| Index: include.preload.js |
| =================================================================== |
| --- a/include.preload.js |
| +++ b/include.preload.js |
| @@ -122,16 +122,43 @@ |
| { |
| if (/^(?!https?:)[\w-]+:/i.test(urls[i])) |
| urls.splice(i--, 1); |
| } |
| return urls; |
| } |
| +function hideElement(element) |
| +{ |
| + function doHide(element) |
| + { |
| + let propertyName = "display"; |
| + let propertyValue = "none"; |
| + if (element.localName == "frame") |
| + { |
| + propertyName = "visibility"; |
| + propertyValue = "hidden"; |
| + } |
| + |
| + if (element.style.getPropertyValue(propertyName) != propertyValue || |
| + element.style.getPropertyPriority(propertyName) != "important") |
| + element.style.setProperty(propertyName, propertyValue, "important"); |
| + } |
| + |
| + doHide(element); |
| + |
| + new MutationObserver(doHide).observe( |
| + element, { |
| + attributes: true, |
| + attributeFilter: ["style"] |
| + } |
| + ); |
| +} |
| + |
| function checkCollapse(element) |
| { |
| let mediatype = typeMap.get(element.localName); |
| if (!mediatype) |
| return; |
| let urls = getURLsFromElement(element); |
| if (urls.length == 0) |
| @@ -142,41 +169,19 @@ |
| type: "filters.collapse", |
| urls, |
| mediatype, |
| baseURL: document.location.href |
| }, |
| collapse => |
| { |
| - function collapseElement() |
| - { |
| - let propertyName = "display"; |
| - let propertyValue = "none"; |
| - if (element.localName == "frame") |
| - { |
| - propertyName = "visibility"; |
| - propertyValue = "hidden"; |
| - } |
| - |
| - if (element.style.getPropertyValue(propertyName) != propertyValue || |
| - element.style.getPropertyPriority(propertyName) != "important") |
| - element.style.setProperty(propertyName, propertyValue, "important"); |
| - } |
| - |
| if (collapse) |
| { |
| - collapseElement(); |
| - |
| - new MutationObserver(collapseElement).observe( |
| - element, { |
| - attributes: true, |
| - attributeFilter: ["style"] |
| - } |
| - ); |
| + hideElement(element); |
| } |
| } |
| ); |
| } |
| function checkSitekey() |
| { |
| let attr = document.documentElement.getAttribute("data-adblockkey"); |
| @@ -205,16 +210,28 @@ |
| { |
| if (document.readyState != "loading") |
| this.checkNodes([document], selectors, filters); |
| this.selectors.push(...selectors); |
| this.filters.push(...filters); |
| }, |
| + reportFilters(filters) |
| + { |
| + let matchedSelectors = []; |
| + for (let filter of filters) |
| + matchedSelectors.push(filter.replace(/^.*?##/, "")); |
| + |
| + ext.backgroundPage.sendMessage({ |
| + type: "devtools.traceElemHide", |
| + selectors: matchedSelectors |
| + }); |
| + }, |
| + |
| checkNodes(nodes, selectors, filters) |
| { |
| let matchedSelectors = []; |
| for (let i = 0; i < selectors.length; i++) |
| { |
| nodes: for (let node of nodes) |
| { |
| @@ -222,30 +239,25 @@ |
| for (let element of elements) |
| { |
| // Only consider selectors that actually have an effect on the |
| // computed styles, and aren't overridden by rules with higher |
| // priority, or haven't been circumvented in a different way. |
| if (getComputedStyle(element).display == "none") |
| { |
| - matchedSelectors.push(filters[i].replace(/^.*?##/, "")); |
| + matchedSelectors.push(filters[i]); |
| break nodes; |
| } |
| } |
| } |
| } |
| if (matchedSelectors.length > 0) |
| - { |
| - ext.backgroundPage.sendMessage({ |
| - type: "devtools.traceElemHide", |
| - selectors: matchedSelectors |
| - }); |
| - } |
| + this.reportFilters(matchedSelectors); |
| }, |
| onTimeout() |
| { |
| this.checkNodes(this.changedNodes, this.selectors, this.filters); |
| this.changedNodes = []; |
| this.timeout = null; |
| }, |
| @@ -425,17 +437,18 @@ |
| window, |
| callback => |
| { |
| ext.backgroundPage.sendMessage({ |
| type: "filters.get", |
| what: "elemhideemulation" |
| }, callback); |
| }, |
| - this.addSelectors.bind(this) |
| + this.addSelectors.bind(this), |
| + this.hideElements.bind(this) |
| ); |
| } |
| ElemHide.prototype = { |
| selectorGroupSize: 200, |
| createShadowTree() |
| { |
| // Use Shadow DOM if available as to not mess with with web pages that |
| @@ -536,16 +549,25 @@ |
| this.style.sheet.insertRule(selector + "{display: none !important;}", |
| this.style.sheet.cssRules.length); |
| } |
| if (this.tracer) |
| this.tracer.addSelectors(selectors, filters || selectors); |
| }, |
| + hideElements(elements, filters) |
| + { |
| + for (let element of elements) |
| + hideElement(element); |
| + |
| + if (this.tracer) |
| + this.tracer.reportFilters(filters); |
| + }, |
| + |
| apply() |
| { |
| ext.backgroundPage.sendMessage({type: "get-selectors"}, response => |
| { |
| if (this.tracer) |
| this.tracer.disconnect(); |
| this.tracer = null; |