Index: lib/child/requestNotifier.js |
=================================================================== |
--- a/lib/child/requestNotifier.js |
+++ b/lib/child/requestNotifier.js |
@@ -32,23 +32,25 @@ let requestEntryMaxId = 0; |
* @type Map.<number,RequestNotifier> |
*/ |
let notifiers = new Map(); |
addMessageListener("AdblockPlus:StartWindowScan", onStartScan); |
addMessageListener("AdblockPlus:ShutdownNotifier", onNotifierShutdown); |
addMessageListener("AdblockPlus:FlashNodes", onFlashNodes); |
addMessageListener("AdblockPlus:RetrieveNodeSize", onRetrieveNodeSize); |
+addMessageListener("AdblockPlus:StoreNodesForEntries", onStoreNodes); |
addMessageListener("AdblockPlus:RetrieveWindowStats", onRetrieveWindowStats); |
onShutdown.add(() => { |
removeMessageListener("AdblockPlus:StartWindowScan", onStartScan); |
removeMessageListener("AdblockPlus:ShutdownNotifier", onNotifierShutdown); |
removeMessageListener("AdblockPlus:FlashNodes", onFlashNodes); |
removeMessageListener("AdblockPlus:RetrieveNodeSize", onRetrieveNodeSize); |
+ removeMessageListener("AdblockPlus:StoreNodesForEntries", onStoreNodes); |
removeMessageListener("AdblockPlus:RetrieveWindowStats", onRetrieveWindowStats); |
}); |
function onStartScan(message) |
{ |
let {notifierID, outerWindowID} = message.data; |
let window = Services.wm.getOuterWindowWithId(outerWindowID); |
if (window) |
@@ -73,16 +75,24 @@ function onFlashNodes(message) |
function onRetrieveNodeSize(message) |
{ |
let {notifierID, responseID, requests} = message.data; |
let notifier = notifiers.get(notifierID); |
if (notifier) |
notifier.retrieveNodeSize(requests, responseID); |
} |
+function onStoreNodes(message) |
+{ |
+ let {notifierID, responseID, requests} = message.data; |
+ let notifier = notifiers.get(notifierID); |
+ if (notifier) |
+ notifier.storeNodesForEntries(requests, responseID); |
+} |
+ |
function onRetrieveWindowStats(message) |
{ |
let {responseID, outerWindowID} = message.data; |
let window = Services.wm.getOuterWindowWithId(outerWindowID); |
if (window) |
{ |
let stats = RequestNotifier.getWindowStatistics(window); |
sendAsyncMessage("AdblockPlus:RetrieveWindowStatsResponse", { |
@@ -276,20 +286,52 @@ RequestNotifier.prototype = |
this.nodes.delete(node); |
else |
{ |
size = getNodeSize(node); |
if (size) |
break; |
} |
} |
- sendAsyncMessage("AdblockPlus:RetrieveNodeSizeResponse", { |
+ sendAsyncMessage("AdblockPlus:NotifierResponse", { |
notifierID: this.id, |
responseID, |
- size |
+ response: size |
+ }); |
+ }, |
+ |
+ /** |
+ * Stores the nodes associated with the requests and generates a unique ID |
+ * for them that can be used with Policy.refilterNodes(). Sends message to |
+ * parent when complete. |
+ * @param {number[]} requests list of request IDs that were previously |
+ * reported by this notifier. |
+ * @param {number} responseID ID to be sent with the response. |
+ */ |
+ storeNodesForEntries: function(requests, responseID) |
+ { |
+ let nodes = []; |
+ for (let id of requests) |
+ { |
+ if (!this.nodes.has(id)) |
+ continue; |
+ |
+ let node = this.nodes.get(id); |
+ if (Cu.isDeadWrapper(node)) |
+ this.nodes.delete(node); |
+ else |
+ nodes.push(node); |
+ } |
+ |
+ let {storeNodes} = require("child/contentPolicy"); |
+ let id = storeNodes(nodes); |
+ sendAsyncMessage("AdblockPlus:NotifierResponse", { |
+ notifierID: this.id, |
+ responseID, |
+ response: id |
}); |
} |
}; |
/** |
* Attaches request data to a DOM node. |
* @param {Node} node node to attach data to |
* @param {Window} topWnd top-level window the node belongs to |