|
26 | 26 | var OriginalElement = window.Element;
|
27 | 27 | var OriginalDocument = window.HTMLDocument || window.Document;
|
28 | 28 |
|
29 |
| - function filterNodeList(list, index, result) { |
| 29 | + function filterNodeList(list, index, result, deep) { |
30 | 30 | var wrappedItem = null;
|
31 | 31 | var root = null;
|
32 | 32 | for (var i = 0, length = list.length; i < length; i++) {
|
33 | 33 | wrappedItem = wrap(list[i]);
|
34 |
| - if (root = getTreeScope(wrappedItem).root) { |
| 34 | + if (!deep && (root = getTreeScope(wrappedItem).root)) { |
35 | 35 | if (root instanceof scope.wrappers.ShadowRoot) {
|
36 | 36 | continue;
|
37 | 37 | }
|
|
42 | 42 | return index;
|
43 | 43 | }
|
44 | 44 |
|
| 45 | + function shimSelector(selector) { |
| 46 | + return String(selector).replace(/\/deep\//g, ' '); |
| 47 | + } |
| 48 | + |
45 | 49 | function findOne(node, selector) {
|
46 | 50 | var m, el = node.firstElementChild;
|
47 | 51 | while (el) {
|
|
98 | 102 | // Structural Pseudo Classes are not guarenteed to be correct
|
99 | 103 | // http://www.w3.org/TR/css3-selectors/#simple-selectors
|
100 | 104 |
|
101 |
| - function querySelectorAllFiltered (p, index, result, selector) { |
| 105 | + function querySelectorAllFiltered(p, index, result, selector, deep) { |
102 | 106 | var target = unsafeUnwrap(this);
|
103 | 107 | var list;
|
104 | 108 | var root = getTreeScope(this).root;
|
|
116 | 120 | return findElements(this, index, result, p, selector, null);
|
117 | 121 | }
|
118 | 122 |
|
119 |
| - return filterNodeList(list, index, result); |
| 123 | + return filterNodeList(list, index, result, deep); |
120 | 124 | }
|
121 | 125 |
|
122 | 126 | var SelectorsInterface = {
|
123 | 127 | querySelector: function(selector) {
|
| 128 | + var shimmed = shimSelector(selector); |
| 129 | + var deep = shimmed !== selector; |
| 130 | + selector = shimmed; |
| 131 | + |
124 | 132 | var target = unsafeUnwrap(this);
|
125 | 133 | var wrappedItem;
|
126 | 134 | var root = getTreeScope(this).root;
|
|
142 | 150 | // When the original query returns nothing
|
143 | 151 | // we return nothing (to be consistent with the other wrapped calls)
|
144 | 152 | return wrappedItem;
|
145 |
| - } else if (root = getTreeScope(wrappedItem).root) { |
| 153 | + } else if (!deep && (root = getTreeScope(wrappedItem).root)) { |
146 | 154 | if (root instanceof scope.wrappers.ShadowRoot) {
|
147 | 155 | // When the original query returns an element in the ShadowDOM
|
148 | 156 | // we must do a manual tree traversal
|
|
153 | 161 | return wrappedItem;
|
154 | 162 | },
|
155 | 163 | querySelectorAll: function(selector) {
|
| 164 | + var shimmed = shimSelector(selector); |
| 165 | + var deep = shimmed !== selector; |
| 166 | + selector = shimmed; |
| 167 | + |
156 | 168 | var result = new NodeList();
|
157 | 169 |
|
158 | 170 | result.length = querySelectorAllFiltered.call(this,
|
159 | 171 | matchesSelector,
|
160 | 172 | 0,
|
161 | 173 | result,
|
162 |
| - selector); |
| 174 | + selector, |
| 175 | + deep); |
163 | 176 |
|
164 | 177 | return result;
|
165 | 178 | }
|
166 | 179 | };
|
167 | 180 |
|
168 |
| - function getElementsByTagNameFiltered (p, index, result, localName, lowercase) { |
| 181 | + function getElementsByTagNameFiltered(p, index, result, localName, |
| 182 | + lowercase) { |
169 | 183 | var target = unsafeUnwrap(this);
|
170 | 184 | var list;
|
171 | 185 | var root = getTreeScope(this).root;
|
|
174 | 188 | // going to be disconnected so we do a manual tree traversal
|
175 | 189 | return findElements(this, index, result, p, localName, lowercase);
|
176 | 190 | } else if (target instanceof OriginalElement) {
|
177 |
| - list = originalElementGetElementsByTagName.call(target, localName, lowercase); |
| 191 | + list = originalElementGetElementsByTagName.call(target, localName, |
| 192 | + lowercase); |
178 | 193 | } else if (target instanceof OriginalDocument) {
|
179 |
| - list = originalDocumentGetElementsByTagName.call(target, localName, lowercase); |
| 194 | + list = originalDocumentGetElementsByTagName.call(target, localName, |
| 195 | + lowercase); |
180 | 196 | } else {
|
181 | 197 | // When we get a ShadowRoot the logical tree is going to be disconnected
|
182 | 198 | // so we do a manual tree traversal
|
183 | 199 | return findElements(this, index, result, p, localName, lowercase);
|
184 | 200 | }
|
185 | 201 |
|
186 |
| - return filterNodeList(list, index, result); |
| 202 | + return filterNodeList(list, index, result, false); |
187 | 203 | }
|
188 | 204 |
|
189 |
| - function getElementsByTagNameNSFiltered (p, index, result, ns, localName) { |
| 205 | + function getElementsByTagNameNSFiltered(p, index, result, ns, localName) { |
190 | 206 | var target = unsafeUnwrap(this);
|
191 | 207 | var list;
|
192 | 208 | var root = getTreeScope(this).root;
|
|
204 | 220 | return findElements(this, index, result, p, ns, localName);
|
205 | 221 | }
|
206 | 222 |
|
207 |
| - return filterNodeList(list, index, result); |
| 223 | + return filterNodeList(list, index, result, false); |
208 | 224 | }
|
209 | 225 |
|
210 | 226 | var GetElementsByInterface = {
|
211 | 227 | getElementsByTagName: function(localName) {
|
212 | 228 | var result = new HTMLCollection();
|
213 | 229 | var match = localName === '*' ? matchesEveryThing : matchesTagName;
|
214 | 230 |
|
215 |
| - result.length = getElementsByTagNameFiltered.call(this, |
| 231 | + result.length = getElementsByTagNameFiltered.call(this, |
216 | 232 | match,
|
217 |
| - 0, |
| 233 | + 0, |
218 | 234 | result,
|
219 | 235 | localName,
|
220 | 236 | localName.toLowerCase());
|
|
236 | 252 | } else {
|
237 | 253 | match = localName === '*' ? matchesNameSpace : matchesLocalNameNS;
|
238 | 254 | }
|
239 |
| - |
240 |
| - result.length = getElementsByTagNameNSFiltered.call(this, |
| 255 | + |
| 256 | + result.length = getElementsByTagNameNSFiltered.call(this, |
241 | 257 | match,
|
242 | 258 | 0,
|
243 | 259 | result,
|
|
0 commit comments