Fix reverse lookup of entity-based cosmetic filters

Related issue:
- https://github.com/uBlockOrigin/uBlock-issues/issues/805
This commit is contained in:
Raymond Hill 2019-12-04 10:10:07 -05:00
parent f7cc2ed7b1
commit 082201d24a
No known key found for this signature in database
GPG Key ID: 25E1490B761470C2
1 changed files with 18 additions and 28 deletions

View File

@ -121,42 +121,32 @@ const fromCosmeticFilter = function(details) {
const exception = prefix.charAt(1) === '@'; const exception = prefix.charAt(1) === '@';
const selector = details.rawFilter.slice(prefix.length); const selector = details.rawFilter.slice(prefix.length);
const isHtmlFilter = prefix.endsWith('^'); const isHtmlFilter = prefix.endsWith('^');
const hostname = details.hostname;
// The longer the needle, the lower the number of false positives. // The longer the needle, the lower the number of false positives.
const needle = selector.match(/\w+/g).reduce(function(a, b) { const needle = selector.match(/\w+/g).reduce(function(a, b) {
return a.length > b.length ? a : b; return a.length > b.length ? a : b;
}); });
const reHostname = new RegExp( const regexFromLabels = (hn, suffix) =>
new RegExp(
'^' + '^' +
details.hostname.split('.').reduce( hn.split('.').reduce((acc, item) => `(${acc}\\.)?${item}`) +
function(acc, item) { suffix
return acc === ''
? item
: '(' + acc + '\\.)?' + item;
},
''
) +
'$'
); );
let reEntity, const reHostname = regexFromLabels(hostname, '$');
domain = details.domain, let reEntity;
pos = domain.indexOf('.'); {
const domain = details.domain;
const pos = domain.indexOf('.');
if ( pos !== -1 ) { if ( pos !== -1 ) {
reEntity = new RegExp( reEntity = regexFromLabels(
'^' + hostname.slice(0, pos + hostname.length - domain.length),
domain.slice(0, pos).split('.').reduce(
function(acc, item) {
return acc === ''
? item
: '(' + acc + '\\.)?' + item;
},
''
) +
'\\.\\*$' '\\.\\*$'
); );
} }
}
const hostnameMatches = hn => { const hostnameMatches = hn => {
return hn === '' || return hn === '' ||