@@ -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
4042var 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