blob: eb41ef143d75e130456396ec2ded292d828782c7 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="resources/shadow-dom.js"></script>
<script src="../../../resources/js-test.js"></script>
</head>
<body>
<div id='sandbox'></div>
<pre id='console'></pre>
</body>
<script>
function borderColorOf(node)
{
return document.defaultView.getComputedStyle(node, null).getPropertyValue('border-color');
}
function borderColorShouldBe(selector, color)
{
var text = 'borderColorOf(getNodeInTreeOfTrees("' + selector + '"))';
shouldBeEqualToString(text, color);
}
function borderColorShouldNotBe(selector, color)
{
var text = 'borderColorOf(getNodeInTreeOfTrees("' + selector + '"))';
var unevaledString = '"' + color.replace(/\\/g, "\\\\").replace(/"/g, "\"") + '"';
shouldNotBe(text, unevaledString);
}
function cleanUp()
{
document.getElementById('sandbox').innerHTML = '';
}
description('Test for /deep/ combinator, http://crbug.com/309504.');
var sandbox = document.getElementById('sandbox');
// div /deep/ span should match host/target.
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div /deep/ span { border: 1px solid green; }')),
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('span', {'id': 'target'},
document.createTextNode('green border, because of hat.'))))));
borderColorShouldBe('host/target', 'rgb(0, 128, 0)');
cleanUp();
// div /deep/ span should match host/host2/target and target2.
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div /deep/ span { border: 1px solid green; }')),
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('div', {'id': 'host2'},
createShadowRoot(
createDOM('span', {'id': 'target'},
document.createTextNode('green border, because of hat.')))))),
createDOM('span', {'id': 'target2'})));
borderColorShouldBe('host/host2/target', 'rgb(0, 128, 0)');
borderColorShouldBe('target2', 'rgb(0, 128, 0)');
cleanUp();
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div#sandbox > div > div /deep/ span { border: 1px solid green; }')),
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('content', {}),
createDOM('span', {'id': 'target'},
document.createTextNode('green border, because of hat.'))),
createDOM('span', {'id': 'target2'}))));
borderColorShouldBe('host/target', 'rgb(0, 128, 0)');
borderColorShouldBe('target2', 'rgb(0, 128, 0)');
cleanUp();
// Testing div /deep/ span in inner scope vs div /deep/ span in outer scope
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div /deep/ span { border: 1px solid green; }')),
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('div', {'id': 'host2'},
createDOM('style', {},
document.createTextNode('div /deep/ span { border: 1px solid red; }')),
createShadowRoot(
createDOM('span', {'id': 'target'},
document.createTextNode('green border, because of hat.')))))),
createDOM('span', {'id': 'target2'})));
borderColorShouldBe('host/host2/target', 'rgb(0, 128, 0)');
cleanUp();
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div /deep/ span { border: 1px solid green; }')),
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode('div > span { border: 1px solid red; }')),
createDOM('div', {},
createDOM('span', {'id': 'target'},
document.createTextNode('green border, because parent hat wins.')))))));
borderColorShouldBe('host/target', 'rgb(0, 128, 0)');
cleanUp();
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div /deep/ span { border: 1px solid green; }')),
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode(':host > span { border: 1px solid red; }')),
createDOM('span', {'id': 'target'},
document.createTextNode('red border because of specificity.'))))));
// Since :host's specificity is the same as *, div /deep/ span wins.
borderColorShouldBe('host/target', 'rgb(0, 128, 0)');
cleanUp();
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode(':host /deep/ span { border: 1px solid green; }')),
createDOM('span', {},
document.createTextNode('some text'))),
createShadowRoot(
createDOM('shadow', {}),
createDOM('span', {'id': 'target'},
document.createTextNode('green border')))));
borderColorShouldBe('host//target', 'rgb(0, 128, 0)');
cleanUp();
// div /deep/ span cannot match, because div cannot match any shadow host.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode('div /deep/ span { border: 1px solid green; }')),
createDOM('span', {},
document.createTextNode('some text'))),
createShadowRoot(
createDOM('shadow', {}),
createDOM('span', {'id': 'target'},
document.createTextNode('no border')))));
borderColorShouldBe('host//target', 'rgb(0, 0, 0)');
cleanUp();
// :host div /deep/ div should match.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode(':host div /deep/ div { border: 1px solid green; }')),
createDOM('div', {'id': 'host2'},
createShadowRoot(
createDOM('div', {'id': 'target'},
document.createTextNode('green border')))))));
borderColorShouldBe('host/host2/target', 'rgb(0, 128, 0)');
cleanUp();
// div :host div /deep/ div should not match.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode('div :host div /deep/ div { border: 1px solid green; }')),
createDOM('div', {'id': 'host2'},
createShadowRoot(
createDOM('div', {'id': 'target'},
document.createTextNode('green border')))))));
borderColorShouldBe('host/host2/target', 'rgb(0, 0, 0)');
cleanUp();
// :host /shadow/ :host /deep/ div should not match.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode(':host /shadow/ :host /deep/ div { border: 1px solid green; }')),
createDOM('div', {'id': 'host2'},
createShadowRoot(
createDOM('div', {'id': 'host3'},
createShadowRoot(
createDOM('div', {'id': 'target'},
document.createTextNode('no border')))))))));
borderColorShouldBe('host/host2/host3/target', 'rgb(0, 0, 0)');
cleanUp();
// div (=shadow host) div /deep/ div should not match.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode('div > div /deep/ div { border: 1px solid green; }')),
createDOM('div', {'id': 'host2'},
createShadowRoot(
createDOM('div', {'id': 'target'},
document.createTextNode('no border')))))));
borderColorShouldBe('host/host2/target', 'rgb(0, 0, 0)');
cleanUp();
// div + div /deep/ div should match.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode('div + div /deep/ div { border: 1px solid green; }')),
createDOM('div', {},
document.createTextNode('sibling')),
createDOM('div', {'id': 'host2'},
createShadowRoot(
createDOM('div', {'id': 'target'},
document.createTextNode('green border')))))));
borderColorShouldBe('host/host2/target', 'rgb(0, 128, 0)');
cleanUp();
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode('div + div /deep/ div { border: 1px solid green; }')),
createDOM('div', {},
document.createTextNode('sibling')),
createDOM('div', {'id': 'host2'},
createShadowRoot(
createDOM('div', {'id': 'host3'},
createShadowRoot(
createDOM('div', {'id': 'target'},
document.createTextNode('green border')))))))));
borderColorShouldBe('host/host2/host3/target', 'rgb(0, 128, 0)');
cleanUp();
// :host + div /deep/ div should not match.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode(':host + div /deep/ div { border: 1px solid green; }')),
createDOM('div', {'id': 'siblingShadow'},
createShadowRoot(
createDOM('div', {},
document.createTextNode('sibling')))),
createDOM('div', {'id': 'host2'},
createShadowRoot(
createDOM('div', {'id': 'target'},
document.createTextNode('no border')))))));
borderColorShouldBe('host/host2/target', 'rgb(0, 0, 0)');
cleanUp();
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode(':host + div /deep/ div { border: 1px solid green; }')),
createDOM('div', {},
document.createTextNode('sibling')),
createDOM('div', {'id': 'host2'},
createShadowRoot(
createDOM('div', {'id': 'host3'},
createShadowRoot(
createDOM('div', {'id': 'target'},
document.createTextNode('no border')))))))));
borderColorShouldBe('host/host2/host3/target', 'rgb(0, 0, 0)');
cleanUp();
// :host /deep/ * should not match desendant nodes of div#host.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode(':host /deep/ * { border: 1px solid red; }')),
createDOM('content', {})),
createDOM('div', {'id': 'child'},
document.createTextNode('show not red'))));
borderColorShouldNotBe('child', 'rgb(255, 0, 0)');
cleanUp();
// Test for crbug.com/331871. 'div#inner h1' should not cross TreeScope boundary.
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div#outer /deep/ div#inner h1 { border: 1px solid red; }')),
createDOM('div', {'id': 'outer'},
createDOM('div', {'id': 'inner'},
createShadowRoot(
createDOM('h1', {'id': 'target'},
document.createTextNode('no red border')))))));
borderColorShouldNotBe('inner/target', 'rgb(255, 0, 0)');
cleanUp();
// :host /deep/ span is declared in a shadow tree, but the shadow root does not participate in flat tree.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode(':host /deep/ span { border: 1px solid green; }')),
createDOM('span', {},
document.createTextNode('some text'))),
createShadowRoot(
createDOM('span', {'id': 'target'},
document.createTextNode('green border')))));
borderColorShouldBe('host//target', 'rgb(0, 128, 0)');
cleanUp();
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode('* /deep/ .x-bar div { border: 1px solid red; }')),
createDOM('div', {'id': 'x-foo'},
document.createTextNode('x-foo')),
createDOM('div', {},
createDOM('div', {'id': 'x-bar-host', 'class': 'x-bar'},
createShadowRoot(
createDOM('div', {'id': 'x-bar-target'},
document.createTextNode('x-bar')),
createDOM('div', {'id': 'x-zot-host', 'class': 'x-zot'},
createShadowRoot(
createDOM('div', {'id': 'x-zot-target'},
document.createTextNode('x-zot'))))))))));
borderColorShouldNotBe('host/x-bar-host/x-bar-target', 'rgb(255, 0, 0)');
borderColorShouldNotBe('host/x-bar-host/x-zot-host/x-zot-target', 'rgb(255, 0, 0)');
cleanUp();
</script>
</html>