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(el) |
+ { |
+ let propertyName = "display"; |
+ let propertyValue = "none"; |
+ if (el.localName == "frame") |
+ { |
+ propertyName = "visibility"; |
+ propertyValue = "hidden"; |
+ } |
+ |
+ if (el.style.getPropertyValue(propertyName) != propertyValue || |
+ el.style.getPropertyPriority(propertyName) != "important") |
+ el.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"); |
@@ -343,17 +348,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 |
@@ -432,16 +438,31 @@ |
this.style.sheet.insertRule(selector + "{display: none !important;}", |
this.style.sheet.cssRules.length); |
} |
if (this.tracer) |
this.tracer.addSelectors(selectors, filters); |
}, |
+ hideElements(elements, filters) |
+ { |
+ for (let element of elements) |
+ hideElement(element); |
+ |
+ if (this.tracer) |
+ { |
+ ext.backgroundPage.sendMessage({ |
+ type: "devtools.traceElemHide", |
+ selectors: [], |
+ filters |
+ }); |
+ } |
+ }, |
+ |
apply() |
{ |
ext.backgroundPage.sendMessage({type: "get-selectors"}, response => |
{ |
if (this.tracer) |
this.tracer.disconnect(); |
this.tracer = null; |