mirror of
https://github.com/servo/servo.git
synced 2025-07-13 02:13:40 +01:00
174 lines
8.7 KiB
HTML
174 lines
8.7 KiB
HTML
<!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>
|