<!DOCTYPE html>
<html>
<head>
<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
<meta name="assert" content="offsetParent should only return nodes that are shadow including ancestor">
<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-htmlelement-offsetparent">
<link rel="help" href="https://dom.spec.whatwg.org/#concept-shadow-including-inclusive-ancestor">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/event-path-test-helpers.js"></script>
</head>
<body>
<div id="log"></div>
<div id="container" style="position: relative"></div>
<script>

const container = document.getElementById('container');

function testOffsetParentInShadowTree(mode) {
    test(function () {
        const host = document.createElement('div');
        container.appendChild(host);
        this.add_cleanup(() => host.remove());
        const shadowRoot = host.attachShadow({mode});
        shadowRoot.innerHTML = '<div id="relativeParent" style="position: relative; padding-left: 100px; padding-top: 70px;"><div id="target"></div></div>';
        const relativeParent = shadowRoot.getElementById('relativeParent');

        assert_true(relativeParent instanceof HTMLDivElement);
        const target = shadowRoot.getElementById('target');
        assert_equals(target.offsetParent, relativeParent);
        assert_equals(target.offsetLeft, 100);
        assert_equals(target.offsetTop, 70);
    }, `offsetParent must return the offset parent in the same shadow tree of ${mode} mode`);
}

testOffsetParentInShadowTree('open');
testOffsetParentInShadowTree('closed');

function testOffsetParentInNestedShadowTrees(mode) {
    test(function () {
        const outerHost = document.createElement('section');
        container.appendChild(outerHost);
        this.add_cleanup(() => outerHost.remove());
        const outerShadow = outerHost.attachShadow({mode});
        outerShadow.innerHTML = '<section id="outerParent" style="position: absolute; top: 50px; left: 50px;"></section>';

        const innerHost = document.createElement('div');
        outerShadow.firstChild.appendChild(innerHost);
        const innerShadow = innerHost.attachShadow({mode});
        innerShadow.innerHTML = '<div id="innerParent" style="position: relative; padding-left: 60px; padding-top: 40px;"><div id="target"></div></div>';
        const innerParent = innerShadow.getElementById('innerParent');

        const target = innerShadow.getElementById('target');
        assert_true(innerParent instanceof HTMLDivElement);
        assert_equals(target.offsetParent, innerParent);
        assert_equals(target.offsetLeft, 60);
        assert_equals(target.offsetTop, 40);

        outerHost.remove();
    }, `offsetParent must return the offset parent in the same shadow tree of ${mode} mode even when nested`);
}

testOffsetParentInNestedShadowTrees('open');
testOffsetParentInNestedShadowTrees('closed');

function testOffsetParentOnElementAssignedToSlotInsideOffsetParent(mode) {
    test(function () {
        const host = document.createElement('div');
        host.innerHTML = '<div id="target"></div>'
        container.appendChild(host);
        this.add_cleanup(() => host.remove());
        const shadowRoot = host.attachShadow({mode});
        shadowRoot.innerHTML = '<div style="position: relative; padding-left: 85px; padding-top: 45px;"><slot></slot></div>';
        const target = host.querySelector('#target');
        assert_equals(target.offsetParent, container);
        assert_equals(target.offsetLeft, 85);
        assert_equals(target.offsetTop, 45);
    }, `offsetParent must skip offset parents of an element when the context object is assigned to a slot in a shadow tree of ${mode} mode`);
}

testOffsetParentOnElementAssignedToSlotInsideOffsetParent('open');
testOffsetParentOnElementAssignedToSlotInsideOffsetParent('closed');

function testOffsetParentOnElementAssignedToSlotInsideNestedOffsetParents(mode) {
    test(function () {
        const host = document.createElement('div');
        host.innerHTML = '<div id="target" style="border:solid 1px blue;">hi</div>';
        const previousBlock = document.createElement('div');
        previousBlock.style.height = '12px';
        container.append(previousBlock, host);
        this.add_cleanup(() => { container.innerHTML = ''; });
        const shadowRoot = host.attachShadow({mode});
        shadowRoot.innerHTML = '<section style="position: relative; margin-left: 20px; margin-top: 100px; background: #ccc"><div style="position: absolute; top: 10px; left: 10px;"><slot></slot></div></section>';
        const target = host.querySelector('#target');
        assert_equals(target.offsetParent, container);
        assert_equals(target.offsetLeft, 30);
        assert_equals(target.offsetTop, 122);
    }, `offsetParent must skip multiple offset parents of an element when the context object is assigned to a slot in a shadow tree of ${mode} mode`);
}

testOffsetParentOnElementAssignedToSlotInsideNestedOffsetParents('open');
testOffsetParentOnElementAssignedToSlotInsideNestedOffsetParents('closed');

function testOffsetParentOnElementAssignedToSlotInsideNestedShadowTrees(mode) {
    test(function () {
        const outerHost = document.createElement('section');
        outerHost.innerHTML = '<div id="target"></div>';
        container.appendChild(outerHost);
        this.add_cleanup(() => outerHost.remove());
        const outerShadow = outerHost.attachShadow({mode});
        outerShadow.innerHTML = '<section style="position: absolute; top: 40px; left: 50px;"><div id="innerHost"><slot></slot></div></section>';

        const innerShadow = outerShadow.getElementById('innerHost').attachShadow({mode});
        innerShadow.innerHTML = '<div style="position: absolute; top: 200px; margin-left: 100px;"><slot></slot></div>';

        const target = outerHost.querySelector('#target');
        assert_equals(target.offsetParent, container);
        assert_equals(target.offsetLeft, 150);
        assert_equals(target.offsetTop, 240);
        outerHost.remove();
    }, `offsetParent must skip offset parents of an element when the context object is assigned to a slot in nested shadow trees of ${mode} mode`);
}

testOffsetParentOnElementAssignedToSlotInsideNestedShadowTrees('open');
testOffsetParentOnElementAssignedToSlotInsideNestedShadowTrees('closed');

function testOffsetParentOnElementInsideShadowTreeWithoutOffsetParent(mode) {
    test(function () {
        const outerHost = document.createElement('section');
        container.appendChild(outerHost);
        this.add_cleanup(() => outerHost.remove());
        const outerShadow = outerHost.attachShadow({mode});
        outerShadow.innerHTML = '<div id="innerHost"><div id="target"></div></div>';

        const innerShadow = outerShadow.getElementById('innerHost').attachShadow({mode});
        innerShadow.innerHTML = '<div style="position: absolute; top: 23px; left: 24px;"><slot></slot></div>';

        const target = outerShadow.querySelector('#target');
        assert_equals(target.offsetParent, container);
        assert_equals(target.offsetLeft, 24);
        assert_equals(target.offsetTop, 23);
    }, `offsetParent must find the first offset parent which is a shadow-including ancestor of the context object even some shadow tree of ${mode} mode did not have any offset parent`);
}

testOffsetParentOnElementInsideShadowTreeWithoutOffsetParent('open');
testOffsetParentOnElementInsideShadowTreeWithoutOffsetParent('closed');

function testOffsetParentOnUnassignedChild(mode) {
    test(function () {
        const host = document.createElement('section');
        host.innerHTML = '<div id="target"></div>';
        this.add_cleanup(() => host.remove());
        container.appendChild(host);
        const shadowRoot = host.attachShadow({mode});
        shadowRoot.innerHTML = '<section style="position: absolute; top: 50px; left: 50px;">content</section>';
        const target = host.querySelector('#target');
        assert_equals(target.offsetParent, null);
        assert_equals(target.offsetLeft, 0);
        assert_equals(target.offsetTop, 0);
    }, `offsetParent must return null on a child element of a shadow host for the shadow tree in ${mode} mode which is not assigned to any slot`);
}

testOffsetParentOnUnassignedChild('open');
testOffsetParentOnUnassignedChild('closed');

function testOffsetParentOnAssignedChildNotInFlatTree(mode) {
    test(function () {
        const outerHost = document.createElement('section');
        outerHost.innerHTML = '<div id="target"></div>';
        container.appendChild(outerHost);
        this.add_cleanup(() => outerHost.remove());
        const outerShadow = outerHost.attachShadow({mode});
        outerShadow.innerHTML = '<div id="innerHost"><div style="position: absolute; top: 50px; left: 50px;"><slot></slot></div></div>';

        const innerShadow = outerShadow.getElementById('innerHost').attachShadow({mode});
        innerShadow.innerHTML = '<div>content</div>';

        const target = outerHost.querySelector('#target');
        assert_equals(target.offsetParent, null);
        assert_equals(target.offsetLeft, 0);
        assert_equals(target.offsetTop, 0);
    }, `offsetParent must return null on a child element of a shadow host for the shadow tree in ${mode} mode which is not in the flat tree`);
}

testOffsetParentOnAssignedChildNotInFlatTree('open');
testOffsetParentOnAssignedChildNotInFlatTree('closed');

</script>
</body>
</html>
