Index: include.preload.js |
=================================================================== |
--- a/include.preload.js |
+++ b/include.preload.js |
@@ -48,80 +48,48 @@ function setElemhideCSSRules(selectors) |
{ |
var selector = selectors.slice(i, i + SELECTOR_GROUP_SIZE).join(", "); |
elt.sheet.insertRule(selector + " { display: none !important; }", j); |
} |
} |
setRules(); |
} |
-function removeElements(tagName, urls) |
+function checkCollapse(event) |
{ |
- var remove = []; |
- var elements = document.getElementsByTagName(tagName); |
- for (var i = 0, l = elements.length; i < l; i++) |
- if (elements[i].src in urls) |
- remove.push(elements[i]); |
+ var target = event.target; |
+ if ((event.type == "error" && target instanceof HTMLImageElement) || |
+ (event.type == "load" && target instanceof HTMLIFrameElement)) |
+ { |
+ // This element failed loading, did we block it? |
+ var url = target.src; |
+ if (!url) |
+ return; |
- for (var i = 0, l = remove.length; i < l; i++) |
- if (remove[i].parentNode) |
- remove[i].parentNode.removeChild(remove[i]); |
- |
- return remove.length > 0; |
+ var type = (target instanceof HTMLImageElement ? "IMAGE": "SUBDOCUMENT"); |
+ chrome.extension.sendRequest({reqtype: "should-collapse", url: url, documentUrl: document.URL, type: type}, function(response) |
+ { |
+ if (response && target.parentNode) |
+ target.parentNode.removeChild(target); |
+ }); |
+ } |
} |
-var removeMap = |
-{ |
- IMAGE: { |
- tag: "img", |
- remove: {}, |
- loadHandler: false |
- }, |
- SUBDOCUMENT: { |
- tag: "iframe", |
- remove: {}, |
- loadHandler: false |
- } |
-}; |
-removeMap.IMAGE.handler = removeElements.bind(null, removeMap.IMAGE.tag, removeMap.IMAGE.remove); |
-removeMap.SUBDOCUMENT.handler = removeElements.bind(null, removeMap.SUBDOCUMENT.tag, removeMap.SUBDOCUMENT.remove); |
- |
function sendRequests() |
{ |
// Make sure this is really an HTML page, as Chrome runs these scripts on just about everything |
if (!(document.documentElement instanceof HTMLElement)) |
return; |
- chrome.extension.onMessage.addListener(function(request, sender, sendResponse) |
- { |
- switch (request.reqtype) |
- { |
- case "hide-element": |
- if (request.documentUrl != document.URL) |
- return; |
- |
- // We have little way of knowing which element was blocked - see |
- // http://code.google.com/p/chromium/issues/detail?id=97392. Have to |
- // look through all of them and try to find the right one. And if we |
- // don't find it then maybe it just wasn't added yet. |
- var info = removeMap[request.type]; |
- info.remove[request.url] = true; |
- if (info.handler()) |
- delete info.remove[request.url]; |
- else if (!info.onLoadHandler) |
- { |
- window.addEventListener("DOMContentLoaded", info.handler, false); |
- info.onLoadHandler = true; |
- } |
- } |
- }); |
- |
chrome.extension.sendRequest({reqtype: "get-settings", selectors: true, frameUrl: window.location.href}, function(response) |
{ |
setElemhideCSSRules(response.selectors); |
}); |
} |
+document.addEventListener("error", checkCollapse, true); |
+document.addEventListener("load", checkCollapse, true); |
+ |
// In Chrome 18 the document might not be initialized yet |
if (document.documentElement) |
sendRequests(); |
else |
window.setTimeout(sendRequests, 0); |