<!DOCTYPE html>
<html>
<body>
<script src='../../resources/testharness.js'></script>
<script src='../../resources/testharnessreport.js'></script>
<div id="container"></div>
<script>
var container = document.getElementById('container');

test(function () {
    var header = document.createElement('header');
    var shadowRoot = header.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = '<img id="foo" name="test2"></img>';
    container.appendChild(header);

    assert_equals(document.foo, undefined);
}, "Document's named property getter should not return elements in shadow DOMs by id");

test(function () {
    var header = document.createElement('header');
    var shadowRoot = header.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = '<img id="foo1" name="test2"></img>';
    container.appendChild(header);

    var img = document.createElement("img");
    img.id = 'foo1';
    img.name = 'test1'
    container.appendChild(img);

    assert_equals(document.foo1, img);
    assert_equals(shadowRoot.firstChild.id, 'foo1');
    shadowRoot.removeChild(shadowRoot.firstChild);
    assert_equals(document.foo1, img);
}, "Document's named property getter should not return elements in shadow DOMs by id (duplicate id)");

test(function () {
    var header = document.createElement('header');
    var shadowRoot = header.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = '<img name="test2"></img>';
    container.appendChild(header);

    assert_equals(document.foo2, undefined);
    shadowRoot.firstChild.id = 'foo2';
    assert_equals(document.foo2, undefined);

}, "Document's named property getter should not return elements in shadow DOMs by id (id attribute update)");

test(function () {
    var header = document.createElement('header');
    var shadowRoot = header.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = '<img name="test2"></img>';
    container.appendChild(header);

    var img = document.createElement("img");
    img.id = 'foo3';
    img.setAttribute('name', 'test1');
    container.appendChild(img);

    assert_equals(document.foo3, img);
    shadowRoot.firstChild.id = 'foo3';
    assert_equals(document.foo3, img);

    shadowRoot.firstChild.id = 'other';
    assert_equals(document.foo3, img);
}, "Document's named property getter should not return elements in shadow DOMs by id (duplicate id attribute update)");

test(function () {
    var header = document.createElement('header');
    var shadowRoot = header.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = '<img></img>';
    container.appendChild(header);

    assert_equals(document.foo4, undefined);
    shadowRoot.firstChild.id = 'foo4';
    assert_equals(document.foo4, undefined);
    shadowRoot.firstChild.setAttribute('name', 'test3');
    assert_equals(document.foo4, undefined);

}, "Document's named property getter should not return elements in shadow DOMs by id (image name change)");

test(function () {
    var header = document.createElement('header');
    var shadowRoot = header.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = '<img></img>';
    container.appendChild(header);

    var img = document.createElement("img");
    img.id = 'foo5';
    img.setAttribute('name', 'test1');
    container.appendChild(img);

    assert_equals(document.foo5, img);
    shadowRoot.firstChild.id = 'foo5';
    assert_equals(document.foo5, img);
    shadowRoot.firstChild.setAttribute('name', 'test3');
    assert_equals(document.foo5, img);

    shadowRoot.firstChild.removeAttribute('name');
    assert_equals(document.foo5, img);
}, "Document's named property getter should not return elements in shadow DOMs by id (image name change with duplicate id)");

test(function () {
    var header = document.createElement('header');
    var shadowRoot = header.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = '<object id="foo6">text</object>';
    container.appendChild(header);

    assert_equals(document.foo6, undefined);
    assert_equals(shadowRoot.firstChild.firstChild.data, "text");
    shadowRoot.firstChild.removeChild(shadowRoot.firstChild.firstChild);
    assert_equals(document.foo6, undefined);
}, "Document's named property getter should not return elements in shadow DOMs by id (object children change)");

test(function () {
    var header = document.createElement('header');
    var shadowRoot = header.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = '<object id="foo7">text</object>';
    container.appendChild(header);

    var object = document.createElement("object");
    object.id = 'foo7';
    container.appendChild(object);

    assert_equals(document.foo7, object);
    assert_equals(shadowRoot.firstChild.firstChild.data, "text");
    shadowRoot.firstChild.removeChild(shadowRoot.firstChild.firstChild);
    assert_equals(document.foo7, object);
    shadowRoot.firstChild.appendChild(document.createElement("a"));
    assert_equals(document.foo7, object);
}, "Document's named property getter should not return elements in shadow DOMs by id (object children change with duplicate id)");

test(function () {
    var header = document.createElement('header');
    var shadowRoot = header.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = '<img name="bar"></img>';
    document.body.appendChild(header);

    assert_equals(document.bar, undefined);
}, "Document's named property getter should not return elements in shadow DOMs by name");

test(function () {
    var header = document.createElement('header');
    var shadowRoot = header.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = '<img name="bar1"></img>';
    document.body.appendChild(header);

    var img = document.createElement("img");
    img.setAttribute('name', 'bar1');
    container.appendChild(img);

    assert_equals(document.bar1, img);
    assert_equals(shadowRoot.firstChild.getAttribute('name'), 'bar1');
    shadowRoot.removeChild(shadowRoot.firstChild);
    assert_equals(document.bar1, img);
}, "Document's named property getter should not return elements in shadow DOMs by name (duplicate name)");

test(function () {
    var header = document.createElement('header');
    var shadowRoot = header.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = '<img></img>';
    document.body.appendChild(header);

    assert_equals(document.bar2, undefined);
    shadowRoot.firstChild.setAttribute('name', 'bar2');
    assert_equals(document.bar2, undefined);
}, "Document's named property getter should not return elements in shadow DOMs by name (name attribute update)");

test(function () {
    var header = document.createElement('header');
    var shadowRoot = header.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = '<img></img>';
    document.body.appendChild(header);

    var img = document.createElement("img");
    img.setAttribute('name', 'bar3');
    container.appendChild(img);

    assert_equals(document.bar3, img);
    shadowRoot.firstChild.setAttribute('name', 'bar3');
    assert_equals(document.bar3, img);

    shadowRoot.firstChild.setAttribute('name', 'other');
    assert_equals(document.bar3, img);
}, "Document's named property getter should not return elements in shadow DOMs by name (duplicate name attribute update)");
</script>
</body>
</html>
