| Index: lib/requestNotifier.js |
| =================================================================== |
| --- a/lib/requestNotifier.js |
| +++ b/lib/requestNotifier.js |
| @@ -19,29 +19,33 @@ |
| * @fileOverview Stores Adblock Plus data to be attached to a window. |
| */ |
| let {Utils} = require("utils"); |
| let windowSelection = new WeakMap(); |
| let requestNotifierMaxId = 0; |
| +let windowStatsMaxResponseID = 0; |
| +let windowStatsCallbacks = new Map(); |
| + |
| /** |
| * Active RequestNotifier instances by their ID |
| * @type Map.<number,RequestNotifier> |
| */ |
| let notifiers = new Map(); |
| let messageManager = Cc["@mozilla.org/parentprocessmessagemanager;1"] |
| .getService(Ci.nsIMessageListenerManager) |
| .QueryInterface(Ci.nsIMessageBroadcaster); |
| Utils.addChildMessageListener("AdblockPlus:FoundNodeData", onNodeData); |
| Utils.addChildMessageListener("AdblockPlus:ScanComplete", onScanComplete); |
| Utils.addChildMessageListener("AdblockPlus:RetrieveNodeSizeResponse", onNodeSizeReceived); |
| +Utils.addChildMessageListener("AdblockPlus:RetrieveWindowStatsResponse", onWindowStatsReceived); |
| function onNodeData({notifierID, data}) |
| { |
| let notifier = notifiers.get(notifierID); |
| if (notifier) |
| notifier.notifyListener(data); |
| } |
| @@ -54,16 +58,24 @@ function onScanComplete(notifierID) |
| function onNodeSizeReceived({notifierID, responseID, size}) |
| { |
| let notifier = notifiers.get(notifierID); |
| if (notifier) |
| notifier.onNodeSizeReceived(responseID, size); |
| } |
| +function onWindowStatsReceived({responseID, stats}) |
| +{ |
| + let callback = windowStatsCallbacks.get(responseID); |
| + windowStatsCallbacks.delete(responseID); |
| + if (typeof callback == "function") |
| + callback(stats); |
| +} |
| + |
| /** |
| * Creates a notifier object for a particular window. After creation the window |
| * will first be scanned for previously saved requests. Once that scan is |
| * complete only new requests for this window will be reported. |
| * @param {Integer} outerWindowID ID of the window to attach the notifier to |
| * @param {Function} listener listener to be called whenever a new request is found |
| * @param {Object} [listenerObj] "this" pointer to be used when calling the listener |
| */ |
| @@ -194,33 +206,39 @@ RequestNotifier.getSelection = function( |
| if (windowSelection.has(wnd.document)) |
| return windowSelection.get(wnd.document); |
| else |
| return null; |
| }; |
| /** |
| * Retrieves the statistics for a window. |
| - * @result {Object} Object with the properties items, blocked, whitelisted, hidden, filters containing statistics for the window (might be null) |
| + * @param {number} outerWindowID the ID of the window |
| + * @param {Function} callback the callback to be called with the resulting |
| + * object (object properties will be items, blocked, |
| + * whitelisted, hidden, filters) or null. |
| */ |
| -RequestNotifier.getWindowStatistics = function(/**Window*/ wnd) |
| +RequestNotifier.getWindowStatistics = function(outerWindowID, callback) |
| { |
| - if (windowStats.has(wnd.document)) |
| - return windowStats.get(wnd.document); |
| - else |
| - return null; |
| + let id = ++windowStatsMaxResponseID; |
| + windowStatsCallbacks.set(id, callback); |
| + |
| + messageManager.broadcastAsyncMessage("AdblockPlus:RetrieveWindowStats", { |
| + responseID: id, |
| + outerWindowID |
| + }); |
| } |
| /** |
| * Retrieves the request data associated with a DOM node. |
| * @param {Node} node |
| * @param {Boolean} noParent if missing or false, the search will extend to the parent nodes until one is found that has data associated with it |
| * @param {Integer} [type] request type to be looking for |
| * @param {String} [location] request location to be looking for |
| - * @result {[Node, Object]} |
| + * @return {[Node, Object]} |
| * @static |
| */ |
| RequestNotifier.getDataForNode = function(node, noParent, type, location) |
| { |
| while (node) |
| { |
| let data = nodeData.get(node); |
| if (typeof data != "undefined") |