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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 let element = document.createElement("div"); | 81 let element = document.createElement("div"); |
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 function createPseudoElementWithStyle(element, pseudo, styleBlock) | |
92 { | |
93 insertStyleRule(`#${element.id}${pseudo} ${styleBlock}`); | |
94 } | |
95 | |
96 // Will ensure the class ElemHideEmulation is loaded. | 91 // Will ensure the class ElemHideEmulation is loaded. |
97 // NOTE: if it never loads, this will probably hang. | 92 // Pass true when it calls itself. |
98 function loadElemHideEmulation() | 93 function loadElemHideEmulation(inside) |
99 { | 94 { |
100 if (typeof ElemHideEmulation == "undefined") | 95 if (typeof ElemHideEmulation == "undefined") |
101 { | 96 { |
| 97 if (inside) |
| 98 return Promise.reject("Failed to load ElemHideEmulation."); |
| 99 |
102 return loadScript(myUrl + "/../../../lib/common.js").then(() => | 100 return loadScript(myUrl + "/../../../lib/common.js").then(() => |
103 { | 101 { |
104 return loadScript(myUrl + "/../../../chrome/content/elemHideEmulation.js")
; | 102 return loadScript(myUrl + "/../../../chrome/content/elemHideEmulation.js")
; |
105 }).then(() => | 103 }).then(() => |
106 { | 104 { |
107 return loadElemHideEmulation(); | 105 return loadElemHideEmulation(true); |
108 }); | 106 }); |
109 } | 107 } |
110 | 108 |
111 return Promise.resolve(); | 109 return Promise.resolve(); |
112 } | 110 } |
113 | 111 |
114 // Create a new ElemHideEmulation instance with @selectors. | 112 // Create a new ElemHideEmulation instance with @selectors. |
115 function applyElemHideEmulation(selectors) | 113 function applyElemHideEmulation(selectors) |
116 { | 114 { |
117 return loadElemHideEmulation().then(() => | 115 return loadElemHideEmulation().then(() => |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 { | 257 { |
260 let toHide = createElementWithStyle("{}"); | 258 let toHide = createElementWithStyle("{}"); |
261 applyElemHideEmulation( | 259 applyElemHideEmulation( |
262 [":-abp-properties(background-color: rgb(0, 0, 0))"] | 260 [":-abp-properties(background-color: rgb(0, 0, 0))"] |
263 ).then(() => | 261 ).then(() => |
264 { | 262 { |
265 expectVisible(test, toHide); | 263 expectVisible(test, toHide); |
266 insertStyleRule("#" + toHide.id + " {background-color: #000}"); | 264 insertStyleRule("#" + toHide.id + " {background-color: #000}"); |
267 return new Promise((resolve, reject) => | 265 return new Promise((resolve, reject) => |
268 { | 266 { |
| 267 // Re-evaluation will only happen after a few seconds |
| 268 expectVisible(test, toHide); |
269 window.setTimeout(() => | 269 window.setTimeout(() => |
270 { | 270 { |
271 expectHidden(test, toHide); | 271 expectHidden(test, toHide); |
272 resolve(); | 272 resolve(); |
273 }, 0); | 273 }, 4000); |
274 }); | 274 }); |
275 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 275 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
276 }; | 276 }; |
277 | 277 |
278 exports.testPropertySelectorForPseudoElementBefore = function(test) | 278 exports.testPseudoClassWithPropBeforeSelector = function(test) |
279 { | 279 { |
280 let toHide = createElementWithStyle("{background-color: #000}"); | 280 let parent = createElementWithStyle("{}"); |
281 createPseudoElementWithStyle(toHide, "::before", "{content: \"publicite\"}"); | 281 let child = createElementWithStyle("{background-color: #000}", parent); |
282 applyElemHideEmulation( | 282 insertStyleRule(`#${child.id}::before {content: "publicite"}`); |
283 [":-abp-properties-before(content: \"publicite\")"] | 283 |
284 ).then(() => | 284 applyElemHideEmulation( |
285 { | 285 ["div:-abp-properties(content: \"publicite\")"] |
286 expectHidden(test, toHide); | 286 ).then(() => |
287 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 287 { |
288 }; | 288 expectHidden(test, child); |
289 | 289 expectVisible(test, parent); |
290 exports.testPropertySelectorForPseudoElementAfter = function(test) | |
291 { | |
292 let toHide = createElementWithStyle("{background-color: #000}"); | |
293 createPseudoElementWithStyle(toHide, "::after", "{content: \"publicite\"}"); | |
294 applyElemHideEmulation( | |
295 [":-abp-properties-after(content: \"publicite\")"] | |
296 ).then(() => | |
297 { | |
298 expectHidden(test, toHide); | |
299 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 290 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
300 }; | 291 }; |
301 | 292 |
302 exports.testPseudoClassHasSelector = function(test) | 293 exports.testPseudoClassHasSelector = function(test) |
303 { | 294 { |
304 let toHide = createElementWithStyle("{}"); | 295 let toHide = createElementWithStyle("{}"); |
305 applyElemHideEmulation( | 296 applyElemHideEmulation( |
306 ["div:-abp-has(div)"] | 297 ["div:-abp-has(div)"] |
307 ).then(() => | 298 ).then(() => |
308 { | 299 { |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 expectVisible(test, sibling2); | 400 expectVisible(test, sibling2); |
410 expectHidden(test, toHide); | 401 expectHidden(test, toHide); |
411 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 402 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
412 } | 403 } |
413 | 404 |
414 exports.testPseudoClassHasSelectorWithHasAndWithSuffixSibling = function(test) | 405 exports.testPseudoClassHasSelectorWithHasAndWithSuffixSibling = function(test) |
415 { | 406 { |
416 runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling(test, "div:-abp-has(:
-abp-has(div.inside)) + div > div"); | 407 runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling(test, "div:-abp-has(:
-abp-has(div.inside)) + div > div"); |
417 }; | 408 }; |
418 | 409 |
419 exports.testPseudoClassHasSelectorWithHasAndWithSuffixSibling2 = function(test) | |
420 { | |
421 runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling(test, "div:-abp-has(:
-abp-has(> div.inside)) + div > div"); | |
422 }; | |
423 | |
424 exports.testPseudoClassContains = function(test) | 410 exports.testPseudoClassContains = function(test) |
425 { | 411 { |
426 document.body.innerHTML = `<div id="parent"> | 412 document.body.innerHTML = `<div id="parent"> |
427 <div id="middle"> | 413 <div id="middle"> |
428 <div id="middle1"><div id="inside" class="inside"></div></div> | 414 <div id="middle1"><div id="inside" class="inside"></div></div> |
429 </div> | 415 </div> |
430 <div id="sibling"> | 416 <div id="sibling"> |
431 <div id="tohide">to hide</div> | 417 <div id="tohide">to hide</div> |
432 </div> | 418 </div> |
433 <div id="sibling2"> | 419 <div id="sibling2"> |
(...skipping 26 matching lines...) Expand all Loading... |
460 let child = createElementWithStyle("{background-color: #000}", parent); | 446 let child = createElementWithStyle("{background-color: #000}", parent); |
461 applyElemHideEmulation( | 447 applyElemHideEmulation( |
462 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] | 448 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] |
463 ).then(() => | 449 ).then(() => |
464 { | 450 { |
465 expectVisible(test, child); | 451 expectVisible(test, child); |
466 expectHidden(test, parent); | 452 expectHidden(test, parent); |
467 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 453 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
468 }; | 454 }; |
469 | 455 |
470 exports.testPseudoClassHasSelectorWithPropAfterSelector = function(test) | 456 exports.testPseudoClassHasSelectorWithPropSelector2 = function(test) |
471 { | 457 { |
472 let parent = createElementWithStyle("{}"); | 458 let parent = createElementWithStyle("{}"); |
473 let child = createElementWithStyle("{background-color: #000}", parent); | 459 let child = createElementWithStyle("{}", parent); |
474 createPseudoElementWithStyle(child, "::before", "{content: \"publicite\"}"); | 460 insertStyleRule("body #" + parent.id + " > div { background-color: #000}"); |
475 | 461 applyElemHideEmulation( |
476 applyElemHideEmulation( | 462 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] |
477 ["div:-abp-has(:-abp-properties-before(content: \"publicite\"))"] | |
478 ).then(() => | 463 ).then(() => |
479 { | 464 { |
480 expectVisible(test, child); | 465 expectVisible(test, child); |
481 expectHidden(test, parent); | 466 expectHidden(test, parent); |
482 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 467 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
483 }; | 468 }; |
LEFT | RIGHT |