| OLD | NEW |
| 1 /* | 1 /* |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
| 3 * Copyright (C) 2006-present eyeo GmbH | 3 * Copyright (C) 2006-present eyeo GmbH |
| 4 * | 4 * |
| 5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
| 6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
| 7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
| 8 * | 8 * |
| 9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 { | 103 { |
| 104 set.add(filter); | 104 set.add(filter); |
| 105 } | 105 } |
| 106 } | 106 } |
| 107 | 107 |
| 108 /** | 108 /** |
| 109 * Removes a filter by a given keyword from a map. | 109 * Removes a filter by a given keyword from a map. |
| 110 * @param {RegExpFilter} filter | 110 * @param {RegExpFilter} filter |
| 111 * @param {string} keyword | 111 * @param {string} keyword |
| 112 * @param {Map.<string,(RegExpFilter|Set.<RegExpFilter>)>} map | 112 * @param {Map.<string,(RegExpFilter|Set.<RegExpFilter>)>} map |
| 113 * @returns {boolean} Whether the filter was removed. |
| 113 */ | 114 */ |
| 114 function removeFilterByKeyword(filter, keyword, map) | 115 function removeFilterByKeyword(filter, keyword, map) |
| 115 { | 116 { |
| 116 let set = map.get(keyword); | 117 let set = map.get(keyword); |
| 117 if (typeof set == "undefined") | 118 if (typeof set == "undefined") |
| 118 return; | 119 return false; |
| 119 | 120 |
| 120 if (set.size == 1) | 121 if (set.size == 1) |
| 121 { | 122 { |
| 122 if (filter == set) | 123 if (filter != set) |
| 123 map.delete(keyword); | 124 return false; |
| 125 |
| 126 map.delete(keyword); |
| 124 } | 127 } |
| 125 else | 128 else |
| 126 { | 129 { |
| 130 let count = set.size; |
| 131 |
| 127 set.delete(filter); | 132 set.delete(filter); |
| 128 | 133 |
| 134 if (set.size == count) |
| 135 return false; |
| 136 |
| 129 if (set.size == 1) | 137 if (set.size == 1) |
| 130 map.set(keyword, [...set][0]); | 138 map.set(keyword, [...set][0]); |
| 131 } | 139 } |
| 140 |
| 141 return true; |
| 132 } | 142 } |
| 133 | 143 |
| 134 /** | 144 /** |
| 135 * Checks whether a particular filter is slow. | 145 * Checks whether a particular filter is slow. |
| 136 * @param {RegExpFilter} filter | 146 * @param {RegExpFilter} filter |
| 137 * @returns {boolean} | 147 * @returns {boolean} |
| 138 */ | 148 */ |
| 139 function isSlowFilter(filter) | 149 function isSlowFilter(filter) |
| 140 { | 150 { |
| 141 return !filter.pattern || !keywordRegExp.test(filter.pattern); | 151 return !filter.pattern || !keywordRegExp.test(filter.pattern); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 addFilterByKeyword(filter, keyword, map); | 219 addFilterByKeyword(filter, keyword, map); |
| 210 } | 220 } |
| 211 } | 221 } |
| 212 | 222 |
| 213 /** | 223 /** |
| 214 * Removes a filter from the matcher | 224 * Removes a filter from the matcher |
| 215 * @param {RegExpFilter} filter | 225 * @param {RegExpFilter} filter |
| 216 */ | 226 */ |
| 217 remove(filter) | 227 remove(filter) |
| 218 { | 228 { |
| 219 let keyword = this.findKeyword(filter); | 229 let keyword = null; |
| 230 let candidates = null; |
| 231 |
| 232 let {pattern} = filter; |
| 233 if (pattern == null) |
| 234 { |
| 235 candidates = [""]; |
| 236 } |
| 237 else |
| 238 { |
| 239 candidates = pattern.toLowerCase().match(allKeywordsRegExp); |
| 240 if (!candidates) |
| 241 candidates = [""]; |
| 242 } |
| 243 |
| 220 let locationOnly = filter.isLocationOnly(); | 244 let locationOnly = filter.isLocationOnly(); |
| 221 | 245 |
| 222 removeFilterByKeyword(filter, keyword, | 246 // The keyword used to add a filter depends on the current list of filters |
| 223 locationOnly ? this._simpleFiltersByKeyword : | 247 // at the time of addition. At this point we don't know what keyword was |
| 224 this._complexFiltersByKeyword); | 248 // used to add the filter. We must try all the candidates. |
| 249 for (let candidate of candidates) |
| 250 { |
| 251 candidate = candidate.substring(1); |
| 225 | 252 |
| 226 if (locationOnly) | 253 if (removeFilterByKeyword(filter, candidate, |
| 254 locationOnly ? this._simpleFiltersByKeyword : |
| 255 this._complexFiltersByKeyword)) |
| 256 { |
| 257 keyword = candidate; |
| 258 break; |
| 259 } |
| 260 } |
| 261 |
| 262 if (locationOnly || keyword == null) |
| 227 return; | 263 return; |
| 228 | 264 |
| 229 for (let type of nonDefaultTypes(filter.contentType)) | 265 for (let type of nonDefaultTypes(filter.contentType)) |
| 230 { | 266 { |
| 231 let map = this._filterMapsByType.get(type); | 267 let map = this._filterMapsByType.get(type); |
| 232 if (map) | 268 if (map) |
| 233 removeFilterByKeyword(filter, keyword, map); | 269 removeFilterByKeyword(filter, keyword, map); |
| 234 } | 270 } |
| 235 } | 271 } |
| 236 | 272 |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 | 588 |
| 553 exports.CombinedMatcher = CombinedMatcher; | 589 exports.CombinedMatcher = CombinedMatcher; |
| 554 | 590 |
| 555 /** | 591 /** |
| 556 * Shared {@link CombinedMatcher} instance that should usually be used. | 592 * Shared {@link CombinedMatcher} instance that should usually be used. |
| 557 * @type {CombinedMatcher} | 593 * @type {CombinedMatcher} |
| 558 */ | 594 */ |
| 559 let defaultMatcher = new CombinedMatcher(); | 595 let defaultMatcher = new CombinedMatcher(); |
| 560 | 596 |
| 561 exports.defaultMatcher = defaultMatcher; | 597 exports.defaultMatcher = defaultMatcher; |
| OLD | NEW |