| Index: lib/matcher.js |
| =================================================================== |
| --- a/lib/matcher.js |
| +++ b/lib/matcher.js |
| @@ -506,16 +506,24 @@ |
| * @private |
| */ |
| _matchesAnyInternal(location, typeMask, docDomain, thirdParty, sitekey, |
| specificOnly) |
| { |
| let candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); |
| if (candidates === null) |
| candidates = []; |
| + |
| + // The first keyword in a URL is the protocol (usually "https" or "http"). |
| + // This is an outlier: it has hundreds of filters typically, yet it rarely |
| + // ever has a match. We cut down the amount of processing for blocked URLs |
| + // significantly by moving it to the end of the list. |
| + if (candidates.length > 0) |
| + candidates.push(candidates.shift()); |
| + |
| candidates.push(""); |
| let whitelistHit = null; |
| let blacklistHit = null; |
| // If the type mask includes no types other than whitelist-only types, we |
| // can skip the blacklist. |
| if ((typeMask & ~WHITELIST_ONLY_TYPES) != 0) |