| 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-present eyeo GmbH | 3 * Copyright (C) 2006-present 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 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 // text, being careful to preserve its spaces. | 312 // text, being careful to preserve its spaces. |
| 313 let beforeOptions = strippedText.substring(0, optionsMatch.index); | 313 let beforeOptions = strippedText.substring(0, optionsMatch.index); |
| 314 let strippedDollarIndex = -1; | 314 let strippedDollarIndex = -1; |
| 315 let dollarIndex = -1; | 315 let dollarIndex = -1; |
| 316 do | 316 do |
| 317 { | 317 { |
| 318 strippedDollarIndex = beforeOptions.indexOf("$", strippedDollarIndex + 1); | 318 strippedDollarIndex = beforeOptions.indexOf("$", strippedDollarIndex + 1); |
| 319 dollarIndex = text.indexOf("$", dollarIndex + 1); | 319 dollarIndex = text.indexOf("$", dollarIndex + 1); |
| 320 } | 320 } |
| 321 while (strippedDollarIndex != -1); | 321 while (strippedDollarIndex != -1); |
| 322 let optionsText = text.substr(dollarIndex + 1); | 322 let optionsText = text.substring(dollarIndex + 1); |
| 323 | 323 |
| 324 // Then we can normalize spaces in the options part safely | 324 // Then we can normalize spaces in the options part safely |
| 325 let options = optionsText.split(","); | 325 let options = optionsText.split(","); |
| 326 for (let i = 0; i < options.length; i++) | 326 for (let i = 0; i < options.length; i++) |
| 327 { | 327 { |
| 328 let option = options[i]; | 328 let option = options[i]; |
| 329 let cspMatch = /^ *c *s *p *=/i.exec(option); | 329 let cspMatch = /^ *c *s *p *=/i.exec(option); |
| 330 if (cspMatch) | 330 if (cspMatch) |
| 331 { | 331 { |
| 332 options[i] = cspMatch[0].replace(/ +/g, "") + | 332 options[i] = cspMatch[0].replace(/ +/g, "") + |
| 333 option.substr(cspMatch[0].length).trim().replace(/ +/g, " "); | 333 option.substring(cspMatch[0].length).trim().replace(/ +/g, "
"); |
| 334 } | 334 } |
| 335 else | 335 else |
| 336 options[i] = option.replace(/ +/g, ""); | 336 options[i] = option.replace(/ +/g, ""); |
| 337 } | 337 } |
| 338 | 338 |
| 339 return beforeOptions + "$" + options.join(); | 339 return beforeOptions + "$" + options.join(); |
| 340 }; | 340 }; |
| 341 | 341 |
| 342 /** | 342 /** |
| 343 * Class for invalid filters | 343 * Class for invalid filters |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 for (let i = 0; i < list.length; i++) | 524 for (let i = 0; i < list.length; i++) |
| 525 { | 525 { |
| 526 let domain = list[i]; | 526 let domain = list[i]; |
| 527 if (domain == "") | 527 if (domain == "") |
| 528 continue; | 528 continue; |
| 529 | 529 |
| 530 let include; | 530 let include; |
| 531 if (domain[0] == "~") | 531 if (domain[0] == "~") |
| 532 { | 532 { |
| 533 include = false; | 533 include = false; |
| 534 domain = domain.substr(1); | 534 domain = domain.substring(1); |
| 535 } | 535 } |
| 536 else | 536 else |
| 537 { | 537 { |
| 538 include = true; | 538 include = true; |
| 539 hasIncludes = true; | 539 hasIncludes = true; |
| 540 } | 540 } |
| 541 | 541 |
| 542 if (!domains) | 542 if (!domains) |
| 543 domains = new Map(); | 543 domains = new Map(); |
| 544 | 544 |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 723 this.rewrite = rewrite; | 723 this.rewrite = rewrite; |
| 724 if (resourceName) | 724 if (resourceName) |
| 725 this.resourceName = resourceName; | 725 this.resourceName = resourceName; |
| 726 | 726 |
| 727 if (regexpSource.length >= 2 && | 727 if (regexpSource.length >= 2 && |
| 728 regexpSource[0] == "/" && | 728 regexpSource[0] == "/" && |
| 729 regexpSource[regexpSource.length - 1] == "/") | 729 regexpSource[regexpSource.length - 1] == "/") |
| 730 { | 730 { |
| 731 // The filter is a regular expression - convert it immediately to | 731 // The filter is a regular expression - convert it immediately to |
| 732 // catch syntax errors | 732 // catch syntax errors |
| 733 let regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), | 733 let regexp = new RegExp(regexpSource.substring(1, regexpSource.length - 1), |
| 734 this.matchCase ? "" : "i"); | 734 this.matchCase ? "" : "i"); |
| 735 Object.defineProperty(this, "regexp", {value: regexp}); | 735 Object.defineProperty(this, "regexp", {value: regexp}); |
| 736 } | 736 } |
| 737 else | 737 else |
| 738 { | 738 { |
| 739 // Patterns like /foo/bar/* exist so that they are not treated as regular | 739 // Patterns like /foo/bar/* exist so that they are not treated as regular |
| 740 // expressions. We drop any superfluous wildcards here so our optimizations | 740 // expressions. We drop any superfluous wildcards here so our optimizations |
| 741 // can kick in. | 741 // can kick in. |
| 742 if (this.rewrite == null || this.resourceName) | 742 if (this.rewrite == null || this.resourceName) |
| 743 regexpSource = regexpSource.replace(/^\*+/, "").replace(/\*+$/, ""); | 743 regexpSource = regexpSource.replace(/^\*+/, "").replace(/\*+$/, ""); |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 968 * @param {string} text same as in Filter() | 968 * @param {string} text same as in Filter() |
| 969 * @return {Filter} | 969 * @return {Filter} |
| 970 */ | 970 */ |
| 971 RegExpFilter.fromText = function(text) | 971 RegExpFilter.fromText = function(text) |
| 972 { | 972 { |
| 973 let blocking = true; | 973 let blocking = true; |
| 974 let origText = text; | 974 let origText = text; |
| 975 if (text[0] == "@" && text[1] == "@") | 975 if (text[0] == "@" && text[1] == "@") |
| 976 { | 976 { |
| 977 blocking = false; | 977 blocking = false; |
| 978 text = text.substr(2); | 978 text = text.substring(2); |
| 979 } | 979 } |
| 980 | 980 |
| 981 let contentType = null; | 981 let contentType = null; |
| 982 let matchCase = null; | 982 let matchCase = null; |
| 983 let domains = null; | 983 let domains = null; |
| 984 let sitekeys = null; | 984 let sitekeys = null; |
| 985 let thirdParty = null; | 985 let thirdParty = null; |
| 986 let collapse = null; | 986 let collapse = null; |
| 987 let csp = null; | 987 let csp = null; |
| 988 let rewrite = null; | 988 let rewrite = null; |
| 989 let resourceName = null; | 989 let resourceName = null; |
| 990 let options; | 990 let options; |
| 991 let match = text.includes("$") ? Filter.optionsRegExp.exec(text) : null; | 991 let match = text.includes("$") ? Filter.optionsRegExp.exec(text) : null; |
| 992 if (match) | 992 if (match) |
| 993 { | 993 { |
| 994 options = match[1].split(","); | 994 options = match[1].split(","); |
| 995 text = match.input.substr(0, match.index); | 995 text = match.input.substring(0, match.index); |
| 996 for (let option of options) | 996 for (let option of options) |
| 997 { | 997 { |
| 998 let value = null; | 998 let value = null; |
| 999 let separatorIndex = option.indexOf("="); | 999 let separatorIndex = option.indexOf("="); |
| 1000 if (separatorIndex >= 0) | 1000 if (separatorIndex >= 0) |
| 1001 { | 1001 { |
| 1002 value = option.substr(separatorIndex + 1); | 1002 value = option.substring(separatorIndex + 1); |
| 1003 option = option.substr(0, separatorIndex); | 1003 option = option.substring(0, separatorIndex); |
| 1004 } | 1004 } |
| 1005 | 1005 |
| 1006 let inverse = option[0] == "~"; | 1006 let inverse = option[0] == "~"; |
| 1007 if (inverse) | 1007 if (inverse) |
| 1008 option = option.substr(1); | 1008 option = option.substring(1); |
| 1009 | 1009 |
| 1010 let type = RegExpFilter.typeMap[option.replace(/-/, "_").toUpperCase()]; | 1010 let type = RegExpFilter.typeMap[option.replace(/-/, "_").toUpperCase()]; |
| 1011 if (type) | 1011 if (type) |
| 1012 { | 1012 { |
| 1013 if (inverse) | 1013 if (inverse) |
| 1014 { | 1014 { |
| 1015 if (contentType == null) | 1015 if (contentType == null) |
| 1016 ({contentType} = RegExpFilter.prototype); | 1016 ({contentType} = RegExpFilter.prototype); |
| 1017 contentType &= ~type; | 1017 contentType &= ~type; |
| 1018 } | 1018 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1049 case "sitekey": | 1049 case "sitekey": |
| 1050 if (!value) | 1050 if (!value) |
| 1051 return new InvalidFilter(origText, "filter_unknown_option"); | 1051 return new InvalidFilter(origText, "filter_unknown_option"); |
| 1052 sitekeys = value.toUpperCase(); | 1052 sitekeys = value.toUpperCase(); |
| 1053 break; | 1053 break; |
| 1054 case "rewrite": | 1054 case "rewrite": |
| 1055 if (value == null) | 1055 if (value == null) |
| 1056 return new InvalidFilter(origText, "filter_unknown_option"); | 1056 return new InvalidFilter(origText, "filter_unknown_option"); |
| 1057 rewrite = value; | 1057 rewrite = value; |
| 1058 if (value.startsWith("abp-resource:")) | 1058 if (value.startsWith("abp-resource:")) |
| 1059 resourceName = value.substr("abp-resource:".length); | 1059 resourceName = value.substring("abp-resource:".length); |
| 1060 break; | 1060 break; |
| 1061 default: | 1061 default: |
| 1062 return new InvalidFilter(origText, "filter_unknown_option"); | 1062 return new InvalidFilter(origText, "filter_unknown_option"); |
| 1063 } | 1063 } |
| 1064 } | 1064 } |
| 1065 } | 1065 } |
| 1066 } | 1066 } |
| 1067 | 1067 |
| 1068 // For security reasons, never match $rewrite filters | 1068 // For security reasons, never match $rewrite filters |
| 1069 // against requests that might load any code to be executed. | 1069 // against requests that might load any code to be executed. |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1437 | 1437 |
| 1438 /** | 1438 /** |
| 1439 * Script that should be executed | 1439 * Script that should be executed |
| 1440 * @type {string} | 1440 * @type {string} |
| 1441 */ | 1441 */ |
| 1442 get script() | 1442 get script() |
| 1443 { | 1443 { |
| 1444 return this.body; | 1444 return this.body; |
| 1445 } | 1445 } |
| 1446 }); | 1446 }); |
| OLD | NEW |