Skip to content

Commit 2cd4709

Browse files
committed
this fixes gorhill#835
1 parent 38a9504 commit 2cd4709

1 file changed

Lines changed: 21 additions & 11 deletions

File tree

src/js/reverselookup-worker.js

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,35 @@ var listEntries = Object.create(null);
3131

3232
// Helpers
3333

34-
var rescape = function(s) {
34+
var reEscape = function(s) {
3535
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
3636
};
3737

38+
var reSpecialChars = /[\*\^\t\v\n]/;
39+
3840
/******************************************************************************/
3941

4042
var fromNetFilter = function(details) {
4143
var lists = [];
4244

43-
var entry, pos;
45+
var compiledFilter = details.compiledFilter;
46+
var entry, content, pos, c;
4447
for ( var path in listEntries ) {
4548
entry = listEntries[path];
4649
if ( entry === undefined ) {
4750
continue;
4851
}
49-
pos = entry.content.indexOf(details.compiledFilter);
52+
content = entry.content;
53+
pos = content.indexOf(compiledFilter);
5054
if ( pos === -1 ) {
5155
continue;
5256
}
57+
// https://github.com/gorhill/uBlock/issues/835
58+
// We need an exact match.
59+
c = content.charAt(pos + compiledFilter.length);
60+
if ( c !== '' && reSpecialChars.test(c) === false ) {
61+
continue;
62+
}
5363
lists.push({
5464
title: entry.title,
5565
supportURL: entry.supportURL
@@ -103,16 +113,16 @@ var fromCosmeticFilter = function(details) {
103113
var matches = rePlainSelector.exec(filter);
104114
if ( matches ) {
105115
if ( matches[0] === filter ) { // simple CSS selector
106-
reStr = rescape('c\vlg\v' + filter);
116+
reStr = reEscape('c\vlg\v' + filter);
107117
} else { // complex CSS selector
108-
reStr = rescape('c\vlg+\v' + matches[0] + '\v' + filter);
118+
reStr = reEscape('c\vlg+\v' + matches[0] + '\v' + filter);
109119
}
110120
} else if ( reHighLow.test(filter) ) { // [alt] or [title]
111-
reStr = rescape('c\vhlg0\v' + filter);
121+
reStr = reEscape('c\vhlg0\v' + filter);
112122
} else if ( reHighMedium.test(filter) ) { // [href^="..."]
113-
reStr = rescape('c\vhmg0\v') + '[a-z.-]+' + rescape('\v') + '[a-z]*' + rescape(filter);
123+
reStr = reEscape('c\vhmg0\v') + '[a-z.-]+' + reEscape('\v') + '[a-z]*' + reEscape(filter);
114124
} else { // all else
115-
reStr = rescape('c\vhhg0\v' + filter);
125+
reStr = reEscape('c\vhhg0\v' + filter);
116126
}
117127
candidates[details.rawFilter] = new RegExp(reStr + '(?:\\n|$)');
118128

@@ -125,9 +135,9 @@ var fromCosmeticFilter = function(details) {
125135
if ( hostname !== '' ) {
126136
for ( ;; ) {
127137
candidates[hostname + '##' + filter] = new RegExp(
128-
rescape('c\vh\v') +
138+
reEscape('c\vh\v') +
129139
'\\w+' +
130-
rescape('\v' + hostname + '\v' + filter) +
140+
reEscape('\v' + hostname + '\v' + filter) +
131141
'(?:\\n|$)'
132142
);
133143
// If there is no valid domain, there won't be any other
@@ -152,7 +162,7 @@ var fromCosmeticFilter = function(details) {
152162
if ( pos !== -1 ) {
153163
var entity = domain.slice(0, pos);
154164
candidates[entity + '.*##' + filter] = new RegExp(
155-
rescape('c\ve\v' + entity + '\v' + filter) +
165+
reEscape('c\ve\v' + entity + '\v' + filter) +
156166
'(?:\\n|$)'
157167
);
158168
}

0 commit comments

Comments
 (0)