Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 /* | 1 /* |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-present eyeo GmbH | 3 * Copyright (C) 2006-present eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
45 }; | 45 }; |
46 | 46 |
47 function timeout(delay) | 47 function timeout(delay) |
48 { | 48 { |
49 return new Promise((resolve, reject) => | 49 return new Promise((resolve, reject) => |
50 { | 50 { |
51 window.setTimeout(resolve, delay); | 51 window.setTimeout(resolve, delay); |
52 }); | 52 }); |
53 } | 53 } |
54 | 54 |
55 function unexpectedError(error) | 55 function unexpectedError(test, error) |
56 { | 56 { |
57 console.error(error); | 57 console.error(error); |
58 this.ok(false, "Unexpected error: " + error); | 58 test.ok(false, "Unexpected error: " + error); |
59 } | 59 } |
60 | 60 |
61 function expectHidden(test, element, id) | 61 function expectHidden(test, element, id) |
62 { | 62 { |
63 let withId = ""; | 63 let withId = ""; |
64 if (typeof id != "undefined") | 64 if (typeof id != "undefined") |
65 withId = ` with ID '${id}'`; | 65 withId = ` with ID '${id}'`; |
66 | 66 |
67 test.equal( | 67 test.equal( |
68 window.getComputedStyle(element).display, "none", | 68 window.getComputedStyle(element).display, "none", |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
141 // Insert a <div> with a unique id and a CSS rule | 141 // Insert a <div> with a unique id and a CSS rule |
142 // for the the selector matching the id. | 142 // for the the selector matching the id. |
143 function createElementWithStyle(styleBlock, parent) | 143 function createElementWithStyle(styleBlock, parent) |
144 { | 144 { |
145 let element = createElement(parent); | 145 let element = createElement(parent); |
146 insertStyleRule("#" + element.id + " " + styleBlock); | 146 insertStyleRule("#" + element.id + " " + styleBlock); |
147 return element; | 147 return element; |
148 } | 148 } |
149 | 149 |
150 // Create a new ElemHideEmulation instance with @selectors. | 150 // Create a new ElemHideEmulation instance with @selectors. |
151 async function applyElemHideEmulation(selectors, test) | 151 async function applyElemHideEmulation(test, selectors) |
152 { | 152 { |
153 await Promise.resolve(); | 153 await Promise.resolve(); |
Manish Jethani
2019/01/17 08:03:33
This should not be necessary but I left it in for
| |
154 | 154 |
155 let elemHideEmulation = null; | |
156 | |
157 try | 155 try |
158 { | 156 { |
159 elemHideEmulation = new ElemHideEmulation( | 157 let elemHideEmulation = new ElemHideEmulation( |
160 elems => | 158 elems => |
161 { | 159 { |
162 for (let elem of elems) | 160 for (let elem of elems) |
163 elem.style.display = "none"; | 161 elem.style.display = "none"; |
164 } | 162 } |
165 ); | 163 ); |
166 | 164 |
167 elemHideEmulation.document = testDocument; | 165 elemHideEmulation.document = testDocument; |
168 elemHideEmulation.MIN_INVOCATION_INTERVAL = REFRESH_INTERVAL / 2; | 166 elemHideEmulation.MIN_INVOCATION_INTERVAL = REFRESH_INTERVAL / 2; |
169 elemHideEmulation.apply(selectors.map( | 167 elemHideEmulation.apply(selectors.map( |
170 selector => ({selector, text: selector}) | 168 selector => ({selector, text: selector}) |
171 )); | 169 )); |
170 | |
171 return elemHideEmulation; | |
172 } | 172 } |
173 catch (error) | 173 catch (error) |
174 { | 174 { |
175 if (!test) | 175 unexpectedError(test, error); |
Manish Jethani
2019/01/17 08:03:33
This should not be necessary if every call to this
Manish Jethani
2019/01/17 08:04:36
Removed now.
| |
176 throw error; | 176 } |
177 | |
178 unexpectedError.call(test, error); | |
179 return null; | |
180 } | |
181 | |
182 return elemHideEmulation; | |
183 } | 177 } |
184 | 178 |
185 exports.testVerbatimPropertySelector = async function(test) | 179 exports.testVerbatimPropertySelector = async function(test) |
186 { | 180 { |
187 let toHide = createElementWithStyle("{background-color: #000}"); | 181 let toHide = createElementWithStyle("{background-color: #000}"); |
188 | 182 let selectors = [":-abp-properties(background-color: rgb(0, 0, 0))"]; |
189 if (await applyElemHideEmulation( | 183 |
190 [":-abp-properties(background-color: rgb(0, 0, 0))"], | 184 if (await applyElemHideEmulation(test, selectors)) |
191 test | |
192 )) | |
193 { | |
194 expectHidden(test, toHide); | 185 expectHidden(test, toHide); |
195 } | |
196 | 186 |
197 test.done(); | 187 test.done(); |
198 }; | 188 }; |
199 | 189 |
200 exports.testVerbatimPropertySelectorWithPrefix = async function(test) | 190 exports.testVerbatimPropertySelectorWithPrefix = async function(test) |
201 { | 191 { |
202 let parent = createElementWithStyle("{background-color: #000}"); | 192 let parent = createElementWithStyle("{background-color: #000}"); |
203 let toHide = createElementWithStyle("{background-color: #000}", parent); | 193 let toHide = createElementWithStyle("{background-color: #000}", parent); |
204 | 194 |
205 if (await applyElemHideEmulation( | 195 let selectors = ["div > :-abp-properties(background-color: rgb(0, 0, 0))"]; |
206 ["div > :-abp-properties(background-color: rgb(0, 0, 0))"], | 196 |
207 test | 197 if (await applyElemHideEmulation(test, selectors)) |
208 )) | |
209 { | 198 { |
210 expectVisible(test, parent); | 199 expectVisible(test, parent); |
211 expectHidden(test, toHide); | 200 expectHidden(test, toHide); |
212 } | 201 } |
213 | 202 |
214 test.done(); | 203 test.done(); |
215 }; | 204 }; |
216 | 205 |
217 exports.testVerbatimPropertySelectorWithPrefixNoMatch = function(test) | 206 exports.testVerbatimPropertySelectorWithPrefixNoMatch = async function(test) |
218 { | 207 { |
219 let parent = createElementWithStyle("{background-color: #000}"); | 208 let parent = createElementWithStyle("{background-color: #000}"); |
220 let toHide = createElementWithStyle("{background-color: #fff}", parent); | 209 let toHide = createElementWithStyle("{background-color: #fff}", parent); |
221 applyElemHideEmulation( | 210 |
222 ["div > :-abp-properties(background-color: rgb(0, 0, 0))"] | 211 let selectors = ["div > :-abp-properties(background-color: rgb(0, 0, 0))"]; |
223 ).then(() => | 212 |
213 if (await applyElemHideEmulation(test, selectors)) | |
224 { | 214 { |
225 expectVisible(test, parent); | 215 expectVisible(test, parent); |
226 expectVisible(test, toHide); | 216 expectVisible(test, toHide); |
227 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 217 } |
228 }; | 218 |
229 | 219 test.done(); |
230 exports.testVerbatimPropertySelectorWithSuffix = function(test) | 220 }; |
221 | |
222 exports.testVerbatimPropertySelectorWithSuffix = async function(test) | |
231 { | 223 { |
232 let parent = createElementWithStyle("{background-color: #000}"); | 224 let parent = createElementWithStyle("{background-color: #000}"); |
233 let toHide = createElementWithStyle("{background-color: #000}", parent); | 225 let toHide = createElementWithStyle("{background-color: #000}", parent); |
234 applyElemHideEmulation( | 226 |
235 [":-abp-properties(background-color: rgb(0, 0, 0)) > div"] | 227 let selectors = [":-abp-properties(background-color: rgb(0, 0, 0)) > div"]; |
236 ).then(() => | 228 |
229 if (await applyElemHideEmulation(test, selectors)) | |
237 { | 230 { |
238 expectVisible(test, parent); | 231 expectVisible(test, parent); |
239 expectHidden(test, toHide); | 232 expectHidden(test, toHide); |
240 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 233 } |
241 }; | 234 |
242 | 235 test.done(); |
243 exports.testVerbatimPropertyPseudoSelectorWithPrefixAndSuffix = function(test) | 236 }; |
237 | |
238 exports.testVerbatimPropertyPseudoSelectorWithPrefixAndSuffix = async function(t est) | |
244 { | 239 { |
245 let parent = createElementWithStyle("{background-color: #000}"); | 240 let parent = createElementWithStyle("{background-color: #000}"); |
246 let middle = createElementWithStyle("{background-color: #000}", parent); | 241 let middle = createElementWithStyle("{background-color: #000}", parent); |
247 let toHide = createElementWithStyle("{background-color: #000}", middle); | 242 let toHide = createElementWithStyle("{background-color: #000}", middle); |
248 applyElemHideEmulation( | 243 |
249 ["div > :-abp-properties(background-color: rgb(0, 0, 0)) > div"] | 244 let selectors = ["div > :-abp-properties(background-color: rgb(0, 0, 0)) > div "]; |
250 ).then(() => | 245 |
246 if (await applyElemHideEmulation(test, selectors)) | |
251 { | 247 { |
252 expectVisible(test, parent); | 248 expectVisible(test, parent); |
253 expectVisible(test, middle); | 249 expectVisible(test, middle); |
254 expectHidden(test, toHide); | 250 expectHidden(test, toHide); |
255 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 251 } |
252 | |
253 test.done(); | |
256 }; | 254 }; |
257 | 255 |
258 // Add the style. Then add the element for that style. | 256 // Add the style. Then add the element for that style. |
259 // This should retrigger the filtering and hide it. | 257 // This should retrigger the filtering and hide it. |
260 exports.testPropertyPseudoSelectorAddStyleAndElement = function(test) | 258 exports.testPropertyPseudoSelectorAddStyleAndElement = async function(test) |
261 { | 259 { |
262 let styleElement; | 260 let styleElement; |
263 let toHide; | 261 let toHide; |
264 applyElemHideEmulation( | 262 |
265 [":-abp-properties(background-color: rgb(0, 0, 0))"] | 263 let selectors = [":-abp-properties(background-color: rgb(0, 0, 0))"]; |
266 ).then(() => | 264 |
265 if (await applyElemHideEmulation(test, selectors)) | |
267 { | 266 { |
268 styleElement = testDocument.createElement("style"); | 267 styleElement = testDocument.createElement("style"); |
269 testDocument.head.appendChild(styleElement); | 268 testDocument.head.appendChild(styleElement); |
270 styleElement.sheet.insertRule("#toHide {background-color: #000}"); | 269 styleElement.sheet.insertRule("#toHide {background-color: #000}"); |
271 return timeout(REFRESH_INTERVAL); | 270 await timeout(REFRESH_INTERVAL); |
272 }).then(() => | 271 |
273 { | |
274 toHide = createElement(); | 272 toHide = createElement(); |
275 toHide.id = "toHide"; | 273 toHide.id = "toHide"; |
276 expectVisible(test, toHide); | 274 expectVisible(test, toHide); |
277 return timeout(REFRESH_INTERVAL); | 275 await timeout(REFRESH_INTERVAL); |
278 }).then(() => | 276 |
279 { | |
280 expectHidden(test, toHide); | 277 expectHidden(test, toHide); |
281 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 278 } |
282 }; | 279 |
283 | 280 test.done(); |
284 exports.testPropertySelectorWithWildcard = function(test) | 281 }; |
282 | |
283 exports.testPropertySelectorWithWildcard = async function(test) | |
285 { | 284 { |
286 let toHide = createElementWithStyle("{background-color: #000}"); | 285 let toHide = createElementWithStyle("{background-color: #000}"); |
287 applyElemHideEmulation( | 286 let selectors = [":-abp-properties(*color: rgb(0, 0, 0))"]; |
288 [":-abp-properties(*color: rgb(0, 0, 0))"] | 287 |
289 ).then(() => | 288 if (await applyElemHideEmulation(test, selectors)) |
290 { | |
291 expectHidden(test, toHide); | 289 expectHidden(test, toHide); |
292 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 290 |
293 }; | 291 test.done(); |
294 | 292 }; |
295 exports.testPropertySelectorWithRegularExpression = function(test) | 293 |
294 exports.testPropertySelectorWithRegularExpression = async function(test) | |
296 { | 295 { |
297 let toHide = createElementWithStyle("{background-color: #000}"); | 296 let toHide = createElementWithStyle("{background-color: #000}"); |
298 applyElemHideEmulation( | 297 let selectors = [":-abp-properties(/.*color: rgb\\(0, 0, 0\\)/)"]; |
299 [":-abp-properties(/.*color: rgb\\(0, 0, 0\\)/)"] | 298 |
300 ).then(() => | 299 if (await applyElemHideEmulation(test, selectors)) |
301 { | |
302 expectHidden(test, toHide); | 300 expectHidden(test, toHide); |
303 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 301 |
304 }; | 302 test.done(); |
305 | 303 }; |
306 exports.testPropertySelectorWithEscapedBrace = function(test) | 304 |
305 exports.testPropertySelectorWithEscapedBrace = async function(test) | |
307 { | 306 { |
308 let toHide = createElementWithStyle("{background-color: #000}"); | 307 let toHide = createElementWithStyle("{background-color: #000}"); |
309 applyElemHideEmulation( | 308 let selectors = [":-abp-properties(/background.\\7B 0,6\\7D : rgb\\(0, 0, 0\\) /)"]; |
310 [":-abp-properties(/background.\\7B 0,6\\7D : rgb\\(0, 0, 0\\)/)"] | 309 |
311 ).then(() => | 310 if (await applyElemHideEmulation(test, selectors)) |
312 { | |
313 expectHidden(test, toHide); | 311 expectHidden(test, toHide); |
314 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 312 |
315 }; | 313 test.done(); |
316 | 314 }; |
317 exports.testPropertySelectorWithImproperlyEscapedBrace = function(test) | 315 |
316 exports.testPropertySelectorWithImproperlyEscapedBrace = async function(test) | |
318 { | 317 { |
319 let toHide = createElementWithStyle("{background-color: #000}"); | 318 let toHide = createElementWithStyle("{background-color: #000}"); |
320 applyElemHideEmulation( | 319 let selectors = [":-abp-properties(/background.\\7B0,6\\7D: rgb\\(0, 0, 0\\)/) "]; |
321 [":-abp-properties(/background.\\7B0,6\\7D: rgb\\(0, 0, 0\\)/)"] | 320 |
322 ).then(() => | 321 if (await applyElemHideEmulation(test, selectors)) |
323 { | |
324 expectVisible(test, toHide); | 322 expectVisible(test, toHide); |
325 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 323 |
326 }; | 324 test.done(); |
327 | 325 }; |
328 exports.testDynamicallyChangedProperty = function(test) | 326 |
327 exports.testDynamicallyChangedProperty = async function(test) | |
329 { | 328 { |
330 let toHide = createElementWithStyle("{}"); | 329 let toHide = createElementWithStyle("{}"); |
331 applyElemHideEmulation( | 330 let selectors = [":-abp-properties(background-color: rgb(0, 0, 0))"]; |
332 [":-abp-properties(background-color: rgb(0, 0, 0))"] | 331 |
333 ).then(() => | 332 if (await applyElemHideEmulation(test, selectors)) |
334 { | 333 { |
335 expectVisible(test, toHide); | 334 expectVisible(test, toHide); |
336 insertStyleRule("#" + toHide.id + " {background-color: #000}"); | 335 insertStyleRule("#" + toHide.id + " {background-color: #000}"); |
337 | 336 |
338 return timeout(0); | 337 await timeout(0); |
339 }).then(() => | 338 |
340 { | |
341 // Re-evaluation will only happen after a delay | 339 // Re-evaluation will only happen after a delay |
342 expectVisible(test, toHide); | 340 expectVisible(test, toHide); |
343 return timeout(REFRESH_INTERVAL); | 341 await timeout(REFRESH_INTERVAL); |
344 }).then(() => | 342 |
345 { | |
346 expectHidden(test, toHide); | 343 expectHidden(test, toHide); |
347 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 344 } |
348 }; | 345 |
349 | 346 test.done(); |
350 exports.testPseudoClassWithPropBeforeSelector = function(test) | 347 }; |
348 | |
349 exports.testPseudoClassWithPropBeforeSelector = async function(test) | |
351 { | 350 { |
352 let parent = createElementWithStyle("{}"); | 351 let parent = createElementWithStyle("{}"); |
353 let child = createElementWithStyle("{background-color: #000}", parent); | 352 let child = createElementWithStyle("{background-color: #000}", parent); |
353 | |
354 let selectors = ["div:-abp-properties(content: \"publicite\")"]; | |
355 | |
354 insertStyleRule(`#${child.id}::before {content: "publicite"}`); | 356 insertStyleRule(`#${child.id}::before {content: "publicite"}`); |
355 | 357 |
356 applyElemHideEmulation( | 358 if (await applyElemHideEmulation(test, selectors)) |
357 ["div:-abp-properties(content: \"publicite\")"] | |
358 ).then(() => | |
359 { | 359 { |
360 expectHidden(test, child); | 360 expectHidden(test, child); |
361 expectVisible(test, parent); | 361 expectVisible(test, parent); |
362 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 362 } |
363 }; | 363 |
364 | 364 test.done(); |
365 exports.testPseudoClassHasSelector = function(test) | 365 }; |
366 | |
367 exports.testPseudoClassHasSelector = async function(test) | |
366 { | 368 { |
367 let toHide = createElementWithStyle("{}"); | 369 let toHide = createElementWithStyle("{}"); |
368 applyElemHideEmulation( | 370 |
369 ["div:-abp-has(div)"] | 371 if (await applyElemHideEmulation(test, ["div:-abp-has(div)"])) |
370 ).then(() => | |
371 { | |
372 expectVisible(test, toHide); | 372 expectVisible(test, toHide); |
373 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 373 |
374 }; | 374 test.done(); |
375 | 375 }; |
376 exports.testPseudoClassHasSelectorWithPrefix = function(test) | 376 |
377 exports.testPseudoClassHasSelectorWithPrefix = async function(test) | |
377 { | 378 { |
378 let parent = createElementWithStyle("{}"); | 379 let parent = createElementWithStyle("{}"); |
379 let child = createElementWithStyle("{}", parent); | 380 let child = createElementWithStyle("{}", parent); |
380 applyElemHideEmulation( | 381 |
381 ["div:-abp-has(div)"] | 382 if (await applyElemHideEmulation(test, ["div:-abp-has(div)"])) |
382 ).then(() => | 383 { |
383 { | 384 expectHidden(test, parent); |
384 expectHidden(test, parent); | 385 expectVisible(test, child); |
385 expectVisible(test, child); | 386 } |
386 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 387 |
387 }; | 388 test.done(); |
388 | 389 }; |
389 exports.testPseudoClassHasSelectorWithSuffix = function(test) | 390 |
391 exports.testPseudoClassHasSelectorWithSuffix = async function(test) | |
390 { | 392 { |
391 let parent = createElementWithStyle("{}"); | 393 let parent = createElementWithStyle("{}"); |
392 let middle = createElementWithStyle("{}", parent); | 394 let middle = createElementWithStyle("{}", parent); |
393 let child = createElementWithStyle("{}", middle); | 395 let child = createElementWithStyle("{}", middle); |
394 applyElemHideEmulation( | 396 |
395 ["div:-abp-has(div) > div"] | 397 if (await applyElemHideEmulation(test, ["div:-abp-has(div) > div"])) |
396 ).then(() => | |
397 { | 398 { |
398 expectVisible(test, parent); | 399 expectVisible(test, parent); |
399 expectHidden(test, middle); | 400 expectHidden(test, middle); |
400 expectHidden(test, child); | 401 expectHidden(test, child); |
401 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 402 } |
402 }; | 403 |
403 | 404 test.done(); |
404 exports.testPseudoClassHasSelectorWithSuffixSibling = function(test) | 405 }; |
406 | |
407 exports.testPseudoClassHasSelectorWithSuffixSibling = async function(test) | |
405 { | 408 { |
406 let parent = createElementWithStyle("{}"); | 409 let parent = createElementWithStyle("{}"); |
407 let middle = createElementWithStyle("{}", parent); | 410 let middle = createElementWithStyle("{}", parent); |
408 let toHide = createElementWithStyle("{}"); | 411 let toHide = createElementWithStyle("{}"); |
409 applyElemHideEmulation( | 412 |
410 ["div:-abp-has(div) + div"] | 413 if (await applyElemHideEmulation(test, ["div:-abp-has(div) + div"])) |
411 ).then(() => | |
412 { | 414 { |
413 expectVisible(test, parent); | 415 expectVisible(test, parent); |
414 expectVisible(test, middle); | 416 expectVisible(test, middle); |
415 expectHidden(test, toHide); | 417 expectHidden(test, toHide); |
416 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 418 } |
417 }; | 419 |
418 | 420 test.done(); |
419 exports.testPseudoClassHasSelectorWithSuffixSiblingChild = function(test) | 421 }; |
422 | |
423 exports.testPseudoClassHasSelectorWithSuffixSiblingChild = async function(test) | |
420 { | 424 { |
421 // <div> | 425 // <div> |
422 // <div></div> | 426 // <div></div> |
423 // <div> | 427 // <div> |
424 // <div>to hide</div> | 428 // <div>to hide</div> |
425 // </div> | 429 // </div> |
426 // </div> | 430 // </div> |
427 let parent = createElementWithStyle("{}"); | 431 let parent = createElementWithStyle("{}"); |
428 let middle = createElementWithStyle("{}", parent); | 432 let middle = createElementWithStyle("{}", parent); |
429 let sibling = createElementWithStyle("{}"); | 433 let sibling = createElementWithStyle("{}"); |
430 let toHide = createElementWithStyle("{}", sibling); | 434 let toHide = createElementWithStyle("{}", sibling); |
431 applyElemHideEmulation( | 435 |
432 ["div:-abp-has(div) + div > div"] | 436 if (await applyElemHideEmulation(test, ["div:-abp-has(div) + div > div"])) |
433 ).then(() => | |
434 { | 437 { |
435 expectVisible(test, parent); | 438 expectVisible(test, parent); |
436 expectVisible(test, middle); | 439 expectVisible(test, middle); |
437 expectVisible(test, sibling); | 440 expectVisible(test, sibling); |
438 expectHidden(test, toHide); | 441 expectHidden(test, toHide); |
439 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 442 } |
443 | |
444 test.done(); | |
440 }; | 445 }; |
441 | 446 |
442 function compareExpectations(test, elems, expectations) | 447 function compareExpectations(test, elems, expectations) |
443 { | 448 { |
444 for (let elem in expectations) | 449 for (let elem in expectations) |
445 { | 450 { |
446 if (elems[elem]) | 451 if (elems[elem]) |
447 { | 452 { |
448 if (expectations[elem]) | 453 if (expectations[elem]) |
449 expectVisible(test, elems[elem], elem); | 454 expectVisible(test, elems[elem], elem); |
450 else | 455 else |
451 expectHidden(test, elems[elem], elem); | 456 expectHidden(test, elems[elem], elem); |
452 } | 457 } |
453 } | 458 } |
454 } | 459 } |
455 | 460 |
456 function runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling(test, selector , expectations) | 461 async function runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling(test, se lector, expectations) |
457 { | 462 { |
458 testDocument.body.innerHTML = `<div id="parent"> | 463 testDocument.body.innerHTML = `<div id="parent"> |
459 <div id="middle"> | 464 <div id="middle"> |
460 <div id="middle1"><div id="inside" class="inside"></div></div> | 465 <div id="middle1"><div id="inside" class="inside"></div></div> |
461 </div> | 466 </div> |
462 <div id="sibling"> | 467 <div id="sibling"> |
463 <div id="tohide"><span>to hide</span></div> | 468 <div id="tohide"><span>to hide</span></div> |
464 </div> | 469 </div> |
465 <div id="sibling2"> | 470 <div id="sibling2"> |
466 <div id="sibling21"><div id="sibling211" class="inside"></div></div> | 471 <div id="sibling21"><div id="sibling211" class="inside"></div></div> |
467 </div> | 472 </div> |
468 </div>`; | 473 </div>`; |
469 let elems = { | 474 let elems = { |
470 parent: testDocument.getElementById("parent"), | 475 parent: testDocument.getElementById("parent"), |
471 middle: testDocument.getElementById("middle"), | 476 middle: testDocument.getElementById("middle"), |
472 inside: testDocument.getElementById("inside"), | 477 inside: testDocument.getElementById("inside"), |
473 sibling: testDocument.getElementById("sibling"), | 478 sibling: testDocument.getElementById("sibling"), |
474 sibling2: testDocument.getElementById("sibling2"), | 479 sibling2: testDocument.getElementById("sibling2"), |
475 toHide: testDocument.getElementById("tohide") | 480 toHide: testDocument.getElementById("tohide") |
476 }; | 481 }; |
477 | 482 |
478 insertStyleRule(".inside {}"); | 483 insertStyleRule(".inside {}"); |
479 | 484 |
480 applyElemHideEmulation( | 485 if (await applyElemHideEmulation(test, [selector])) |
481 [selector] | |
482 ).then(() => | |
483 { | |
484 compareExpectations(test, elems, expectations); | 486 compareExpectations(test, elems, expectations); |
485 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 487 |
488 test.done(); | |
486 } | 489 } |
487 | 490 |
488 exports.testPseudoClassHasSelectorWithHasAndWithSuffixSibling = function(test) | 491 exports.testPseudoClassHasSelectorWithHasAndWithSuffixSibling = function(test) |
489 { | 492 { |
490 let expectations = { | 493 let expectations = { |
491 parent: true, | 494 parent: true, |
492 middile: true, | 495 middile: true, |
493 inside: true, | 496 inside: true, |
494 sibling: true, | 497 sibling: true, |
495 sibling2: true, | 498 sibling2: true, |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
548 middile: true, | 551 middile: true, |
549 inside: true, | 552 inside: true, |
550 sibling: true, | 553 sibling: true, |
551 sibling2: true, | 554 sibling2: true, |
552 toHide: true | 555 toHide: true |
553 }; | 556 }; |
554 runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling( | 557 runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling( |
555 test, "div:-abp-has(> span:-abp-contains(Advertisment))", expectations); | 558 test, "div:-abp-has(> span:-abp-contains(Advertisment))", expectations); |
556 }; | 559 }; |
557 | 560 |
558 function runTestPseudoClassContains(test, selector, expectations) | 561 async function runTestPseudoClassContains(test, selector, expectations) |
559 { | 562 { |
560 testDocument.body.innerHTML = `<div id="parent"> | 563 testDocument.body.innerHTML = `<div id="parent"> |
561 <div id="middle"> | 564 <div id="middle"> |
562 <div id="middle1"><div id="inside" class="inside"></div></div> | 565 <div id="middle1"><div id="inside" class="inside"></div></div> |
563 </div> | 566 </div> |
564 <div id="sibling"> | 567 <div id="sibling"> |
565 <div id="tohide">to hide \ud83d\ude42!</div> | 568 <div id="tohide">to hide \ud83d\ude42!</div> |
566 </div> | 569 </div> |
567 <div id="sibling2"> | 570 <div id="sibling2"> |
568 <div id="sibling21"><div id="sibling211" class="inside">Ad*</div></div> | 571 <div id="sibling21"><div id="sibling211" class="inside">Ad*</div></div> |
569 </div> | 572 </div> |
570 </div>`; | 573 </div>`; |
571 let elems = { | 574 let elems = { |
572 parent: testDocument.getElementById("parent"), | 575 parent: testDocument.getElementById("parent"), |
573 middle: testDocument.getElementById("middle"), | 576 middle: testDocument.getElementById("middle"), |
574 inside: testDocument.getElementById("inside"), | 577 inside: testDocument.getElementById("inside"), |
575 sibling: testDocument.getElementById("sibling"), | 578 sibling: testDocument.getElementById("sibling"), |
576 sibling2: testDocument.getElementById("sibling2"), | 579 sibling2: testDocument.getElementById("sibling2"), |
577 toHide: testDocument.getElementById("tohide") | 580 toHide: testDocument.getElementById("tohide") |
578 }; | 581 }; |
579 | 582 |
580 applyElemHideEmulation( | 583 if (await applyElemHideEmulation(test, [selector])) |
581 [selector] | 584 compareExpectations(test, elems, expectations); |
582 ).then( | 585 |
583 () => compareExpectations(test, elems, expectations) | 586 test.done(); |
584 ).catch(unexpectedError.bind(test)).then(() => test.done()); | |
585 } | 587 } |
586 | 588 |
587 exports.testPseudoClassContainsText = function(test) | 589 exports.testPseudoClassContainsText = function(test) |
588 { | 590 { |
589 let expectations = { | 591 let expectations = { |
590 parent: true, | 592 parent: true, |
591 middle: true, | 593 middle: true, |
592 inside: true, | 594 inside: true, |
593 sibling: false, | 595 sibling: false, |
594 sibling2: true, | 596 sibling2: true, |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
662 middle: true, | 664 middle: true, |
663 inside: true, | 665 inside: true, |
664 sibling: true, | 666 sibling: true, |
665 sibling2: false, | 667 sibling2: false, |
666 toHide: true | 668 toHide: true |
667 }; | 669 }; |
668 runTestPseudoClassContains( | 670 runTestPseudoClassContains( |
669 test, "#parent div:-abp-contains(Ad*)", expectations); | 671 test, "#parent div:-abp-contains(Ad*)", expectations); |
670 }; | 672 }; |
671 | 673 |
672 exports.testPseudoClassHasSelectorWithPropSelector = function(test) | 674 exports.testPseudoClassHasSelectorWithPropSelector = async function(test) |
673 { | 675 { |
674 let parent = createElementWithStyle("{}"); | 676 let parent = createElementWithStyle("{}"); |
675 let child = createElementWithStyle("{background-color: #000}", parent); | 677 let child = createElementWithStyle("{background-color: #000}", parent); |
676 applyElemHideEmulation( | 678 |
677 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] | 679 let selectors = ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0) ))"]; |
678 ).then(() => | 680 |
679 { | 681 if (await applyElemHideEmulation(test, selectors)) |
680 expectVisible(test, child); | 682 { |
681 expectHidden(test, parent); | 683 expectVisible(test, child); |
682 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 684 expectHidden(test, parent); |
683 }; | 685 } |
684 | 686 |
685 exports.testPseudoClassHasSelectorWithPropSelector2 = function(test) | 687 test.done(); |
688 }; | |
689 | |
690 exports.testPseudoClassHasSelectorWithPropSelector2 = async function(test) | |
686 { | 691 { |
687 let parent = createElementWithStyle("{}"); | 692 let parent = createElementWithStyle("{}"); |
688 let child = createElementWithStyle("{}", parent); | 693 let child = createElementWithStyle("{}", parent); |
694 | |
695 let selectors = ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0) ))"]; | |
696 | |
689 insertStyleRule("body #" + parent.id + " > div { background-color: #000}"); | 697 insertStyleRule("body #" + parent.id + " > div { background-color: #000}"); |
690 applyElemHideEmulation( | 698 |
691 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] | 699 if (await applyElemHideEmulation(test, selectors)) |
692 ).then(() => | 700 { |
693 { | 701 expectVisible(test, child); |
694 expectVisible(test, child); | 702 expectHidden(test, parent); |
695 expectHidden(test, parent); | 703 } |
696 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 704 |
697 }; | 705 test.done(); |
698 | 706 }; |
699 exports.testDomUpdatesStyle = function(test) | 707 |
708 exports.testDomUpdatesStyle = async function(test) | |
700 { | 709 { |
701 let parent = createElementWithStyle("{}"); | 710 let parent = createElementWithStyle("{}"); |
702 let child = createElementWithStyle("{}", parent); | 711 let child = createElementWithStyle("{}", parent); |
703 applyElemHideEmulation( | 712 |
704 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] | 713 let selectors = ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0) ))"]; |
705 ).then(() => | 714 |
715 if (await applyElemHideEmulation(test, selectors)) | |
706 { | 716 { |
707 expectVisible(test, child); | 717 expectVisible(test, child); |
708 expectVisible(test, parent); | 718 expectVisible(test, parent); |
709 | 719 |
710 insertStyleRule("body #" + parent.id + " > div { background-color: #000}"); | 720 insertStyleRule("body #" + parent.id + " > div { background-color: #000}"); |
711 return timeout(0); | 721 await timeout(0); |
712 }).then(() => | 722 |
713 { | 723 expectVisible(test, child); |
714 expectVisible(test, child); | 724 expectVisible(test, parent); |
715 expectVisible(test, parent); | 725 await timeout(REFRESH_INTERVAL); |
716 return timeout(REFRESH_INTERVAL); | 726 |
717 }).then(() => | 727 expectVisible(test, child); |
718 { | 728 expectHidden(test, parent); |
719 expectVisible(test, child); | 729 } |
720 expectHidden(test, parent); | 730 |
721 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 731 test.done(); |
722 }; | 732 }; |
723 | 733 |
724 exports.testDomUpdatesContent = function(test) | 734 exports.testDomUpdatesContent = async function(test) |
725 { | 735 { |
726 let parent = createElementWithStyle("{}"); | 736 let parent = createElementWithStyle("{}"); |
727 let child = createElementWithStyle("{}", parent); | 737 let child = createElementWithStyle("{}", parent); |
728 applyElemHideEmulation( | 738 |
729 ["div > div:-abp-contains(hide me)"] | 739 if (await applyElemHideEmulation(test, ["div > div:-abp-contains(hide me)"])) |
730 ).then(() => | |
731 { | 740 { |
732 expectVisible(test, parent); | 741 expectVisible(test, parent); |
733 expectVisible(test, child); | 742 expectVisible(test, child); |
734 | 743 |
735 child.textContent = "hide me"; | 744 child.textContent = "hide me"; |
736 return timeout(0); | 745 await timeout(0); |
737 }).then(() => | 746 |
738 { | 747 expectVisible(test, parent); |
739 expectVisible(test, parent); | 748 expectVisible(test, child); |
740 expectVisible(test, child); | 749 await timeout(REFRESH_INTERVAL); |
741 return timeout(REFRESH_INTERVAL); | 750 |
742 }).then(() => | |
743 { | |
744 expectVisible(test, parent); | 751 expectVisible(test, parent); |
745 expectHidden(test, child); | 752 expectHidden(test, child); |
746 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 753 } |
747 }; | 754 |
748 | 755 test.done(); |
749 exports.testDomUpdatesNewElement = function(test) | 756 }; |
757 | |
758 exports.testDomUpdatesNewElement = async function(test) | |
750 { | 759 { |
751 let parent = createElementWithStyle("{}"); | 760 let parent = createElementWithStyle("{}"); |
752 let child = createElementWithStyle("{ background-color: #000}", parent); | 761 let child = createElementWithStyle("{ background-color: #000}", parent); |
753 let sibling; | 762 let sibling; |
754 let child2; | 763 let child2; |
755 applyElemHideEmulation( | 764 |
756 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] | 765 let selectors = ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0) ))"]; |
757 ).then(() => | 766 |
767 if (await applyElemHideEmulation(test, selectors)) | |
758 { | 768 { |
759 expectHidden(test, parent); | 769 expectHidden(test, parent); |
760 expectVisible(test, child); | 770 expectVisible(test, child); |
761 | 771 |
762 sibling = createElementWithStyle("{}"); | 772 sibling = createElementWithStyle("{}"); |
763 return timeout(0); | 773 await timeout(0); |
764 }).then(() => | 774 |
765 { | |
766 expectHidden(test, parent); | 775 expectHidden(test, parent); |
767 expectVisible(test, child); | 776 expectVisible(test, child); |
768 expectVisible(test, sibling); | 777 expectVisible(test, sibling); |
769 | 778 |
770 return timeout(REFRESH_INTERVAL); | 779 await timeout(REFRESH_INTERVAL); |
771 }).then(() => | 780 |
772 { | |
773 expectHidden(test, parent); | 781 expectHidden(test, parent); |
774 expectVisible(test, child); | 782 expectVisible(test, child); |
775 expectVisible(test, sibling); | 783 expectVisible(test, sibling); |
776 | 784 |
777 child2 = createElementWithStyle("{ background-color: #000}", | 785 child2 = createElementWithStyle("{ background-color: #000}", |
778 sibling); | 786 sibling); |
779 return timeout(0); | 787 await timeout(0); |
780 }).then(() => | 788 |
781 { | |
782 expectVisible(test, child2); | 789 expectVisible(test, child2); |
783 return timeout(REFRESH_INTERVAL); | 790 await timeout(REFRESH_INTERVAL); |
784 }).then(() => | 791 |
785 { | |
786 expectHidden(test, parent); | 792 expectHidden(test, parent); |
787 expectVisible(test, child); | 793 expectVisible(test, child); |
788 expectHidden(test, sibling); | 794 expectHidden(test, sibling); |
789 expectVisible(test, child2); | 795 expectVisible(test, child2); |
790 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 796 } |
791 }; | 797 |
792 | 798 test.done(); |
793 exports.testPseudoClassPropertiesOnStyleSheetLoad = function(test) | 799 }; |
800 | |
801 exports.testPseudoClassPropertiesOnStyleSheetLoad = async function(test) | |
794 { | 802 { |
795 let parent = createElement(); | 803 let parent = createElement(); |
796 let child = createElement(parent); | 804 let child = createElement(parent); |
797 applyElemHideEmulation( | 805 |
798 ["div:-abp-properties(background-color: rgb(0, 0, 0))", | 806 let selectors = [ |
799 "div:-abp-contains(hide me)", | 807 "div:-abp-properties(background-color: rgb(0, 0, 0))", |
800 "div:-abp-has(> div.hideMe)"] | 808 "div:-abp-contains(hide me)", |
801 ).then(() => timeout(REFRESH_INTERVAL) | 809 "div:-abp-has(> div.hideMe)" |
802 ).then(() => | 810 ]; |
803 { | 811 |
812 if (await applyElemHideEmulation(test, selectors)) | |
813 { | |
814 await timeout(REFRESH_INTERVAL); | |
815 | |
804 expectVisible(test, parent); | 816 expectVisible(test, parent); |
805 expectVisible(test, child); | 817 expectVisible(test, child); |
806 | 818 |
807 // Load a style sheet that targets the parent element. This should run only | 819 // Load a style sheet that targets the parent element. This should run only |
808 // the "div:-abp-properties(background-color: rgb(0, 0, 0))" pattern. | 820 // the "div:-abp-properties(background-color: rgb(0, 0, 0))" pattern. |
809 insertStyleRule("#" + parent.id + " {background-color: #000}"); | 821 insertStyleRule("#" + parent.id + " {background-color: #000}"); |
810 | 822 |
811 return timeout(REFRESH_INTERVAL); | 823 await timeout(REFRESH_INTERVAL); |
812 }).then(() => | 824 |
813 { | 825 expectHidden(test, parent); |
814 expectHidden(test, parent); | 826 expectVisible(test, child); |
815 expectVisible(test, child); | 827 } |
816 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 828 |
817 }; | 829 test.done(); |
818 | 830 }; |
819 exports.testPlainAttributeOnDomMutation = function(test) | 831 |
832 exports.testPlainAttributeOnDomMutation = async function(test) | |
820 { | 833 { |
821 let parent = createElement(); | 834 let parent = createElement(); |
822 let child = createElement(parent); | 835 let child = createElement(parent); |
823 applyElemHideEmulation( | 836 |
824 ["div:-abp-properties(background-color: rgb(0, 0, 0))", | 837 let selectors = [ |
825 "div[data-hide-me]", | 838 "div:-abp-properties(background-color: rgb(0, 0, 0))", |
826 "div:-abp-contains(hide me)", | 839 "div[data-hide-me]", |
827 "div:-abp-has(> div.hideMe)"] | 840 "div:-abp-contains(hide me)", |
828 ).then(() => timeout(REFRESH_INTERVAL) | 841 "div:-abp-has(> div.hideMe)" |
829 ).then(() => | 842 ]; |
830 { | 843 |
844 if (await applyElemHideEmulation(test, selectors)) | |
845 { | |
846 await timeout(REFRESH_INTERVAL); | |
847 | |
831 expectVisible(test, parent); | 848 expectVisible(test, parent); |
832 expectVisible(test, child); | 849 expectVisible(test, child); |
833 | 850 |
834 // Set the "data-hide-me" attribute on the child element. | 851 // Set the "data-hide-me" attribute on the child element. |
835 // | 852 // |
836 // Note: Since the "div[data-hide-me]" pattern has already been processed | 853 // Note: Since the "div[data-hide-me]" pattern has already been processed |
837 // and the selector added to the document's style sheet, this will in fact | 854 // and the selector added to the document's style sheet, this will in fact |
838 // not do anything at our end, but the browser will just match the selector | 855 // not do anything at our end, but the browser will just match the selector |
839 // and hide the element. | 856 // and hide the element. |
840 child.setAttribute("data-hide-me", ""); | 857 child.setAttribute("data-hide-me", ""); |
841 | 858 |
842 return timeout(REFRESH_INTERVAL); | 859 await timeout(REFRESH_INTERVAL); |
843 }).then(() => | 860 |
844 { | |
845 expectVisible(test, parent); | 861 expectVisible(test, parent); |
846 expectHidden(test, child); | 862 expectHidden(test, child); |
847 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 863 } |
848 }; | 864 |
849 | 865 test.done(); |
850 exports.testPseudoClassContainsOnDomMutation = function(test) | 866 }; |
867 | |
868 exports.testPseudoClassContainsOnDomMutation = async function(test) | |
851 { | 869 { |
852 let parent = createElement(); | 870 let parent = createElement(); |
853 let child = createElement(parent); | 871 let child = createElement(parent); |
854 | 872 |
873 let selectors = [ | |
874 "div:-abp-properties(background-color: rgb(0, 0, 0))", | |
875 "div[data-hide-me]", | |
876 "div:-abp-contains(hide me)", | |
877 "div:-abp-has(> div.hideMe)" | |
878 ]; | |
879 | |
855 child.innerText = "do nothing"; | 880 child.innerText = "do nothing"; |
856 | 881 |
857 applyElemHideEmulation( | 882 if (await applyElemHideEmulation(test, selectors)) |
858 ["div:-abp-properties(background-color: rgb(0, 0, 0))", | 883 { |
859 "div[data-hide-me]", | 884 await timeout(REFRESH_INTERVAL); |
860 "div:-abp-contains(hide me)", | 885 |
861 "div:-abp-has(> div.hideMe)"] | |
862 ).then(() => timeout(REFRESH_INTERVAL) | |
863 ).then(() => | |
864 { | |
865 expectVisible(test, parent); | 886 expectVisible(test, parent); |
866 expectVisible(test, child); | 887 expectVisible(test, child); |
867 | 888 |
868 // Set the child element's text to "hide me". This should run only the | 889 // Set the child element's text to "hide me". This should run only the |
869 // "div:-abp-contains(hide me)" pattern. | 890 // "div:-abp-contains(hide me)" pattern. |
870 // | 891 // |
871 // Note: We need to set Node.innerText here in order to trigger the | 892 // Note: We need to set Node.innerText here in order to trigger the |
872 // "characterData" DOM mutation on Chromium. If we set Node.textContent | 893 // "characterData" DOM mutation on Chromium. If we set Node.textContent |
873 // instead, it triggers the "childList" DOM mutation instead. | 894 // instead, it triggers the "childList" DOM mutation instead. |
874 child.innerText = "hide me"; | 895 child.innerText = "hide me"; |
875 | 896 |
876 return timeout(REFRESH_INTERVAL); | 897 await timeout(REFRESH_INTERVAL); |
877 }).then(() => | 898 |
878 { | 899 expectHidden(test, parent); |
879 expectHidden(test, parent); | 900 expectVisible(test, child); |
880 expectVisible(test, child); | 901 } |
881 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 902 |
882 }; | 903 test.done(); |
883 | 904 }; |
884 exports.testPseudoClassHasOnDomMutation = function(test) | 905 |
906 exports.testPseudoClassHasOnDomMutation = async function(test) | |
885 { | 907 { |
886 let parent = createElement(); | 908 let parent = createElement(); |
887 let child = null; | 909 let child = null; |
888 applyElemHideEmulation( | 910 |
889 ["div:-abp-properties(background-color: rgb(0, 0, 0))", | 911 let selectors = [ |
890 "div[data-hide-me]", | 912 "div:-abp-properties(background-color: rgb(0, 0, 0))", |
891 "div:-abp-contains(hide me)", | 913 "div[data-hide-me]", |
892 "div:-abp-has(> div)"] | 914 "div:-abp-contains(hide me)", |
893 ).then(() => timeout(REFRESH_INTERVAL) | 915 "div:-abp-has(> div)" |
894 ).then(() => | 916 ]; |
895 { | 917 |
918 if (await applyElemHideEmulation(test, selectors)) | |
919 { | |
920 await timeout(REFRESH_INTERVAL); | |
921 | |
896 expectVisible(test, parent); | 922 expectVisible(test, parent); |
897 | 923 |
898 // Add the child element. This should run all the DOM-dependent patterns | 924 // Add the child element. This should run all the DOM-dependent patterns |
899 // ("div:-abp-contains(hide me)" and "div:-abp-has(> div)"). | 925 // ("div:-abp-contains(hide me)" and "div:-abp-has(> div)"). |
900 child = createElement(parent); | 926 child = createElement(parent); |
901 | 927 |
902 return timeout(REFRESH_INTERVAL); | 928 await timeout(REFRESH_INTERVAL); |
903 }).then(() => | 929 |
904 { | 930 expectHidden(test, parent); |
905 expectHidden(test, parent); | 931 expectVisible(test, child); |
906 expectVisible(test, child); | 932 } |
907 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 933 |
908 }; | 934 test.done(); |
909 | 935 }; |
910 exports.testPseudoClassHasWithClassOnDomMutation = function(test) | 936 |
937 exports.testPseudoClassHasWithClassOnDomMutation = async function(test) | |
911 { | 938 { |
912 let parent = createElement(); | 939 let parent = createElement(); |
913 let child = createElement(parent); | 940 let child = createElement(parent); |
914 applyElemHideEmulation( | 941 |
915 ["div:-abp-properties(background-color: rgb(0, 0, 0))", | 942 let selectors = [ |
916 "div[data-hide-me]", | 943 "div:-abp-properties(background-color: rgb(0, 0, 0))", |
917 "div:-abp-contains(hide me)", | 944 "div[data-hide-me]", |
918 "div:-abp-has(> div.hideMe)"] | 945 "div:-abp-contains(hide me)", |
919 ).then(() => timeout(REFRESH_INTERVAL) | 946 "div:-abp-has(> div.hideMe)" |
920 ).then(() => | 947 ]; |
921 { | 948 |
949 if (await applyElemHideEmulation(test, selectors)) | |
950 { | |
951 await timeout(REFRESH_INTERVAL); | |
952 | |
922 expectVisible(test, parent); | 953 expectVisible(test, parent); |
923 expectVisible(test, child); | 954 expectVisible(test, child); |
924 | 955 |
925 // Set the child element's class to "hideMe". This should run only the | 956 // Set the child element's class to "hideMe". This should run only the |
926 // "div:-abp-has(> div.hideMe)" pattern. | 957 // "div:-abp-has(> div.hideMe)" pattern. |
927 child.className = "hideMe"; | 958 child.className = "hideMe"; |
928 | 959 |
929 return timeout(REFRESH_INTERVAL); | 960 await timeout(REFRESH_INTERVAL); |
930 }).then(() => | 961 |
931 { | 962 expectHidden(test, parent); |
932 expectHidden(test, parent); | 963 expectVisible(test, child); |
933 expectVisible(test, child); | 964 } |
934 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 965 |
935 }; | 966 test.done(); |
936 | 967 }; |
937 exports.testPseudoClassHasWithPseudoClassContainsOnDomMutation = function(test) | 968 |
969 exports.testPseudoClassHasWithPseudoClassContainsOnDomMutation = async function( test) | |
938 { | 970 { |
939 let parent = createElement(); | 971 let parent = createElement(); |
940 let child = createElement(parent); | 972 let child = createElement(parent); |
941 | 973 |
974 let selectors = [ | |
975 "div:-abp-properties(background-color: rgb(0, 0, 0))", | |
976 "div[data-hide-me]", | |
977 "div:-abp-contains(hide me)", | |
978 "div:-abp-has(> div:-abp-contains(hide me))" | |
979 ]; | |
980 | |
942 child.innerText = "do nothing"; | 981 child.innerText = "do nothing"; |
943 | 982 |
944 applyElemHideEmulation( | 983 if (await applyElemHideEmulation(test, selectors)) |
945 ["div:-abp-properties(background-color: rgb(0, 0, 0))", | 984 { |
946 "div[data-hide-me]", | 985 await timeout(REFRESH_INTERVAL); |
947 "div:-abp-contains(hide me)", | 986 |
948 "div:-abp-has(> div:-abp-contains(hide me))"] | |
949 ).then(() => timeout(REFRESH_INTERVAL) | |
950 ).then(() => | |
951 { | |
952 expectVisible(test, parent); | 987 expectVisible(test, parent); |
953 expectVisible(test, child); | 988 expectVisible(test, child); |
954 | 989 |
955 // Set the child element's text to "hide me". This should run only the | 990 // Set the child element's text to "hide me". This should run only the |
956 // "div:-abp-contains(hide me)" and | 991 // "div:-abp-contains(hide me)" and |
957 // "div:-abp-has(> div:-abp-contains(hide me))" patterns. | 992 // "div:-abp-has(> div:-abp-contains(hide me))" patterns. |
958 child.innerText = "hide me"; | 993 child.innerText = "hide me"; |
959 | 994 |
960 return timeout(REFRESH_INTERVAL); | 995 await timeout(REFRESH_INTERVAL); |
961 }).then(() => | 996 |
962 { | |
963 // Note: Even though it runs both the :-abp-contains() patterns, it only | 997 // Note: Even though it runs both the :-abp-contains() patterns, it only |
964 // hides the parent element because of revision d7d51d29aa34. | 998 // hides the parent element because of revision d7d51d29aa34. |
965 expectHidden(test, parent); | 999 expectHidden(test, parent); |
966 expectVisible(test, child); | 1000 expectVisible(test, child); |
967 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 1001 } |
968 }; | 1002 |
969 | 1003 test.done(); |
970 exports.testOnlyRelevantElementsProcessed = function(test) | 1004 }; |
1005 | |
1006 exports.testOnlyRelevantElementsProcessed = async function(test) | |
971 { | 1007 { |
972 // <body> | 1008 // <body> |
973 // <div id="n1"> | 1009 // <div id="n1"> |
974 // <p id="n1_1"></p> | 1010 // <p id="n1_1"></p> |
975 // <p id="n1_2"></p> | 1011 // <p id="n1_2"></p> |
976 // <p id="n1_4">Hello</p> | 1012 // <p id="n1_4">Hello</p> |
977 // </div> | 1013 // </div> |
978 // <div id="n2"> | 1014 // <div id="n2"> |
979 // <p id="n2_1"></p> | 1015 // <p id="n2_1"></p> |
980 // <p id="n2_2"></p> | 1016 // <p id="n2_2"></p> |
(...skipping 10 matching lines...) Expand all Loading... | |
991 // <p id="n4_4">Hello</p> | 1027 // <p id="n4_4">Hello</p> |
992 // </div> | 1028 // </div> |
993 // </body> | 1029 // </body> |
994 for (let i of [1, 2, 3, 4]) | 1030 for (let i of [1, 2, 3, 4]) |
995 { | 1031 { |
996 let n = createElement(null, "div", `n${i}`); | 1032 let n = createElement(null, "div", `n${i}`); |
997 for (let [j, text] of [[1], [2], [4, "Hello"]]) | 1033 for (let [j, text] of [[1], [2], [4, "Hello"]]) |
998 createElement(n, "p", `n${i}_${j}`, text); | 1034 createElement(n, "p", `n${i}_${j}`, text); |
999 } | 1035 } |
1000 | 1036 |
1001 applyElemHideEmulation( | 1037 let selectors = [ |
1002 ["p:-abp-contains(Hello)", | 1038 "p:-abp-contains(Hello)", |
1003 "div:-abp-contains(Try me!)", | 1039 "div:-abp-contains(Try me!)", |
1004 "div:-abp-has(p:-abp-contains(This is good))"] | 1040 "div:-abp-has(p:-abp-contains(This is good))" |
1005 ).then(() => timeout(REFRESH_INTERVAL) | 1041 ]; |
1006 ).then(() => | 1042 |
1007 { | 1043 if (await applyElemHideEmulation(test, selectors)) |
1044 { | |
1045 await timeout(REFRESH_INTERVAL); | |
1046 | |
1008 // This is only a sanity check to make sure everything else is working | 1047 // This is only a sanity check to make sure everything else is working |
1009 // before we do the actual test. | 1048 // before we do the actual test. |
1010 for (let i of [1, 2, 3, 4]) | 1049 for (let i of [1, 2, 3, 4]) |
1011 { | 1050 { |
1012 for (let j of [1, 2, 4]) | 1051 for (let j of [1, 2, 4]) |
1013 { | 1052 { |
1014 let id = `n${i}_${j}`; | 1053 let id = `n${i}_${j}`; |
1015 if (j == 4) | 1054 if (j == 4) |
1016 expectHidden(test, testDocument.getElementById(id), id); | 1055 expectHidden(test, testDocument.getElementById(id), id); |
1017 else | 1056 else |
1018 expectVisible(test, testDocument.getElementById(id), id); | 1057 expectVisible(test, testDocument.getElementById(id), id); |
1019 } | 1058 } |
1020 } | 1059 } |
1021 | 1060 |
1022 // All <div> and <p> elements should be processed initially. | 1061 // All <div> and <p> elements should be processed initially. |
1023 for (let element of [...testDocument.getElementsByTagName("div"), | 1062 for (let element of [...testDocument.getElementsByTagName("div"), |
1024 ...testDocument.getElementsByTagName("p")]) | 1063 ...testDocument.getElementsByTagName("p")]) |
1025 { | 1064 { |
1026 expectProcessed(test, element, element.id); | 1065 expectProcessed(test, element, element.id); |
1027 } | 1066 } |
1028 | 1067 |
1029 // Modify the text in <p id="n4_1"> | 1068 // Modify the text in <p id="n4_1"> |
1030 testDocument.getElementById("n4_1").innerText = "Try me!"; | 1069 testDocument.getElementById("n4_1").innerText = "Try me!"; |
1031 | 1070 |
1032 return timeout(REFRESH_INTERVAL); | 1071 await timeout(REFRESH_INTERVAL); |
1033 }).then(() => | 1072 |
1034 { | |
1035 // When an element's text is modified, only the element or one of its | 1073 // When an element's text is modified, only the element or one of its |
1036 // ancestors matching any selector is processed for :-abp-has() and | 1074 // ancestors matching any selector is processed for :-abp-has() and |
1037 // :-abp-contains() | 1075 // :-abp-contains() |
1038 for (let element of [...testDocument.getElementsByTagName("div"), | 1076 for (let element of [...testDocument.getElementsByTagName("div"), |
1039 ...testDocument.getElementsByTagName("p")]) | 1077 ...testDocument.getElementsByTagName("p")]) |
1040 { | 1078 { |
1041 if (element.id == "n4" || element.id == "n4_1") | 1079 if (element.id == "n4" || element.id == "n4_1") |
1042 expectProcessed(test, element, element.id); | 1080 expectProcessed(test, element, element.id); |
1043 else | 1081 else |
1044 expectNotProcessed(test, element, element.id); | 1082 expectNotProcessed(test, element, element.id); |
1045 } | 1083 } |
1046 | 1084 |
1047 // Create a new <p id="n2_3"> element with no text. | 1085 // Create a new <p id="n2_3"> element with no text. |
1048 createElement(testDocument.getElementById("n2"), "p", "n2_3"); | 1086 createElement(testDocument.getElementById("n2"), "p", "n2_3"); |
1049 | 1087 |
1050 return timeout(REFRESH_INTERVAL); | 1088 await timeout(REFRESH_INTERVAL); |
1051 }).then(() => | 1089 |
1052 { | |
1053 // When a new element is added, only the element or one of its ancestors | 1090 // When a new element is added, only the element or one of its ancestors |
1054 // matching any selector is processed for :-abp-has() and :-abp-contains() | 1091 // matching any selector is processed for :-abp-has() and :-abp-contains() |
1055 for (let element of [...testDocument.getElementsByTagName("div"), | 1092 for (let element of [...testDocument.getElementsByTagName("div"), |
1056 ...testDocument.getElementsByTagName("p")]) | 1093 ...testDocument.getElementsByTagName("p")]) |
1057 { | 1094 { |
1058 if (element.id == "n2" || element.id == "n2_3") | 1095 if (element.id == "n2" || element.id == "n2_3") |
1059 expectProcessed(test, element, element.id); | 1096 expectProcessed(test, element, element.id); |
1060 else | 1097 else |
1061 expectNotProcessed(test, element, element.id); | 1098 expectNotProcessed(test, element, element.id); |
1062 } | 1099 } |
1063 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 1100 } |
1064 }; | 1101 |
1102 test.done(); | |
1103 }; | |
LEFT | RIGHT |