Index: lib/matcher.js |
=================================================================== |
--- a/lib/matcher.js |
+++ b/lib/matcher.js |
@@ -463,28 +463,25 @@ |
} |
} |
} |
return null; |
} |
_checkEntryMatchSimple(keyword, location, typeMask, docDomain, thirdParty, |
- sitekey, specificOnly, collection) |
+ sitekey, collection) |
{ |
let filters = this._simpleFiltersByKeyword.get(keyword); |
if (filters) |
{ |
let lowerCaseLocation = location.toLowerCase(); |
for (let filter of filters) |
{ |
- if (specificOnly && !(filter instanceof WhitelistFilter)) |
- continue; |
- |
if (filter.matchesLocation(location, lowerCaseLocation)) |
{ |
if (!collection) |
return filter; |
collection.push(filter); |
} |
} |
@@ -499,18 +496,17 @@ |
let filtersForType = this._filterMapsByType.get(typeMask); |
if (filtersForType) |
{ |
let filters = filtersForType.get(keyword); |
if (filters) |
{ |
for (let filter of filters) |
{ |
- if (specificOnly && filter.isGeneric() && |
- !(filter instanceof WhitelistFilter)) |
+ if (specificOnly && filter.isGeneric()) |
continue; |
if (filter.matches(location, typeMask, docDomain, thirdParty, |
sitekey)) |
{ |
if (!collection) |
return filter; |
@@ -533,19 +529,26 @@ |
{ |
return this._matchFiltersByDomain(filtersByDomain, location, typeMask, |
docDomain, thirdParty, sitekey, |
specificOnly, collection); |
} |
// Because of the memory optimization in the add function, most of the |
// time this will be a filter rather than a map. |
- return this._matchFilterWithoutDomain(filtersByDomain, location, |
- typeMask, thirdParty, sitekey, |
- collection); |
+ |
+ // Also see #7312: If it's a single filter, it's always the equivalent of |
+ // Map { "" => Map { filter => true } } (i.e. applies to any domain). If |
+ // the specific-only flag is set, we skip it. |
+ if (!specificOnly) |
+ { |
+ return this._matchFilterWithoutDomain(filtersByDomain, location, |
+ typeMask, thirdParty, sitekey, |
+ collection); |
+ } |
} |
return null; |
} |
/** |
* Checks whether the entries for a particular keyword match a URL |
* @param {string} keyword |
@@ -566,17 +569,17 @@ |
specificOnly, collection) |
{ |
// We need to skip the simple (location-only) filters if the type mask does |
// not contain any default content types. |
if (!specificOnly && (typeMask & DEFAULT_TYPES) != 0) |
{ |
let filter = this._checkEntryMatchSimple(keyword, location, typeMask, |
docDomain, thirdParty, sitekey, |
- specificOnly, collection); |
+ collection); |
if (filter) |
return filter; |
} |
// If the type mask contains a non-default type (first condition) and it is |
// the only type in the mask (second condition), we can use the |
// type-specific map, which typically contains a lot fewer filters. This |
// enables faster lookups for whitelisting types like $document, $elemhide, |