| Index: include.postload.js | 
| =================================================================== | 
| --- a/include.postload.js | 
| +++ b/include.postload.js | 
| @@ -1,6 +1,6 @@ | 
| /* | 
| * This file is part of Adblock Plus <http://adblockplus.org/>, | 
| - * Copyright (C) 2006-2013 Eyeo GmbH | 
| + * Copyright (C) 2006-2014 Eyeo GmbH | 
| * | 
| * Adblock Plus is free software: you can redistribute it and/or modify | 
| * it under the terms of the GNU General Public License version 3 as | 
| @@ -299,13 +299,15 @@ | 
| clickHideFilters.push(document.domain + "###" + elementId); | 
| selectorList.push("#" + elementId); | 
| } | 
| -  if (elementClasses) | 
| +  if (elementClasses && elementClasses.length > 0) | 
| { | 
| -    for(var i = 0; i < elementClasses.length; i++) | 
| +    var selector = elementClasses.map(function(elClass) | 
| { | 
| -      clickHideFilters.push(document.domain + "##." + elementClasses[i]); | 
| -      selectorList.push("." + elementClasses[i]); | 
| -    } | 
| +      return "." + elClass.replace(/([^\w-])/, "\\$1"); | 
| +    }).join(""); | 
| + | 
| +    clickHideFilters.push(document.domain + "##" + selector); | 
| +    selectorList.push(selector); | 
| } | 
| if (url) | 
| { | 
| @@ -353,32 +355,6 @@ | 
| return url; | 
| } | 
|  | 
| -// Converts relative to absolute URL | 
| -// e.g.: foo.swf on http://example.com/whatever/bar.html | 
| -//  -> http://example.com/whatever/foo.swf | 
| -function relativeToAbsoluteUrl(url) | 
| -{ | 
| -  // If URL is already absolute, don't mess with it | 
| -  if (!url || /^[\w\-]+:/i.test(url)) | 
| -    return url; | 
| - | 
| -  // Leading / means absolute path | 
| -  // Leading // means network path | 
| -  if (url[0] == '/') | 
| -  { | 
| -    if (url[1] == '/') | 
| -      return document.location.protocol + url; | 
| -    else | 
| -      return document.location.protocol + "//" + document.location.host + url; | 
| -  } | 
| - | 
| -  // Remove filename and add relative URL to it | 
| -  var base = document.baseURI.match(/.+\//); | 
| -  if (!base) | 
| -    return document.baseURI + "/" + url; | 
| -  return base[0] + url; | 
| -} | 
| - | 
| // This function Copyright (c) 2008 Jeni Tennison, from jquery.uri.js | 
| // and licensed under the MIT license. See jquery-*.min.js for details. | 
| function removeDotSegments(u) { | 
| @@ -511,7 +487,7 @@ | 
| clickHide_deactivate(); | 
| break; | 
| case "clickhide-new-filter": | 
| -        // The request is received by all frames, so ignore it if we're not the frame the | 
| +        // The message is received by all frames, so ignore it if we're not the frame the | 
| // user right-clicked in | 
| if(!lastRightClickEvent) | 
| return; | 
| @@ -542,7 +518,7 @@ | 
| // Following test will be true if we found the element with the filter URL | 
| if(msg.filter === url) | 
| { | 
| -          // This request would have come from the chrome.contextMenu handler, so we | 
| +          // This message would have come from the chrome.contextMenu handler, so we | 
| // simulate the user having chosen the element to get rid of via the usual means. | 
| clickHide_activated = true; | 
| // FIXME: clickHideFilters is erased in clickHide_mouseClick anyway, so why set it? | 
| @@ -555,31 +531,41 @@ | 
| clickHide_mouseClick(lastRightClickEvent); | 
| } | 
| else | 
| -          console.log("clickhide-new-filter: URLs don't match. Couldn't find that element.", request.filter, url, lastRightClickEvent.target.src); | 
| +          console.log("clickhide-new-filter: URLs don't match. Couldn't find that element.", msg.filter, url, lastRightClickEvent.target.src); | 
| break; | 
| case "clickhide-init": | 
| if (clickHideFiltersDialog) | 
| { | 
| sendResponse({filters: clickHide_filters}); | 
|  | 
| -          clickHideFiltersDialog.style.width = (msg.width + 5) + "px"; | 
| -          clickHideFiltersDialog.style.height = (msg.height + 5) + "px"; | 
| +          clickHideFiltersDialog.style.width = msg.width + "px"; | 
| +          clickHideFiltersDialog.style.height = msg.height + "px"; | 
| clickHideFiltersDialog.style.visibility = "visible"; | 
| } | 
| break; | 
| case "clickhide-move": | 
| if (clickHideFiltersDialog) | 
| { | 
| -          clickHideFiltersDialog.style.left = (parseInt(clickHideFiltersDialog.style.left, 10) + request.x) + "px"; | 
| -          clickHideFiltersDialog.style.top = (parseInt(clickHideFiltersDialog.style.top, 10) + request.y) + "px"; | 
| +          clickHideFiltersDialog.style.left = (parseInt(clickHideFiltersDialog.style.left, 10) + msg.x) + "px"; | 
| +          clickHideFiltersDialog.style.top = (parseInt(clickHideFiltersDialog.style.top, 10) + msg.y) + "px"; | 
| } | 
| break; | 
| case "clickhide-close": | 
| if (clickHideFiltersDialog) | 
| { | 
| // Explicitly get rid of currentElement | 
| -          if (msg.remove && currentElement && currentElement.parentNode) | 
| -            currentElement.parentNode.removeChild(currentElement); | 
| +          var element = currentElement; | 
| +          currentElement.parentNode.removeChild(currentElement); | 
| +          ext.backgroundPage.sendMessage({ | 
| +            type: "should-collapse", | 
| +            url: element.src, | 
| +            documentUrl: document.URL, | 
| +            mediatype: typeMap[element.localName] | 
| +          }, function(response) | 
| +          { | 
| +            if (response && element.parentNode) | 
| +              element.parentNode.removeChild(element); | 
| +          }); | 
|  | 
| clickHide_deactivate(); | 
| } | 
|  |