| <!DOCTYPE html> |
| <html> |
| <head> |
| <meta name='author' title='Google' href='http://www.google.com'> |
| <meta name='assert' content='getElement* API in document should not leak any node in shadow tree.'> |
| <link rel='help' href='https://w3c.github.io/webcomponents/spec/shadow/'> |
| <script src='/resources/testharness.js'></script> |
| <script src='/resources/testharnessreport.js'></script> |
| </head> |
| <body> |
| |
| <!-- This template will be filled in '#doc', '#host-open', and '#host-closed' below --> |
| <template id='domtree-template'> |
| <span id='foo'></span> |
| <div class='bar'></div> |
| <form name='baz'></form> |
| <my-element></my-element> |
| </template> |
| |
| <div id='doc'> |
| <div id='host-open'></div> |
| <div id='host-closed'></div> |
| </div> |
| |
| </body> |
| <script> |
| 'use strict'; |
| |
| function fillTemplate(root, prefix) { |
| var tmpl = document.getElementById('domtree-template'); |
| root.appendChild(document.importNode(tmpl.content, true)); |
| for (var i = 0; i < root.childNodes.length; ++i) { |
| var el = root.childNodes[i]; |
| if (el.nodeType != 1) |
| continue; |
| el.setAttribute('label', prefix + el.tagName.toLowerCase()); |
| } |
| |
| root.appendChild(document.createElementNS('http://www.w3.org/2000/svg', 'linearGradient')); |
| } |
| |
| // Construct subtree with 'doc-*' ids. |
| var doc = document.getElementById('doc'); |
| fillTemplate(doc, 'doc-'); |
| |
| // Construct shadow subtree with 'shadow-*' ids. |
| var hostOpen = document.getElementById('host-open'); |
| var shadowOpen = hostOpen.attachShadow({mode: 'open'}); |
| fillTemplate(shadowOpen, 'shadow-open-'); |
| |
| var hostClosed = document.getElementById('host-closed'); |
| var shadowClosed = hostClosed.attachShadow({mode: 'closed'}); |
| fillTemplate(shadowClosed, 'shadow-closed-'); |
| |
| test(function() { |
| // getElementById() (NonElementParentNode) |
| assert_equals(document.querySelectorAll('#foo').length, 1); |
| assert_equals(document.getElementById('foo').getAttribute('label'), 'doc-span'); |
| assert_equals(document.querySelector('#foo').getAttribute('label'), 'doc-span'); |
| |
| assert_equals(doc.querySelectorAll('#foo').length, 1); |
| assert_equals(doc.querySelector('#foo').getAttribute('label'), 'doc-span'); |
| |
| assert_equals(hostOpen.querySelectorAll('#foo').length, 0); |
| |
| assert_equals(shadowOpen.querySelectorAll('#foo').length, 1); |
| assert_equals(shadowOpen.getElementById('foo').getAttribute('label'), 'shadow-open-span'); |
| assert_equals(shadowOpen.querySelector('#foo').getAttribute('label'), 'shadow-open-span'); |
| |
| assert_equals(hostClosed.querySelectorAll('#foo').length, 0); |
| |
| assert_equals(shadowClosed.querySelectorAll('#foo').length, 1); |
| assert_equals(shadowClosed.getElementById('foo').getAttribute('label'), 'shadow-closed-span'); |
| assert_equals(shadowClosed.querySelector('#foo').getAttribute('label'), 'shadow-closed-span'); |
| }, 'getElementsById() should not leak nodes in shadow tree'); |
| |
| test(function() { |
| // getElementsByClassName() (Element, Document) |
| assert_equals(document.getElementsByClassName('bar').length, 1); |
| assert_equals(document.getElementsByClassName('bar')[0].getAttribute('label'), 'doc-div'); |
| assert_equals(document.getElementsByClassName('bar').length, 1); |
| assert_equals(document.getElementsByClassName('bar')[0].getAttribute('label'), 'doc-div'); |
| assert_equals(document.querySelectorAll('.bar').length, 1); |
| |
| assert_equals(doc.querySelectorAll('.bar').length, 1); |
| assert_equals(doc.getElementsByClassName('bar')[0].getAttribute('label'), 'doc-div'); |
| |
| assert_equals(hostOpen.querySelectorAll('.bar').length, 0); |
| |
| assert_equals(shadowOpen.querySelectorAll('.bar').length, 1); |
| assert_equals(shadowOpen.querySelectorAll('.bar')[0].getAttribute('label'), 'shadow-open-div'); |
| |
| assert_equals(hostClosed.querySelectorAll('.bar').length, 0); |
| |
| assert_equals(shadowClosed.querySelectorAll('.bar').length, 1); |
| assert_equals(shadowClosed.querySelectorAll('.bar')[0].getAttribute('label'), 'shadow-closed-div'); |
| }, 'getElementsByClassName() should not leak nodes in shadow tree'); |
| |
| test(function() { |
| // getElementsByName (Document) |
| assert_equals(document.getElementsByName('baz').length, 1); |
| assert_equals(document.getElementsByName('baz')[0].getAttribute('label'), 'doc-form'); |
| assert_equals(document.getElementsByName('baz').length, 1); |
| assert_equals(document.getElementsByName('baz')[0].getAttribute('label'), 'doc-form'); |
| assert_equals(document.querySelectorAll('[name=baz]').length, 1); |
| |
| assert_equals(doc.querySelectorAll('[name=baz]').length, 1); |
| |
| assert_equals(hostOpen.querySelectorAll('[name=baz]').length, 0); |
| assert_equals(shadowOpen.querySelectorAll('[name=baz]').length, 1); |
| assert_equals(shadowOpen.querySelectorAll('[name=baz]')[0].getAttribute('label'), 'shadow-open-form'); |
| |
| assert_equals(hostClosed.querySelectorAll('[name=baz]').length, 0); |
| assert_equals(shadowClosed.querySelectorAll('[name=baz]').length, 1); |
| assert_equals(shadowClosed.querySelectorAll('[name=baz]')[0].getAttribute('label'), 'shadow-closed-form'); |
| }, 'getElementsByName() should not leak nodes in shadow tree'); |
| |
| test(function() { |
| // getElementsByTagName (Element, Document) |
| assert_equals(document.getElementsByTagName('my-element').length, 1); |
| assert_equals(document.getElementsByTagName('my-element')[0].getAttribute('label'), 'doc-my-element'); |
| assert_equals(document.getElementsByTagName('my-element').length, 1); |
| assert_equals(document.getElementsByTagName('my-element')[0].getAttribute('label'), 'doc-my-element'); |
| assert_equals(document.querySelectorAll('my-element').length, 1); |
| |
| assert_equals(doc.querySelectorAll('my-element').length, 1); |
| assert_equals(doc.getElementsByTagName('my-element')[0].getAttribute('label'), 'doc-my-element'); |
| |
| assert_equals(hostOpen.querySelectorAll('my-element').length, 0); |
| // ShadowRoot isn't an Element, does not have getElementsByTagName(). |
| assert_equals(shadowOpen.querySelectorAll('my-element').length, 1); |
| assert_equals(shadowOpen.querySelectorAll('my-element')[0].getAttribute('label'), 'shadow-open-my-element'); |
| |
| assert_equals(hostClosed.querySelectorAll('my-element').length, 0); |
| assert_equals(shadowClosed.querySelectorAll('my-element').length, 1); |
| assert_equals(shadowClosed.querySelectorAll('my-element')[0].getAttribute('label'), 'shadow-closed-my-element'); |
| }, 'getElementsByTagName() should not leak nodes in shadow tree'); |
| |
| test(function() { |
| // getElementsByTagNameNS (Element, Document) |
| assert_equals(document.getElementsByTagName('lineargradient').length, 0); |
| assert_equals(document.getElementsByTagNameNS('*', 'lineargradient').length, 0); |
| assert_equals(document.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'lineargradient').length, 0); |
| assert_equals(document.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'lineargradient').length, 0); |
| |
| assert_equals(document.getElementsByTagName('linearGradient').length, 1); |
| assert_equals(document.getElementsByTagNameNS('*', 'linearGradient').length, 1); |
| assert_equals(document.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'linearGradient').length, 1); |
| assert_equals(document.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'linearGradient').length, 0); |
| |
| assert_equals(doc.getElementsByTagName('lineargradient').length, 0); |
| assert_equals(doc.getElementsByTagNameNS('*', 'lineargradient').length, 0); |
| assert_equals(doc.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'lineargradient').length, 0); |
| assert_equals(doc.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'lineargradient').length, 0); |
| |
| assert_equals(doc.getElementsByTagName('linearGradient').length, 1); |
| assert_equals(doc.getElementsByTagNameNS('*', 'linearGradient').length, 1); |
| assert_equals(doc.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'linearGradient').length, 1); |
| assert_equals(doc.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'linearGradient').length, 0); |
| |
| assert_equals(hostOpen.getElementsByTagName('linearGradient').length, 0); |
| assert_equals(hostOpen.getElementsByTagNameNS('*', 'linearGradient').length, 0); |
| assert_equals(hostOpen.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'linearGradient').length, 0); |
| assert_equals(hostOpen.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'linearGradient').length, 0); |
| |
| assert_equals(hostClosed.getElementsByTagName('linearGradient').length, 0); |
| assert_equals(hostClosed.getElementsByTagNameNS('*', 'linearGradient').length, 0); |
| assert_equals(hostClosed.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'linearGradient').length, 0); |
| assert_equals(hostClosed.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'linearGradient').length, 0); |
| |
| // ShadowRoot isn't an Element, does not have getElementsByTagNameNS(). |
| }, 'getElementsByTagNameNS() should not leak nodes in shadow tree'); |
| </script> |
| </html> |