| 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 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 * @param location {String} | 115 * @param location {String} |
| 116 * @param collapse {Boolean} true to force hiding of the node | 116 * @param collapse {Boolean} true to force hiding of the node |
| 117 * @return {Boolean} false if the node should be blocked | 117 * @return {Boolean} false if the node should be blocked |
| 118 */ | 118 */ |
| 119 processNode: function(wnd, node, contentType, location, collapse) | 119 processNode: function(wnd, node, contentType, location, collapse) |
| 120 { | 120 { |
| 121 let topWnd = wnd.top; | 121 let topWnd = wnd.top; |
| 122 if (!topWnd || !topWnd.location || !topWnd.location.href) | 122 if (!topWnd || !topWnd.location || !topWnd.location.href) |
| 123 return true; | 123 return true; |
| 124 | 124 |
| 125 // Ignore whitelisted schemes |
| 126 if (!this.isBlockableScheme(location)) |
| 127 return true; |
| 128 |
| 125 // Interpret unknown types as "other" | 129 // Interpret unknown types as "other" |
| 126 if (!this.contentTypes.has(contentType)) | 130 if (!this.contentTypes.has(contentType)) |
| 127 contentType = "OTHER"; | 131 contentType = "OTHER"; |
| 128 | 132 |
| 129 let originWindow = Utils.getOriginWindow(wnd); | 133 let originWindow = Utils.getOriginWindow(wnd); |
| 130 let wndLocation = originWindow.location.href; | 134 let wndLocation = originWindow.location.href; |
| 131 let docDomain = getHostname(wndLocation); | 135 let docDomain = getHostname(wndLocation); |
| 132 let match = null; | 136 let match = null; |
| 133 let [sitekey, sitekeyWnd] = getSitekey(wnd); | 137 let [sitekey, sitekeyWnd] = getSitekey(wnd); |
| 134 let nogeneric = false; | 138 let nogeneric = false; |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 // Store node data | 252 // Store node data |
| 249 RequestNotifier.addNodeData(node, topWnd, contentType, docDomain, thirdParty
, location, match); | 253 RequestNotifier.addNodeData(node, topWnd, contentType, docDomain, thirdParty
, location, match); |
| 250 if (match) | 254 if (match) |
| 251 addHit(match); | 255 addHit(match); |
| 252 | 256 |
| 253 return !match || match instanceof WhitelistFilter; | 257 return !match || match instanceof WhitelistFilter; |
| 254 }, | 258 }, |
| 255 | 259 |
| 256 /** | 260 /** |
| 257 * Checks whether the location's scheme is blockable. | 261 * Checks whether the location's scheme is blockable. |
| 258 * @param location {nsIURI} | 262 * @param location {nsIURI|String} |
| 259 * @return {Boolean} | 263 * @return {Boolean} |
| 260 */ | 264 */ |
| 261 isBlockableScheme: function(location) | 265 isBlockableScheme: function(location) |
| 262 { | 266 { |
| 263 return !this.whitelistSchemes.has(location.scheme); | 267 let scheme; |
| 268 if (typeof location == "string") |
| 269 { |
| 270 let match = /^([\w\-]+):/.exec(location); |
| 271 scheme = match ? match[1] : null; |
| 272 } |
| 273 else |
| 274 scheme = location.scheme; |
| 275 return !this.whitelistSchemes.has(scheme); |
| 264 }, | 276 }, |
| 265 | 277 |
| 266 /** | 278 /** |
| 267 * Checks whether a page is whitelisted. | 279 * Checks whether a page is whitelisted. |
| 268 * @param {String} url | 280 * @param {String} url |
| 269 * @param {String} [parentUrl] location of the parent page | 281 * @param {String} [parentUrl] location of the parent page |
| 270 * @param {String} [sitekey] public key provided on the page | 282 * @param {String} [sitekey] public key provided on the page |
| 271 * @return {Filter} filter that matched the URL or null if not whitelisted | 283 * @return {Filter} filter that matched the URL or null if not whitelisted |
| 272 */ | 284 */ |
| 273 isWhitelisted: function(url, parentUrl, sitekey) | 285 isWhitelisted: function(url, parentUrl, sitekey) |
| 274 { | 286 { |
| 275 if (!url) | 287 if (!url) |
| 276 return null; | 288 return null; |
| 277 | 289 |
| 278 // Do not apply exception rules to schemes on our whitelistschemes list. | 290 // Do not apply exception rules to schemes on our whitelistschemes list. |
| 279 let match = /^([\w\-]+):/.exec(url); | 291 if (!this.isBlockableScheme(url)) |
| 280 if (match && this.whitelistSchemes.has(match[1])) | |
| 281 return null; | 292 return null; |
| 282 | 293 |
| 283 if (!parentUrl) | 294 if (!parentUrl) |
| 284 parentUrl = url; | 295 parentUrl = url; |
| 285 | 296 |
| 286 // Ignore fragment identifier | 297 // Ignore fragment identifier |
| 287 let index = url.indexOf("#"); | 298 let index = url.indexOf("#"); |
| 288 if (index >= 0) | 299 if (index >= 0) |
| 289 url = url.substring(0, index); | 300 url = url.substring(0, index); |
| 290 | 301 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 return Ci.nsIContentPolicy.ACCEPT; | 384 return Ci.nsIContentPolicy.ACCEPT; |
| 374 | 385 |
| 375 // Ignore standalone objects | 386 // Ignore standalone objects |
| 376 if (contentType == Ci.nsIContentPolicy.TYPE_OBJECT && node.ownerDocument &&
!/^text\/|[+\/]xml$/.test(node.ownerDocument.contentType)) | 387 if (contentType == Ci.nsIContentPolicy.TYPE_OBJECT && node.ownerDocument &&
!/^text\/|[+\/]xml$/.test(node.ownerDocument.contentType)) |
| 377 return Ci.nsIContentPolicy.ACCEPT; | 388 return Ci.nsIContentPolicy.ACCEPT; |
| 378 | 389 |
| 379 let wnd = Utils.getWindow(node); | 390 let wnd = Utils.getWindow(node); |
| 380 if (!wnd) | 391 if (!wnd) |
| 381 return Ci.nsIContentPolicy.ACCEPT; | 392 return Ci.nsIContentPolicy.ACCEPT; |
| 382 | 393 |
| 383 // Ignore whitelisted schemes | |
| 384 let location = Utils.unwrapURL(contentLocation); | 394 let location = Utils.unwrapURL(contentLocation); |
| 385 if (!Policy.isBlockableScheme(location)) | |
| 386 return Ci.nsIContentPolicy.ACCEPT; | |
| 387 | |
| 388 let result = Policy.processNode(wnd, node, types.get(contentType), location.
spec, false); | 395 let result = Policy.processNode(wnd, node, types.get(contentType), location.
spec, false); |
| 389 return (result ? Ci.nsIContentPolicy.ACCEPT : Ci.nsIContentPolicy.REJECT_REQ
UEST); | 396 return (result ? Ci.nsIContentPolicy.ACCEPT : Ci.nsIContentPolicy.REJECT_REQ
UEST); |
| 390 }, | 397 }, |
| 391 | 398 |
| 392 shouldProcess: function(contentType, contentLocation, requestOrigin, insecNode
, mimeType, extra) | 399 shouldProcess: function(contentType, contentLocation, requestOrigin, insecNode
, mimeType, extra) |
| 393 { | 400 { |
| 394 return Ci.nsIContentPolicy.ACCEPT; | 401 return Ci.nsIContentPolicy.ACCEPT; |
| 395 }, | 402 }, |
| 396 | 403 |
| 397 // | 404 // |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 678 if (!wnd || wnd.closed) | 685 if (!wnd || wnd.closed) |
| 679 return; | 686 return; |
| 680 | 687 |
| 681 if (entry.type == "OBJECT") | 688 if (entry.type == "OBJECT") |
| 682 { | 689 { |
| 683 node.removeEventListener("mouseover", objectMouseEventHander, true); | 690 node.removeEventListener("mouseover", objectMouseEventHander, true); |
| 684 node.removeEventListener("mouseout", objectMouseEventHander, true); | 691 node.removeEventListener("mouseout", objectMouseEventHander, true); |
| 685 } | 692 } |
| 686 Policy.processNode(wnd, node, entry.type, entry.location, true); | 693 Policy.processNode(wnd, node, entry.type, entry.location, true); |
| 687 } | 694 } |
| OLD | NEW |