| OLD | NEW |
| 1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
| 2 <html> | 2 <html> |
| 3 <head> | 3 <head> |
| 4 <script src="../../../resources/js-test.js"></script> | 4 <script src="../../../resources/js-test.js"></script> |
| 5 <script src="resources/shadow-dom.js"></script> | 5 <script src="resources/shadow-dom.js"></script> |
| 6 </head> | 6 </head> |
| 7 <body> | 7 <body> |
| 8 <div id="console"></div> | 8 <div id="console"></div> |
| 9 <div id="sandbox"></div> | 9 <div id="sandbox"></div> |
| 10 <script> | 10 <script> |
| 11 description("Tests for Composed Shadow DOM Tree Traversal APIs. Can only run wit
hin DRT"); | 11 description("Tests for Composed Shadow DOM Tree Traversal APIs. Can only run wit
hin DRT"); |
| 12 | 12 |
| 13 function testComposedShadowTree(node) | 13 function testFlatTree(node) |
| 14 { | 14 { |
| 15 var sandbox = document.getElementById('sandbox'); | 15 var sandbox = document.getElementById('sandbox'); |
| 16 sandbox.innerHTML = ''; | 16 sandbox.innerHTML = ''; |
| 17 sandbox.appendChild(node); | 17 sandbox.appendChild(node); |
| 18 document.body.offsetLeft; | 18 document.body.offsetLeft; |
| 19 showComposedShadowTree(node); | 19 showFlatTree(node); |
| 20 } | 20 } |
| 21 | 21 |
| 22 debug('ShadowRoot should be used.'); | 22 debug('ShadowRoot should be used.'); |
| 23 testComposedShadowTree( | 23 testFlatTree( |
| 24 createDOM('div', {'id': 'a'}, | 24 createDOM('div', {'id': 'a'}, |
| 25 createShadowRoot(createDOM('div', {'id': 'b'})), | 25 createShadowRoot(createDOM('div', {'id': 'b'})), |
| 26 createDOM('div', {'id': 'c'}))); | 26 createDOM('div', {'id': 'c'}))); |
| 27 | 27 |
| 28 debug('A content element should select light children'); | 28 debug('A content element should select light children'); |
| 29 testComposedShadowTree( | 29 testFlatTree( |
| 30 createDOM('div', {'id': 'a'}, | 30 createDOM('div', {'id': 'a'}, |
| 31 createShadowRoot(createDOM('div', {'id': 'b'}), | 31 createShadowRoot(createDOM('div', {'id': 'b'}), |
| 32 createDOM('content')), | 32 createDOM('content')), |
| 33 createDOM('div', {'id': 'c'}), | 33 createDOM('div', {'id': 'c'}), |
| 34 createDOM('div', {'id': 'd'}))); | 34 createDOM('div', {'id': 'd'}))); |
| 35 | 35 |
| 36 debug('Test for content element selector.'); | 36 debug('Test for content element selector.'); |
| 37 testComposedShadowTree( | 37 testFlatTree( |
| 38 createDOM('div', {'id': 'a'}, | 38 createDOM('div', {'id': 'a'}, |
| 39 createShadowRoot(createDOM('div', {'id': 'b'}), | 39 createShadowRoot(createDOM('div', {'id': 'b'}), |
| 40 createDOM('content', {'select': '#d'})), | 40 createDOM('content', {'select': '#d'})), |
| 41 createDOM('div', {'id': 'c'}), | 41 createDOM('div', {'id': 'c'}), |
| 42 createDOM('div', {'id': 'd'}), | 42 createDOM('div', {'id': 'd'}), |
| 43 createDOM('div', {'id': 'e'}))); | 43 createDOM('div', {'id': 'e'}))); |
| 44 | 44 |
| 45 debug('Light children should be selected only at once.'); | 45 debug('Light children should be selected only at once.'); |
| 46 testComposedShadowTree( | 46 testFlatTree( |
| 47 createDOM('div', {'id': 'a'}, | 47 createDOM('div', {'id': 'a'}, |
| 48 createShadowRoot(createDOM('div', {'id': 'b'}), | 48 createShadowRoot(createDOM('div', {'id': 'b'}), |
| 49 createDOM('content', {'select': '#d'}), | 49 createDOM('content', {'select': '#d'}), |
| 50 createDOM('content')), | 50 createDOM('content')), |
| 51 createDOM('div', {'id': 'c'}), | 51 createDOM('div', {'id': 'c'}), |
| 52 createDOM('div', {'id': 'd'}), | 52 createDOM('div', {'id': 'd'}), |
| 53 createDOM('div', {'id': 'e'}))); | 53 createDOM('div', {'id': 'e'}))); |
| 54 | 54 |
| 55 debug('A content element can have fallback elements.'); | 55 debug('A content element can have fallback elements.'); |
| 56 testComposedShadowTree( | 56 testFlatTree( |
| 57 createDOM('div', {'id': 'a'}, | 57 createDOM('div', {'id': 'a'}, |
| 58 createShadowRoot(createDOM('div', {'id': 'b'}), | 58 createShadowRoot(createDOM('div', {'id': 'b'}), |
| 59 createDOM('content', {'select': '#z'}, | 59 createDOM('content', {'select': '#z'}, |
| 60 createDOM('div', {'id': 'f1'}), | 60 createDOM('div', {'id': 'f1'}), |
| 61 createDOM('div', {'id': 'f2'}))), | 61 createDOM('div', {'id': 'f2'}))), |
| 62 createDOM('div', {'id': 'c'}))); | 62 createDOM('div', {'id': 'c'}))); |
| 63 | 63 |
| 64 debug('Fallback elements should not be used if a content element selects an elem
ent.'); | 64 debug('Fallback elements should not be used if a content element selects an elem
ent.'); |
| 65 testComposedShadowTree( | 65 testFlatTree( |
| 66 createDOM('div', {'id': 'a'}, | 66 createDOM('div', {'id': 'a'}, |
| 67 createShadowRoot(createDOM('div', {'id': 'b'}), | 67 createShadowRoot(createDOM('div', {'id': 'b'}), |
| 68 createDOM('content', {'select': '#c'}, | 68 createDOM('content', {'select': '#c'}, |
| 69 createDOM('div', {'id': 'f1'}, | 69 createDOM('div', {'id': 'f1'}, |
| 70 createDOM('div', {'id': 'f2'}
)))), | 70 createDOM('div', {'id': 'f2'}
)))), |
| 71 createDOM('div', {'id': 'c'}))); | 71 createDOM('div', {'id': 'c'}))); |
| 72 | 72 |
| 73 debug('Test for traversal, starting with a fallback element which is not used.')
; | 73 debug('Test for traversal, starting with a fallback element which is not used.')
; |
| 74 showComposedShadowTree(getNodeInTreeOfTrees('a/f1')); | 74 showFlatTree(getNodeInTreeOfTrees('a/f1')); |
| 75 showNextNode(getNodeInTreeOfTrees('a/f1')); | 75 showNextNode(getNodeInTreeOfTrees('a/f1')); |
| 76 showNextNode(getNodeInTreeOfTrees('a/f2')); | 76 showNextNode(getNodeInTreeOfTrees('a/f2')); |
| 77 debug(''); | 77 debug(''); |
| 78 | 78 |
| 79 debug('Test for Nested ShadowRoots.'); | 79 debug('Test for Nested ShadowRoots.'); |
| 80 testComposedShadowTree( | 80 testFlatTree( |
| 81 createDOM('div', {'id': 'a'}, | 81 createDOM('div', {'id': 'a'}, |
| 82 createShadowRoot(createDOM('div', {'id': 'b'}, | 82 createShadowRoot(createDOM('div', {'id': 'b'}, |
| 83 createShadowRoot(createDOM('div', {'id'
: 'c'}), | 83 createShadowRoot(createDOM('div', {'id'
: 'c'}), |
| 84 createDOM('content'), | 84 createDOM('content'), |
| 85 createDOM('div', {'id'
: 'd'})), | 85 createDOM('div', {'id'
: 'd'})), |
| 86 createDOM('div', {'id': 'e'})), | 86 createDOM('div', {'id': 'e'})), |
| 87 createDOM('div', {'id': 'f'}), | 87 createDOM('div', {'id': 'f'}), |
| 88 createDOM('content'), | 88 createDOM('content'), |
| 89 createDOM('div', {'id': 'g'})), | 89 createDOM('div', {'id': 'g'})), |
| 90 createDOM('div', {'id': 'h'}), | 90 createDOM('div', {'id': 'h'}), |
| 91 createDOM('div', {'id': 'i'}))); | 91 createDOM('div', {'id': 'i'}))); |
| 92 | 92 |
| 93 debug('Test for Multiple ShadowRoots.'); | 93 debug('Test for Multiple ShadowRoots.'); |
| 94 testComposedShadowTree( | 94 testFlatTree( |
| 95 createDOM('div', {'id': 'a'}, | 95 createDOM('div', {'id': 'a'}, |
| 96 createShadowRoot(createDOM('div', {'id': 'b'}), | 96 createShadowRoot(createDOM('div', {'id': 'b'}), |
| 97 createDOM('content'), | 97 createDOM('content'), |
| 98 createDOM('div', {'id': 'c'})), | 98 createDOM('div', {'id': 'c'})), |
| 99 createShadowRoot(createDOM('div', {'id': 'd'}), | 99 createShadowRoot(createDOM('div', {'id': 'd'}), |
| 100 createDOM('shadow', {}), | 100 createDOM('shadow', {}), |
| 101 createDOM('div', {'id': 'e'})), | 101 createDOM('div', {'id': 'e'})), |
| 102 createDOM('div', {'id': 'f'}))); | 102 createDOM('div', {'id': 'f'}))); |
| 103 | 103 |
| 104 debug('Test for inactive insertion points.'); | 104 debug('Test for inactive insertion points.'); |
| 105 testComposedShadowTree( | 105 testFlatTree( |
| 106 createDOM('div', {'id': 'a'}, | 106 createDOM('div', {'id': 'a'}, |
| 107 createDOM('content', {'id': 'b'}, | 107 createDOM('content', {'id': 'b'}, |
| 108 createDOM('content', {'id': 'c'})))); | 108 createDOM('content', {'id': 'c'})))); |
| 109 | 109 |
| 110 debug('Test for an orphaned shadow subtree.'); | 110 debug('Test for an orphaned shadow subtree.'); |
| 111 testComposedShadowTree( | 111 testFlatTree( |
| 112 createDOM('div', {'id': 'a'}, | 112 createDOM('div', {'id': 'a'}, |
| 113 createShadowRoot( | 113 createShadowRoot( |
| 114 createDOM('div', {'id': 'b'}, | 114 createDOM('div', {'id': 'b'}, |
| 115 createDOM('div', {'id': 'c'}))), | 115 createDOM('div', {'id': 'c'}))), |
| 116 createShadowRoot( | 116 createShadowRoot( |
| 117 createDOM('div', {'id': 'd'})))); | 117 createDOM('div', {'id': 'd'})))); |
| 118 | 118 |
| 119 debug('Test for traversal, starting with a node in an orphaned shadow subtree.')
; | 119 debug('Test for traversal, starting with a node in an orphaned shadow subtree.')
; |
| 120 showComposedShadowTree(getNodeInTreeOfTrees('a/b')); | 120 showFlatTree(getNodeInTreeOfTrees('a/b')); |
| 121 | 121 |
| 122 debug('Test for a content element which does not select any nodes nor have fallb
ack elements.'); | 122 debug('Test for a content element which does not select any nodes nor have fallb
ack elements.'); |
| 123 testComposedShadowTree( | 123 testFlatTree( |
| 124 createDOM('div', {'id': 'a'}, | 124 createDOM('div', {'id': 'a'}, |
| 125 createShadowRoot(createDOM('content', {'select': '#none'}), | 125 createShadowRoot(createDOM('content', {'select': '#none'}), |
| 126 createDOM('div', {'id': 'b'}), | 126 createDOM('div', {'id': 'b'}), |
| 127 createDOM('content', {'select': '#none'}), | 127 createDOM('content', {'select': '#none'}), |
| 128 createDOM('div', {'id': 'c'}), | 128 createDOM('div', {'id': 'c'}), |
| 129 createDOM('content', {'select': '#none'})))); | 129 createDOM('content', {'select': '#none'})))); |
| 130 | 130 |
| 131 debug('Test for a nested insertion point.'); | 131 debug('Test for a nested insertion point.'); |
| 132 testComposedShadowTree( | 132 testFlatTree( |
| 133 createDOM('div', {'id': 'a'}, | 133 createDOM('div', {'id': 'a'}, |
| 134 createShadowRoot(createDOM('div', {'id': 'b'}, | 134 createShadowRoot(createDOM('div', {'id': 'b'}, |
| 135 createShadowRoot(createDOM('content', {
})), | 135 createShadowRoot(createDOM('content', {
})), |
| 136 createDOM('content', {}))), | 136 createDOM('content', {}))), |
| 137 createDOM('div', {'id': 'c'}))); | 137 createDOM('div', {'id': 'c'}))); |
| 138 | 138 |
| 139 debug('Test for nested insertion points. Some of them are either empty insertion
points or inactive insertion points.'); | 139 debug('Test for nested insertion points. Some of them are either empty insertion
points or inactive insertion points.'); |
| 140 testComposedShadowTree( | 140 testFlatTree( |
| 141 createDOM('div', {'id': 'a'}, | 141 createDOM('div', {'id': 'a'}, |
| 142 createShadowRoot(createDOM('content', {'select': '#none'}), | 142 createShadowRoot(createDOM('content', {'select': '#none'}), |
| 143 createDOM('div', {'id': 'b'}, | 143 createDOM('div', {'id': 'b'}, |
| 144 createShadowRoot(createDOM('content', {
'select': '.select-1'}), | 144 createShadowRoot(createDOM('content', {
'select': '.select-1'}), |
| 145 createDOM('div', {'id'
: 'c'}), | 145 createDOM('div', {'id'
: 'c'}), |
| 146 createDOM('content', {
'select': '.select-2'})), | 146 createDOM('content', {
'select': '.select-2'})), |
| 147 createDOM('content', {'class': 'select-
1', 'select': '.select-4'}), | 147 createDOM('content', {'class': 'select-
1', 'select': '.select-4'}), |
| 148 createDOM('content', {'class': 'select-
2', 'select': '#none'}), | 148 createDOM('content', {'class': 'select-
2', 'select': '#none'}), |
| 149 createDOM('div', {'id': 'd', 'class': '
select-2'}), | 149 createDOM('div', {'id': 'd', 'class': '
select-2'}), |
| 150 createDOM('content', {'class': 'select-
2', 'select': '#none'}), | 150 createDOM('content', {'class': 'select-
2', 'select': '#none'}), |
| 151 createDOM('div', {'id': 'e', 'class': '
select-2'}), | 151 createDOM('div', {'id': 'e', 'class': '
select-2'}), |
| 152 createDOM('content', {'class': 'select-
2', 'select': '#none'}))), | 152 createDOM('content', {'class': 'select-
2', 'select': '#none'}))), |
| 153 createDOM('content', {'id': 'inactive-insertion-point', 'class': '
select-4'}), | 153 createDOM('content', {'id': 'inactive-insertion-point', 'class': '
select-4'}), |
| 154 createDOM('div', {'id': 'should-not-be-selected'}), | 154 createDOM('div', {'id': 'should-not-be-selected'}), |
| 155 createDOM('div', {'id': 'f', 'class': 'select-4'}))); | 155 createDOM('div', {'id': 'f', 'class': 'select-4'}))); |
| 156 | 156 |
| 157 debug('Test for a re-projection.'); | 157 debug('Test for a re-projection.'); |
| 158 testComposedShadowTree( | 158 testFlatTree( |
| 159 createDOM('div', {'id': 'a'}, | 159 createDOM('div', {'id': 'a'}, |
| 160 createShadowRoot( | 160 createShadowRoot( |
| 161 createDOM('div', {'id': 'b'}, | 161 createDOM('div', {'id': 'b'}, |
| 162 createShadowRoot(createDOM('content', {'select': '#c
'})), | 162 createShadowRoot(createDOM('content', {'select': '#c
'})), |
| 163 createDOM('content', {'select': '#c'}))), | 163 createDOM('content', {'select': '#c'}))), |
| 164 createDOM('div', {'id': 'c'}))); | 164 createDOM('div', {'id': 'c'}))); |
| 165 | 165 |
| 166 debug('Test for a content element which is selected by another content element.'
); | 166 debug('Test for a content element which is selected by another content element.'
); |
| 167 testComposedShadowTree( | 167 testFlatTree( |
| 168 createDOM('div', {'id': 'a'}, | 168 createDOM('div', {'id': 'a'}, |
| 169 createShadowRoot( | 169 createShadowRoot( |
| 170 createDOM('div', {'id': 'b'}, | 170 createDOM('div', {'id': 'b'}, |
| 171 createShadowRoot(createDOM('content', {'select': '#c
ontent'}), | 171 createShadowRoot(createDOM('content', {'select': '#c
ontent'}), |
| 172 createDOM('div', {'id': 'most-inner
-child'}), | 172 createDOM('div', {'id': 'most-inner
-child'}), |
| 173 createDOM('content', {'select': '#h
ost-child'})), | 173 createDOM('content', {'select': '#h
ost-child'})), |
| 174 createDOM('content', {'id': 'content', 'select': '#h
ost-child'}, | 174 createDOM('content', {'id': 'content', 'select': '#h
ost-child'}, |
| 175 createDOM('div', {'id': 'should-not-be-use
d'})), | 175 createDOM('div', {'id': 'should-not-be-use
d'})), |
| 176 createDOM('div', {'id': 'inner-child', 'class': 'foo
'}))), | 176 createDOM('div', {'id': 'inner-child', 'class': 'foo
'}))), |
| 177 createDOM('div', {'id': 'host-child'}))); | 177 createDOM('div', {'id': 'host-child'}))); |
| 178 | 178 |
| 179 debug('Test for a reprojection. Content elements should be used in document orde
r.'); | 179 debug('Test for a reprojection. Content elements should be used in document orde
r.'); |
| 180 testComposedShadowTree( | 180 testFlatTree( |
| 181 createDOM('div', {'id': 'a'}, | 181 createDOM('div', {'id': 'a'}, |
| 182 createShadowRoot( | 182 createShadowRoot( |
| 183 createDOM('content', {'select': '#host-child1'}), | 183 createDOM('content', {'select': '#host-child1'}), |
| 184 createDOM('div', {'id': 'b'}, | 184 createDOM('div', {'id': 'b'}, |
| 185 createShadowRoot(createDOM('content', {'select': '.c
hild'})), | 185 createShadowRoot(createDOM('content', {'select': '.c
hild'})), |
| 186 createDOM('content', {'select': '.child'}))), | 186 createDOM('content', {'select': '.child'}))), |
| 187 createDOM('div', {'id': 'host-child1', 'class': 'child'}), | 187 createDOM('div', {'id': 'host-child1', 'class': 'child'}), |
| 188 createDOM('div', {'id': 'host-child2', 'class': 'child'}))); | 188 createDOM('div', {'id': 'host-child2', 'class': 'child'}))); |
| 189 | 189 |
| 190 debug('Test for complex re-projections.'); | 190 debug('Test for complex re-projections.'); |
| 191 testComposedShadowTree( | 191 testFlatTree( |
| 192 createDOM('div', {'id': 'a'}, | 192 createDOM('div', {'id': 'a'}, |
| 193 createShadowRoot( | 193 createShadowRoot( |
| 194 createDOM('div', {'id': 'b'}, | 194 createDOM('div', {'id': 'b'}, |
| 195 createShadowRoot(createDOM('content', {'select': '.f
oo'}), | 195 createShadowRoot(createDOM('content', {'select': '.f
oo'}), |
| 196 createDOM('div', {'id': 'c'})), | 196 createDOM('div', {'id': 'c'})), |
| 197 // Select #child-1 | 197 // Select #child-1 |
| 198 createDOM('content', {'select': '#child-1'}, | 198 createDOM('content', {'select': '#child-1'}, |
| 199 createDOM('div', {'class': 'should-not-be-
used'}), | 199 createDOM('div', {'class': 'should-not-be-
used'}), |
| 200 // Should not select any nodes since it's
inactive. | 200 // Should not select any nodes since it's
inactive. |
| 201 createDOM('content', {'class': 'should-be-
inactive', 'select': '.foo'})), | 201 createDOM('content', {'class': 'should-be-
inactive', 'select': '.foo'})), |
| 202 createDOM('div', {'id': 'd', 'class': 'foo'}, | 202 createDOM('div', {'id': 'd', 'class': 'foo'}, |
| 203 createShadowRoot(createDOM('div', {'id': '
e'}), | 203 createShadowRoot(createDOM('div', {'id': '
e'}), |
| 204 // Should select #child-2
and #g. | 204 // Should select #child-2
and #g. |
| 205 createDOM('content', {'se
lect': '.foo'}), | 205 createDOM('content', {'se
lect': '.foo'}), |
| 206 createDOM('div', {'id': '
f'})), | 206 createDOM('div', {'id': '
f'})), |
| 207 // Select #child-2 | 207 // Select #child-2 |
| 208 createDOM('content', {'select': '#child-2'
}), | 208 createDOM('content', {'select': '#child-2'
}), |
| 209 createDOM('div', {'id': 'g', 'class': 'foo
'})), | 209 createDOM('div', {'id': 'g', 'class': 'foo
'})), |
| 210 createDOM('div', {'class': 'should-not-be-selected'}
), | 210 createDOM('div', {'class': 'should-not-be-selected'}
), |
| 211 createDOM('div', {'id': 'h', 'class': 'foo'}))), | 211 createDOM('div', {'id': 'h', 'class': 'foo'}))), |
| 212 createDOM('div', {'id': 'child-1', 'class': 'foo'}), | 212 createDOM('div', {'id': 'child-1', 'class': 'foo'}), |
| 213 createDOM('div', {'id': 'not-selected', 'class': 'foo'}), | 213 createDOM('div', {'id': 'not-selected', 'class': 'foo'}), |
| 214 createDOM('div', {'id': 'child-2', 'class': 'foo'}))); | 214 createDOM('div', {'id': 'child-2', 'class': 'foo'}))); |
| 215 | 215 |
| 216 debug('Test for a shadow insertion point where nothing is distributed.'); | 216 debug('Test for a shadow insertion point where nothing is distributed.'); |
| 217 testComposedShadowTree( | 217 testFlatTree( |
| 218 createDOM('div', {'id': 'a'}, | 218 createDOM('div', {'id': 'a'}, |
| 219 createShadowRoot(), | 219 createShadowRoot(), |
| 220 createShadowRoot( | 220 createShadowRoot( |
| 221 createDOM('div', {'id': 'b'}), | 221 createDOM('div', {'id': 'b'}), |
| 222 createDOM('shadow', {'id': 'shadow'}, | 222 createDOM('shadow', {'id': 'shadow'}, |
| 223 createDOM('div', {'id': 'should-not-be-used'})), | 223 createDOM('div', {'id': 'should-not-be-used'})), |
| 224 createDOM('div', {'id': 'c'})))); | 224 createDOM('div', {'id': 'c'})))); |
| 225 </script> | 225 </script> |
| 226 </body> | 226 </body> |
| 227 </html> | 227 </html> |
| OLD | NEW |