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-2017 eyeo GmbH | 3 * Copyright (C) 2006-2017 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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 element.id = findUniqueId(); | 82 element.id = findUniqueId(); |
83 if (!parent) | 83 if (!parent) |
84 document.body.appendChild(element); | 84 document.body.appendChild(element); |
85 else | 85 else |
86 parent.appendChild(element); | 86 parent.appendChild(element); |
87 insertStyleRule("#" + element.id + " " + styleBlock); | 87 insertStyleRule("#" + element.id + " " + styleBlock); |
88 return element; | 88 return element; |
89 } | 89 } |
90 | 90 |
91 // Will ensure the class ElemHideEmulation is loaded. | 91 // Will ensure the class ElemHideEmulation is loaded. |
92 // NOTE: if it never loads, this will probably hang. | 92 // Pass true when it calls itself. |
93 function loadElemHideEmulation() | 93 function loadElemHideEmulation(inside) |
94 { | 94 { |
95 if (typeof ElemHideEmulation == "undefined") | 95 if (typeof ElemHideEmulation == "undefined") |
96 { | 96 { |
| 97 if (inside) |
| 98 return Promise.reject("Failed to load ElemHideEmulation."); |
| 99 |
97 return loadScript(myUrl + "/../../../lib/common.js").then(() => | 100 return loadScript(myUrl + "/../../../lib/common.js").then(() => |
98 { | 101 { |
99 return loadScript(myUrl + "/../../../chrome/content/elemHideEmulation.js")
; | 102 return loadScript(myUrl + "/../../../chrome/content/elemHideEmulation.js")
; |
100 }).then(() => | 103 }).then(() => |
101 { | 104 { |
102 return loadElemHideEmulation(); | 105 return loadElemHideEmulation(true); |
103 }); | 106 }); |
104 } | 107 } |
105 | 108 |
106 return Promise.resolve(); | 109 return Promise.resolve(); |
107 } | 110 } |
108 | 111 |
109 // Create a new ElemHideEmulation instance with @selectors. | 112 // Create a new ElemHideEmulation instance with @selectors. |
110 function applyElemHideEmulation(selectors) | 113 function applyElemHideEmulation(selectors) |
111 { | 114 { |
112 return loadElemHideEmulation().then(() => | 115 return loadElemHideEmulation().then(() => |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 expectVisible(test, toHide); | 268 expectVisible(test, toHide); |
266 window.setTimeout(() => | 269 window.setTimeout(() => |
267 { | 270 { |
268 expectHidden(test, toHide); | 271 expectHidden(test, toHide); |
269 resolve(); | 272 resolve(); |
270 }, 4000); | 273 }, 4000); |
271 }); | 274 }); |
272 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 275 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
273 }; | 276 }; |
274 | 277 |
| 278 exports.testPseudoClassWithPropBeforeSelector = function(test) |
| 279 { |
| 280 let parent = createElementWithStyle("{}"); |
| 281 let child = createElementWithStyle("{background-color: #000}", parent); |
| 282 insertStyleRule(`#${child.id}::before {content: "publicite"}`); |
| 283 |
| 284 applyElemHideEmulation( |
| 285 ["div:-abp-properties(content: \"publicite\")"] |
| 286 ).then(() => |
| 287 { |
| 288 expectHidden(test, child); |
| 289 expectVisible(test, parent); |
| 290 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
| 291 }; |
| 292 |
275 exports.testPseudoClassHasSelector = function(test) | 293 exports.testPseudoClassHasSelector = function(test) |
276 { | 294 { |
277 let toHide = createElementWithStyle("{}"); | 295 let toHide = createElementWithStyle("{}"); |
278 applyElemHideEmulation( | 296 applyElemHideEmulation( |
279 ["div:-abp-has(div)"] | 297 ["div:-abp-has(div)"] |
280 ).then(() => | 298 ).then(() => |
281 { | 299 { |
282 expectVisible(test, toHide); | 300 expectVisible(test, toHide); |
283 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 301 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
284 }; | 302 }; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 ["div:-abp-has(div) + div > div"] | 360 ["div:-abp-has(div) + div > div"] |
343 ).then(() => | 361 ).then(() => |
344 { | 362 { |
345 expectVisible(test, parent); | 363 expectVisible(test, parent); |
346 expectVisible(test, middle); | 364 expectVisible(test, middle); |
347 expectVisible(test, sibling); | 365 expectVisible(test, sibling); |
348 expectHidden(test, toHide); | 366 expectHidden(test, toHide); |
349 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 367 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
350 }; | 368 }; |
351 | 369 |
352 function runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling(test, selector
) | 370 function runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling(test, selector
, expectations) |
| 371 { |
| 372 document.body.innerHTML = `<div id="parent"> |
| 373 <div id="middle"> |
| 374 <div id="middle1"><div id="inside" class="inside"></div></div> |
| 375 </div> |
| 376 <div id="sibling"> |
| 377 <div id="tohide">to hide</div> |
| 378 </div> |
| 379 <div id="sibling2"> |
| 380 <div id="sibling21"><div id="sibling211" class="inside"></div></div> |
| 381 </div> |
| 382 </div>`; |
| 383 let elems = { |
| 384 parent: document.getElementById("parent"), |
| 385 middle: document.getElementById("middle"), |
| 386 inside: document.getElementById("inside"), |
| 387 sibling: document.getElementById("sibling"), |
| 388 sibling2: document.getElementById("sibling2"), |
| 389 toHide: document.getElementById("tohide") |
| 390 }; |
| 391 |
| 392 insertStyleRule(".inside {}"); |
| 393 |
| 394 applyElemHideEmulation( |
| 395 [selector] |
| 396 ).then(() => |
| 397 { |
| 398 for (let elem in expectations) |
| 399 if (elems[elem]) |
| 400 { |
| 401 if (expectations[elem]) |
| 402 expectVisible(test, elems[elem]); |
| 403 else |
| 404 expectHidden(test, elems[elem]); |
| 405 } |
| 406 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
| 407 } |
| 408 |
| 409 exports.testPseudoClassHasSelectorWithHasAndWithSuffixSibling = function(test) |
| 410 { |
| 411 let expectations = { |
| 412 parent: true, |
| 413 middile: true, |
| 414 inside: true, |
| 415 sibling: true, |
| 416 sibling2: true, |
| 417 toHide: false |
| 418 }; |
| 419 runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling( |
| 420 test, "div:-abp-has(:-abp-has(div.inside)) + div > div", expectations); |
| 421 }; |
| 422 |
| 423 exports.testPseudoClassHasSelectorWithHasAndWithSuffixSibling2 = function(test) |
| 424 { |
| 425 let expectations = { |
| 426 parent: true, |
| 427 middile: true, |
| 428 inside: true, |
| 429 sibling: true, |
| 430 sibling2: true, |
| 431 toHide: false |
| 432 }; |
| 433 runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling( |
| 434 test, "div:-abp-has(:-abp-has(> div.inside)) + div > div", expectations); |
| 435 }; |
| 436 |
| 437 exports.testPseudoClassHasSelectorWithSuffixSiblingNoop = function(test) |
| 438 { |
| 439 let expectations = { |
| 440 parent: true, |
| 441 middile: true, |
| 442 inside: true, |
| 443 sibling: true, |
| 444 sibling2: true, |
| 445 toHide: true |
| 446 }; |
| 447 runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling( |
| 448 test, "div:-abp-has(> body div.inside) + div > div", expectations); |
| 449 }; |
| 450 |
| 451 exports.testPseudoClassContains = function(test) |
353 { | 452 { |
354 document.body.innerHTML = `<div id="parent"> | 453 document.body.innerHTML = `<div id="parent"> |
355 <div id="middle"> | 454 <div id="middle"> |
356 <div id="middle1"><div id="inside" class="inside"></div></div> | 455 <div id="middle1"><div id="inside" class="inside"></div></div> |
357 </div> | 456 </div> |
358 <div id="sibling"> | 457 <div id="sibling"> |
359 <div id="tohide">to hide</div> | 458 <div id="tohide">to hide</div> |
360 </div> | 459 </div> |
361 <div id="sibling2"> | 460 <div id="sibling2"> |
362 <div id="sibling21"><div id="sibling211" class="inside"></div></div> | 461 <div id="sibling21"><div id="sibling211" class="inside"></div></div> |
363 </div> | 462 </div> |
364 </div>`; | 463 </div>`; |
365 let parent = document.getElementById("parent"); | 464 let parent = document.getElementById("parent"); |
366 let middle = document.getElementById("middle"); | 465 let middle = document.getElementById("middle"); |
367 let inside = document.getElementById("inside"); | 466 let inside = document.getElementById("inside"); |
368 let sibling = document.getElementById("sibling"); | 467 let sibling = document.getElementById("sibling"); |
369 let sibling2 = document.getElementById("sibling2"); | 468 let sibling2 = document.getElementById("sibling2"); |
370 let toHide = document.getElementById("tohide"); | 469 let toHide = document.getElementById("tohide"); |
371 | 470 |
372 insertStyleRule(".inside {}"); | 471 applyElemHideEmulation( |
373 | 472 ["#parent div:-abp-contains(to hide)"] |
374 applyElemHideEmulation( | |
375 [selector] | |
376 ).then(() => | 473 ).then(() => |
377 { | 474 { |
378 expectVisible(test, parent); | 475 expectVisible(test, parent); |
379 expectVisible(test, middle); | 476 expectVisible(test, middle); |
380 expectVisible(test, inside); | 477 expectVisible(test, inside); |
381 expectVisible(test, sibling); | 478 expectHidden(test, sibling); |
382 expectVisible(test, sibling2); | 479 expectVisible(test, sibling2); |
383 expectHidden(test, toHide); | 480 expectHidden(test, toHide); |
384 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 481 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
385 } | |
386 | |
387 exports.testPseudoClassHasSelectorWithHasAndWithSuffixSibling = function(test) | |
388 { | |
389 runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling(test, "div:-abp-has(:
-abp-has(div.inside)) + div > div"); | |
390 }; | |
391 | |
392 exports.testPseudoClassHasSelectorWithHasAndWithSuffixSibling2 = function(test) | |
393 { | |
394 runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling(test, "div:-abp-has(:
-abp-has(> div.inside)) + div > div"); | |
395 }; | 482 }; |
396 | 483 |
397 exports.testPseudoClassHasSelectorWithPropSelector = function(test) | 484 exports.testPseudoClassHasSelectorWithPropSelector = function(test) |
398 { | 485 { |
399 let parent = createElementWithStyle("{}"); | 486 let parent = createElementWithStyle("{}"); |
400 let child = createElementWithStyle("{background-color: #000}", parent); | 487 let child = createElementWithStyle("{background-color: #000}", parent); |
401 applyElemHideEmulation( | 488 applyElemHideEmulation( |
402 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] | 489 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] |
403 ).then(() => | 490 ).then(() => |
404 { | 491 { |
405 expectVisible(test, child); | 492 expectVisible(test, child); |
406 expectHidden(test, parent); | 493 expectHidden(test, parent); |
407 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 494 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
408 }; | 495 }; |
409 | 496 |
410 exports.testPseudoClassHasSelectorWithPropSelector2 = function(test) | 497 exports.testPseudoClassHasSelectorWithPropSelector2 = function(test) |
411 { | 498 { |
412 let parent = createElementWithStyle("{}"); | 499 let parent = createElementWithStyle("{}"); |
413 let child = createElementWithStyle("{}", parent); | 500 let child = createElementWithStyle("{}", parent); |
414 insertStyleRule("body #" + parent.id + " > div { background-color: #000}"); | 501 insertStyleRule("body #" + parent.id + " > div { background-color: #000}"); |
415 applyElemHideEmulation( | 502 applyElemHideEmulation( |
416 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] | 503 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] |
417 ).then(() => | 504 ).then(() => |
418 { | 505 { |
419 expectVisible(test, child); | 506 expectVisible(test, child); |
420 expectHidden(test, parent); | 507 expectHidden(test, parent); |
421 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 508 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
422 }; | 509 }; |
LEFT | RIGHT |