| Index: lib/child/contentPolicy.js |
| =================================================================== |
| --- a/lib/child/contentPolicy.js |
| +++ b/lib/child/contentPolicy.js |
| @@ -32,26 +32,27 @@ try |
| catch (e) |
| { |
| Cu.reportError(e); |
| } |
| let {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {}); |
| let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); |
| +let {port} = require("messaging"); |
| let {Utils} = require("utils"); |
| let {getFrames, isPrivate} = require("child/utils"); |
| let {objectMouseEventHander} = require("child/objectTabs"); |
| let {RequestNotifier} = require("child/requestNotifier"); |
| /** |
| * Randomly generated class name, to be applied to collapsed nodes. |
| - * @type string |
| + * @type Promise.<string> |
| */ |
| -let collapsedClass = null; |
| +let collapsedClass = port.emitWithResponse("getCollapsedClass"); |
| /** |
| * Maps numerical content type IDs to strings. |
| * @type Map.<number,string> |
| */ |
| let types = new Map(); |
| /** |
| @@ -68,23 +69,18 @@ let storedNodes = new Map(); |
| let nodesIDPrefix = Services.appinfo.processID + " "; |
| /** |
| * Counter used to generate unique nodes identifiers in storeNodes(). |
| * @type number |
| */ |
| let maxNodesID = 0; |
| -addMessageListener("AdblockPlus:DeleteNodes", onDeleteNodes); |
| -addMessageListener("AdblockPlus:RefilterNodes", onRefilterNodes); |
| - |
| -onShutdown.add(() => { |
| - removeMessageListener("AdblockPlus:DeleteNodes", onDeleteNodes); |
| - removeMessageListener("AdblockPlus:RefilterNodes", onRefilterNodes); |
| -}); |
| +port.on("deleteNodes", onDeleteNodes); |
| +port.on("refilterNodes", onRefilterNodes); |
| /** |
| * Processes parent's response to the ShouldAllow message. |
| * @param {nsIDOMWindow} window window that the request is associated with |
| * @param {nsIDOMElement} node DOM element that the request is associated with |
| * @param {Object|undefined} response object received as response |
| * @return {Boolean} false if the request should be blocked |
| */ |
| @@ -131,17 +127,17 @@ function processPolicyResponse(window, n |
| * @param {nsIDOMWindow} window |
| * @param {nsIDOMElement} node |
| * @param {String} contentType |
| * @param {String} location location of the request, filter key if contentType is ELEMHIDE |
| * @return {Boolean} false if the request should be blocked |
| */ |
| let shouldAllow = exports.shouldAllow = function(window, node, contentType, location) |
| { |
| - return processPolicyResponse(window, node, sendSyncMessage("AdblockPlus:ShouldAllow", { |
| + return processPolicyResponse(window, node, port.emitSync("shouldAllow", { |
| contentType, |
| location, |
| frames: getFrames(window), |
| isPrivate: isPrivate(window) |
| })); |
| }; |
| /** |
| @@ -150,22 +146,25 @@ let shouldAllow = exports.shouldAllow = |
| * @param {nsIDOMElement} node |
| * @param {String} contentType |
| * @param {String} location location of the request, filter key if contentType is ELEMHIDE |
| * @param {Function} callback callback to be called with a boolean value, if |
| * false the request should be blocked |
| */ |
| let shouldAllowAsync = exports.shouldAllowAsync = function(window, node, contentType, location, callback) |
| { |
| - sendAsyncMessage("AdblockPlus:ShouldAllow", { |
| + port.emitWithResponse("shouldAllow", { |
| contentType, |
| location, |
| frames: getFrames(window), |
| isPrivate: isPrivate(window) |
| - }, response => callback(processPolicyResponse(window, node, response))); |
| + }).then(response => |
| + { |
| + callback(processPolicyResponse(window, node, response)); |
| + }); |
| }; |
| /** |
| * Stores nodes and generates a unique ID for them that can be used for |
| * Policy.refilterNodes() later. It's important that Policy.deleteNodes() is |
| * called later, otherwise the nodes will be leaked. |
| * @param {DOMNode[]} nodes list of nodes to be stored |
| * @return {string} unique ID for the nodes |
| @@ -175,27 +174,26 @@ let storeNodes = exports.storeNodes = fu |
| let id = nodesIDPrefix + (++maxNodesID); |
| storedNodes.set(id, nodes); |
| return id; |
| }; |
| /** |
| * Called via message whenever Policy.deleteNodes() is called in the parent. |
| */ |
| -function onDeleteNodes(message) |
| +function onDeleteNodes(id, sender) |
| { |
| - storedNodes.delete(message.data); |
| + storedNodes.delete(id); |
| } |
| /** |
| * Called via message whenever Policy.refilterNodes() is called in the parent. |
| */ |
| -function onRefilterNodes(message) |
| +function onRefilterNodes({nodesID, entry}, sender) |
| { |
| - let {nodesID, entry} = message.data; |
| let nodes = storedNodes.get(nodesID); |
| if (nodes) |
| for (let node of nodes) |
| if (node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE) |
| Utils.runAsync(refilterNode.bind(this, node, entry)); |
| } |
| /** |
| @@ -453,42 +451,44 @@ function schedulePostProcess(/**Element* |
| } |
| } |
| /** |
| * Processes nodes scheduled for post-processing (typically hides them). |
| */ |
| function postProcessNodes() |
| { |
| - if (!collapsedClass) |
| - collapsedClass = sendSyncMessage("AdblockPlus:GetCollapsedClass"); |
| + collapsedClass.then(cls => |
|
Thomas Greiner
2016/03/23 18:47:59
Detail: Anything wrong with calling it "collapsedC
Wladimir Palant
2016/03/24 07:27:26
They are not the same thing however. I would consi
|
| + { |
| + let nodes = scheduledNodes; |
| + scheduledNodes = null; |
| - let nodes = scheduledNodes; |
| - scheduledNodes = null; |
| + // Resolving class is async initially so the nodes might have already been |
| + // processed in the meantime. |
| + if (!nodes) |
| + return; |
| - if (!collapsedClass) |
| - return; |
| + for (let node of nodes) |
| + { |
| + // adjust frameset's cols/rows for frames |
| + let parentNode = node.parentNode; |
| + if (parentNode && parentNode instanceof Ci.nsIDOMHTMLFrameSetElement) |
| + { |
| + let hasCols = (parentNode.cols && parentNode.cols.indexOf(",") > 0); |
| + let hasRows = (parentNode.rows && parentNode.rows.indexOf(",") > 0); |
| + if ((hasCols || hasRows) && !(hasCols && hasRows)) |
| + { |
| + let index = -1; |
| + for (let frame = node; frame; frame = frame.previousSibling) |
| + if (frame instanceof Ci.nsIDOMHTMLFrameElement || frame instanceof Ci.nsIDOMHTMLFrameSetElement) |
| + index++; |
| - for (let node of nodes) |
| - { |
| - // adjust frameset's cols/rows for frames |
| - let parentNode = node.parentNode; |
| - if (parentNode && parentNode instanceof Ci.nsIDOMHTMLFrameSetElement) |
| - { |
| - let hasCols = (parentNode.cols && parentNode.cols.indexOf(",") > 0); |
| - let hasRows = (parentNode.rows && parentNode.rows.indexOf(",") > 0); |
| - if ((hasCols || hasRows) && !(hasCols && hasRows)) |
| - { |
| - let index = -1; |
| - for (let frame = node; frame; frame = frame.previousSibling) |
| - if (frame instanceof Ci.nsIDOMHTMLFrameElement || frame instanceof Ci.nsIDOMHTMLFrameSetElement) |
| - index++; |
| - |
| - let property = (hasCols ? "cols" : "rows"); |
| - let weights = parentNode[property].split(","); |
| - weights[index] = "0"; |
| - parentNode[property] = weights.join(","); |
| + let property = (hasCols ? "cols" : "rows"); |
| + let weights = parentNode[property].split(","); |
| + weights[index] = "0"; |
| + parentNode[property] = weights.join(","); |
| + } |
| } |
| + else |
| + node.classList.add(cls); |
| } |
| - else |
| - node.classList.add(collapsedClass); |
| - } |
| + }); |
| } |