Index: include.postload.js |
=================================================================== |
--- a/include.postload.js |
+++ b/include.postload.js |
@@ -175,6 +175,84 @@ |
} |
} |
+function getElementURLs(element) { |
+ var urls = []; |
+ |
+ if (element.src) |
+ urls.push(element.src); |
+ |
+ switch (element.localName) |
+ { |
+ case "object": |
+ var url = element.getAttribute("data"); |
+ if (url) |
+ return [resolveURL(url)]; |
+ |
+ for (var i = 0; i < element.children.length; i++) |
+ { |
+ var child = element.children[i]; |
+ if (child.localName != "param") |
+ continue; |
+ |
+ var name = child.getAttribute("name"); |
+ if (name != "movie" && name != "src") |
+ continue; |
+ |
+ var value = child.getAttribute("value"); |
+ if (!value) |
+ continue; |
+ |
+ return [resolveURL(value)]; |
+ } |
+ |
+ return []; |
+ |
+ case "video": |
+ case "audio": |
+ case "picture": |
+ for (var i = 0; i < element.children.length; i++) |
+ { |
+ var child = element.children[i]; |
+ |
+ if (child.localName != "source") |
+ continue; |
+ |
+ if (child.src) |
+ urls.push(child.src); |
+ |
+ urls = urls.concat(parseSrcSet(child)); |
+ } |
+ |
+ if (element.poster) |
+ urls.push(element.poster); |
+ |
+ break; |
+ |
+ case "img": |
+ urls = urls.concat(parseSrcSet(element)); |
+ } |
+ |
+ return urls; |
+} |
+ |
+function isBlockable(element) |
+{ |
+ if (element.id) |
+ return true; |
+ if (element.classList.length > 0) |
+ return true; |
+ if (getElementURLs(element).length > 0) |
+ return true; |
+ |
+ // We only generate filters based on the "style" attribute, |
+ // if this is the only way we can generate a filter, and |
+ // only if there are at least two CSS properties defined. |
+ if (/:.+:/.test(element.getAttribute("style"))) |
+ return true; |
+ |
+ return false; |
+} |
+ |
// Gets the absolute position of an element by walking up the DOM tree, |
// adding up offsets. |
// I hope there's a better way because it just seems absolutely stupid |
@@ -198,13 +276,11 @@ |
// If element doesn't have at least one of class name, ID or URL, give up |
// because we don't know how to construct a filter rule for it |
- var url = getElementURL(elt); |
- if(!elt.className && !elt.id && !url) |
+ if(!isBlockable(elt)) |
return; |
var thisStyle = getComputedStyle(elt, null); |
var overlay = document.createElement('div'); |
overlay.prisoner = elt; |
- overlay.prisonerURL = url; |
overlay.className = "__adblockplus__overlay"; |
overlay.setAttribute('style', 'opacity:0.4; background-color:#ffffff; display:inline-box; ' + 'width:' + thisStyle.width + '; height:' + thisStyle.height + '; position:absolute; overflow:hidden; -webkit-box-sizing:border-box; z-index: 99999'); |
var pos = getAbsolutePosition(elt); |
@@ -265,7 +341,7 @@ |
clickHide_deactivate(); |
// Add overlays for elements with URLs so user can easily click them |
- var elts = document.querySelectorAll('object,embed,img,iframe'); |
+ var elts = document.querySelectorAll('object,embed,img,iframe,video,audio,picture'); |
for(var i=0; i<elts.length; i++) |
addElementOverlay(elts[i]); |
@@ -333,7 +409,7 @@ |
return; |
var target = e.target; |
- while (target.parentNode && !(target.id || target.className || target.src || /:.+:/.test(target.getAttribute("style")))) |
+ while (target.parentNode && !isBlockable(target)) |
target = target.parentNode; |
if (target == document.documentElement || target == document.body) |
target = null; |
@@ -386,20 +462,17 @@ |
return; |
var elt = currentElement; |
- var url = null; |
if (currentElement.classList.contains("__adblockplus__overlay")) |
- { |
elt = currentElement.prisoner; |
- url = currentElement.prisonerURL; |
- } |
- else if (elt.src) |
- url = elt.src; |
clickHideFilters = new Array(); |
selectorList = new Array(); |
var addSelector = function(selector) |
{ |
+ if (selectorList.indexOf(selector) != -1) |
+ return; |
+ |
clickHideFilters.push(document.domain + "##" + selector); |
selectorList.push(selector); |
}; |
@@ -417,20 +490,31 @@ |
addSelector(selector); |
} |
- if (url) |
+ var urls = getElementURLs(elt); |
+ for (var i = 0; i < urls.length; i++) |
{ |
- var src = elt.getAttribute("src"); |
- var selector = src && escapeCSS(elt.localName) + '[src=' + quote(src) + ']'; |
+ var url = urls[i]; |
+ var isHTTP = /^https?:/i.test(url); |
- if (/^https?:/i.test(url)) |
+ if (isHTTP) |
{ |
- clickHideFilters.push(url.replace(/^[\w\-]+:\/+(?:www\.)?/, "||")); |
+ var filter = url.replace(/^[\w\-]+:\/+(?:www\.)?/, "||"); |
- if (selector) |
+ if (clickHideFilters.indexOf(filter) != -1) |
+ continue; |
+ |
+ clickHideFilters.push(filter); |
+ } |
+ |
+ if (url == elt.src) |
+ { |
+ var selector = escapeCSS(elt.localName) + '[src=' + quote(elt.getAttribute("src")) + ']'; |
+ |
+ if (isHTTP) |
selectorList.push(selector); |
+ else |
+ addSelector(selector); |
} |
- else if (selector) |
- addSelector(selector); |
} |
// restore the original style, before generating the fallback filter that |
@@ -458,29 +542,22 @@ |
e.stopPropagation(); |
} |
-// Extracts source URL from an IMG, OBJECT, EMBED, or IFRAME |
-function getElementURL(elt) { |
- // Check children of object nodes for "param" nodes with name="movie" that specify a URL |
- // in value attribute |
- var url; |
- if(elt.localName.toUpperCase() == "OBJECT" && !(url = elt.getAttribute("data"))) { |
- // No data attribute, look in PARAM child tags for a URL for the swf file |
- var params = elt.querySelectorAll("param[name=\"movie\"]"); |
- // This OBJECT could contain an EMBED we already nuked, in which case there's no URL |
- if(params[0]) |
- url = params[0].getAttribute("value"); |
- else { |
- params = elt.querySelectorAll("param[name=\"src\"]"); |
- if(params[0]) |
- url = params[0].getAttribute("value"); |
- } |
+function parseSrcSet(element) |
+{ |
+ if (!element.srcset) |
+ return []; |
+ var urls = element.srcset.split(","); |
+ for (var i = 0; i < urls.length; i++) |
+ { |
+ var url = urls[i].replace(/^\s+/, "").replace(/(\s+\S+)?\s*$/, ""); |
if (url) |
- url = resolveURL(url); |
- } else if(!url) { |
- url = elt.src || elt.href; |
+ urls[i] = resolveURL(url); |
+ else |
+ urls.splice(i--, 1); |
} |
- return url; |
+ |
+ return urls; |
} |
// This function Copyright (c) 2008 Jeni Tennison, from jquery.uri.js |