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-2016 Eyeo GmbH | 3 * Copyright (C) 2006-2016 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 16 matching lines...) Expand all Loading... |
27 let {FilterStorage} = require("filterStorage"); | 27 let {FilterStorage} = require("filterStorage"); |
28 let {FilterNotifier} = require("filterNotifier"); | 28 let {FilterNotifier} = require("filterNotifier"); |
29 let {ElemHide} = require("elemHide"); | 29 let {ElemHide} = require("elemHide"); |
30 let {CSSRules} = require("cssRules"); | 30 let {CSSRules} = require("cssRules"); |
31 let {defaultMatcher} = require("matcher"); | 31 let {defaultMatcher} = require("matcher"); |
32 let {ActiveFilter, RegExpFilter, ElemHideBase, CSSPropertyFilter} = | 32 let {ActiveFilter, RegExpFilter, ElemHideBase, CSSPropertyFilter} = |
33 require("filterClasses"); | 33 require("filterClasses"); |
34 let {Prefs} = require("prefs"); | 34 let {Prefs} = require("prefs"); |
35 | 35 |
36 /** | 36 /** |
37 * Value of the FilterListener.batchMode property. | |
38 * @type Boolean | |
39 */ | |
40 let batchMode = false; | |
41 | |
42 /** | |
43 * Increases on filter changes, filters will be saved if it exceeds 1. | 37 * Increases on filter changes, filters will be saved if it exceeds 1. |
44 * @type Integer | 38 * @type Integer |
45 */ | 39 */ |
46 let isDirty = 0; | 40 let isDirty = 0; |
47 | 41 |
48 /** | 42 /** |
49 * This object can be used to change properties of the filter change listeners. | 43 * This object can be used to change properties of the filter change listeners. |
50 * @class | 44 * @class |
51 */ | 45 */ |
52 let FilterListener = | 46 let FilterListener = |
53 { | 47 { |
54 /** | 48 /** |
55 * Set to true when executing many changes, changes will only be fully applied
after this variable is set to false again. | |
56 * @type Boolean | |
57 */ | |
58 get batchMode() | |
59 { | |
60 return batchMode; | |
61 }, | |
62 set batchMode(value) | |
63 { | |
64 batchMode = value; | |
65 flushElemHide(); | |
66 }, | |
67 | |
68 /** | |
69 * Increases "dirty factor" of the filters and calls FilterStorage.saveToDisk(
) | 49 * Increases "dirty factor" of the filters and calls FilterStorage.saveToDisk(
) |
70 * if it becomes 1 or more. Save is executed delayed to prevent multiple | 50 * if it becomes 1 or more. Save is executed delayed to prevent multiple |
71 * subsequent calls. If the parameter is 0 it forces saving filters if any | 51 * subsequent calls. If the parameter is 0 it forces saving filters if any |
72 * changes were recorded after the previous save. | 52 * changes were recorded after the previous save. |
73 */ | 53 */ |
74 setDirty: function(/**Integer*/ factor) | 54 setDirty: function(/**Integer*/ factor) |
75 { | 55 { |
76 if (factor == 0 && isDirty > 0) | 56 if (factor == 0 && isDirty > 0) |
77 isDirty = 1; | 57 isDirty = 1; |
78 else | 58 else |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 FilterNotifier.on("subscription.title", onGenericChange); | 104 FilterNotifier.on("subscription.title", onGenericChange); |
125 FilterNotifier.on("subscription.fixedTitle", onGenericChange); | 105 FilterNotifier.on("subscription.fixedTitle", onGenericChange); |
126 FilterNotifier.on("subscription.homepage", onGenericChange); | 106 FilterNotifier.on("subscription.homepage", onGenericChange); |
127 FilterNotifier.on("subscription.downloadStatus", onGenericChange); | 107 FilterNotifier.on("subscription.downloadStatus", onGenericChange); |
128 FilterNotifier.on("subscription.lastCheck", onGenericChange); | 108 FilterNotifier.on("subscription.lastCheck", onGenericChange); |
129 FilterNotifier.on("subscription.errors", onGenericChange); | 109 FilterNotifier.on("subscription.errors", onGenericChange); |
130 | 110 |
131 FilterNotifier.on("load", onLoad); | 111 FilterNotifier.on("load", onLoad); |
132 FilterNotifier.on("save", onSave); | 112 FilterNotifier.on("save", onSave); |
133 | 113 |
134 | |
135 if ("nsIStyleSheetService" in Ci) | |
136 ElemHide.init(); | |
137 else | |
138 flushElemHide = function() {}; // No global stylesheet in Chrome & Co. | |
139 FilterStorage.loadFromDisk(); | 114 FilterStorage.loadFromDisk(); |
140 | 115 |
141 Services.obs.addObserver(HistoryPurgeObserver, "browser:purge-session-history"
, true); | 116 Services.obs.addObserver(HistoryPurgeObserver, "browser:purge-session-history"
, true); |
142 onShutdown.add(function() | 117 onShutdown.add(function() |
143 { | 118 { |
144 Services.obs.removeObserver(HistoryPurgeObserver, "browser:purge-session-his
tory"); | 119 Services.obs.removeObserver(HistoryPurgeObserver, "browser:purge-session-his
tory"); |
145 }); | 120 }); |
146 } | 121 } |
147 init(); | 122 init(); |
148 | 123 |
149 /** | 124 /** |
150 * Calls ElemHide.apply() if necessary. | |
151 */ | |
152 function flushElemHide() | |
153 { | |
154 if (!batchMode && ElemHide.isDirty) | |
155 ElemHide.apply(); | |
156 } | |
157 | |
158 /** | |
159 * Notifies Matcher instances or ElemHide object about a new filter | 125 * Notifies Matcher instances or ElemHide object about a new filter |
160 * if necessary. | 126 * if necessary. |
161 * @param {Filter} filter filter that has been added | 127 * @param {Filter} filter filter that has been added |
162 */ | 128 */ |
163 function addFilter(filter) | 129 function addFilter(filter) |
164 { | 130 { |
165 if (!(filter instanceof ActiveFilter) || filter.disabled) | 131 if (!(filter instanceof ActiveFilter) || filter.disabled) |
166 return; | 132 return; |
167 | 133 |
168 let hasEnabled = false; | 134 let hasEnabled = false; |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 | 203 |
238 for (let i = 0; i < len; i++, current = (current + step) % len) | 204 for (let i = 0; i < len; i++, current = (current + step) % len) |
239 addFilter(filters[current]); | 205 addFilter(filters[current]); |
240 } | 206 } |
241 | 207 |
242 function onSubscriptionAdded(subscription) | 208 function onSubscriptionAdded(subscription) |
243 { | 209 { |
244 FilterListener.setDirty(1); | 210 FilterListener.setDirty(1); |
245 | 211 |
246 if (!subscription.disabled) | 212 if (!subscription.disabled) |
247 { | |
248 addFilters(subscription.filters); | 213 addFilters(subscription.filters); |
249 flushElemHide(); | |
250 } | |
251 } | 214 } |
252 | 215 |
253 function onSubscriptionRemoved(subscription) | 216 function onSubscriptionRemoved(subscription) |
254 { | 217 { |
255 FilterListener.setDirty(1); | 218 FilterListener.setDirty(1); |
256 | 219 |
257 if (!subscription.disabled) | 220 if (!subscription.disabled) |
258 { | |
259 subscription.filters.forEach(removeFilter); | 221 subscription.filters.forEach(removeFilter); |
260 flushElemHide(); | |
261 } | |
262 } | 222 } |
263 | 223 |
264 function onSubscriptionDisabled(subscription, newValue) | 224 function onSubscriptionDisabled(subscription, newValue) |
265 { | 225 { |
266 FilterListener.setDirty(1); | 226 FilterListener.setDirty(1); |
267 | 227 |
268 if (subscription.url in FilterStorage.knownSubscriptions) | 228 if (subscription.url in FilterStorage.knownSubscriptions) |
269 { | 229 { |
270 if (newValue == false) | 230 if (newValue == false) |
271 addFilters(subscription.filters); | 231 addFilters(subscription.filters); |
272 else | 232 else |
273 subscription.filters.forEach(removeFilter); | 233 subscription.filters.forEach(removeFilter); |
274 flushElemHide(); | |
275 } | 234 } |
276 } | 235 } |
277 | 236 |
278 function onSubscriptionUpdated(subscription) | 237 function onSubscriptionUpdated(subscription) |
279 { | 238 { |
280 FilterListener.setDirty(1); | 239 FilterListener.setDirty(1); |
281 | 240 |
282 if (subscription.url in FilterStorage.knownSubscriptions && | 241 if (subscription.url in FilterStorage.knownSubscriptions && |
283 !subscription.disabled) | 242 !subscription.disabled) |
284 { | 243 { |
285 subscription.oldFilters.forEach(removeFilter); | 244 subscription.oldFilters.forEach(removeFilter); |
286 addFilters(subscription.filters); | 245 addFilters(subscription.filters); |
287 flushElemHide(); | |
288 } | 246 } |
289 } | 247 } |
290 | 248 |
291 function onFilterHitCount(filter, newValue) | 249 function onFilterHitCount(filter, newValue) |
292 { | 250 { |
293 if (newValue == 0) | 251 if (newValue == 0) |
294 FilterListener.setDirty(0); | 252 FilterListener.setDirty(0); |
295 else | 253 else |
296 FilterListener.setDirty(0.002); | 254 FilterListener.setDirty(0.002); |
297 } | 255 } |
298 | 256 |
299 function onFilterLastHit() | 257 function onFilterLastHit() |
300 { | 258 { |
301 FilterListener.setDirty(0.002); | 259 FilterListener.setDirty(0.002); |
302 } | 260 } |
303 | 261 |
304 function onFilterAdded(filter) | 262 function onFilterAdded(filter) |
305 { | 263 { |
306 FilterListener.setDirty(1); | 264 FilterListener.setDirty(1); |
307 | 265 |
308 if (!filter.disabled) | 266 if (!filter.disabled) |
309 { | |
310 addFilter(filter); | 267 addFilter(filter); |
311 flushElemHide(); | |
312 } | |
313 } | 268 } |
314 | 269 |
315 function onFilterRemoved(filter) | 270 function onFilterRemoved(filter) |
316 { | 271 { |
317 FilterListener.setDirty(1); | 272 FilterListener.setDirty(1); |
318 | 273 |
319 if (!filter.disabled) | 274 if (!filter.disabled) |
320 { | |
321 removeFilter(filter); | 275 removeFilter(filter); |
322 flushElemHide(); | |
323 } | |
324 } | 276 } |
325 | 277 |
326 function onFilterDisabled(filter, newValue) | 278 function onFilterDisabled(filter, newValue) |
327 { | 279 { |
328 FilterListener.setDirty(1); | 280 FilterListener.setDirty(1); |
329 | 281 |
330 if (newValue == false) | 282 if (newValue == false) |
331 addFilter(filter); | 283 addFilter(filter); |
332 else | 284 else |
333 removeFilter(filter); | 285 removeFilter(filter); |
334 flushElemHide(); | |
335 } | 286 } |
336 | 287 |
337 function onGenericChange() | 288 function onGenericChange() |
338 { | 289 { |
339 FilterListener.setDirty(1); | 290 FilterListener.setDirty(1); |
340 } | 291 } |
341 | 292 |
342 function onLoad() | 293 function onLoad() |
343 { | 294 { |
344 isDirty = 0; | 295 isDirty = 0; |
345 | 296 |
346 defaultMatcher.clear(); | 297 defaultMatcher.clear(); |
347 ElemHide.clear(); | 298 ElemHide.clear(); |
348 CSSRules.clear(); | 299 CSSRules.clear(); |
349 for (let subscription of FilterStorage.subscriptions) | 300 for (let subscription of FilterStorage.subscriptions) |
350 if (!subscription.disabled) | 301 if (!subscription.disabled) |
351 addFilters(subscription.filters); | 302 addFilters(subscription.filters); |
352 flushElemHide(); | |
353 } | 303 } |
354 | 304 |
355 function onSave() | 305 function onSave() |
356 { | 306 { |
357 isDirty = 0; | 307 isDirty = 0; |
358 } | 308 } |
OLD | NEW |