Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: lib/filterListener.js

Issue 29935568: Issue 7096 - Make it possible to lazy initialize a filter's subscriptions (Closed) Base URL: https://hg.adblockplus.org/adblockpluscore/
Left Patch Set: Fix typo Created Nov. 15, 2018, 10:58 p.m.
Right Patch Set: Use new methods in two more places Created Nov. 18, 2018, 4:57 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « lib/filterClasses.js ('k') | lib/filterStorage.js » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
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 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 /** 133 /**
134 * Notifies Matcher instances or ElemHide object about a new filter 134 * Notifies Matcher instances or ElemHide object about a new filter
135 * if necessary. 135 * if necessary.
136 * @param {Filter} filter filter that has been added 136 * @param {Filter} filter filter that has been added
137 */ 137 */
138 function addFilter(filter) 138 function addFilter(filter)
139 { 139 {
140 if (!(filter instanceof ActiveFilter) || filter.disabled) 140 if (!(filter instanceof ActiveFilter) || filter.disabled)
141 return; 141 return;
142 142
143 if (!filter.subscriptionsAdded)
144 filterStorage.addSubscriptionsToFilter(filter);
145
146 let hasEnabled = false; 143 let hasEnabled = false;
147 let allowSnippets = false; 144 let allowSnippets = false;
148 for (let subscription of filter.subscriptions()) 145 for (let subscription of filterStorage.subscriptionsForFilter(filter))
149 { 146 {
150 if (!subscription.disabled) 147 if (!subscription.disabled)
151 { 148 {
152 hasEnabled = true; 149 hasEnabled = true;
153 150
154 // Allow snippets to be executed only by the circumvention lists or the 151 // Allow snippets to be executed only by the circumvention lists or the
155 // user's own filters. 152 // user's own filters.
156 if (subscription.type == "circumvention" || 153 if (subscription.type == "circumvention" ||
157 subscription.url == "https://easylist-downloads.adblockplus.org/abp-fi lters-anti-cv.txt" || 154 subscription.url == "https://easylist-downloads.adblockplus.org/abp-fi lters-anti-cv.txt" ||
158 subscription instanceof SpecialSubscription) 155 subscription instanceof SpecialSubscription)
(...skipping 26 matching lines...) Expand all
185 * if necessary. 182 * if necessary.
186 * @param {Filter} filter filter that has been removed 183 * @param {Filter} filter filter that has been removed
187 */ 184 */
188 function removeFilter(filter) 185 function removeFilter(filter)
189 { 186 {
190 if (!(filter instanceof ActiveFilter)) 187 if (!(filter instanceof ActiveFilter))
191 return; 188 return;
192 189
193 if (!filter.disabled) 190 if (!filter.disabled)
194 { 191 {
195 if (!filter.subscriptionsAdded)
196 filterStorage.addSubscriptionsToFilter(filter);
197
198 let hasEnabled = false; 192 let hasEnabled = false;
199 for (let subscription of filter.subscriptions()) 193 for (let subscription of filterStorage.subscriptionsForFilter(filter))
200 { 194 {
201 if (!subscription.disabled) 195 if (!subscription.disabled)
202 { 196 {
203 hasEnabled = true; 197 hasEnabled = true;
204 break; 198 break;
205 } 199 }
206 } 200 }
207 if (hasEnabled) 201 if (hasEnabled)
208 return; 202 return;
209 } 203 }
210 204
211 if (filter instanceof RegExpFilter) 205 if (filter instanceof RegExpFilter)
212 defaultMatcher.remove(filter); 206 defaultMatcher.remove(filter);
213 else if (filter instanceof ElemHideBase) 207 else if (filter instanceof ElemHideBase)
214 { 208 {
215 if (filter instanceof ElemHideFilter) 209 if (filter instanceof ElemHideFilter)
216 ElemHide.remove(filter); 210 ElemHide.remove(filter);
217 else if (filter instanceof ElemHideEmulationFilter) 211 else if (filter instanceof ElemHideEmulationFilter)
218 ElemHideEmulation.remove(filter); 212 ElemHideEmulation.remove(filter);
219 else 213 else
220 ElemHideExceptions.remove(filter); 214 ElemHideExceptions.remove(filter);
221 } 215 }
222 else if (filter instanceof SnippetFilter) 216 else if (filter instanceof SnippetFilter)
223 Snippets.remove(filter); 217 Snippets.remove(filter);
224 } 218 }
225 219
226 const primes = [101, 109, 131, 149, 163, 179, 193, 211, 229, 241]; 220 const primes = [101, 109, 131, 149, 163, 179, 193, 211, 229, 241];
227 221
228 function addFilters(filters) 222 function addSubscriptionFilters(subscription)
229 { 223 {
230 // We add filters using pseudo-random ordering. Reason is that ElemHide will 224 // We add filters using pseudo-random ordering. Reason is that ElemHide will
231 // assign consecutive filter IDs that might be visible to the website. The 225 // assign consecutive filter IDs that might be visible to the website. The
232 // randomization makes sure that no conclusion can be made about the actual 226 // randomization makes sure that no conclusion can be made about the actual
233 // filters applying there. We have ten prime numbers to use as iteration step, 227 // filters applying there. We have ten prime numbers to use as iteration step,
234 // any of those can be chosen as long as the array length isn't divisible by 228 // any of those can be chosen as long as the array length isn't divisible by
235 // it. 229 // it.
236 let len = filters.length; 230 let len = subscription.filterCount;
237 if (!len) 231 if (!len)
238 return; 232 return;
239 233
240 let current = (Math.random() * len) | 0; 234 let current = (Math.random() * len) | 0;
241 let step; 235 let step;
242 do 236 do
243 { 237 {
244 step = primes[(Math.random() * primes.length) | 0]; 238 step = primes[(Math.random() * primes.length) | 0];
245 } while (len % step == 0); 239 } while (len % step == 0);
246 240
247 for (let i = 0; i < len; i++, current = (current + step) % len) 241 for (let i = 0; i < len; i++, current = (current + step) % len)
248 addFilter(filters[current]); 242 addFilter(subscription.filterAt(current));
249 } 243 }
250 244
251 function onSubscriptionAdded(subscription) 245 function onSubscriptionAdded(subscription)
252 { 246 {
253 FilterListener.setDirty(1); 247 FilterListener.setDirty(1);
254 248
255 if (!subscription.disabled) 249 if (!subscription.disabled)
256 addFilters(subscription.filters); 250 addSubscriptionFilters(subscription);
257 } 251 }
258 252
259 function onSubscriptionRemoved(subscription) 253 function onSubscriptionRemoved(subscription)
260 { 254 {
261 FilterListener.setDirty(1); 255 FilterListener.setDirty(1);
262 256
263 if (!subscription.disabled) 257 if (!subscription.disabled)
264 subscription.filters.forEach(removeFilter); 258 {
259 for (let filter of subscription.filters())
260 removeFilter(filter);
261 }
265 } 262 }
266 263
267 function onSubscriptionDisabled(subscription, newValue) 264 function onSubscriptionDisabled(subscription, newValue)
268 { 265 {
269 FilterListener.setDirty(1); 266 FilterListener.setDirty(1);
270 267
271 if (filterStorage.knownSubscriptions.has(subscription.url)) 268 if (filterStorage.knownSubscriptions.has(subscription.url))
272 { 269 {
273 if (newValue == false) 270 if (newValue == false)
274 addFilters(subscription.filters); 271 {
272 addSubscriptionFilters(subscription);
273 }
275 else 274 else
276 subscription.filters.forEach(removeFilter); 275 {
276 for (let filter of subscription.filters())
277 removeFilter(filter);
278 }
277 } 279 }
278 } 280 }
279 281
280 function onSubscriptionUpdated(subscription, oldFilters) 282 function onSubscriptionUpdated(subscription, oldFilters)
281 { 283 {
282 FilterListener.setDirty(1); 284 FilterListener.setDirty(1);
283 285
284 if (!subscription.disabled && 286 if (!subscription.disabled &&
285 filterStorage.knownSubscriptions.has(subscription.url)) 287 filterStorage.knownSubscriptions.has(subscription.url))
286 { 288 {
287 oldFilters.forEach(removeFilter); 289 for (let filter of oldFilters)
288 addFilters(subscription.filters); 290 removeFilter(filter);
291
292 addSubscriptionFilters(subscription);
289 } 293 }
290 } 294 }
291 295
292 function onFilterHitCount(filter, newValue) 296 function onFilterHitCount(filter, newValue)
293 { 297 {
294 if (newValue == 0) 298 if (newValue == 0)
295 FilterListener.setDirty(0); 299 FilterListener.setDirty(0);
296 else 300 else
297 FilterListener.setDirty(0.002); 301 FilterListener.setDirty(0.002);
298 } 302 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 339
336 function onLoad() 340 function onLoad()
337 { 341 {
338 isDirty = 0; 342 isDirty = 0;
339 343
340 defaultMatcher.clear(); 344 defaultMatcher.clear();
341 ElemHide.clear(); 345 ElemHide.clear();
342 ElemHideEmulation.clear(); 346 ElemHideEmulation.clear();
343 ElemHideExceptions.clear(); 347 ElemHideExceptions.clear();
344 Snippets.clear(); 348 Snippets.clear();
349
345 for (let subscription of filterStorage.subscriptions()) 350 for (let subscription of filterStorage.subscriptions())
346 { 351 {
347 if (!subscription.disabled) 352 if (!subscription.disabled)
348 addFilters(subscription.filters); 353 addSubscriptionFilters(subscription);
349 } 354 }
350 } 355 }
351 356
352 function onSave() 357 function onSave()
353 { 358 {
354 isDirty = 0; 359 isDirty = 0;
355 } 360 }
LEFTRIGHT

Powered by Google App Engine
This is Rietveld