| Index: include.postload.js | 
| =================================================================== | 
| --- a/include.postload.js | 
| +++ b/include.postload.js | 
| @@ -24,30 +24,6 @@ | 
| var lastRightClickEvent = null; | 
| var lastRightClickEventValid = false; | 
| -function escapeChar(chr) | 
| -{ | 
| - var code = chr.charCodeAt(0); | 
| - | 
| - // Control characters and leading digits must be escaped based on | 
| - // their char code in CSS. Moreover, curly brackets aren't allowed | 
| - // in elemhide filters, and therefore must be escaped based on their | 
| - // char code as well. | 
| - if (code <= 0x1F || code == 0x7F || /[\d\{\}]/.test(chr)) | 
| - return "\\" + code.toString(16) + " "; | 
| - | 
| - return "\\" + chr; | 
| -} | 
| - | 
| -function quote(value) | 
| -{ | 
| - return '"' + value.replace(/["\\\{\}\x00-\x1F\x7F]/g, escapeChar) + '"'; | 
| -} | 
| - | 
| -function escapeCSS(s) | 
| -{ | 
| - return s.replace(/^[\d\-]|[^\w\-\u0080-\uFFFF]/g, escapeChar); | 
| -} | 
| - | 
| function highlightElement(element, shadowColor, backgroundColor) | 
| { | 
| unhighlightElement(element); | 
| @@ -144,7 +120,7 @@ | 
| { | 
| var url = element.getAttribute("data"); | 
| if (url) | 
| - return [resolveURL(url)]; | 
| + return [url]; | 
| for (var i = 0; i < element.children.length; i++) | 
| { | 
| @@ -163,7 +139,7 @@ | 
| if (!value) | 
| continue; | 
| - return [resolveURL(value)]; | 
| + return [value]; | 
| } | 
| return []; | 
| @@ -183,7 +159,7 @@ | 
| { | 
| var url = candidates[i].trim().replace(/\s+\S+$/, ""); | 
| if (url) | 
| - urls.push(resolveURL(url)); | 
| + urls.push(url); | 
| } | 
| } | 
| @@ -509,6 +485,26 @@ | 
| } | 
| } | 
| +function getFiltersForElement(element, callback) | 
| +{ | 
| + ext.backgroundPage.sendMessage( | 
| + { | 
| + type: "compose-filters", | 
| + tagName: element.localName, | 
| + id: element.id, | 
| + src: element.getAttribute("src"), | 
| + style: element.getAttribute("style"), | 
| + classes: [].slice.call(element.classList), | 
| + urls: getURLsFromElement(element), | 
| + baseURL: document.location.href | 
| + }, | 
| + function(response) | 
| + { | 
| + callback(response.filters, response.selectors); | 
| + } | 
| + ); | 
| +} | 
| + | 
| // When the user clicks, the currentElement is the one we want. | 
| // We should have ABP rules ready for when the | 
| // popup asks for them. | 
| @@ -521,62 +517,8 @@ | 
| if (currentElement.classList.contains("__adblockplus__overlay")) | 
| elt = currentElement.prisoner; | 
| - var clickHideFilters = []; | 
| - var selectorList = []; | 
| - | 
| - var addSelector = function(selector) | 
| + getFiltersForElement(elt, function(filters, selectors) | 
| { | 
| - if (selectorList.indexOf(selector) != -1) | 
| - return; | 
| - | 
| - clickHideFilters.push(document.domain + "##" + selector); | 
| - selectorList.push(selector); | 
| - }; | 
| - | 
| - if (elt.id) | 
| - addSelector("#" + escapeCSS(elt.id)); | 
| - | 
| - if (elt.classList.length > 0) | 
| - { | 
| - var selector = ""; | 
| - | 
| - for (var i = 0; i < elt.classList.length; i++) | 
| - selector += "." + escapeCSS(elt.classList[i]); | 
| - | 
| - addSelector(selector); | 
| - } | 
| - | 
| - var urls = getURLsFromElement(elt); | 
| - for (var i = 0; i < urls.length; i++) | 
| - { | 
| - var url = urls[i]; | 
| - | 
| - if (/^https?:/i.test(url)) | 
| - { | 
| - var filter = url.replace(/^[\w\-]+:\/+(?:www\.)?/, "||"); | 
| - | 
| - if (clickHideFilters.indexOf(filter) == -1) | 
| - clickHideFilters.push(filter); | 
| - | 
| - continue; | 
| - } | 
| - | 
| - if (url == elt.src) | 
| - addSelector(escapeCSS(elt.localName) + '[src=' + quote(elt.getAttribute("src")) + ']'); | 
| - } | 
| - | 
| - // as last resort, create a filter based on inline styles | 
| - if (clickHideFilters.length == 0) | 
| - { | 
| - var style = elt.getAttribute("style"); | 
| - if (style) | 
| - addSelector(escapeCSS(elt.localName) + '[style=' + quote(style) + ']'); | 
| - } | 
| - | 
| - // Show popup, or if inside frame tell the parent to do it | 
| - if (window.self == window.top) | 
| - clickHide_showDialog(e.clientX, e.clientY, clickHideFilters); | 
| - else | 
| ext.backgroundPage.sendMessage( | 
| { | 
| type: "forward", | 
| @@ -585,15 +527,15 @@ | 
| type: "clickhide-show-dialog", | 
| screenX: e.screenX, | 
| screenY: e.screenY, | 
| - clickHideFilters: clickHideFilters | 
| + clickHideFilters: filters | 
| } | 
| }); | 
| - // Highlight the elements specified by selector in yellow | 
| - if (selectorList.length > 0) | 
| - highlightElements(selectorList.join(",")); | 
| - // Now, actually highlight the element the user clicked on in red | 
| - highlightElement(currentElement, "#fd1708", "#f6a1b5"); | 
| + if (selectors.length > 0) | 
| + highlightElements(selectors.join(",")); | 
| + | 
| + highlightElement(currentElement, "#fd1708", "#f6a1b5"); | 
| + }); | 
| // Make sure the browser doesn't handle this click | 
| e.preventDefault(); |