blob: cdb876ab08caac887a4a45ef21f1815db100066a [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test-pre.js"></script>
<script src="resources/polyfill.js"></script>
<script src="resources/shadow-dom.js"></script>
</head>
<body>
<div id="container"></div>
<pre id="console"></pre>
<script>
function testCase(f)
{
container.innerHTML = '';
container.appendChild(createDOM('div', {'id': 'host'},
createShadowRoot()));
shadowRoot = internals.shadowRoot(host);
f();
debug('');
}
testCase(function()
{
debug('Id should be collected');
shadowRoot.innerHTML = '<content select="#foo"></content>';
shouldBe('internals.hasSelectorForIdInShadow(host, "foo")', 'true');
shouldBe('internals.hasSelectorForIdInShadow(host, "bar")', 'false');
shouldBe('internals.hasSelectorForIdInShadow(host, "host")', 'false');
});
testCase(function()
{
debug('Class should be collected');
shadowRoot.innerHTML = '<content select=".foo"></content>';
shouldBe('internals.hasSelectorForClassInShadow(host, "foo")', 'true');
shouldBe('internals.hasSelectorForClassInShadow(host, "host")', 'false');
});
testCase(function()
{
debug('Attribute should be collected');
shadowRoot.innerHTML = '<content select="div[foo]"></content>';
shouldBe('internals.hasSelectorForAttributeInShadow(host, "foo")', 'true');
shouldBe('internals.hasSelectorForAttributeInShadow(host, "host")', 'false');
});
testCase(function()
{
debug('Select attribute might have several selectors');
shadowRoot.innerHTML = '<content select="#foo,.bar,div[baz]"></content>';
shouldBe('internals.hasSelectorForIdInShadow(host, "foo")', 'true');
shouldBe('internals.hasSelectorForIdInShadow(host, "bar")', 'false');
shouldBe('internals.hasSelectorForIdInShadow(host, "baz")', 'false');
shouldBe('internals.hasSelectorForClassInShadow(host, "foo")', 'false');
shouldBe('internals.hasSelectorForClassInShadow(host, "bar")', 'true');
shouldBe('internals.hasSelectorForClassInShadow(host, "baz")', 'false');
shouldBe('internals.hasSelectorForAttributeInShadow(host, "foo")', 'false');
shouldBe('internals.hasSelectorForAttributeInShadow(host, "bar")', 'false');
shouldBe('internals.hasSelectorForAttributeInShadow(host, "baz")', 'true');
});
testCase(function()
{
debug('Don\'t count shadow element');
shadowRoot.innerHTML = '<shadow select="#foo,.bar,div[baz]"></shadow>';
shouldBe('internals.hasSelectorForIdInShadow(host, "foo")', 'false');
shouldBe('internals.hasSelectorForIdInShadow(host, "bar")', 'false');
shouldBe('internals.hasSelectorForIdInShadow(host, "baz")', 'false');
shouldBe('internals.hasSelectorForClassInShadow(host, "foo")', 'false');
shouldBe('internals.hasSelectorForClassInShadow(host, "bar")', 'false');
shouldBe('internals.hasSelectorForClassInShadow(host, "baz")', 'false');
shouldBe('internals.hasSelectorForAttributeInShadow(host, "foo")', 'false');
shouldBe('internals.hasSelectorForAttributeInShadow(host, "bar")', 'false');
shouldBe('internals.hasSelectorForAttributeInShadow(host, "baz")', 'false');
});
testCase(function()
{
debug('Complex case for single ShadowRoot');
shadowRoot.innerHTML = '<div><div></div><content select="*"></content><div><content select="div[foo=piyo]"></content></div>';
shouldBe('internals.hasSelectorForIdInShadow(host, "foo")', 'false');
shouldBe('internals.hasSelectorForClassInShadow(host, "foo")', 'false');
shouldBe('internals.hasSelectorForAttributeInShadow(host, "foo")', 'true');
shouldBe('internals.hasSelectorForAttributeInShadow(host, "piyo")', 'false');
});
testCase(function()
{
debug('Another complex case for single ShadowRoot');
shadowRoot.innerHTML = '<content select="#foo,.foo,div[foo]"></content>';
shouldBe('internals.hasSelectorForIdInShadow(host, "foo")', 'true');
shouldBe('internals.hasSelectorForClassInShadow(host, "foo")', 'true');
shouldBe('internals.hasSelectorForAttributeInShadow(host, "foo")', 'true');
});
testCase(function()
{
debug('Multiple ShadowRoot case');
var anotherShadowRoot = host.webkitCreateShadowRoot();
shadowRoot.innerHTML = '<content select="#foo"></content>';
anotherShadowRoot.innerHTML = '<content select="#bar"></content><content select="div[baz],.bar"></content>';
shouldBe('internals.hasSelectorForIdInShadow(host, "foo")', 'true');
shouldBe('internals.hasSelectorForIdInShadow(host, "bar")', 'true');
shouldBe('internals.hasSelectorForIdInShadow(host, "baz")', 'false');
shouldBe('internals.hasSelectorForClassInShadow(host, "foo")', 'false');
shouldBe('internals.hasSelectorForClassInShadow(host, "bar")', 'true');
shouldBe('internals.hasSelectorForClassInShadow(host, "baz")', 'false');
shouldBe('internals.hasSelectorForAttributeInShadow(host, "foo")', 'false');
shouldBe('internals.hasSelectorForAttributeInShadow(host, "bar")', 'false');
shouldBe('internals.hasSelectorForAttributeInShadow(host, "baz")', 'true');
});
testCase(function()
{
debug('Dynamic select attribute update');
shadowRoot.innerHTML = '<content select="#foo"></content>';
shouldBe('internals.hasSelectorForIdInShadow(host, "foo")', 'true');
shouldBe('internals.hasSelectorForIdInShadow(host, "bar")', 'false');
var content = shadowRoot.querySelector('content');
content.select = '#bar';
shouldBe('internals.hasSelectorForIdInShadow(host, "foo")', 'false');
shouldBe('internals.hasSelectorForIdInShadow(host, "bar")', 'true');
});
testCase(function()
{
debug('Nested ShadowDOM case');
shadowRoot.innerHTML = '<content select="#foo"></content>';
var div = document.createElement('div');
var nestedShadowRoot = div.webkitCreateShadowRoot();
nestedShadowRoot.innerHTML = '<content select="#bar"></content>';
shadowRoot.appendChild(div);
shouldBe('internals.hasSelectorForIdInShadow(host, "foo")', 'true');
shouldBe('internals.hasSelectorForIdInShadow(host, "bar")', 'true');
shouldBe('internals.hasSelectorForIdInShadow(host, "baz")', 'false');
var content = nestedShadowRoot.querySelector('content');
content.select = '#baz';
shouldBe('internals.hasSelectorForIdInShadow(host, "foo")', 'true');
shouldBe('internals.hasSelectorForIdInShadow(host, "bar")', 'false');
shouldBe('internals.hasSelectorForIdInShadow(host, "baz")', 'true');
});
testCase(function()
{
debug('PseudoClass case: :checked');
shadowRoot.innerHTML = '<content select="input:checked"></content>';
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "checked")', 'true');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "enabled")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "disabled")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "indeterminate")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "link")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "target")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "visited")', 'false');
});
testCase(function()
{
debug('PseudoClass case: :enabled');
shadowRoot.innerHTML = '<content select="input:enabled"></content>';
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "checked")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "enabled")', 'true');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "disabled")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "indeterminate")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "link")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "target")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "visited")', 'false');
});
testCase(function()
{
debug('PseudoClass case: :disabled');
shadowRoot.innerHTML = '<content select="input:disabled"></content>';
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "checked")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "enabled")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "disabled")', 'true');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "indeterminate")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "link")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "target")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "visited")', 'false');
});
testCase(function()
{
debug('PseudoClass case: :indeterminate');
shadowRoot.innerHTML = '<content select="input:indeterminate"></content>';
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "checked")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "enabled")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "disabled")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "indeterminate")', 'true');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "link")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "target")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "visited")', 'false');
});
testCase(function()
{
debug('PseudoClass case: :link');
shadowRoot.innerHTML = '<content select="input:link"></content>';
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "checked")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "enabled")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "disabled")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "indeterminate")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "link")', 'true');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "target")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "visited")', 'false');
});
testCase(function()
{
debug('PseudoClass case: :target');
shadowRoot.innerHTML = '<content select="input:target"></content>';
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "checked")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "enabled")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "disabled")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "indeterminate")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "link")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "target")', 'true');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "visited")', 'false');
});
testCase(function()
{
debug('PseudoClass case: :visited');
shadowRoot.innerHTML = '<content select="input:visited"></content>';
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "checked")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "enabled")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "disabled")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "indeterminate")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "link")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "target")', 'false');
shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "visited")', 'true');
});
finishJSTest();
</script>
<script src="../../../resources/js-test-post.js"></script>
</body>
</html>