Index: lib/elemHide.js |
=================================================================== |
--- a/lib/elemHide.js |
+++ b/lib/elemHide.js |
@@ -21,17 +21,16 @@ |
Cu.import("resource://gre/modules/Services.jsm"); |
let {Utils} = require("utils"); |
let {IO} = require("io"); |
let {Prefs} = require("prefs"); |
let {ElemHideException} = require("filterClasses"); |
let {FilterNotifier} = require("filterNotifier"); |
-let {AboutHandler} = require("elemHideHitRegistration"); |
/** |
* Lookup table, filters by their associated key |
* @type Object |
*/ |
let filterByKey = Object.create(null); |
/** |
@@ -76,25 +75,32 @@ let ElemHide = exports.ElemHide = |
*/ |
applied: false, |
/** |
* Called on module startup. |
*/ |
init: function() |
{ |
+ let messageManager = Cc["@mozilla.org/parentprocessmessagemanager;1"] |
+ .getService(Ci.nsIMessageListenerManager); |
+ let hitHandler = (message => { |
+ let result = ElemHide.shouldHide(message.data); |
+ let target = message.target.QueryInterface(Ci.nsIMessageSender); |
+ target.sendAsyncMessage(message.data.responseMessage, result); |
+ }); |
+ messageManager.addMessageListener("AdblockPlus:ElemHideHit", hitHandler); |
+ onShutdown.add(() => messageManager.removeMessageListener("AdblockPlus:ElemHideHit", hitHandler)); |
+ |
Prefs.addListener(function(name) |
{ |
if (name == "enabled") |
ElemHide.apply(); |
}); |
- onShutdown.add(function() |
- { |
- ElemHide.unapply(); |
- }); |
+ onShutdown.add(() => ElemHide.unapply()); |
let styleFile = IO.resolveFilePath(Prefs.data_directory); |
styleFile.append("elemhide.css"); |
styleURL = Services.io.newFileURI(styleFile).QueryInterface(Ci.nsIFileURL); |
}, |
/** |
* Removes all known filters |
@@ -184,16 +190,64 @@ let ElemHide = exports.ElemHide = |
for (let i = list.length - 1; i >= 0; i--) |
if (list[i].isActiveOnDomain(docDomain)) |
return list[i]; |
return null; |
}, |
/** |
+ * Processes an element hiding hit |
+ * @param {String} message.key |
+ * key of the matching element hiding rule |
+ * @param {Object[]} message.frames |
+ * information required to reconstruct frame |
+ * data for the hit |
+ * @return {Boolean} |
+ */ |
+ shouldHide: function(message) |
+ { |
+ let filter = ElemHide.getFilterByKey(message.key); |
+ if (!filter || !message.frames.length) |
+ return false; |
+ |
+ let fakeFrame = null; |
+ for (let i = message.frames.length - 1; i >= 0; i--) |
+ { |
+ fakeFrame = { |
+ parent: fakeFrame, |
+ location: { |
+ href: message.frames[i].location |
+ }, |
+ document: { |
+ documentElement: {} |
+ }, |
+ QueryInterface: function() {return this;}, |
+ getInterface: function() {return this;}, |
+ usePrivateBrowsing: (fakeFrame ? fakeFrame.usePrivateBrowsing : message.frames[i].privateBrowsing) |
+ }; |
+ fakeFrame.top = fakeFrame.parent || fakeFrame; |
+ if (!fakeFrame.parent) |
+ fakeFrame.parent = fakeFrame; |
+ |
+ let sitekey = message.frames[i].sitekey || null; |
+ fakeFrame.document.documentElement.getAttribute = function(attr) |
+ { |
+ if (attr == "data-adblockkey") |
+ return sitekey; |
+ else |
+ return null; |
+ }; |
+ } |
+ |
+ let {Policy} = require("contentPolicy"); |
+ return !Policy.processNode(fakeFrame, fakeFrame.document, Policy.type.ELEMHIDE, filter); |
Wladimir Palant
2015/10/16 12:15:10
Side-effect here: the hit info is attached to a fa
|
+ }, |
+ |
+ /** |
* Will be set to true if apply() is running (reentrance protection). |
* @type Boolean |
*/ |
_applying: false, |
/** |
* Will be set to true if an apply() call arrives while apply() is already |
* running (delayed execution). |
@@ -308,17 +362,17 @@ let ElemHide = exports.ElemHide = |
throw Cr.NS_ERROR_NOT_AVAILABLE; |
function escapeChar(match) |
{ |
return "\\" + match.charCodeAt(0).toString(16) + " "; |
} |
// Return CSS data |
- let cssTemplate = "-moz-binding: url(about:" + AboutHandler.aboutPrefix + "?%ID%#dummy) !important;"; |
+ let cssTemplate = "-moz-binding: url(about:abp-elemhidehit?%ID%#dummy) !important;"; |
for (let domain in domains) |
{ |
let rules = []; |
let list = domains[domain]; |
if (domain) |
yield ('@-moz-document domain("' + domain.split(",").join('"),domain("') + '"){').replace(/[^\x01-\x7F]/g, escapeChar); |
else |