| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
| 3 * Copyright (C) 2006-2016 Eyeo GmbH | 3 * Copyright (C) 2006-2016 Eyeo GmbH |
| 4 * | 4 * |
| 5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
| 6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
| 7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
| 8 * | 8 * |
| 9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 30 delete proto.Components; | 30 delete proto.Components; |
| 31 } | 31 } |
| 32 catch (e) | 32 catch (e) |
| 33 { | 33 { |
| 34 Cu.reportError(e); | 34 Cu.reportError(e); |
| 35 } | 35 } |
| 36 | 36 |
| 37 let {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {}); | 37 let {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {}); |
| 38 let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); | 38 let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); |
| 39 | 39 |
| 40 let {port} = require("messaging"); | |
| 40 let {Utils} = require("utils"); | 41 let {Utils} = require("utils"); |
| 41 let {getFrames, isPrivate} = require("child/utils"); | 42 let {getFrames, isPrivate} = require("child/utils"); |
| 42 let {objectMouseEventHander} = require("child/objectTabs"); | 43 let {objectMouseEventHander} = require("child/objectTabs"); |
| 43 let {RequestNotifier} = require("child/requestNotifier"); | 44 let {RequestNotifier} = require("child/requestNotifier"); |
| 44 | 45 |
| 45 /** | 46 /** |
| 46 * Randomly generated class name, to be applied to collapsed nodes. | 47 * Randomly generated class name, to be applied to collapsed nodes. |
| 47 * @type string | 48 * @type Promise.<string> |
| 48 */ | 49 */ |
| 49 let collapsedClass = null; | 50 let collapsedClass = port.emitWithResponse("getCollapsedClass"); |
| 50 | 51 |
| 51 /** | 52 /** |
| 52 * Maps numerical content type IDs to strings. | 53 * Maps numerical content type IDs to strings. |
| 53 * @type Map.<number,string> | 54 * @type Map.<number,string> |
| 54 */ | 55 */ |
| 55 let types = new Map(); | 56 let types = new Map(); |
| 56 | 57 |
| 57 /** | 58 /** |
| 58 * Contains nodes stored by storeNodes() mapped by their IDs. | 59 * Contains nodes stored by storeNodes() mapped by their IDs. |
| 59 * @type Map.<string,DOMNode[]> | 60 * @type Map.<string,DOMNode[]> |
| 60 */ | 61 */ |
| 61 let storedNodes = new Map(); | 62 let storedNodes = new Map(); |
| 62 | 63 |
| 63 /** | 64 /** |
| 64 * Process-dependent prefix to be used for unique nodes identifiers returned | 65 * Process-dependent prefix to be used for unique nodes identifiers returned |
| 65 * by storeNodes(). | 66 * by storeNodes(). |
| 66 * @type string | 67 * @type string |
| 67 */ | 68 */ |
| 68 let nodesIDPrefix = Services.appinfo.processID + " "; | 69 let nodesIDPrefix = Services.appinfo.processID + " "; |
| 69 | 70 |
| 70 /** | 71 /** |
| 71 * Counter used to generate unique nodes identifiers in storeNodes(). | 72 * Counter used to generate unique nodes identifiers in storeNodes(). |
| 72 * @type number | 73 * @type number |
| 73 */ | 74 */ |
| 74 let maxNodesID = 0; | 75 let maxNodesID = 0; |
| 75 | 76 |
| 76 addMessageListener("AdblockPlus:DeleteNodes", onDeleteNodes); | 77 port.on("deleteNodes", onDeleteNodes); |
| 77 addMessageListener("AdblockPlus:RefilterNodes", onRefilterNodes); | 78 port.on("refilterNodes", onRefilterNodes); |
| 78 | |
| 79 onShutdown.add(() => { | |
| 80 removeMessageListener("AdblockPlus:DeleteNodes", onDeleteNodes); | |
| 81 removeMessageListener("AdblockPlus:RefilterNodes", onRefilterNodes); | |
| 82 }); | |
| 83 | 79 |
| 84 /** | 80 /** |
| 85 * Processes parent's response to the ShouldAllow message. | 81 * Processes parent's response to the ShouldAllow message. |
| 86 * @param {nsIDOMWindow} window window that the request is associated with | 82 * @param {nsIDOMWindow} window window that the request is associated with |
| 87 * @param {nsIDOMElement} node DOM element that the request is associated with | 83 * @param {nsIDOMElement} node DOM element that the request is associated with |
| 88 * @param {Object|undefined} response object received as response | 84 * @param {Object|undefined} response object received as response |
| 89 * @return {Boolean} false if the request should be blocked | 85 * @return {Boolean} false if the request should be blocked |
| 90 */ | 86 */ |
| 91 function processPolicyResponse(window, node, response) | 87 function processPolicyResponse(window, node, response) |
| 92 { | 88 { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 129 /** | 125 /** |
| 130 * Checks whether a request should be allowed, hides it if necessary | 126 * Checks whether a request should be allowed, hides it if necessary |
| 131 * @param {nsIDOMWindow} window | 127 * @param {nsIDOMWindow} window |
| 132 * @param {nsIDOMElement} node | 128 * @param {nsIDOMElement} node |
| 133 * @param {String} contentType | 129 * @param {String} contentType |
| 134 * @param {String} location location of the request, filter key if contentType i s ELEMHIDE | 130 * @param {String} location location of the request, filter key if contentType i s ELEMHIDE |
| 135 * @return {Boolean} false if the request should be blocked | 131 * @return {Boolean} false if the request should be blocked |
| 136 */ | 132 */ |
| 137 let shouldAllow = exports.shouldAllow = function(window, node, contentType, loca tion) | 133 let shouldAllow = exports.shouldAllow = function(window, node, contentType, loca tion) |
| 138 { | 134 { |
| 139 return processPolicyResponse(window, node, sendSyncMessage("AdblockPlus:Should Allow", { | 135 return processPolicyResponse(window, node, port.emitSync("shouldAllow", { |
| 140 contentType, | 136 contentType, |
| 141 location, | 137 location, |
| 142 frames: getFrames(window), | 138 frames: getFrames(window), |
| 143 isPrivate: isPrivate(window) | 139 isPrivate: isPrivate(window) |
| 144 })); | 140 })); |
| 145 }; | 141 }; |
| 146 | 142 |
| 147 /** | 143 /** |
| 148 * Asynchronously checks whether a request should be allowed. | 144 * Asynchronously checks whether a request should be allowed. |
| 149 * @param {nsIDOMWindow} window | 145 * @param {nsIDOMWindow} window |
| 150 * @param {nsIDOMElement} node | 146 * @param {nsIDOMElement} node |
| 151 * @param {String} contentType | 147 * @param {String} contentType |
| 152 * @param {String} location location of the request, filter key if contentType i s ELEMHIDE | 148 * @param {String} location location of the request, filter key if contentType i s ELEMHIDE |
| 153 * @param {Function} callback callback to be called with a boolean value, if | 149 * @param {Function} callback callback to be called with a boolean value, if |
| 154 * false the request should be blocked | 150 * false the request should be blocked |
| 155 */ | 151 */ |
| 156 let shouldAllowAsync = exports.shouldAllowAsync = function(window, node, content Type, location, callback) | 152 let shouldAllowAsync = exports.shouldAllowAsync = function(window, node, content Type, location, callback) |
| 157 { | 153 { |
| 158 sendAsyncMessage("AdblockPlus:ShouldAllow", { | 154 port.emitWithResponse("shouldAllow", { |
| 159 contentType, | 155 contentType, |
| 160 location, | 156 location, |
| 161 frames: getFrames(window), | 157 frames: getFrames(window), |
| 162 isPrivate: isPrivate(window) | 158 isPrivate: isPrivate(window) |
| 163 }, response => callback(processPolicyResponse(window, node, response))); | 159 }).then(response => |
| 160 { | |
| 161 callback(processPolicyResponse(window, node, response)); | |
| 162 }); | |
| 164 }; | 163 }; |
| 165 | 164 |
| 166 /** | 165 /** |
| 167 * Stores nodes and generates a unique ID for them that can be used for | 166 * Stores nodes and generates a unique ID for them that can be used for |
| 168 * Policy.refilterNodes() later. It's important that Policy.deleteNodes() is | 167 * Policy.refilterNodes() later. It's important that Policy.deleteNodes() is |
| 169 * called later, otherwise the nodes will be leaked. | 168 * called later, otherwise the nodes will be leaked. |
| 170 * @param {DOMNode[]} nodes list of nodes to be stored | 169 * @param {DOMNode[]} nodes list of nodes to be stored |
| 171 * @return {string} unique ID for the nodes | 170 * @return {string} unique ID for the nodes |
| 172 */ | 171 */ |
| 173 let storeNodes = exports.storeNodes = function(nodes) | 172 let storeNodes = exports.storeNodes = function(nodes) |
| 174 { | 173 { |
| 175 let id = nodesIDPrefix + (++maxNodesID); | 174 let id = nodesIDPrefix + (++maxNodesID); |
| 176 storedNodes.set(id, nodes); | 175 storedNodes.set(id, nodes); |
| 177 return id; | 176 return id; |
| 178 }; | 177 }; |
| 179 | 178 |
| 180 /** | 179 /** |
| 181 * Called via message whenever Policy.deleteNodes() is called in the parent. | 180 * Called via message whenever Policy.deleteNodes() is called in the parent. |
| 182 */ | 181 */ |
| 183 function onDeleteNodes(message) | 182 function onDeleteNodes(id, sender) |
| 184 { | 183 { |
| 185 storedNodes.delete(message.data); | 184 storedNodes.delete(id); |
| 186 } | 185 } |
| 187 | 186 |
| 188 /** | 187 /** |
| 189 * Called via message whenever Policy.refilterNodes() is called in the parent. | 188 * Called via message whenever Policy.refilterNodes() is called in the parent. |
| 190 */ | 189 */ |
| 191 function onRefilterNodes(message) | 190 function onRefilterNodes({nodesID, entry}, sender) |
| 192 { | 191 { |
| 193 let {nodesID, entry} = message.data; | |
| 194 let nodes = storedNodes.get(nodesID); | 192 let nodes = storedNodes.get(nodesID); |
| 195 if (nodes) | 193 if (nodes) |
| 196 for (let node of nodes) | 194 for (let node of nodes) |
| 197 if (node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE) | 195 if (node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE) |
| 198 Utils.runAsync(refilterNode.bind(this, node, entry)); | 196 Utils.runAsync(refilterNode.bind(this, node, entry)); |
| 199 } | 197 } |
| 200 | 198 |
| 201 /** | 199 /** |
| 202 * Re-checks filters on an element. | 200 * Re-checks filters on an element. |
| 203 */ | 201 */ |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 451 scheduledNodes = [node]; | 449 scheduledNodes = [node]; |
| 452 Utils.runAsync(postProcessNodes); | 450 Utils.runAsync(postProcessNodes); |
| 453 } | 451 } |
| 454 } | 452 } |
| 455 | 453 |
| 456 /** | 454 /** |
| 457 * Processes nodes scheduled for post-processing (typically hides them). | 455 * Processes nodes scheduled for post-processing (typically hides them). |
| 458 */ | 456 */ |
| 459 function postProcessNodes() | 457 function postProcessNodes() |
| 460 { | 458 { |
| 461 if (!collapsedClass) | 459 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
| |
| 462 collapsedClass = sendSyncMessage("AdblockPlus:GetCollapsedClass"); | 460 { |
| 461 let nodes = scheduledNodes; | |
| 462 scheduledNodes = null; | |
| 463 | 463 |
| 464 let nodes = scheduledNodes; | 464 // Resolving class is async initially so the nodes might have already been |
| 465 scheduledNodes = null; | 465 // processed in the meantime. |
| 466 if (!nodes) | |
| 467 return; | |
| 466 | 468 |
| 467 if (!collapsedClass) | 469 for (let node of nodes) |
| 468 return; | 470 { |
| 471 // adjust frameset's cols/rows for frames | |
| 472 let parentNode = node.parentNode; | |
| 473 if (parentNode && parentNode instanceof Ci.nsIDOMHTMLFrameSetElement) | |
| 474 { | |
| 475 let hasCols = (parentNode.cols && parentNode.cols.indexOf(",") > 0); | |
| 476 let hasRows = (parentNode.rows && parentNode.rows.indexOf(",") > 0); | |
| 477 if ((hasCols || hasRows) && !(hasCols && hasRows)) | |
| 478 { | |
| 479 let index = -1; | |
| 480 for (let frame = node; frame; frame = frame.previousSibling) | |
| 481 if (frame instanceof Ci.nsIDOMHTMLFrameElement || frame instanceof C i.nsIDOMHTMLFrameSetElement) | |
| 482 index++; | |
| 469 | 483 |
| 470 for (let node of nodes) | 484 let property = (hasCols ? "cols" : "rows"); |
| 471 { | 485 let weights = parentNode[property].split(","); |
| 472 // adjust frameset's cols/rows for frames | 486 weights[index] = "0"; |
| 473 let parentNode = node.parentNode; | 487 parentNode[property] = weights.join(","); |
| 474 if (parentNode && parentNode instanceof Ci.nsIDOMHTMLFrameSetElement) | 488 } |
| 475 { | |
| 476 let hasCols = (parentNode.cols && parentNode.cols.indexOf(",") > 0); | |
| 477 let hasRows = (parentNode.rows && parentNode.rows.indexOf(",") > 0); | |
| 478 if ((hasCols || hasRows) && !(hasCols && hasRows)) | |
| 479 { | |
| 480 let index = -1; | |
| 481 for (let frame = node; frame; frame = frame.previousSibling) | |
| 482 if (frame instanceof Ci.nsIDOMHTMLFrameElement || frame instanceof Ci. nsIDOMHTMLFrameSetElement) | |
| 483 index++; | |
| 484 | |
| 485 let property = (hasCols ? "cols" : "rows"); | |
| 486 let weights = parentNode[property].split(","); | |
| 487 weights[index] = "0"; | |
| 488 parentNode[property] = weights.join(","); | |
| 489 } | 489 } |
| 490 else | |
| 491 node.classList.add(cls); | |
| 490 } | 492 } |
| 491 else | 493 }); |
| 492 node.classList.add(collapsedClass); | |
| 493 } | |
| 494 } | 494 } |
| OLD | NEW |