| 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,24 +206,30 @@ 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 |