Index: lib/child/requestNotifier.js |
=================================================================== |
--- a/lib/child/requestNotifier.js |
+++ b/lib/child/requestNotifier.js |
@@ -31,21 +31,23 @@ let requestEntryMaxId = 0; |
* Active RequestNotifier instances by their ID |
* @type Map.<number,RequestNotifier> |
*/ |
let notifiers = new Map(); |
addMessageListener("AdblockPlus:StartWindowScan", onStartScan); |
addMessageListener("AdblockPlus:ShutdownNotifier", onNotifierShutdown); |
addMessageListener("AdblockPlus:FlashNodes", onFlashNodes); |
+addMessageListener("AdblockPlus:RetrieveNodeSize", onRetrieveNodeSize); |
onShutdown.add(() => { |
removeMessageListener("AdblockPlus:StartWindowScan", onStartScan); |
removeMessageListener("AdblockPlus:ShutdownNotifier", onNotifierShutdown); |
removeMessageListener("AdblockPlus:FlashNodes", onFlashNodes); |
+ removeMessageListener("AdblockPlus:RetrieveNodeSize", onRetrieveNodeSize); |
}); |
function onStartScan(message) |
{ |
let {notifierID, outerWindowID} = message.data; |
let window = Services.wm.getOuterWindowWithId(outerWindowID); |
if (window) |
new RequestNotifier(window, notifierID); |
@@ -61,16 +63,24 @@ function onNotifierShutdown(message) |
function onFlashNodes(message) |
{ |
let {notifierID, requests, scrollToItem} = message.data; |
let notifier = notifiers.get(notifierID); |
if (notifier) |
notifier.flashNodes(requests, scrollToItem); |
} |
+function onRetrieveNodeSize(message) |
+{ |
+ let {notifierID, responseID, requests} = message.data; |
+ let notifier = notifiers.get(notifierID); |
+ if (notifier) |
+ notifier.retrieveNodeSize(requests, responseID); |
+} |
+ |
/** |
* 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 {Window} wnd window to attach the notifier to |
* @param {Integer} id Parent notifier ID to be messaged |
*/ |
function RequestNotifier(window, notifierID) |
@@ -212,16 +222,58 @@ RequestNotifier.prototype = |
/** |
* Stops flashing nodes after a previous flashNodes() call. |
*/ |
stopFlashing: function() |
{ |
if (this.flasher) |
this.flasher.stop(); |
this.flasher = null; |
+ }, |
+ |
+ /** |
+ * Attempts to calculate the size of the nodes associated with the requests, |
+ * 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. |
+ */ |
+ retrieveNodeSize: function(requests, responseID) |
+ { |
+ function getNodeSize(node) |
+ { |
+ if (node instanceof Ci.nsIDOMHTMLImageElement && (node.naturalWidth || node.naturalHeight)) |
+ return [node.naturalWidth, node.naturalHeight]; |
+ else if (node instanceof Ci.nsIDOMHTMLElement && (node.offsetWidth || node.offsetHeight)) |
+ return [node.offsetWidth, node.offsetHeight]; |
+ else |
+ return null; |
+ } |
+ |
+ let size = null; |
+ 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 |
+ { |
+ size = getNodeSize(node); |
+ if (size) |
+ break; |
+ } |
+ } |
+ sendAsyncMessage("AdblockPlus:RetrieveNodeSizeResponse", { |
+ notifierID: this.id, |
+ responseID, |
+ size |
+ }); |
} |
}; |
/** |
* 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 |
* @param {String} contentType request type, e.g. "IMAGE" |