| 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-2015 Eyeo GmbH | 3 * Copyright (C) 2006-2015 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 12 matching lines...) Expand all Loading... |
| 23 | 23 |
| 24 let {Utils} = require("utils"); | 24 let {Utils} = require("utils"); |
| 25 let {IO} = require("io"); | 25 let {IO} = require("io"); |
| 26 let {Prefs} = require("prefs"); | 26 let {Prefs} = require("prefs"); |
| 27 let {ElemHideException} = require("filterClasses"); | 27 let {ElemHideException} = require("filterClasses"); |
| 28 let {FilterNotifier} = require("filterNotifier"); | 28 let {FilterNotifier} = require("filterNotifier"); |
| 29 let {AboutHandler} = require("elemHideHitRegistration"); | 29 let {AboutHandler} = require("elemHideHitRegistration"); |
| 30 | 30 |
| 31 /** | 31 /** |
| 32 * Lookup table, filters by their associated key | 32 * Lookup table, filters by their associated key |
| 33 * @type Object | 33 * @type Map |
| 34 */ | 34 */ |
| 35 let filterByKey = Object.create(null); | 35 let filterByKey = new Map(); |
| 36 | 36 |
| 37 /** | 37 /** |
| 38 * Lookup table, keys of the filters by filter text | 38 * Lookup table, keys of the filters by filter |
| 39 * @type Object | 39 * @type WeakMap |
| 40 */ | 40 */ |
| 41 let keyByFilter = Object.create(null); | 41 let keyByFilter = new Map(); |
| 42 | 42 |
| 43 /** | 43 /** |
| 44 * Lookup table, keys are known element hiding exceptions | 44 * Lookup table, keys are known element hiding exceptions |
| 45 * @type Object | 45 * @type Object |
| 46 */ | 46 */ |
| 47 let knownExceptions = Object.create(null); | 47 let knownExceptions = Object.create(null); |
| 48 | 48 |
| 49 /** | 49 /** |
| 50 * Lookup table, lists of element hiding exceptions by selector | 50 * Lookup table, lists of element hiding exceptions by selector |
| 51 * @type Object | 51 * @type Object |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 let styleFile = IO.resolveFilePath(Prefs.data_directory); | 94 let styleFile = IO.resolveFilePath(Prefs.data_directory); |
| 95 styleFile.append("elemhide.css"); | 95 styleFile.append("elemhide.css"); |
| 96 styleURL = Services.io.newFileURI(styleFile).QueryInterface(Ci.nsIFileURL); | 96 styleURL = Services.io.newFileURI(styleFile).QueryInterface(Ci.nsIFileURL); |
| 97 }, | 97 }, |
| 98 | 98 |
| 99 /** | 99 /** |
| 100 * Removes all known filters | 100 * Removes all known filters |
| 101 */ | 101 */ |
| 102 clear: function() | 102 clear: function() |
| 103 { | 103 { |
| 104 filterByKey = Object.create(null); | 104 filterByKey = new Map(); |
| 105 keyByFilter = Object.create(null); | 105 keyByFilter = new Map(); |
| 106 knownExceptions = Object.create(null); | 106 knownExceptions = Object.create(null); |
| 107 exceptions = Object.create(null); | 107 exceptions = Object.create(null); |
| 108 ElemHide.isDirty = false; | 108 ElemHide.isDirty = false; |
| 109 ElemHide.unapply(); | 109 ElemHide.unapply(); |
| 110 }, | 110 }, |
| 111 | 111 |
| 112 /** | 112 /** |
| 113 * Add a new element hiding filter | 113 * Add a new element hiding filter |
| 114 * @param {ElemHideFilter} filter | 114 * @param {ElemHideFilter} filter |
| 115 */ | 115 */ |
| 116 add: function(filter) | 116 add: function(filter) |
| 117 { | 117 { |
| 118 if (filter instanceof ElemHideException) | 118 if (filter instanceof ElemHideException) |
| 119 { | 119 { |
| 120 if (filter.text in knownExceptions) | 120 if (filter.text in knownExceptions) |
| 121 return; | 121 return; |
| 122 | 122 |
| 123 let selector = filter.selector; | 123 let selector = filter.selector; |
| 124 if (!(selector in exceptions)) | 124 if (!(selector in exceptions)) |
| 125 exceptions[selector] = []; | 125 exceptions[selector] = []; |
| 126 exceptions[selector].push(filter); | 126 exceptions[selector].push(filter); |
| 127 knownExceptions[filter.text] = true; | 127 knownExceptions[filter.text] = true; |
| 128 } | 128 } |
| 129 else | 129 else |
| 130 { | 130 { |
| 131 if (filter.text in keyByFilter) | 131 if (keyByFilter.has(filter.text)) |
| 132 return; | 132 return; |
| 133 | 133 |
| 134 let key; | 134 let key; |
| 135 do { | 135 do { |
| 136 key = Math.random().toFixed(15).substr(5); | 136 key = Math.random().toFixed(15).substr(5); |
| 137 } while (key in filterByKey); | 137 } while (filterByKey.has(key)); |
| 138 | 138 |
| 139 filterByKey[key] = filter; | 139 filterByKey.set(key, filter); |
| 140 keyByFilter[filter.text] = key; | 140 keyByFilter.set(filter.text, key); |
| 141 ElemHide.isDirty = true; | 141 ElemHide.isDirty = true; |
| 142 } | 142 } |
| 143 }, | 143 }, |
| 144 | 144 |
| 145 /** | 145 /** |
| 146 * Removes an element hiding filter | 146 * Removes an element hiding filter |
| 147 * @param {ElemHideFilter} filter | 147 * @param {ElemHideFilter} filter |
| 148 */ | 148 */ |
| 149 remove: function(filter) | 149 remove: function(filter) |
| 150 { | 150 { |
| 151 if (filter instanceof ElemHideException) | 151 if (filter instanceof ElemHideException) |
| 152 { | 152 { |
| 153 if (!(filter.text in knownExceptions)) | 153 if (!(filter.text in knownExceptions)) |
| 154 return; | 154 return; |
| 155 | 155 |
| 156 let list = exceptions[filter.selector]; | 156 let list = exceptions[filter.selector]; |
| 157 let index = list.indexOf(filter); | 157 let index = list.indexOf(filter); |
| 158 if (index >= 0) | 158 if (index >= 0) |
| 159 list.splice(index, 1); | 159 list.splice(index, 1); |
| 160 delete knownExceptions[filter.text]; | 160 delete knownExceptions[filter.text]; |
| 161 } | 161 } |
| 162 else | 162 else |
| 163 { | 163 { |
| 164 if (!(filter.text in keyByFilter)) | 164 if (!keyByFilter.has(filter.text)) |
| 165 return; | 165 return; |
| 166 | 166 |
| 167 let key = keyByFilter[filter.text]; | 167 let key = keyByFilter.get(filter.text); |
| 168 delete filterByKey[key]; | 168 filterByKey.delete(key); |
| 169 delete keyByFilter[filter.text]; | 169 keyByFilter.delete(filter.text); |
| 170 ElemHide.isDirty = true; | 170 ElemHide.isDirty = true; |
| 171 } | 171 } |
| 172 }, | 172 }, |
| 173 | 173 |
| 174 /** | 174 /** |
| 175 * Checks whether an exception rule is registered for a filter on a particular | 175 * Checks whether an exception rule is registered for a filter on a particular |
| 176 * domain. | 176 * domain. |
| 177 */ | 177 */ |
| 178 getException: function(/**Filter*/ filter, /**String*/ docDomain) /**ElemHideE
xception*/ | 178 getException: function(/**Filter*/ filter, /**String*/ docDomain) /**ElemHideE
xception*/ |
| 179 { | 179 { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 }.bind(this)); | 280 }.bind(this)); |
| 281 | 281 |
| 282 this._applying = true; | 282 this._applying = true; |
| 283 }, | 283 }, |
| 284 | 284 |
| 285 _generateCSSContent: function*() | 285 _generateCSSContent: function*() |
| 286 { | 286 { |
| 287 // Grouping selectors by domains | 287 // Grouping selectors by domains |
| 288 let domains = Object.create(null); | 288 let domains = Object.create(null); |
| 289 let hasFilters = false; | 289 let hasFilters = false; |
| 290 for (let key in filterByKey) | 290 for (let [key, filter] of filterByKey.entries()) |
| 291 { | 291 { |
| 292 let filter = filterByKey[key]; | |
| 293 let domain = filter.selectorDomain || ""; | 292 let domain = filter.selectorDomain || ""; |
| 294 | 293 |
| 295 let list; | 294 let list; |
| 296 if (domain in domains) | 295 if (domain in domains) |
| 297 list = domains[domain]; | 296 list = domains[domain]; |
| 298 else | 297 else |
| 299 { | 298 { |
| 300 list = Object.create(null); | 299 list = Object.create(null); |
| 301 domains[domain] = list; | 300 domains[domain] = list; |
| 302 } | 301 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 get styleURL() | 360 get styleURL() |
| 362 { | 361 { |
| 363 return ElemHide.applied ? styleURL.spec : null; | 362 return ElemHide.applied ? styleURL.spec : null; |
| 364 }, | 363 }, |
| 365 | 364 |
| 366 /** | 365 /** |
| 367 * Retrieves an element hiding filter by the corresponding protocol key | 366 * Retrieves an element hiding filter by the corresponding protocol key |
| 368 */ | 367 */ |
| 369 getFilterByKey: function(/**String*/ key) /**Filter*/ | 368 getFilterByKey: function(/**String*/ key) /**Filter*/ |
| 370 { | 369 { |
| 371 return (key in filterByKey ? filterByKey[key] : null); | 370 return (filterByKey.has(key) ? filterByKey.get(key) : null); |
| 372 }, | 371 }, |
| 373 | 372 |
| 374 /** | 373 /** |
| 375 * Returns a list of all selectors active on a particular domain (currently | 374 * Returns a list of all selectors active on a particular domain (currently |
| 376 * used only in Chrome, Opera and Safari). | 375 * used only in Chrome, Opera and Safari). |
| 377 */ | 376 */ |
| 378 getSelectorsForDomain: function(/**String*/ domain, /**Boolean*/ specificOnly) | 377 getSelectorsForDomain: function(/**String*/ domain, /**Boolean*/ specificOnly) |
| 379 { | 378 { |
| 380 let result = []; | 379 let result = []; |
| 381 let keys = Object.getOwnPropertyNames(filterByKey); | 380 for (let filter of filterByKey.values()) |
| 382 for (let key of keys) | |
| 383 { | 381 { |
| 384 let filter = filterByKey[key]; | |
| 385 if (specificOnly && (!filter.domains || filter.domains[""])) | 382 if (specificOnly && (!filter.domains || filter.domains[""])) |
| 386 continue; | 383 continue; |
| 387 | 384 |
| 388 if (filter.isActiveOnDomain(domain) && !this.getException(filter, domain)) | 385 if (filter.isActiveOnDomain(domain) && !this.getException(filter, domain)) |
| 389 result.push(filter.selector); | 386 result.push(filter.selector); |
| 390 } | 387 } |
| 391 return result; | 388 return result; |
| 392 } | 389 } |
| 393 }; | 390 }; |
| OLD | NEW |