| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| 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 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 310 } | 310 } |
| 311 }; | 311 }; |
| 312 | 312 |
| 313 function ElemHideEmulation(window, getFiltersFunc, addSelectorsFunc, | 313 function ElemHideEmulation(window, getFiltersFunc, addSelectorsFunc, |
| 314 hideElemsFunc) | 314 hideElemsFunc) |
| 315 { | 315 { |
| 316 this.window = window; | 316 this.window = window; |
| 317 this.getFiltersFunc = getFiltersFunc; | 317 this.getFiltersFunc = getFiltersFunc; |
| 318 this.addSelectorsFunc = addSelectorsFunc; | 318 this.addSelectorsFunc = addSelectorsFunc; |
| 319 this.hideElemsFunc = hideElemsFunc; | 319 this.hideElemsFunc = hideElemsFunc; |
| 320 this.observer = new MutationObserver(this.observe.bind(this)); | |
|
Wladimir Palant
2017/07/21 21:37:28
new window.MutationObserver?
hub
2017/07/22 01:31:24
https://developer.mozilla.org/en-US/docs/Web/API/M
hub
2017/07/23 15:36:34
My bad. will actually do that.
| |
| 320 } | 321 } |
| 321 | 322 |
| 322 ElemHideEmulation.prototype = { | 323 ElemHideEmulation.prototype = { |
| 323 isSameOrigin(stylesheet) | 324 isSameOrigin(stylesheet) |
| 324 { | 325 { |
| 325 try | 326 try |
| 326 { | 327 { |
| 327 return new URL(stylesheet.href).origin == this.window.location.origin; | 328 return new URL(stylesheet.href).origin == this.window.location.origin; |
| 328 } | 329 } |
| 329 catch (e) | 330 catch (e) |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 480 } | 481 } |
| 481 } | 482 } |
| 482 } | 483 } |
| 483 | 484 |
| 484 this.addSelectorsFunc(selectors, selectorFilters); | 485 this.addSelectorsFunc(selectors, selectorFilters); |
| 485 this.hideElemsFunc(elements, elementFilters); | 486 this.hideElemsFunc(elements, elementFilters); |
| 486 }, | 487 }, |
| 487 | 488 |
| 488 _stylesheetQueue: null, | 489 _stylesheetQueue: null, |
| 489 | 490 |
| 491 queueFiltering() | |
| 492 { | |
| 493 if (!this._stylesheetQueue && | |
| 494 Date.now() - this._lastInvocation < MIN_INVOCATION_INTERVAL) | |
| 495 { | |
| 496 this._stylesheetQueue = []; | |
| 497 this.window.setTimeout(() => | |
| 498 { | |
| 499 let stylesheets = this._stylesheetQueue; | |
| 500 this._stylesheetQueue = null; | |
| 501 this.addSelectors(stylesheets); | |
| 502 }, MIN_INVOCATION_INTERVAL - (Date.now() - this._lastInvocation)); | |
| 503 } | |
| 504 }, | |
| 505 | |
| 490 onLoad(event) | 506 onLoad(event) |
| 491 { | 507 { |
| 492 let stylesheet = event.target.sheet; | 508 let stylesheet = event.target.sheet; |
| 493 if (stylesheet) | 509 if (stylesheet) |
| 494 { | 510 { |
| 495 if (!this._stylesheetQueue && | 511 this.queueFiltering(); |
| 496 Date.now() - this._lastInvocation < MIN_INVOCATION_INTERVAL) | |
| 497 { | |
| 498 this._stylesheetQueue = []; | |
| 499 this.window.setTimeout(() => | |
| 500 { | |
| 501 let stylesheets = this._stylesheetQueue; | |
| 502 this._stylesheetQueue = null; | |
| 503 this.addSelectors(stylesheets); | |
| 504 }, MIN_INVOCATION_INTERVAL - (Date.now() - this._lastInvocation)); | |
| 505 } | |
| 506 | 512 |
| 507 if (this._stylesheetQueue) | 513 if (this._stylesheetQueue) |
| 508 this._stylesheetQueue.push(stylesheet); | 514 this._stylesheetQueue.push(stylesheet); |
| 509 else | 515 else |
| 510 this.addSelectors([stylesheet]); | 516 this.addSelectors([stylesheet]); |
| 511 } | 517 } |
| 512 }, | 518 }, |
| 513 | 519 |
| 520 observe(mutations) | |
| 521 { | |
| 522 for (let mutation of mutations) | |
| 523 { | |
| 524 if (mutation.type == "childList") | |
| 525 { | |
| 526 this.queueFiltering(); | |
|
Wladimir Palant
2017/07/21 21:37:28
a) Reapplying the rules on the entire document is
hub
2017/07/22 01:31:24
Acknowledged.
| |
| 527 break; | |
| 528 } | |
| 529 } | |
| 530 }, | |
| 531 | |
| 514 apply() | 532 apply() |
| 515 { | 533 { |
| 516 this.getFiltersFunc(patterns => | 534 this.getFiltersFunc(patterns => |
| 517 { | 535 { |
| 518 this.patterns = []; | 536 this.patterns = []; |
| 519 for (let pattern of patterns) | 537 for (let pattern of patterns) |
| 520 { | 538 { |
| 521 let selectors = this.parseSelector(pattern.selector); | 539 let selectors = this.parseSelector(pattern.selector); |
| 522 if (selectors != null && selectors.length > 0) | 540 if (selectors != null && selectors.length > 0) |
| 523 this.patterns.push({selectors, text: pattern.text}); | 541 this.patterns.push({selectors, text: pattern.text}); |
| 524 } | 542 } |
| 525 | 543 |
| 526 if (this.patterns.length > 0) | 544 if (this.patterns.length > 0) |
| 527 { | 545 { |
| 528 let {document} = this.window; | 546 let {document} = this.window; |
| 529 this.addSelectors(); | 547 this.addSelectors(); |
| 548 this.observer.observe( | |
| 549 document, | |
| 550 { | |
| 551 childList: true, | |
| 552 subtree: true | |
| 553 } | |
| 554 ); | |
| 530 document.addEventListener("load", this.onLoad.bind(this), true); | 555 document.addEventListener("load", this.onLoad.bind(this), true); |
| 531 } | 556 } |
| 532 }); | 557 }); |
| 533 } | 558 } |
| 534 }; | 559 }; |
| OLD | NEW |