Index: include.preload.js |
=================================================================== |
--- a/include.preload.js |
+++ b/include.preload.js |
@@ -15,6 +15,7 @@ |
* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
*/ |
+var MutationObserver = window.MutationObserver || window.WebKitMutationObserver; |
var SELECTOR_GROUP_SIZE = 20; |
var typeMap = { |
@@ -127,48 +128,49 @@ |
function checkCollapse(element) |
{ |
- var tag = element.localName; |
- if (tag in typeMap) |
- { |
- // This element failed loading, did we block it? |
- var urls = getURLsFromElement(element); |
- if (urls.length == 0) |
- return; |
+ window.collapsing = true; |
- ext.backgroundPage.sendMessage( |
+ var mediatype = typeMap[element.localName]; |
+ if (!mediatype) |
+ return; |
+ |
+ var urls = getURLsFromElement(element); |
+ if (urls.length == 0) |
+ return; |
+ |
+ ext.backgroundPage.sendMessage( |
+ { |
+ type: "should-collapse", |
+ urls: urls, |
+ mediatype: mediatype, |
+ baseURL: document.location.href |
+ }, |
+ |
+ function(collapse) |
+ { |
+ function collapseElement() |
{ |
- type: "should-collapse", |
- urls: urls, |
- mediatype: typeMap[tag], |
- baseURL: document.location.href |
- }, |
+ if (element.localName == "frame") |
+ element.style.setProperty("visibility", "hidden", "important"); |
+ else |
+ element.style.setProperty("display", "none", "important"); |
+ } |
- function(response) |
+ if (collapse && !element._collapsed) |
{ |
- if (response && element.parentNode) |
- { |
- var property = "display"; |
- var value = "none"; |
+ collapseElement(); |
+ element._collapsed = true; |
- // <frame> cannot be removed, doing that will mess up the frameset |
- if (tag == "frame") |
- { |
- property = "visibility"; |
- value = "hidden"; |
- } |
- |
- // <input type="image"> elements try to load their image again |
- // when the "display" CSS property is set. So we have to check |
- // that it isn't already collapsed to avoid an infinite recursion. |
- if (element.style.getPropertyValue(property) != value || |
- element.style.getPropertyPriority(property) != "important") |
- element.style.setProperty(property, value, "important"); |
- } |
+ if (MutationObserver) |
+ new MutationObserver(collapseElement).observe( |
+ element, { |
+ attributes: true, |
+ attributeFilter: ["style"] |
+ } |
+ ); |
} |
- ); |
- } |
- |
- window.collapsing = true; |
+ } |
+ ); |
} |
function checkSitekey() |
@@ -333,8 +335,6 @@ |
function reinjectStyleSheetWhenRemoved(document, style) |
{ |
- var MutationObserver = window.MutationObserver || |
- window.WebKitMutationObserver; |
if (!MutationObserver) |
return null; |