| 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(); |