| 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-2015 Eyeo GmbH | 3 * Copyright (C) 2006-2015 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 |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
| 13 * | 13 * |
| 14 * You should have received a copy of the GNU General Public License | 14 * You should have received a copy of the GNU General Public License |
| 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| 16 */ | 16 */ |
| 17 | 17 |
| 18 /** | 18 /** |
| 19 * @fileOverview Content policy implementation, responsible for blocking things. | 19 * @fileOverview Content policy implementation, responsible for blocking things. |
| 20 */ | 20 */ |
| 21 | 21 |
| 22 Cu.import("resource://gre/modules/XPCOMUtils.jsm"); | 22 Cu.import("resource://gre/modules/XPCOMUtils.jsm"); |
| 23 Cu.import("resource://gre/modules/Services.jsm"); | 23 Cu.import("resource://gre/modules/Services.jsm"); |
| 24 | 24 |
| 25 let {Utils} = require("utils"); | 25 let {Utils} = require("utils"); |
| 26 let {Prefs} = require("prefs"); | 26 let {Prefs} = require("prefs"); |
| 27 let {FilterStorage} = require("filterStorage"); | 27 let {FilterStorage} = require("filterStorage"); |
| 28 let {BlockingFilter, WhitelistFilter} = require("filterClasses"); | 28 let {BlockingFilter, WhitelistFilter, RegExpFilter} = require("filterClasses"); |
| 29 let {defaultMatcher} = require("matcher"); | 29 let {defaultMatcher} = require("matcher"); |
| 30 let {objectMouseEventHander} = require("objectTabs"); | 30 let {objectMouseEventHander} = require("objectTabs"); |
| 31 let {RequestNotifier} = require("requestNotifier"); | 31 let {RequestNotifier} = require("requestNotifier"); |
| 32 let {ElemHide} = require("elemHide"); | 32 let {ElemHide} = require("elemHide"); |
| 33 | 33 |
| 34 /** | 34 /** |
| 35 * List of explicitly supported content types | 35 * List of explicitly supported content types |
| 36 * @type string[] | 36 * @type string[] |
| 37 */ | 37 */ |
| 38 let contentTypes = ["OTHER", "SCRIPT", "IMAGE", "STYLESHEET", "OBJECT", "SUBDOCU MENT", "DOCUMENT", "XMLHTTPREQUEST", "OBJECT_SUBREQUEST", "FONT", "MEDIA"]; | 38 let contentTypes = ["OTHER", "SCRIPT", "IMAGE", "STYLESHEET", "OBJECT", "SUBDOCU MENT", "DOCUMENT", "XMLHTTPREQUEST", "OBJECT_SUBREQUEST", "FONT", "MEDIA"]; |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 60 */ | 60 */ |
| 61 type: {}, | 61 type: {}, |
| 62 | 62 |
| 63 /** | 63 /** |
| 64 * Map of content type names by their identifiers (reverse of type map). | 64 * Map of content type names by their identifiers (reverse of type map). |
| 65 * @type Object | 65 * @type Object |
| 66 */ | 66 */ |
| 67 typeDescr: {}, | 67 typeDescr: {}, |
| 68 | 68 |
| 69 /** | 69 /** |
| 70 * Map of numerical content types with their corresponding masks | |
| 71 * @type Object | |
| 72 */ | |
| 73 typeMask: {}, | |
| 74 | |
| 75 /** | |
| 70 * Map of localized content type names by their identifiers. | 76 * Map of localized content type names by their identifiers. |
| 71 * @type Object | 77 * @type Object |
| 72 */ | 78 */ |
| 73 localizedDescr: {}, | 79 localizedDescr: {}, |
| 74 | 80 |
| 75 /** | 81 /** |
| 76 * Lists the non-visual content types. | 82 * Lists the non-visual content types. |
| 77 * @type Object | 83 * @type Object |
| 78 */ | 84 */ |
| 79 nonVisual: {}, | 85 nonVisual: {}, |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 92 // type constant by type description and type description by type constant | 98 // type constant by type description and type description by type constant |
| 93 let iface = Ci.nsIContentPolicy; | 99 let iface = Ci.nsIContentPolicy; |
| 94 for (let typeName of contentTypes) | 100 for (let typeName of contentTypes) |
| 95 { | 101 { |
| 96 if ("TYPE_" + typeName in iface) | 102 if ("TYPE_" + typeName in iface) |
| 97 { | 103 { |
| 98 let id = iface["TYPE_" + typeName]; | 104 let id = iface["TYPE_" + typeName]; |
| 99 this.type[typeName] = id; | 105 this.type[typeName] = id; |
| 100 this.typeDescr[id] = typeName; | 106 this.typeDescr[id] = typeName; |
| 101 this.localizedDescr[id] = Utils.getString("type_label_" + typeName.toLow erCase()); | 107 this.localizedDescr[id] = Utils.getString("type_label_" + typeName.toLow erCase()); |
| 108 this.typeMask[id] = RegExpFilter.toTypeMask(typeName); | |
| 102 } | 109 } |
| 103 } | 110 } |
| 104 | 111 |
| 105 this.type.ELEMHIDE = 0xFFFD; | 112 this.type.ELEMHIDE = 0xFFFD; |
| 106 this.typeDescr[0xFFFD] = "ELEMHIDE"; | 113 this.typeDescr[0xFFFD] = "ELEMHIDE"; |
| 107 this.localizedDescr[0xFFFD] = Utils.getString("type_label_elemhide"); | 114 this.localizedDescr[0xFFFD] = Utils.getString("type_label_elemhide"); |
| 115 this.typeMask[0xFFFD] = RegExpFilter.toTypeMask("ELEMHIDE"); | |
| 108 | 116 |
| 109 this.type.POPUP = 0xFFFE; | 117 this.type.POPUP = 0xFFFE; |
| 110 this.typeDescr[0xFFFE] = "POPUP"; | 118 this.typeDescr[0xFFFE] = "POPUP"; |
| 111 this.localizedDescr[0xFFFE] = Utils.getString("type_label_popup"); | 119 this.localizedDescr[0xFFFE] = Utils.getString("type_label_popup"); |
| 120 this.typeMask[0xFFFE] = RegExpFilter.toTypeMask("POPUP"); | |
| 121 | |
| 122 this.defaultTypeMask = RegExpFilter.toTypeMask(""); | |
|
Wladimir Palant
2015/07/10 21:07:00
It's a bit mask - the default is always 0.
kzar
2015/07/12 13:59:39
Egad, that was stupid of me.
Done.
| |
| 112 | 123 |
| 113 for (let type of nonVisualTypes) | 124 for (let type of nonVisualTypes) |
| 114 this.nonVisual[this.type[type]] = true; | 125 this.nonVisual[this.type[type]] = true; |
| 115 | 126 |
| 116 // whitelisted URL schemes | 127 // whitelisted URL schemes |
| 117 for (let scheme of Prefs.whitelistschemes.toLowerCase().split(" ")) | 128 for (let scheme of Prefs.whitelistschemes.toLowerCase().split(" ")) |
| 118 this.whitelistSchemes[scheme] = true; | 129 this.whitelistSchemes[scheme] = true; |
| 119 | 130 |
| 120 // Generate class identifier used to collapse node and register correspondin g | 131 // Generate class identifier used to collapse node and register correspondin g |
| 121 // stylesheet. | 132 // stylesheet. |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 192 let locationText = location.spec; | 203 let locationText = location.spec; |
| 193 if (!match && contentType == Policy.type.ELEMHIDE) | 204 if (!match && contentType == Policy.type.ELEMHIDE) |
| 194 { | 205 { |
| 195 let testWnd = wnd; | 206 let testWnd = wnd; |
| 196 let parentWndLocation = getWindowLocation(testWnd); | 207 let parentWndLocation = getWindowLocation(testWnd); |
| 197 while (true) | 208 while (true) |
| 198 { | 209 { |
| 199 let testWndLocation = parentWndLocation; | 210 let testWndLocation = parentWndLocation; |
| 200 parentWndLocation = (testWnd == testWnd.parent ? testWndLocation : getWi ndowLocation(testWnd.parent)); | 211 parentWndLocation = (testWnd == testWnd.parent ? testWndLocation : getWi ndowLocation(testWnd.parent)); |
| 201 let parentDocDomain = getHostname(parentWndLocation); | 212 let parentDocDomain = getHostname(parentWndLocation); |
| 202 match = defaultMatcher.matchesAny(testWndLocation, "ELEMHIDE", parentDoc Domain, false, sitekey); | 213 match = defaultMatcher.matchesAny(testWndLocation, Policy.typeMask[Polic y.type.ELEMHIDE], parentDocDomain, false, sitekey); |
| 203 if (match instanceof WhitelistFilter) | 214 if (match instanceof WhitelistFilter) |
| 204 { | 215 { |
| 205 FilterStorage.increaseHitCount(match, wnd); | 216 FilterStorage.increaseHitCount(match, wnd); |
| 206 RequestNotifier.addNodeData(testWnd.document, topWnd, contentType, par entDocDomain, false, testWndLocation, match); | 217 RequestNotifier.addNodeData(testWnd.document, topWnd, contentType, par entDocDomain, false, testWndLocation, match); |
| 207 return true; | 218 return true; |
| 208 } | 219 } |
| 209 | 220 |
| 210 if (testWnd.parent == testWnd) | 221 if (testWnd.parent == testWnd) |
| 211 break; | 222 break; |
| 212 else | 223 else |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 226 FilterStorage.increaseHitCount(exception, wnd); | 237 FilterStorage.increaseHitCount(exception, wnd); |
| 227 RequestNotifier.addNodeData(node, topWnd, contentType, docDomain, false, locationText, exception); | 238 RequestNotifier.addNodeData(node, topWnd, contentType, docDomain, false, locationText, exception); |
| 228 return true; | 239 return true; |
| 229 } | 240 } |
| 230 } | 241 } |
| 231 | 242 |
| 232 let thirdParty = (contentType == Policy.type.ELEMHIDE ? false : isThirdParty (location, docDomain)); | 243 let thirdParty = (contentType == Policy.type.ELEMHIDE ? false : isThirdParty (location, docDomain)); |
| 233 | 244 |
| 234 if (!match && Prefs.enabled) | 245 if (!match && Prefs.enabled) |
| 235 { | 246 { |
| 236 match = defaultMatcher.matchesAny(locationText, Policy.typeDescr[contentTy pe] || "", docDomain, thirdParty, sitekey); | 247 match = defaultMatcher.matchesAny(locationText, Policy.typeMask[contentTyp e] || Policy.defaultTypeMask, docDomain, thirdParty, sitekey); |
|
Wladimir Palant
2015/07/10 21:07:00
This cannot possibly return a match if type mask i
kzar
2015/07/12 13:59:39
Done.
| |
| 237 if (match instanceof BlockingFilter && node.ownerDocument && !(contentType in Policy.nonVisual)) | 248 if (match instanceof BlockingFilter && node.ownerDocument && !(contentType in Policy.nonVisual)) |
| 238 { | 249 { |
| 239 let prefCollapse = (match.collapse != null ? match.collapse : !Prefs.fas tcollapse); | 250 let prefCollapse = (match.collapse != null ? match.collapse : !Prefs.fas tcollapse); |
| 240 if (collapse || prefCollapse) | 251 if (collapse || prefCollapse) |
| 241 schedulePostProcess(node); | 252 schedulePostProcess(node); |
| 242 } | 253 } |
| 243 | 254 |
| 244 // Track mouse events for objects | 255 // Track mouse events for objects |
| 245 if (!match && contentType == Policy.type.OBJECT && node.nodeType == Ci.nsI DOMNode.ELEMENT_NODE) | 256 if (!match && contentType == Policy.type.OBJECT && node.nodeType == Ci.nsI DOMNode.ELEMENT_NODE) |
| 246 { | 257 { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 285 return null; | 296 return null; |
| 286 | 297 |
| 287 if (!parentUrl) | 298 if (!parentUrl) |
| 288 parentUrl = url; | 299 parentUrl = url; |
| 289 | 300 |
| 290 // Ignore fragment identifier | 301 // Ignore fragment identifier |
| 291 let index = url.indexOf("#"); | 302 let index = url.indexOf("#"); |
| 292 if (index >= 0) | 303 if (index >= 0) |
| 293 url = url.substring(0, index); | 304 url = url.substring(0, index); |
| 294 | 305 |
| 295 let result = defaultMatcher.matchesAny(url, "DOCUMENT", getHostname(parentUr l), false, sitekey); | 306 let result = defaultMatcher.matchesAny(url, Policy.typeMask[Policy.type.DOCU MENT], getHostname(parentUrl), false, sitekey); |
| 296 return (result instanceof WhitelistFilter ? result : null); | 307 return (result instanceof WhitelistFilter ? result : null); |
| 297 }, | 308 }, |
| 298 | 309 |
| 299 /** | 310 /** |
| 300 * Checks whether the page loaded in a window is whitelisted for indication in the UI. | 311 * Checks whether the page loaded in a window is whitelisted for indication in the UI. |
| 301 * @param wnd {nsIDOMWindow} | 312 * @param wnd {nsIDOMWindow} |
| 302 * @return {Filter} matching exception rule or null if not whitelisted | 313 * @return {Filter} matching exception rule or null if not whitelisted |
| 303 */ | 314 */ |
| 304 isWindowWhitelisted: function(wnd) | 315 isWindowWhitelisted: function(wnd) |
| 305 { | 316 { |
| (...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 786 if (!wnd || wnd.closed) | 797 if (!wnd || wnd.closed) |
| 787 return; | 798 return; |
| 788 | 799 |
| 789 if (entry.type == Policy.type.OBJECT) | 800 if (entry.type == Policy.type.OBJECT) |
| 790 { | 801 { |
| 791 node.removeEventListener("mouseover", objectMouseEventHander, true); | 802 node.removeEventListener("mouseover", objectMouseEventHander, true); |
| 792 node.removeEventListener("mouseout", objectMouseEventHander, true); | 803 node.removeEventListener("mouseout", objectMouseEventHander, true); |
| 793 } | 804 } |
| 794 Policy.processNode(wnd, node, entry.type, Utils.makeURI(entry.location), true) ; | 805 Policy.processNode(wnd, node, entry.type, Utils.makeURI(entry.location), true) ; |
| 795 } | 806 } |
| OLD | NEW |