| 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 |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
| 13 * | 13 * |
| 14 * You should have received a copy of the GNU General Public License | 14 * You should have received a copy of the GNU General Public License |
| 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| 16 */ | 16 */ |
| 17 | 17 |
| 18 "use strict"; | 18 "use strict"; |
| 19 | 19 |
| 20 const {ElemHideEmulation} = require("../../lib/content/elemHideEmulation"); | 20 const {ElemHideEmulation} = require("../../lib/content/elemHideEmulation"); |
| 21 | 21 |
| 22 const REFRESH_INTERVAL = 200; | |
| 23 | |
| 22 let testDocument = null; | 24 let testDocument = null; |
| 23 | 25 |
| 24 exports.setUp = function(callback) | 26 exports.setUp = function(callback) |
| 25 { | 27 { |
| 26 testDocument = null; | |
|
Wladimir Palant
2017/08/23 13:23:31
This assignment seems pointless.
hub
2017/08/23 16:38:00
Done.
| |
| 27 let iframe = document.createElement("iframe"); | 28 let iframe = document.createElement("iframe"); |
| 28 iframe.id = "test-iframe"; | |
| 29 document.body.appendChild(iframe); | 29 document.body.appendChild(iframe); |
| 30 testDocument = iframe.contentDocument; | 30 testDocument = iframe.contentDocument; |
| 31 | 31 |
| 32 callback(); | 32 callback(); |
| 33 }; | 33 }; |
| 34 | 34 |
| 35 exports.tearDown = function(callback) | 35 exports.tearDown = function(callback) |
| 36 { | 36 { |
| 37 let iframe = document.getElementById("test-iframe"); | 37 let iframe = testDocument.defaultView.frameElement; |
|
Wladimir Palant
2017/08/23 13:23:32
Use `testDocument.defaultView.frameElement` here?
hub
2017/08/23 16:38:00
Done.
| |
| 38 iframe.parentNode.removeChild(iframe); | 38 iframe.parentNode.removeChild(iframe); |
|
Wladimir Palant
2017/08/23 13:23:31
Please null out testDocument as well, so that tryi
hub
2017/08/23 16:38:00
Done.
| |
| 39 testDocument = null; | |
| 39 | 40 |
| 40 callback(); | 41 callback(); |
| 41 }; | 42 }; |
| 43 | |
| 44 function timeout(delay) | |
| 45 { | |
| 46 return new Promise((resolve, reject) => | |
| 47 { | |
| 48 window.setTimeout(resolve, delay); | |
| 49 }); | |
| 50 } | |
| 42 | 51 |
| 43 function unexpectedError(error) | 52 function unexpectedError(error) |
| 44 { | 53 { |
| 45 console.error(error); | 54 console.error(error); |
| 46 this.ok(false, "Unexpected error: " + error); | 55 this.ok(false, "Unexpected error: " + error); |
| 47 } | 56 } |
| 48 | 57 |
| 49 function expectHidden(test, element) | 58 function expectHidden(test, element) |
| 50 { | 59 { |
| 51 test.equal(window.getComputedStyle(element).display, "none", | 60 test.equal(window.getComputedStyle(element).display, "none", |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 117 let selector = newSelectors.join(", "); | 126 let selector = newSelectors.join(", "); |
| 118 insertStyleRule(selector + "{display: none !important;}"); | 127 insertStyleRule(selector + "{display: none !important;}"); |
| 119 }, | 128 }, |
| 120 elems => | 129 elems => |
| 121 { | 130 { |
| 122 for (let elem of elems) | 131 for (let elem of elems) |
| 123 elem.style.display = "none"; | 132 elem.style.display = "none"; |
| 124 } | 133 } |
| 125 ); | 134 ); |
| 126 | 135 |
| 136 elemHideEmulation.MIN_INVOCATION_INTERVAL = REFRESH_INTERVAL / 2; | |
| 127 elemHideEmulation.apply(); | 137 elemHideEmulation.apply(); |
| 128 return elemHideEmulation; | 138 return elemHideEmulation; |
| 129 }); | 139 }); |
| 130 } | 140 } |
| 131 | 141 |
| 132 exports.testVerbatimPropertySelector = function(test) | 142 exports.testVerbatimPropertySelector = function(test) |
| 133 { | 143 { |
| 134 let toHide = createElementWithStyle("{background-color: #000}"); | 144 let toHide = createElementWithStyle("{background-color: #000}"); |
| 135 applyElemHideEmulation( | 145 applyElemHideEmulation( |
| 136 [":-abp-properties(background-color: rgb(0, 0, 0))"] | 146 [":-abp-properties(background-color: rgb(0, 0, 0))"] |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 240 | 250 |
| 241 exports.testDynamicallyChangedProperty = function(test) | 251 exports.testDynamicallyChangedProperty = function(test) |
| 242 { | 252 { |
| 243 let toHide = createElementWithStyle("{}"); | 253 let toHide = createElementWithStyle("{}"); |
| 244 applyElemHideEmulation( | 254 applyElemHideEmulation( |
| 245 [":-abp-properties(background-color: rgb(0, 0, 0))"] | 255 [":-abp-properties(background-color: rgb(0, 0, 0))"] |
| 246 ).then(() => | 256 ).then(() => |
| 247 { | 257 { |
| 248 expectVisible(test, toHide); | 258 expectVisible(test, toHide); |
| 249 insertStyleRule("#" + toHide.id + " {background-color: #000}"); | 259 insertStyleRule("#" + toHide.id + " {background-color: #000}"); |
| 250 return new Promise((resolve, reject) => | 260 |
| 251 { | 261 return timeout(0); |
| 252 // Re-evaluation will only happen after a few seconds | 262 }).then(() => |
| 253 expectVisible(test, toHide); | 263 { |
| 254 window.setTimeout(() => | 264 // Re-evaluation will only happen after a delay |
| 255 { | 265 expectVisible(test, toHide); |
| 256 expectHidden(test, toHide); | 266 return timeout(REFRESH_INTERVAL); |
| 257 resolve(); | 267 }).then(() => |
| 258 }, 4000); | 268 { |
| 259 }); | 269 expectHidden(test, toHide); |
| 260 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 270 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
| 261 }; | 271 }; |
| 262 | 272 |
| 263 exports.testPseudoClassWithPropBeforeSelector = function(test) | 273 exports.testPseudoClassWithPropBeforeSelector = function(test) |
| 264 { | 274 { |
| 265 let parent = createElementWithStyle("{}"); | 275 let parent = createElementWithStyle("{}"); |
| 266 let child = createElementWithStyle("{background-color: #000}", parent); | 276 let child = createElementWithStyle("{background-color: #000}", parent); |
| 267 insertStyleRule(`#${child.id}::before {content: "publicite"}`); | 277 insertStyleRule(`#${child.id}::before {content: "publicite"}`); |
| 268 | 278 |
| 269 applyElemHideEmulation( | 279 applyElemHideEmulation( |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 498 let parent = createElementWithStyle("{}"); | 508 let parent = createElementWithStyle("{}"); |
| 499 let child = createElementWithStyle("{}", parent); | 509 let child = createElementWithStyle("{}", parent); |
| 500 applyElemHideEmulation( | 510 applyElemHideEmulation( |
| 501 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] | 511 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] |
| 502 ).then(() => | 512 ).then(() => |
| 503 { | 513 { |
| 504 expectVisible(test, child); | 514 expectVisible(test, child); |
| 505 expectVisible(test, parent); | 515 expectVisible(test, parent); |
| 506 | 516 |
| 507 insertStyleRule("body #" + parent.id + " > div { background-color: #000}"); | 517 insertStyleRule("body #" + parent.id + " > div { background-color: #000}"); |
| 508 | 518 return timeout(0); |
| 509 return new Promise((resolve, reject) => | 519 }).then(() => |
| 510 { | 520 { |
| 511 expectVisible(test, child); | 521 expectVisible(test, child); |
| 512 expectVisible(test, parent); | 522 expectVisible(test, parent); |
| 513 window.setTimeout(() => | 523 return timeout(REFRESH_INTERVAL); |
| 514 { | 524 }).then(() => |
| 515 expectVisible(test, child); | 525 { |
| 516 expectHidden(test, parent); | 526 expectVisible(test, child); |
| 517 resolve(); | 527 expectHidden(test, parent); |
| 518 }, 4000); | |
| 519 }); | |
|
Wladimir Palant
2017/08/23 13:23:32
Please use a helper to promisify timeouts:
func
hub
2017/08/23 16:38:00
Done.
| |
| 520 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 528 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
| 521 }; | 529 }; |
| 522 | 530 |
| 523 exports.testDomUpdatesContent = function(test) | 531 exports.testDomUpdatesContent = function(test) |
| 524 { | 532 { |
| 525 let parent = createElementWithStyle("{}"); | 533 let parent = createElementWithStyle("{}"); |
| 526 let child = createElementWithStyle("{}", parent); | 534 let child = createElementWithStyle("{}", parent); |
| 527 applyElemHideEmulation( | 535 applyElemHideEmulation( |
| 528 ["div > div:-abp-contains(hide me)"] | 536 ["div > div:-abp-contains(hide me)"] |
| 529 ).then(() => | 537 ).then(() => |
| 530 { | 538 { |
| 531 expectVisible(test, parent); | 539 expectVisible(test, parent); |
| 532 expectVisible(test, child); | 540 expectVisible(test, child); |
| 533 | 541 |
| 534 child.innerText = "hide me"; | 542 child.textContent = "hide me"; |
|
Wladimir Palant
2017/08/23 13:23:32
Please use child.textContent, innerText is non-sta
hub
2017/08/23 16:38:00
Done.
| |
| 535 return new Promise((resolve, reject) => | 543 return timeout(0); |
| 536 { | 544 }).then(() => |
| 537 expectVisible(test, parent); | 545 { |
| 538 expectVisible(test, child); | 546 expectVisible(test, parent); |
| 539 window.setTimeout(() => | 547 expectVisible(test, child); |
| 540 { | 548 return timeout(REFRESH_INTERVAL); |
| 541 expectVisible(test, parent); | 549 }).then(() => |
| 542 expectHidden(test, child); | 550 { |
| 543 resolve(); | 551 expectVisible(test, parent); |
| 544 }, 4000); | 552 expectHidden(test, child); |
| 545 }); | |
| 546 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 553 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
| 547 }; | 554 }; |
| 548 | 555 |
| 549 exports.testDomUpdatesNewElement = function(test) | 556 exports.testDomUpdatesNewElement = function(test) |
| 550 { | 557 { |
| 551 let parent = createElementWithStyle("{}"); | 558 let parent = createElementWithStyle("{}"); |
| 552 let child = createElementWithStyle("{ background-color: #000}", parent); | 559 let child = createElementWithStyle("{ background-color: #000}", parent); |
| 560 let sibling; | |
| 561 let child2; | |
| 553 applyElemHideEmulation( | 562 applyElemHideEmulation( |
| 554 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] | 563 ["div:-abp-has(:-abp-properties(background-color: rgb(0, 0, 0)))"] |
| 555 ).then(() => | 564 ).then(() => |
| 556 { | 565 { |
| 557 expectHidden(test, parent); | 566 expectHidden(test, parent); |
| 558 expectVisible(test, child); | 567 expectVisible(test, child); |
| 559 | 568 |
| 560 let sibling = createElementWithStyle("{}"); | 569 sibling = createElementWithStyle("{}"); |
| 570 return timeout(0); | |
| 571 }).then(() => | |
| 572 { | |
| 573 expectHidden(test, parent); | |
| 574 expectVisible(test, child); | |
| 561 expectVisible(test, sibling); | 575 expectVisible(test, sibling); |
| 562 | 576 |
| 563 return new Promise((resolve, reject) => | 577 return timeout(REFRESH_INTERVAL); |
| 564 { | 578 }).then(() => |
| 565 expectHidden(test, parent); | 579 { |
| 566 expectVisible(test, child); | 580 expectHidden(test, parent); |
| 567 expectVisible(test, sibling); | 581 expectVisible(test, child); |
| 568 window.setTimeout(() => | 582 expectVisible(test, sibling); |
| 569 { | 583 |
| 570 expectHidden(test, parent); | 584 child2 = createElementWithStyle("{ background-color: #000}", |
| 571 expectVisible(test, child); | 585 sibling); |
| 572 expectVisible(test, sibling); | 586 return timeout(0); |
| 573 | 587 }).then(() => |
| 574 let child2 = createElementWithStyle("{ background-color: #000}", | 588 { |
| 575 sibling); | 589 expectVisible(test, child2); |
| 576 expectVisible(test, child2); | 590 return timeout(REFRESH_INTERVAL); |
| 577 window.setTimeout(() => | 591 }).then(() => |
| 578 { | 592 { |
| 579 expectHidden(test, parent); | 593 expectHidden(test, parent); |
| 580 expectVisible(test, child); | 594 expectVisible(test, child); |
| 581 expectHidden(test, sibling); | 595 expectHidden(test, sibling); |
| 582 expectVisible(test, child2); | 596 expectVisible(test, child2); |
| 583 | 597 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
| 584 resolve(); | 598 }; |
| 585 }, 4000); | |
| 586 }, 4000); | |
|
Wladimir Palant
2017/08/23 13:23:32
The huge delays here are an issue. We need to chan
hub
2017/08/23 16:38:00
IMHO the best approach would be to have it configu
| |
| 587 }); | |
| 588 }).catch(unexpectedError.bind(test)).then(() => test.done()); | |
| 589 }; | |
| LEFT | RIGHT |