4 <script src="resources/shadow-dom.js"></script>
5 <script src="../../../resources/js-test.js"></script>
8 <div id='sandbox'></div>
9 <pre id='console'></pre>
13 function borderColorOf(node)
15 return document.defaultView.getComputedStyle(node, null).getPropertyValue('border-color');
18 function borderColorShouldBe(selector, color)
20 var text = 'borderColorOf(getNodeInTreeOfTrees("' + selector + '"))';
21 shouldBeEqualToString(text, color);
24 function borderColorShouldNotBe(selector, color)
26 var text = 'borderColorOf(getNodeInTreeOfTrees("' + selector + '"))';
27 var unevaledString = '"' + color.replace(/\\/g, "\\\\").replace(/"/g, "\"") + '"';
28 shouldNotBe(text, unevaledString);
33 document.getElementById('sandbox').innerHTML = '';
36 description('Test for ^^ combinator, http://crbug.com/309504.');
38 var sandbox = document.getElementById('sandbox');
40 // div ^^ span should match host/target.
44 createDOM('style', {},
45 document.createTextNode('div ^^ span { border: 1px solid green; }')),
46 createDOM('div', {'id': 'host'},
48 createDOM('span', {'id': 'target'},
49 document.createTextNode('green border, because of hat.'))))));
51 borderColorShouldBe('host/target', 'rgb(0, 128, 0)');
55 // div ^^ span should match host/host2/target and target2.
59 createDOM('style', {},
60 document.createTextNode('div ^^ span { border: 1px solid green; }')),
61 createDOM('div', {'id': 'host'},
63 createDOM('div', {'id': 'host2'},
65 createDOM('span', {'id': 'target'},
66 document.createTextNode('green border, because of hat.')))))),
67 createDOM('span', {'id': 'target2'})));
69 borderColorShouldBe('host/host2/target', 'rgb(0, 128, 0)');
70 borderColorShouldBe('target2', 'rgb(0, 128, 0)');
76 createDOM('style', {},
77 document.createTextNode('div#sandbox > div > div ^^ span { border: 1px solid green; }')),
78 createDOM('div', {'id': 'host'},
80 createDOM('content', {}),
81 createDOM('span', {'id': 'target'},
82 document.createTextNode('green border, because of hat.'))),
83 createDOM('span', {'id': 'target2'}))));
85 borderColorShouldBe('host/target', 'rgb(0, 128, 0)');
86 borderColorShouldBe('target2', 'rgb(0, 128, 0)');
90 // Testing div ^^ span in inner scope vs div ^^ span in outer scope
94 createDOM('style', {},
95 document.createTextNode('div ^^ span { border: 1px solid green; }')),
96 createDOM('div', {'id': 'host'},
98 createDOM('div', {'id': 'host2'},
99 createDOM('style', {},
100 document.createTextNode('div ^^ span { border: 1px solid red; }')),
102 createDOM('span', {'id': 'target'},
103 document.createTextNode('green border, because of hat.')))))),
104 createDOM('span', {'id': 'target2'})));
106 borderColorShouldBe('host/host2/target', 'rgb(0, 128, 0)');
112 createDOM('style', {},
113 document.createTextNode('div ^^ span { border: 1px solid green; }')),
114 createDOM('div', {'id': 'host'},
116 createDOM('style', {},
117 document.createTextNode('div > span { border: 1px solid red; }')),
119 createDOM('span', {'id': 'target'},
120 document.createTextNode('green border, because parent hat wins.')))))));
122 borderColorShouldBe('host/target', 'rgb(0, 128, 0)');
128 createDOM('style', {},
129 document.createTextNode('div ^^ span { border: 1px solid green; }')),
130 createDOM('div', {'id': 'host'},
132 createDOM('style', {},
133 document.createTextNode(':host > span { border: 1px solid red; }')),
134 createDOM('span', {'id': 'target'},
135 document.createTextNode('red border because of specificity.'))))));
137 // Since :host's specificity is the same as *, div ^^ span wins.
138 borderColorShouldBe('host/target', 'rgb(0, 128, 0)');
143 createDOM('div', {'id': 'host'},
145 createDOM('style', {},
146 document.createTextNode(':host ^^ span { border: 1px solid green; }')),
147 createDOM('span', {},
148 document.createTextNode('some text'))),
150 createDOM('shadow', {}),
151 createDOM('span', {'id': 'target'},
152 document.createTextNode('green border')))));
154 borderColorShouldBe('host//target', 'rgb(0, 128, 0)');
158 // div ^^ span cannot match, because div cannot match any shadow host.
160 createDOM('div', {'id': 'host'},
162 createDOM('style', {},
163 document.createTextNode('div ^^ span { border: 1px solid green; }')),
164 createDOM('span', {},
165 document.createTextNode('some text'))),
167 createDOM('shadow', {}),
168 createDOM('span', {'id': 'target'},
169 document.createTextNode('no border')))));
171 borderColorShouldBe('host//target', 'rgb(0, 0, 0)');
175 // .foo ^^ span, .foo is an ancestor of some shadow host which has span in its hosting shadow tree, should match.
177 createDOM('div', {'id': 'host'},
179 createDOM('style', {},
180 document.createTextNode('.foo ^^ span { border: 1px solid green; }')),
181 createDOM('span', {},
182 document.createTextNode('some text'))),
184 createDOM('shadow', {}),
185 createDOM('div', {'class': 'foo'},
186 createDOM('div', {'id': 'host2'},
188 createDOM('span', {'id': 'target'},
189 document.createTextNode('green border'))))))));
191 borderColorShouldBe('host//host2/target', 'rgb(0, 128, 0)');
196 // :host div ^^ div should match.
199 createDOM('div', {'id': 'host'},
201 createDOM('style', {},
202 document.createTextNode(':host div ^^ div { border: 1px solid green; }')),
203 createDOM('div', {'id': 'host2'},
205 createDOM('div', {'id': 'target'},
206 document.createTextNode('green border')))))));
208 borderColorShouldBe('host/host2/target', 'rgb(0, 128, 0)');
212 // div :host div ^^ div should not match.
215 createDOM('div', {'id': 'host'},
217 createDOM('style', {},
218 document.createTextNode('div :host div ^^ div { border: 1px solid green; }')),
219 createDOM('div', {'id': 'host2'},
221 createDOM('div', {'id': 'target'},
222 document.createTextNode('green border')))))));
224 borderColorShouldBe('host/host2/target', 'rgb(0, 0, 0)');
228 // :host ^ :host ^^ div should not match.
231 createDOM('div', {'id': 'host'},
233 createDOM('style', {},
234 document.createTextNode(':host ^ :host ^^ div { border: 1px solid green; }')),
235 createDOM('div', {'id': 'host2'},
237 createDOM('div', {'id': 'host3'},
239 createDOM('div', {'id': 'target'},
240 document.createTextNode('no border')))))))));
242 borderColorShouldBe('host/host2/host3/target', 'rgb(0, 0, 0)');
246 // div (=shadow host) div ^^ div should not match.
249 createDOM('div', {'id': 'host'},
251 createDOM('style', {},
252 document.createTextNode('div > div ^^ div { border: 1px solid green; }')),
253 createDOM('div', {'id': 'host2'},
255 createDOM('div', {'id': 'target'},
256 document.createTextNode('no border')))))));
258 borderColorShouldBe('host/host2/target', 'rgb(0, 0, 0)');
262 // div + div ^^ div should match.
265 createDOM('div', {'id': 'host'},
267 createDOM('style', {},
268 document.createTextNode('div + div ^^ div { border: 1px solid green; }')),
270 document.createTextNode('sibling')),
271 createDOM('div', {'id': 'host2'},
273 createDOM('div', {'id': 'target'},
274 document.createTextNode('green border')))))));
276 borderColorShouldBe('host/host2/target', 'rgb(0, 128, 0)');
281 createDOM('div', {'id': 'host'},
283 createDOM('style', {},
284 document.createTextNode('div + div ^^ div { border: 1px solid green; }')),
286 document.createTextNode('sibling')),
287 createDOM('div', {'id': 'host2'},
289 createDOM('div', {'id': 'host3'},
291 createDOM('div', {'id': 'target'},
292 document.createTextNode('green border')))))))));
294 borderColorShouldBe('host/host2/host3/target', 'rgb(0, 128, 0)');
298 // :host + div ^^ div should not match.
301 createDOM('div', {'id': 'host'},
303 createDOM('style', {},
304 document.createTextNode(':host + div ^^ div { border: 1px solid green; }')),
305 createDOM('div', {'id': 'siblingShadow'},
308 document.createTextNode('sibling')))),
309 createDOM('div', {'id': 'host2'},
311 createDOM('div', {'id': 'target'},
312 document.createTextNode('no border')))))));
314 borderColorShouldBe('host/host2/target', 'rgb(0, 0, 0)');
319 createDOM('div', {'id': 'host'},
321 createDOM('style', {},
322 document.createTextNode(':host + div ^^ div { border: 1px solid green; }')),
324 document.createTextNode('sibling')),
325 createDOM('div', {'id': 'host2'},
327 createDOM('div', {'id': 'host3'},
329 createDOM('div', {'id': 'target'},
330 document.createTextNode('no border')))))))));
332 borderColorShouldBe('host/host2/host3/target', 'rgb(0, 0, 0)');
336 // div ^^ span in a sibling shadow tree can match.
338 createDOM('div', {'id': 'host'},
340 createDOM('style', {},
341 document.createTextNode('div ^^ span { border: 1px solid green; }')),
342 createDOM('span', {},
343 document.createTextNode('some text'))),
345 createDOM('shadow', {}),
346 createDOM('div', {'id': 'host2'},
348 createDOM('span', {'id': 'target'},
349 document.createTextNode('green border')))))));
351 borderColorShouldBe('host//host2/target', 'rgb(0, 128, 0)');
355 // :host ^^ * should not match desendant nodes of div#host.
357 createDOM('div', {'id': 'host'},
359 createDOM('style', {},
360 document.createTextNode(':host ^^ * { border: 1px solid red; }')),
361 createDOM('content', {})),
362 createDOM('div', {'id': 'child'},
363 document.createTextNode('show not red'))));
365 borderColorShouldNotBe('child', 'rgb(255, 0, 0)');
369 // Test for crbug.com/331871. 'div#inner h1' should not cross TreeScope boundary.
373 createDOM('style', {},
374 document.createTextNode('div#outer ^^ div#inner h1 { border: 1px solid red; }')),
375 createDOM('div', {'id': 'outer'},
376 createDOM('div', {'id': 'inner'},
378 createDOM('h1', {'id': 'target'},
379 document.createTextNode('no red border')))))));
381 borderColorShouldNotBe('inner/target', 'rgb(255, 0, 0)');
385 // :host ^^ span is declared in a shadow tree, but the shadow root does not participate in composed tree.
388 createDOM('div', {'id': 'host'},
390 createDOM('style', {},
391 document.createTextNode(':host ^^ span { border: 1px solid red; }')),
392 createDOM('span', {},
393 document.createTextNode('some text'))),
395 createDOM('span', {'id': 'target'},
396 document.createTextNode('not red border')))));
398 borderColorShouldNotBe('host//target', 'rgb(255, 0, 0)');