LEFT | RIGHT |
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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 if (parts.length == 2 && parts[0] in data) | 64 if (parts.length == 2 && parts[0] in data) |
65 data[parts[0]] = decodeURIComponent(parts[1]); | 65 data[parts[0]] = decodeURIComponent(parts[1]); |
66 } | 66 } |
67 } | 67 } |
68 } | 68 } |
69 | 69 |
70 let params = { | 70 let params = { |
71 blockedURLs: "", | 71 blockedURLs: "", |
72 filterlistsReinitialized: false, | 72 filterlistsReinitialized: false, |
73 addSubscription: false, | 73 addSubscription: false, |
74 filterError: false, | |
75 downloadStatus: "synchronize_ok", | 74 downloadStatus: "synchronize_ok", |
76 showNotificationUI: false, | 75 showNotificationUI: false, |
77 showPageOptions: false | 76 showPageOptions: false |
78 }; | 77 }; |
79 updateFromURL(params); | 78 updateFromURL(params); |
80 | 79 |
81 let modules = {}; | 80 let modules = {}; |
82 window.require = function(module) | 81 window.require = function(module) |
83 { | 82 { |
84 return modules[module]; | 83 return modules[module]; |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 } | 305 } |
307 } | 306 } |
308 } | 307 } |
309 } | 308 } |
310 }; | 309 }; |
311 | 310 |
312 function Filter(text) | 311 function Filter(text) |
313 { | 312 { |
314 this.text = text; | 313 this.text = text; |
315 this.disabled = false; | 314 this.disabled = false; |
316 } | 315 if (Filter.elemhideRegExp.test(text)) |
| 316 this.selector = RegExp.$3; |
| 317 } |
| 318 Filter.elemhideRegExp = /^([^/*|@"!]*?)#([@?])?#(.+)$/; |
317 Filter.fromText = (text) => new Filter(text); | 319 Filter.fromText = (text) => new Filter(text); |
318 | 320 |
319 function BlockingFilter() | 321 function BlockingFilter() |
320 { | 322 { |
321 } | 323 } |
322 | 324 |
323 function RegExpFilter() | 325 function RegExpFilter() |
324 { | 326 { |
325 } | 327 } |
326 RegExpFilter.typeMap = Object.create(null); | 328 RegExpFilter.typeMap = Object.create(null); |
327 | 329 |
328 modules.filterClasses = { | 330 modules.filterClasses = { |
329 BlockingFilter, | 331 BlockingFilter, |
330 Filter, | 332 Filter, |
331 RegExpFilter | 333 RegExpFilter |
332 }; | 334 }; |
333 | 335 |
| 336 const isValidCSSSelector = selector => |
| 337 { |
| 338 if (!selector) |
| 339 return true; |
| 340 try |
| 341 { |
| 342 document.documentElement.matches(selector); |
| 343 return true; |
| 344 } |
| 345 catch (error) |
| 346 { |
| 347 return false; |
| 348 } |
| 349 }; |
| 350 |
334 modules.filterValidation = | 351 modules.filterValidation = |
335 { | 352 { |
| 353 // to test failing filters |
| 354 // use one or more bad CSS selectors |
| 355 // or start the line with a [ |
336 parseFilter(text) | 356 parseFilter(text) |
337 { | 357 { |
338 if (params.filterError) | 358 let filter = null; |
339 return {error: "Invalid filter"}; | 359 if (text) |
340 return {filter: modules.filterClasses.Filter.fromText(text)}; | 360 { |
| 361 if (text[0] == "[") |
| 362 return {error: {reason: "Unexpected filter list header"}}; |
| 363 |
| 364 filter = modules.filterClasses.Filter.fromText(text); |
| 365 |
| 366 if (!isValidCSSSelector(filter.selector)) |
| 367 { |
| 368 return {error: {reason: "Invalid CSS selector"}}; |
| 369 } |
| 370 } |
| 371 |
| 372 return {filter}; |
341 }, | 373 }, |
342 parseFilters(text) | 374 parseFilters(text) |
343 { | 375 { |
344 if (params.filterError) | 376 let lines = text.split("\n"); |
345 return {errors: [{reason: "Invalid filter", lineno: 1}]}; | 377 let filters = []; |
346 return { | 378 let errors = []; |
347 filters: text.split("\n") | 379 |
348 .filter((filter) => !!filter) | 380 for (let i = 0; i < lines.length; i++) |
349 .map(modules.filterClasses.Filter.fromText), | 381 { |
350 errors: [] | 382 let {filter, error} = this.parseFilter(lines[i]); |
351 }; | 383 |
| 384 if (filter) |
| 385 filters.push(filter); |
| 386 |
| 387 if (error) |
| 388 { |
| 389 error.lineno = i + 1; |
| 390 errors.push(error); |
| 391 } |
| 392 } |
| 393 |
| 394 return {filters, errors}; |
352 } | 395 } |
353 }; | 396 }; |
354 | 397 |
355 modules.synchronizer = { | 398 modules.synchronizer = { |
356 Synchronizer: { | 399 Synchronizer: { |
357 _downloading: false, | 400 _downloading: false, |
358 execute(subscription, manual) | 401 execute(subscription, manual) |
359 { | 402 { |
360 modules.synchronizer.Synchronizer._downloading = true; | 403 modules.synchronizer.Synchronizer._downloading = true; |
361 modules.filterNotifier.FilterNotifier.emit( | 404 modules.filterNotifier.FilterNotifier.emit( |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 }, | 655 }, |
613 filter: { | 656 filter: { |
614 text: "||example.com/some-annoying-popup$popup", | 657 text: "||example.com/some-annoying-popup$popup", |
615 whitelisted: false, | 658 whitelisted: false, |
616 userDefined: true, | 659 userDefined: true, |
617 subscription: null | 660 subscription: null |
618 } | 661 } |
619 }); | 662 }); |
620 }); | 663 }); |
621 }()); | 664 }()); |
LEFT | RIGHT |