Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: lib/filterClasses.js

Issue 29978576: Issue 7208 - Drop superfluous wildcards before processing pattern (Closed) Base URL: https://hg.adblockplus.org/adblockpluscore/
Patch Set: Move rewrite property to RegExpFilter Created Jan. 10, 2019, 11:03 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 670 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 * @param {boolean} [matchCase] 681 * @param {boolean} [matchCase]
682 * Defines whether the filter should distinguish between lower and upper case 682 * Defines whether the filter should distinguish between lower and upper case
683 * letters 683 * letters
684 * @param {string} [domains] 684 * @param {string} [domains]
685 * Domains that the filter is restricted to, e.g. "foo.com|bar.com|~baz.com" 685 * Domains that the filter is restricted to, e.g. "foo.com|bar.com|~baz.com"
686 * @param {boolean} [thirdParty] 686 * @param {boolean} [thirdParty]
687 * Defines whether the filter should apply to third-party or first-party 687 * Defines whether the filter should apply to third-party or first-party
688 * content only 688 * content only
689 * @param {string} [sitekeys] 689 * @param {string} [sitekeys]
690 * Public keys of websites that this filter should apply to 690 * Public keys of websites that this filter should apply to
691 * @param {?string} [rewrite]
692 * The (optional) rule specifying how to rewrite the URL. See
693 * RegExpFilter.prototype.rewrite.
691 * @constructor 694 * @constructor
692 * @augments ActiveFilter 695 * @augments ActiveFilter
693 */ 696 */
694 function RegExpFilter(text, regexpSource, contentType, matchCase, domains, 697 function RegExpFilter(text, regexpSource, contentType, matchCase, domains,
695 thirdParty, sitekeys) 698 thirdParty, sitekeys, rewrite)
696 { 699 {
697 ActiveFilter.call(this, text, domains); 700 ActiveFilter.call(this, text, domains);
698 701
699 if (contentType != null) 702 if (contentType != null)
700 this.contentType = contentType; 703 this.contentType = contentType;
701 if (matchCase) 704 if (matchCase)
702 this.matchCase = matchCase; 705 this.matchCase = matchCase;
703 if (thirdParty != null) 706 if (thirdParty != null)
704 this.thirdParty = thirdParty; 707 this.thirdParty = thirdParty;
705 if (sitekeys != null) 708 if (sitekeys != null)
706 this.sitekeySource = sitekeys; 709 this.sitekeySource = sitekeys;
710 if (rewrite != null)
711 this.rewrite = rewrite;
707 712
708 if (regexpSource.length >= 2 && 713 if (regexpSource.length >= 2 &&
709 regexpSource[0] == "/" && 714 regexpSource[0] == "/" &&
710 regexpSource[regexpSource.length - 1] == "/") 715 regexpSource[regexpSource.length - 1] == "/")
711 { 716 {
712 // The filter is a regular expression - convert it immediately to 717 // The filter is a regular expression - convert it immediately to
713 // catch syntax errors 718 // catch syntax errors
714 let regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), 719 let regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2),
715 this.matchCase ? "" : "i"); 720 this.matchCase ? "" : "i");
716 Object.defineProperty(this, "regexp", {value: regexp}); 721 Object.defineProperty(this, "regexp", {value: regexp});
717 } 722 }
718 else 723 else
719 { 724 {
725 // Patterns like /foo/bar/* exist so that they are not treated as regular
726 // expressions. We drop any superfluous wildcards here so our optimizations
727 // can kick in.
728 if (this.rewrite == null)
729 regexpSource = regexpSource.replace(/^\*+/, "").replace(/\*+$/, "");
730
720 if (!this.matchCase && isLiteralPattern(regexpSource)) 731 if (!this.matchCase && isLiteralPattern(regexpSource))
721 regexpSource = regexpSource.toLowerCase(); 732 regexpSource = regexpSource.toLowerCase();
722 733
723 // No need to convert this filter to regular expression yet, do it on demand 734 // No need to convert this filter to regular expression yet, do it on demand
724 this.pattern = regexpSource; 735 this.pattern = regexpSource;
725 } 736 }
726 } 737 }
727 exports.RegExpFilter = RegExpFilter; 738 exports.RegExpFilter = RegExpFilter;
728 739
729 RegExpFilter.prototype = extend(ActiveFilter, { 740 RegExpFilter.prototype = extend(ActiveFilter, {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
801 this.sitekeySource = null; 812 this.sitekeySource = null;
802 } 813 }
803 814
804 Object.defineProperty( 815 Object.defineProperty(
805 this, "sitekeys", {value: sitekeys, enumerable: true} 816 this, "sitekeys", {value: sitekeys, enumerable: true}
806 ); 817 );
807 return this.sitekeys; 818 return this.sitekeys;
808 }, 819 },
809 820
810 /** 821 /**
822 * The rule specifying how to rewrite the URL.
823 * The syntax is similar to the one of String.prototype.replace().
824 * @type {?string}
825 */
826 rewrite: null,
827
828 /**
811 * Tests whether the URL matches this filter 829 * Tests whether the URL matches this filter
812 * @param {string} location URL to be tested 830 * @param {string} location URL to be tested
813 * @param {number} typeMask bitmask of content / request types to match 831 * @param {number} typeMask bitmask of content / request types to match
814 * @param {string} [docDomain] domain name of the document that loads the URL 832 * @param {string} [docDomain] domain name of the document that loads the URL
815 * @param {boolean} [thirdParty] should be true if the URL is a third-party 833 * @param {boolean} [thirdParty] should be true if the URL is a third-party
816 * request 834 * request
817 * @param {string} [sitekey] public key provided by the document 835 * @param {string} [sitekey] public key provided by the document
818 * @return {boolean} true in case of a match 836 * @return {boolean} true in case of a match
819 */ 837 */
820 matches(location, typeMask, docDomain, thirdParty, sitekey) 838 matches(location, typeMask, docDomain, thirdParty, sitekey)
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
990 } 1008 }
991 1009
992 try 1010 try
993 { 1011 {
994 if (blocking) 1012 if (blocking)
995 { 1013 {
996 if (csp && Filter.invalidCSPRegExp.test(csp)) 1014 if (csp && Filter.invalidCSPRegExp.test(csp))
997 return new InvalidFilter(origText, "filter_invalid_csp"); 1015 return new InvalidFilter(origText, "filter_invalid_csp");
998 1016
999 return new BlockingFilter(origText, text, contentType, matchCase, domains, 1017 return new BlockingFilter(origText, text, contentType, matchCase, domains,
1000 thirdParty, sitekeys, collapse, csp, rewrite); 1018 thirdParty, sitekeys, rewrite, collapse, csp);
1001 } 1019 }
1002 return new WhitelistFilter(origText, text, contentType, matchCase, domains, 1020 return new WhitelistFilter(origText, text, contentType, matchCase, domains,
1003 thirdParty, sitekeys); 1021 thirdParty, sitekeys);
1004 } 1022 }
1005 catch (e) 1023 catch (e)
1006 { 1024 {
1007 return new InvalidFilter(origText, "filter_invalid_regexp"); 1025 return new InvalidFilter(origText, "filter_invalid_regexp");
1008 } 1026 }
1009 }; 1027 };
1010 1028
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1049 1067
1050 /** 1068 /**
1051 * Class for blocking filters 1069 * Class for blocking filters
1052 * @param {string} text see {@link Filter Filter()} 1070 * @param {string} text see {@link Filter Filter()}
1053 * @param {string} regexpSource see {@link RegExpFilter RegExpFilter()} 1071 * @param {string} regexpSource see {@link RegExpFilter RegExpFilter()}
1054 * @param {number} [contentType] see {@link RegExpFilter RegExpFilter()} 1072 * @param {number} [contentType] see {@link RegExpFilter RegExpFilter()}
1055 * @param {boolean} [matchCase] see {@link RegExpFilter RegExpFilter()} 1073 * @param {boolean} [matchCase] see {@link RegExpFilter RegExpFilter()}
1056 * @param {string} [domains] see {@link RegExpFilter RegExpFilter()} 1074 * @param {string} [domains] see {@link RegExpFilter RegExpFilter()}
1057 * @param {boolean} [thirdParty] see {@link RegExpFilter RegExpFilter()} 1075 * @param {boolean} [thirdParty] see {@link RegExpFilter RegExpFilter()}
1058 * @param {string} [sitekeys] see {@link RegExpFilter RegExpFilter()} 1076 * @param {string} [sitekeys] see {@link RegExpFilter RegExpFilter()}
1077 * @param {?string} [rewrite]
1078 * The (optional) rule specifying how to rewrite the URL. See
1079 * RegExpFilter.prototype.rewrite.
1059 * @param {boolean} [collapse] 1080 * @param {boolean} [collapse]
1060 * defines whether the filter should collapse blocked content, can be null 1081 * defines whether the filter should collapse blocked content, can be null
1061 * @param {string} [csp] 1082 * @param {string} [csp]
1062 * Content Security Policy to inject when the filter matches 1083 * Content Security Policy to inject when the filter matches
1063 * @param {?string} [rewrite]
1064 * The (optional) rule specifying how to rewrite the URL. See
1065 * BlockingFilter.prototype.rewrite.
1066 * @constructor 1084 * @constructor
1067 * @augments RegExpFilter 1085 * @augments RegExpFilter
1068 */ 1086 */
1069 function BlockingFilter(text, regexpSource, contentType, matchCase, domains, 1087 function BlockingFilter(text, regexpSource, contentType, matchCase, domains,
1070 thirdParty, sitekeys, collapse, csp, rewrite) 1088 thirdParty, sitekeys, rewrite, collapse, csp)
1071 { 1089 {
1072 RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, 1090 RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains,
1073 thirdParty, sitekeys); 1091 thirdParty, sitekeys, rewrite);
1074 1092
1075 if (collapse != null) 1093 if (collapse != null)
1076 this.collapse = collapse; 1094 this.collapse = collapse;
1077 1095
1078 if (csp != null) 1096 if (csp != null)
1079 this.csp = csp; 1097 this.csp = csp;
1080
1081 if (rewrite != null)
1082 this.rewrite = rewrite;
1083 } 1098 }
1084 exports.BlockingFilter = BlockingFilter; 1099 exports.BlockingFilter = BlockingFilter;
1085 1100
1086 BlockingFilter.prototype = extend(RegExpFilter, { 1101 BlockingFilter.prototype = extend(RegExpFilter, {
1087 type: "blocking", 1102 type: "blocking",
1088 1103
1089 /** 1104 /**
1090 * Defines whether the filter should collapse blocked content. 1105 * Defines whether the filter should collapse blocked content.
1091 * Can be null (use the global preference). 1106 * Can be null (use the global preference).
1092 * @type {?boolean} 1107 * @type {?boolean}
1093 */ 1108 */
1094 collapse: null, 1109 collapse: null,
1095 1110
1096 /** 1111 /**
1097 * Content Security Policy to inject for matching requests. 1112 * Content Security Policy to inject for matching requests.
1098 * @type {?string} 1113 * @type {?string}
1099 */ 1114 */
1100 csp: null, 1115 csp: null,
1101 1116
1102 /** 1117 /**
1103 * The rule specifying how to rewrite the URL.
1104 * The syntax is similar to the one of String.prototype.replace().
1105 * @type {?string}
1106 */
1107 rewrite: null,
1108
1109 /**
1110 * Rewrites an URL. 1118 * Rewrites an URL.
1111 * @param {string} url the URL to rewrite 1119 * @param {string} url the URL to rewrite
1112 * @return {string} the rewritten URL, or the original in case of failure 1120 * @return {string} the rewritten URL, or the original in case of failure
1113 */ 1121 */
1114 rewriteUrl(url) 1122 rewriteUrl(url)
1115 { 1123 {
1116 try 1124 try
1117 { 1125 {
1118 let rewrittenUrl = new URL(url.replace(this.regexp, this.rewrite), url); 1126 let rewrittenUrl = new URL(url.replace(this.regexp, this.rewrite), url);
1119 if (rewrittenUrl.origin == new URL(url).origin) 1127 if (rewrittenUrl.origin == new URL(url).origin)
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
1353 1361
1354 /** 1362 /**
1355 * Script that should be executed 1363 * Script that should be executed
1356 * @type {string} 1364 * @type {string}
1357 */ 1365 */
1358 get script() 1366 get script()
1359 { 1367 {
1360 return this.body; 1368 return this.body;
1361 } 1369 }
1362 }); 1370 });
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld