@browserless.io/browserless 2.16.0-beta-1 → 2.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/bin/browserless.js +6 -4
  3. package/bin/scaffold/src/hello-world.http.ts +1 -1
  4. package/build/logger.js +1 -1
  5. package/build/routes/chrome/http/content.post.body.json +38 -8
  6. package/build/routes/chrome/http/pdf.post.body.json +43 -9
  7. package/build/routes/chrome/http/scrape.post.body.json +38 -8
  8. package/build/routes/chrome/http/screenshot.post.body.json +38 -8
  9. package/build/routes/chromium/http/content.post.body.json +38 -8
  10. package/build/routes/chromium/http/pdf.post.body.json +43 -9
  11. package/build/routes/chromium/http/scrape.post.body.json +38 -8
  12. package/build/routes/chromium/http/screenshot.post.body.json +38 -8
  13. package/extensions/ublock/_locales/be/messages.json +1 -1
  14. package/extensions/ublock/_locales/br_FR/messages.json +2 -2
  15. package/extensions/ublock/_locales/bs/messages.json +5 -5
  16. package/extensions/ublock/_locales/eu/messages.json +1 -1
  17. package/extensions/ublock/_locales/it/messages.json +21 -21
  18. package/extensions/ublock/_locales/kn/messages.json +13 -13
  19. package/extensions/ublock/_locales/lt/messages.json +1 -1
  20. package/extensions/ublock/_locales/ms/messages.json +9 -9
  21. package/extensions/ublock/_locales/nb/messages.json +2 -2
  22. package/extensions/ublock/_locales/no/messages.json +2 -2
  23. package/extensions/ublock/_locales/sv/messages.json +2 -2
  24. package/extensions/ublock/_locales/tr/messages.json +4 -4
  25. package/extensions/ublock/_locales/zh_TW/messages.json +17 -17
  26. package/extensions/ublock/assets/assets.json +4 -3
  27. package/extensions/ublock/assets/resources/scriptlets.js +208 -57
  28. package/extensions/ublock/assets/thirdparties/easylist/easylist.txt +3584 -4032
  29. package/extensions/ublock/assets/thirdparties/easylist/easyprivacy.txt +3732 -1683
  30. package/extensions/ublock/assets/thirdparties/pgl.yoyo.org/as/serverlist +27 -205
  31. package/extensions/ublock/assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat +465 -434
  32. package/extensions/ublock/assets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt +3232 -1382
  33. package/extensions/ublock/assets/ublock/badware.min.txt +867 -408
  34. package/extensions/ublock/assets/ublock/filters.min.txt +1382 -937
  35. package/extensions/ublock/assets/ublock/privacy.min.txt +43 -56
  36. package/extensions/ublock/assets/ublock/quick-fixes.min.txt +127 -71
  37. package/extensions/ublock/assets/ublock/unbreak.min.txt +145 -27
  38. package/extensions/ublock/js/contentscript-extra.js +25 -0
  39. package/extensions/ublock/js/contentscript.js +3 -1
  40. package/extensions/ublock/js/cosmetic-filtering.js +8 -7
  41. package/extensions/ublock/js/dom.js +8 -4
  42. package/extensions/ublock/js/epicker-ui.js +1 -1
  43. package/extensions/ublock/js/s14e-serializer.js +2 -1
  44. package/extensions/ublock/js/static-filtering-parser.js +255 -254
  45. package/extensions/ublock/js/storage.js +7 -6
  46. package/extensions/ublock/js/traffic.js +33 -34
  47. package/extensions/ublock/manifest.json +1 -1
  48. package/extensions/ublock/popup-fenix.html +1 -1
  49. package/package.json +16 -16
  50. package/src/logger.ts +1 -1
  51. package/static/debugger/index.html +1 -1
  52. package/static/debugger/router.js +1 -0
  53. package/static/debugger/tracker.js +1 -1
  54. package/static/docs/swagger.json +45 -11
  55. package/static/docs/swagger.min.json +44 -10
  56. package/static/function/client.js +4441 -16820
  57. package/static/function/index.html +4441 -16820
  58. package/static/debugger/router.bundle.js +0 -2
  59. package/static/debugger/router.bundle.js.map +0 -1
  60. package/static/debugger/router.d.ts +0 -2
@@ -19,12 +19,10 @@
19
19
  Home: https://github.com/gorhill/uBlock
20
20
  */
21
21
 
22
- 'use strict';
23
-
24
22
  /******************************************************************************/
25
23
 
26
- import Regex from '../lib/regexanalyzer/regex.js';
27
24
  import * as cssTree from '../lib/csstree/css-tree.js';
25
+ import Regex from '../lib/regexanalyzer/regex.js';
28
26
 
29
27
  /*******************************************************************************
30
28
  *
@@ -781,21 +779,21 @@ class DomainListIterator {
781
779
  let ready = false;
782
780
  while ( node !== 0 ) {
783
781
  switch ( this.parser.getNodeType(node) ) {
784
- case NODE_TYPE_OPTION_VALUE_DOMAIN_RAW:
785
- this.item.hn = '';
786
- this.item.not = false;
787
- this.item.bad = this.parser.getNodeFlags(node, NODE_FLAG_ERROR) !== 0;
788
- break;
789
- case NODE_TYPE_OPTION_VALUE_NOT:
790
- this.item.not = true;
791
- break;
792
- case NODE_TYPE_OPTION_VALUE_DOMAIN:
793
- this.item.hn = this.parser.getNodeTransform(node);
794
- this.value = this.item;
795
- ready = true;
796
- break;
797
- default:
798
- break;
782
+ case NODE_TYPE_OPTION_VALUE_DOMAIN_RAW:
783
+ this.item.hn = '';
784
+ this.item.not = false;
785
+ this.item.bad = this.parser.getNodeFlags(node, NODE_FLAG_ERROR) !== 0;
786
+ break;
787
+ case NODE_TYPE_OPTION_VALUE_NOT:
788
+ this.item.not = true;
789
+ break;
790
+ case NODE_TYPE_OPTION_VALUE_DOMAIN:
791
+ this.item.hn = this.parser.getNodeTransform(node);
792
+ this.value = this.item;
793
+ ready = true;
794
+ break;
795
+ default:
796
+ break;
799
797
  }
800
798
  node = this.walker.next();
801
799
  if ( ready ) { return this; }
@@ -859,17 +857,17 @@ export class AstFilterParser {
859
857
  this.reInlineComment = /(?:\s+#).*?$/;
860
858
  this.reNetException = /^@@/;
861
859
  this.reNetAnchor = /(?:)\$[^,\w~]/;
862
- this.reHnAnchoredPlainAscii = /^\|\|[0-9a-z%&,\-.\/:;=?_]+$/;
860
+ this.reHnAnchoredPlainAscii = /^\|\|[0-9a-z%&,\-./:;=?_]+$/;
863
861
  this.reHnAnchoredHostnameAscii = /^\|\|(?:[\da-z][\da-z_-]*\.)*[\da-z_-]*[\da-z]\^$/;
864
862
  this.reHnAnchoredHostnameUnicode = /^\|\|(?:[\p{L}\p{N}][\p{L}\p{N}\u{2d}]*\.)*[\p{L}\p{N}\u{2d}]*[\p{L}\p{N}]\^$/u;
865
863
  this.reHn3pAnchoredHostnameAscii = /^\|\|(?:[\da-z][\da-z_-]*\.)*[\da-z_-]*[\da-z]\^\$third-party$/;
866
- this.rePlainAscii = /^[0-9a-z%&\-.\/:;=?_]{2,}$/;
864
+ this.rePlainAscii = /^[0-9a-z%&\-./:;=?_]{2,}$/;
867
865
  this.reNetHosts1 = /^127\.0\.0\.1 (?:[\da-z][\da-z_-]*\.)+[\da-z-]*[a-z]$/;
868
866
  this.reNetHosts2 = /^0\.0\.0\.0 (?:[\da-z][\da-z_-]*\.)+[\da-z-]*[a-z]$/;
869
867
  this.rePlainGenericCosmetic = /^##[.#][A-Za-z_][\w-]*$/;
870
868
  this.reHostnameAscii = /^(?:[\da-z][\da-z_-]*\.)*[\da-z][\da-z-]*[\da-z]$/;
871
869
  this.rePlainEntity = /^(?:[\da-z][\da-z_-]*\.)+\*$/;
872
- this.reHostsSink = /^[\w%.:\[\]-]+\s+/;
870
+ this.reHostsSink = /^[\w%.:[\]-]+\s+/;
873
871
  this.reHostsRedirect = /(?:0\.0\.0\.0|broadcasthost|local|localhost(?:\.localdomain)?|ip6-\w+)(?:[^\w.-]|$)/;
874
872
  this.reNetOptionComma = /,(?:~?[13a-z-]+(?:=.*?)?|_+)(?:,|$)/;
875
873
  this.rePointlessLeftAnchor = /^\|\|?\*+/;
@@ -886,8 +884,8 @@ export class AstFilterParser {
886
884
  this.rePreparseDirectiveIf = /^!#if /;
887
885
  this.rePreparseDirectiveAny = /^!#(?:else|endif|if |include )/;
888
886
  this.reURL = /\bhttps?:\/\/\S+/;
889
- this.reHasPatternSpecialChars = /[\*\^]/;
890
- this.rePatternAllSpecialChars = /[\*\^]+|[^\x00-\x7f]+/g;
887
+ this.reHasPatternSpecialChars = /[*^]/;
888
+ this.rePatternAllSpecialChars = /[*^]+|[^\x00-\x7f]+/g;
891
889
  // https://github.com/uBlockOrigin/uBlock-issues/issues/1146
892
890
  // From https://codemirror.net/doc/manual.html#option_specialChars
893
891
  this.reHasInvalidChar = /[\x00-\x1F\x7F-\x9F\xAD\u061C\u200B-\u200F\u2028\u2029\uFEFF\uFFF9-\uFFFC]/;
@@ -1315,218 +1313,218 @@ export class AstFilterParser {
1315
1313
  const hasValue = (flags & NODE_FLAG_OPTION_HAS_VALUE) !== 0;
1316
1314
  bad = false; realBad = false;
1317
1315
  switch ( type ) {
1318
- case NODE_TYPE_NET_OPTION_NAME_ALL:
1319
- realBad = isNegated || hasValue || modifierType !== 0;
1320
- break;
1321
- case NODE_TYPE_NET_OPTION_NAME_1P:
1322
- case NODE_TYPE_NET_OPTION_NAME_3P:
1323
- realBad = hasValue;
1324
- break;
1325
- case NODE_TYPE_NET_OPTION_NAME_BADFILTER:
1326
- badfilter = true;
1327
- /* falls through */
1328
- case NODE_TYPE_NET_OPTION_NAME_NOOP:
1329
- realBad = isNegated || hasValue;
1330
- break;
1331
- case NODE_TYPE_NET_OPTION_NAME_CSS:
1332
- case NODE_TYPE_NET_OPTION_NAME_FONT:
1333
- case NODE_TYPE_NET_OPTION_NAME_IMAGE:
1334
- case NODE_TYPE_NET_OPTION_NAME_MEDIA:
1335
- case NODE_TYPE_NET_OPTION_NAME_OBJECT:
1336
- case NODE_TYPE_NET_OPTION_NAME_OTHER:
1337
- case NODE_TYPE_NET_OPTION_NAME_SCRIPT:
1338
- case NODE_TYPE_NET_OPTION_NAME_XHR:
1339
- realBad = hasValue;
1340
- if ( realBad ) { break; }
1341
- requestTypeCount += 1;
1342
- break;
1343
- case NODE_TYPE_NET_OPTION_NAME_CNAME:
1344
- realBad = isException === false || isNegated || hasValue;
1345
- if ( realBad ) { break; }
1346
- modifierType = type;
1347
- break;
1348
- case NODE_TYPE_NET_OPTION_NAME_CSP:
1349
- realBad = (hasValue || isException) === false ||
1350
- modifierType !== 0 ||
1351
- this.reBadCSP.test(
1352
- this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_CSP)
1353
- );
1354
- if ( realBad ) { break; }
1355
- modifierType = type;
1356
- break;
1357
- case NODE_TYPE_NET_OPTION_NAME_DENYALLOW:
1358
- realBad = isNegated || hasValue === false ||
1359
- this.getBranchFromType(NODE_TYPE_NET_OPTION_NAME_FROM) === 0;
1360
- break;
1361
- case NODE_TYPE_NET_OPTION_NAME_DOC:
1362
- case NODE_TYPE_NET_OPTION_NAME_FRAME:
1363
- realBad = hasValue;
1364
- if ( realBad ) { break; }
1365
- docTypeCount += 1;
1366
- break;
1367
- case NODE_TYPE_NET_OPTION_NAME_EHIDE:
1368
- case NODE_TYPE_NET_OPTION_NAME_GHIDE:
1369
- case NODE_TYPE_NET_OPTION_NAME_SHIDE:
1370
- realBad = isNegated || hasValue || modifierType !== 0;
1371
- if ( realBad ) { break; }
1372
- behaviorTypeCount += 1;
1373
- unredirectableTypeCount += 1;
1374
- break;
1375
- case NODE_TYPE_NET_OPTION_NAME_EMPTY:
1376
- case NODE_TYPE_NET_OPTION_NAME_MP4:
1377
- realBad = isNegated || hasValue || modifierType !== 0;
1378
- if ( realBad ) { break; }
1379
- modifierType = type;
1380
- break;
1381
- case NODE_TYPE_NET_OPTION_NAME_FROM:
1382
- case NODE_TYPE_NET_OPTION_NAME_METHOD:
1383
- case NODE_TYPE_NET_OPTION_NAME_TO:
1384
- realBad = isNegated || hasValue === false;
1385
- break;
1386
- case NODE_TYPE_NET_OPTION_NAME_GENERICBLOCK:
1387
- bad = true;
1388
- realBad = isException === false || isNegated || hasValue;
1389
- break;
1390
- case NODE_TYPE_NET_OPTION_NAME_HEADER:
1391
- realBad = isNegated || hasValue === false;
1392
- break;
1393
- case NODE_TYPE_NET_OPTION_NAME_IMPORTANT:
1394
- realBad = isException || isNegated || hasValue;
1395
- break;
1396
- case NODE_TYPE_NET_OPTION_NAME_INLINEFONT:
1397
- case NODE_TYPE_NET_OPTION_NAME_INLINESCRIPT:
1398
- realBad = hasValue;
1399
- if ( realBad ) { break; }
1400
- modifierType = type;
1401
- unredirectableTypeCount += 1;
1402
- break;
1403
- case NODE_TYPE_NET_OPTION_NAME_MATCHCASE:
1404
- realBad = this.isRegexPattern() === false;
1405
- break;
1406
- case NODE_TYPE_NET_OPTION_NAME_PERMISSIONS:
1407
- realBad = modifierType !== 0 ||
1408
- (hasValue || isException) === false ||
1409
- this.reBadPP.test(
1410
- this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_PERMISSIONS)
1411
- );
1412
- if ( realBad ) { break; }
1413
- modifierType = type;
1414
- break;
1415
- case NODE_TYPE_NET_OPTION_NAME_PING:
1416
- case NODE_TYPE_NET_OPTION_NAME_WEBSOCKET:
1417
- realBad = hasValue;
1418
- if ( realBad ) { break; }
1419
- requestTypeCount += 1;
1420
- unredirectableTypeCount += 1;
1421
- break;
1422
- case NODE_TYPE_NET_OPTION_NAME_POPUNDER:
1423
- case NODE_TYPE_NET_OPTION_NAME_POPUP:
1424
- realBad = hasValue;
1425
- if ( realBad ) { break; }
1426
- abstractTypeCount += 1;
1427
- unredirectableTypeCount += 1;
1428
- break;
1429
- case NODE_TYPE_NET_OPTION_NAME_REDIRECT:
1430
- case NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE:
1431
- case NODE_TYPE_NET_OPTION_NAME_REPLACE:
1432
- case NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM:
1433
- realBad = isNegated || (isException || hasValue) === false ||
1434
- modifierType !== 0;
1435
- if ( realBad ) { break; }
1436
- modifierType = type;
1437
- break;
1438
- case NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM:
1439
- realBad = isNegated || modifierType !== 0;
1440
- if ( realBad ) { break; }
1441
- modifierType = type;
1442
- break;
1443
- case NODE_TYPE_NET_OPTION_NAME_STRICT1P:
1444
- case NODE_TYPE_NET_OPTION_NAME_STRICT3P:
1445
- realBad = isNegated || hasValue;
1446
- break;
1447
- case NODE_TYPE_NET_OPTION_NAME_UNKNOWN:
1448
- this.astError = AST_ERROR_OPTION_UNKNOWN;
1449
- realBad = true;
1450
- break;
1451
- case NODE_TYPE_NET_OPTION_NAME_WEBRTC:
1452
- realBad = true;
1453
- break;
1454
- case NODE_TYPE_NET_PATTERN_RAW:
1455
- realBad = this.hasOptions() === false &&
1456
- this.getNetPattern().length <= 1;
1457
- break;
1458
- default:
1459
- break;
1460
- }
1461
- if ( bad || realBad ) {
1462
- this.addNodeFlags(targetNode, NODE_FLAG_ERROR);
1463
- }
1464
- if ( realBad ) {
1465
- this.addFlags(AST_FLAG_HAS_ERROR);
1466
- }
1467
- }
1468
- const requiresTrustedSource = ( ) =>
1469
- this.options.trustedSource !== true &&
1470
- isException === false && badfilter === false;
1471
- switch ( modifierType ) {
1316
+ case NODE_TYPE_NET_OPTION_NAME_ALL:
1317
+ realBad = isNegated || hasValue || modifierType !== 0;
1318
+ break;
1319
+ case NODE_TYPE_NET_OPTION_NAME_1P:
1320
+ case NODE_TYPE_NET_OPTION_NAME_3P:
1321
+ realBad = hasValue;
1322
+ break;
1323
+ case NODE_TYPE_NET_OPTION_NAME_BADFILTER:
1324
+ badfilter = true;
1325
+ /* falls through */
1326
+ case NODE_TYPE_NET_OPTION_NAME_NOOP:
1327
+ realBad = isNegated || hasValue;
1328
+ break;
1329
+ case NODE_TYPE_NET_OPTION_NAME_CSS:
1330
+ case NODE_TYPE_NET_OPTION_NAME_FONT:
1331
+ case NODE_TYPE_NET_OPTION_NAME_IMAGE:
1332
+ case NODE_TYPE_NET_OPTION_NAME_MEDIA:
1333
+ case NODE_TYPE_NET_OPTION_NAME_OBJECT:
1334
+ case NODE_TYPE_NET_OPTION_NAME_OTHER:
1335
+ case NODE_TYPE_NET_OPTION_NAME_SCRIPT:
1336
+ case NODE_TYPE_NET_OPTION_NAME_XHR:
1337
+ realBad = hasValue;
1338
+ if ( realBad ) { break; }
1339
+ requestTypeCount += 1;
1340
+ break;
1472
1341
  case NODE_TYPE_NET_OPTION_NAME_CNAME:
1473
- realBad = abstractTypeCount || behaviorTypeCount || requestTypeCount;
1342
+ realBad = isException === false || isNegated || hasValue;
1343
+ if ( realBad ) { break; }
1344
+ modifierType = type;
1474
1345
  break;
1475
1346
  case NODE_TYPE_NET_OPTION_NAME_CSP:
1476
- case NODE_TYPE_NET_OPTION_NAME_PERMISSIONS:
1477
- realBad = abstractTypeCount || behaviorTypeCount || requestTypeCount;
1347
+ realBad = (hasValue || isException) === false ||
1348
+ modifierType !== 0 ||
1349
+ this.reBadCSP.test(
1350
+ this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_CSP)
1351
+ );
1352
+ if ( realBad ) { break; }
1353
+ modifierType = type;
1354
+ break;
1355
+ case NODE_TYPE_NET_OPTION_NAME_DENYALLOW:
1356
+ realBad = isNegated || hasValue === false ||
1357
+ this.getBranchFromType(NODE_TYPE_NET_OPTION_NAME_FROM) === 0;
1358
+ break;
1359
+ case NODE_TYPE_NET_OPTION_NAME_DOC:
1360
+ case NODE_TYPE_NET_OPTION_NAME_FRAME:
1361
+ realBad = hasValue;
1362
+ if ( realBad ) { break; }
1363
+ docTypeCount += 1;
1364
+ break;
1365
+ case NODE_TYPE_NET_OPTION_NAME_EHIDE:
1366
+ case NODE_TYPE_NET_OPTION_NAME_GHIDE:
1367
+ case NODE_TYPE_NET_OPTION_NAME_SHIDE:
1368
+ realBad = isNegated || hasValue || modifierType !== 0;
1369
+ if ( realBad ) { break; }
1370
+ behaviorTypeCount += 1;
1371
+ unredirectableTypeCount += 1;
1372
+ break;
1373
+ case NODE_TYPE_NET_OPTION_NAME_EMPTY:
1374
+ case NODE_TYPE_NET_OPTION_NAME_MP4:
1375
+ realBad = isNegated || hasValue || modifierType !== 0;
1376
+ if ( realBad ) { break; }
1377
+ modifierType = type;
1378
+ break;
1379
+ case NODE_TYPE_NET_OPTION_NAME_FROM:
1380
+ case NODE_TYPE_NET_OPTION_NAME_METHOD:
1381
+ case NODE_TYPE_NET_OPTION_NAME_TO:
1382
+ realBad = isNegated || hasValue === false;
1383
+ break;
1384
+ case NODE_TYPE_NET_OPTION_NAME_GENERICBLOCK:
1385
+ bad = true;
1386
+ realBad = isException === false || isNegated || hasValue;
1387
+ break;
1388
+ case NODE_TYPE_NET_OPTION_NAME_HEADER:
1389
+ realBad = isNegated || hasValue === false;
1390
+ break;
1391
+ case NODE_TYPE_NET_OPTION_NAME_IMPORTANT:
1392
+ realBad = isException || isNegated || hasValue;
1478
1393
  break;
1479
1394
  case NODE_TYPE_NET_OPTION_NAME_INLINEFONT:
1480
1395
  case NODE_TYPE_NET_OPTION_NAME_INLINESCRIPT:
1481
- realBad = behaviorTypeCount;
1396
+ realBad = hasValue;
1397
+ if ( realBad ) { break; }
1398
+ modifierType = type;
1399
+ unredirectableTypeCount += 1;
1482
1400
  break;
1483
- case NODE_TYPE_NET_OPTION_NAME_EMPTY:
1484
- realBad = abstractTypeCount || behaviorTypeCount;
1401
+ case NODE_TYPE_NET_OPTION_NAME_MATCHCASE:
1402
+ realBad = this.isRegexPattern() === false;
1485
1403
  break;
1486
- case NODE_TYPE_NET_OPTION_NAME_MEDIA:
1487
- case NODE_TYPE_NET_OPTION_NAME_MP4:
1488
- realBad = abstractTypeCount || behaviorTypeCount || docTypeCount || requestTypeCount;
1404
+ case NODE_TYPE_NET_OPTION_NAME_PERMISSIONS:
1405
+ realBad = modifierType !== 0 ||
1406
+ (hasValue || isException) === false ||
1407
+ this.reBadPP.test(
1408
+ this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_PERMISSIONS)
1409
+ );
1410
+ if ( realBad ) { break; }
1411
+ modifierType = type;
1489
1412
  break;
1490
- case NODE_TYPE_NET_OPTION_NAME_REDIRECT:
1491
- case NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE: {
1492
- realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount;
1413
+ case NODE_TYPE_NET_OPTION_NAME_PING:
1414
+ case NODE_TYPE_NET_OPTION_NAME_WEBSOCKET:
1415
+ realBad = hasValue;
1416
+ if ( realBad ) { break; }
1417
+ requestTypeCount += 1;
1418
+ unredirectableTypeCount += 1;
1493
1419
  break;
1494
- }
1495
- case NODE_TYPE_NET_OPTION_NAME_REPLACE: {
1496
- realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount;
1420
+ case NODE_TYPE_NET_OPTION_NAME_POPUNDER:
1421
+ case NODE_TYPE_NET_OPTION_NAME_POPUP:
1422
+ realBad = hasValue;
1497
1423
  if ( realBad ) { break; }
1498
- if ( requiresTrustedSource() ) {
1499
- this.astError = AST_ERROR_UNTRUSTED_SOURCE;
1500
- realBad = true;
1501
- break;
1502
- }
1503
- const value = this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_REPLACE);
1504
- if ( parseReplaceValue(value) === undefined ) {
1505
- this.astError = AST_ERROR_OPTION_BADVALUE;
1506
- realBad = true;
1507
- }
1424
+ abstractTypeCount += 1;
1425
+ unredirectableTypeCount += 1;
1508
1426
  break;
1509
- }
1510
- case NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM: {
1511
- realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount;
1427
+ case NODE_TYPE_NET_OPTION_NAME_REDIRECT:
1428
+ case NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE:
1429
+ case NODE_TYPE_NET_OPTION_NAME_REPLACE:
1430
+ case NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM:
1431
+ realBad = isNegated || (isException || hasValue) === false ||
1432
+ modifierType !== 0;
1512
1433
  if ( realBad ) { break; }
1513
- if ( requiresTrustedSource() ) {
1514
- this.astError = AST_ERROR_UNTRUSTED_SOURCE;
1515
- realBad = true;
1516
- break;
1517
- }
1518
- const value = this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM);
1519
- if ( value !== '' && parseReplaceValue(value) === undefined ) {
1520
- this.astError = AST_ERROR_OPTION_BADVALUE;
1521
- realBad = true;
1522
- }
1434
+ modifierType = type;
1523
1435
  break;
1524
- }
1525
1436
  case NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM:
1526
- realBad = abstractTypeCount || behaviorTypeCount;
1437
+ realBad = isNegated || modifierType !== 0;
1438
+ if ( realBad ) { break; }
1439
+ modifierType = type;
1440
+ break;
1441
+ case NODE_TYPE_NET_OPTION_NAME_STRICT1P:
1442
+ case NODE_TYPE_NET_OPTION_NAME_STRICT3P:
1443
+ realBad = isNegated || hasValue;
1444
+ break;
1445
+ case NODE_TYPE_NET_OPTION_NAME_UNKNOWN:
1446
+ this.astError = AST_ERROR_OPTION_UNKNOWN;
1447
+ realBad = true;
1448
+ break;
1449
+ case NODE_TYPE_NET_OPTION_NAME_WEBRTC:
1450
+ realBad = true;
1451
+ break;
1452
+ case NODE_TYPE_NET_PATTERN_RAW:
1453
+ realBad = this.hasOptions() === false &&
1454
+ this.getNetPattern().length <= 1;
1527
1455
  break;
1528
1456
  default:
1529
1457
  break;
1458
+ }
1459
+ if ( bad || realBad ) {
1460
+ this.addNodeFlags(targetNode, NODE_FLAG_ERROR);
1461
+ }
1462
+ if ( realBad ) {
1463
+ this.addFlags(AST_FLAG_HAS_ERROR);
1464
+ }
1465
+ }
1466
+ const requiresTrustedSource = ( ) =>
1467
+ this.options.trustedSource !== true &&
1468
+ isException === false && badfilter === false;
1469
+ switch ( modifierType ) {
1470
+ case NODE_TYPE_NET_OPTION_NAME_CNAME:
1471
+ realBad = abstractTypeCount || behaviorTypeCount || requestTypeCount;
1472
+ break;
1473
+ case NODE_TYPE_NET_OPTION_NAME_CSP:
1474
+ case NODE_TYPE_NET_OPTION_NAME_PERMISSIONS:
1475
+ realBad = abstractTypeCount || behaviorTypeCount || requestTypeCount;
1476
+ break;
1477
+ case NODE_TYPE_NET_OPTION_NAME_INLINEFONT:
1478
+ case NODE_TYPE_NET_OPTION_NAME_INLINESCRIPT:
1479
+ realBad = behaviorTypeCount;
1480
+ break;
1481
+ case NODE_TYPE_NET_OPTION_NAME_EMPTY:
1482
+ realBad = abstractTypeCount || behaviorTypeCount;
1483
+ break;
1484
+ case NODE_TYPE_NET_OPTION_NAME_MEDIA:
1485
+ case NODE_TYPE_NET_OPTION_NAME_MP4:
1486
+ realBad = abstractTypeCount || behaviorTypeCount || docTypeCount || requestTypeCount;
1487
+ break;
1488
+ case NODE_TYPE_NET_OPTION_NAME_REDIRECT:
1489
+ case NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE: {
1490
+ realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount;
1491
+ break;
1492
+ }
1493
+ case NODE_TYPE_NET_OPTION_NAME_REPLACE: {
1494
+ realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount;
1495
+ if ( realBad ) { break; }
1496
+ if ( requiresTrustedSource() ) {
1497
+ this.astError = AST_ERROR_UNTRUSTED_SOURCE;
1498
+ realBad = true;
1499
+ break;
1500
+ }
1501
+ const value = this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_REPLACE);
1502
+ if ( parseReplaceValue(value) === undefined ) {
1503
+ this.astError = AST_ERROR_OPTION_BADVALUE;
1504
+ realBad = true;
1505
+ }
1506
+ break;
1507
+ }
1508
+ case NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM: {
1509
+ realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount;
1510
+ if ( realBad ) { break; }
1511
+ if ( requiresTrustedSource() ) {
1512
+ this.astError = AST_ERROR_UNTRUSTED_SOURCE;
1513
+ realBad = true;
1514
+ break;
1515
+ }
1516
+ const value = this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM);
1517
+ if ( value !== '' && parseReplaceValue(value) === undefined ) {
1518
+ this.astError = AST_ERROR_OPTION_BADVALUE;
1519
+ realBad = true;
1520
+ }
1521
+ break;
1522
+ }
1523
+ case NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM:
1524
+ realBad = abstractTypeCount || behaviorTypeCount;
1525
+ break;
1526
+ default:
1527
+ break;
1530
1528
  }
1531
1529
  if ( realBad ) {
1532
1530
  const targetNode = this.getBranchFromType(modifierType);
@@ -2061,15 +2059,15 @@ export class AstFilterParser {
2061
2059
  parentBeg + optionEnd
2062
2060
  );
2063
2061
  switch ( nodeOptionType ) {
2064
- case NODE_TYPE_NET_OPTION_NAME_DENYALLOW:
2065
- this.linkDown(next, this.parseDomainList(next, '|'), 0b00000);
2066
- break;
2067
- case NODE_TYPE_NET_OPTION_NAME_FROM:
2068
- case NODE_TYPE_NET_OPTION_NAME_TO:
2069
- this.linkDown(next, this.parseDomainList(next, '|', 0b11010));
2070
- break;
2071
- default:
2072
- break;
2062
+ case NODE_TYPE_NET_OPTION_NAME_DENYALLOW:
2063
+ this.linkDown(next, this.parseDomainList(next, '|'), 0b00000);
2064
+ break;
2065
+ case NODE_TYPE_NET_OPTION_NAME_FROM:
2066
+ case NODE_TYPE_NET_OPTION_NAME_TO:
2067
+ this.linkDown(next, this.parseDomainList(next, '|', 0b11010));
2068
+ break;
2069
+ default:
2070
+ break;
2073
2071
  }
2074
2072
  this.linkRight(prev, next);
2075
2073
  return this.throwHeadNode(head);
@@ -2284,27 +2282,27 @@ export class AstFilterParser {
2284
2282
  if ( (flags & NODE_FLAG_ERROR) !== 0 ) { continue; }
2285
2283
  realBad = false;
2286
2284
  switch ( type ) {
2287
- case NODE_TYPE_EXT_PATTERN_RESPONSEHEADER: {
2288
- const pattern = this.getNodeString(targetNode);
2289
- realBad =
2290
- pattern !== '' && removableHTTPHeaders.has(pattern) === false ||
2291
- pattern === '' && isException === false;
2292
- break;
2293
- }
2294
- case NODE_TYPE_EXT_PATTERN_SCRIPTLET_TOKEN: {
2295
- if ( this.interactive !== true ) { break; }
2296
- if ( isException ) { break; }
2297
- const { trustedSource, trustedScriptletTokens } = this.options;
2298
- if ( trustedScriptletTokens instanceof Set === false ) { break; }
2299
- const token = this.getNodeString(targetNode);
2300
- if ( trustedScriptletTokens.has(token) && trustedSource !== true ) {
2301
- this.astError = AST_ERROR_UNTRUSTED_SOURCE;
2302
- realBad = true;
2303
- }
2304
- break;
2285
+ case NODE_TYPE_EXT_PATTERN_RESPONSEHEADER: {
2286
+ const pattern = this.getNodeString(targetNode);
2287
+ realBad =
2288
+ pattern !== '' && removableHTTPHeaders.has(pattern) === false ||
2289
+ pattern === '' && isException === false;
2290
+ break;
2291
+ }
2292
+ case NODE_TYPE_EXT_PATTERN_SCRIPTLET_TOKEN: {
2293
+ if ( this.interactive !== true ) { break; }
2294
+ if ( isException ) { break; }
2295
+ const { trustedSource, trustedScriptletTokens } = this.options;
2296
+ if ( trustedScriptletTokens instanceof Set === false ) { break; }
2297
+ const token = this.getNodeString(targetNode);
2298
+ if ( trustedScriptletTokens.has(token) && trustedSource !== true ) {
2299
+ this.astError = AST_ERROR_UNTRUSTED_SOURCE;
2300
+ realBad = true;
2305
2301
  }
2306
- default:
2307
- break;
2302
+ break;
2303
+ }
2304
+ default:
2305
+ break;
2308
2306
  }
2309
2307
  if ( realBad ) {
2310
2308
  this.addNodeFlags(targetNode, NODE_FLAG_ERROR);
@@ -2420,7 +2418,7 @@ export class AstFilterParser {
2420
2418
  parentBeg + argsEnd
2421
2419
  );
2422
2420
  this.linkDown(next, this.parseExtPatternScriptletArglist(next));
2423
- prev = this.linkRight(prev, next);
2421
+ this.linkRight(prev, next);
2424
2422
  return this.throwHeadNode(head);
2425
2423
  }
2426
2424
 
@@ -2474,12 +2472,12 @@ export class AstFilterParser {
2474
2472
  const walker = this.getWalker(root);
2475
2473
  for ( let node = walker.next(); node !== 0; node = walker.next() ) {
2476
2474
  switch ( this.getNodeType(node) ) {
2477
- case NODE_TYPE_EXT_PATTERN_SCRIPTLET_TOKEN:
2478
- case NODE_TYPE_EXT_PATTERN_SCRIPTLET_ARG:
2479
- args.push(this.getNodeTransform(node));
2480
- break;
2481
- default:
2482
- break;
2475
+ case NODE_TYPE_EXT_PATTERN_SCRIPTLET_TOKEN:
2476
+ case NODE_TYPE_EXT_PATTERN_SCRIPTLET_ARG:
2477
+ args.push(this.getNodeTransform(node));
2478
+ break;
2479
+ default:
2480
+ break;
2483
2481
  }
2484
2482
  }
2485
2483
  walker.dispose();
@@ -3206,6 +3204,7 @@ class ExtSelectorCompiler {
3206
3204
  'matches-css-before',
3207
3205
  'matches-media',
3208
3206
  'matches-path',
3207
+ 'matches-prop',
3209
3208
  'min-text-length',
3210
3209
  'others',
3211
3210
  'shadow',
@@ -3842,6 +3841,7 @@ class ExtSelectorCompiler {
3842
3841
  case 'if-not':
3843
3842
  return this.compileSelector(arg);
3844
3843
  case 'matches-attr':
3844
+ case 'matches-prop':
3845
3845
  return this.compileMatchAttrArgument(arg);
3846
3846
  case 'matches-css':
3847
3847
  return this.compileCSSDeclaration(arg);
@@ -4037,7 +4037,7 @@ class ExtSelectorCompiler {
4037
4037
 
4038
4038
  compileAttrList(s) {
4039
4039
  if ( s === '' ) { return s; }
4040
- const attrs = s.split('\s*,\s*');
4040
+ const attrs = s.split(/\s*,\s*/);
4041
4041
  const out = [];
4042
4042
  for ( const attr of attrs ) {
4043
4043
  if ( attr !== '' ) {
@@ -4075,6 +4075,7 @@ export const proceduralOperatorTokens = new Map([
4075
4075
  [ 'matches-css', 0b11 ],
4076
4076
  [ 'matches-media', 0b11 ],
4077
4077
  [ 'matches-path', 0b11 ],
4078
+ [ 'matches-prop', 0b11 ],
4078
4079
  [ 'min-text-length', 0b01 ],
4079
4080
  [ 'not', 0b01 ],
4080
4081
  [ 'nth-ancestor', 0b00 ],
@@ -607,6 +607,7 @@ onBroadcast(msg => {
607
607
  const url = new URL(options.docURL);
608
608
  comment = '! ' +
609
609
  this.hiddenSettings.autoCommentFilterTemplate
610
+ .replace('{{isodate}}', d.toISOString().split('T')[0])
610
611
  .replace('{{date}}', d.toLocaleDateString(undefined, { dateStyle: 'medium' }))
611
612
  .replace('{{time}}', d.toLocaleTimeString())
612
613
  .replace('{{hostname}}', url.hostname)
@@ -1007,12 +1008,12 @@ onBroadcast(msg => {
1007
1008
  ubolog('loadFilterLists() Start');
1008
1009
  t0 = Date.now();
1009
1010
  loadedListKeys.length = 0;
1010
- loadingPromise = Promise.all([
1011
- this.getAvailableLists().then(lists => onFilterListsReady(lists)),
1012
- this.loadRedirectResources().then(( ) => {
1013
- ubolog(`loadFilterLists() Redirects/scriptlets ready at ${elapsed()}`);
1014
- }),
1015
- ]).then(( ) => {
1011
+ loadingPromise = this.loadRedirectResources().then(( ) => {
1012
+ ubolog(`loadFilterLists() Redirects/scriptlets ready at ${elapsed()}`);
1013
+ return this.getAvailableLists();
1014
+ }).then(lists => {
1015
+ return onFilterListsReady(lists)
1016
+ }).then(( ) => {
1016
1017
  onDone();
1017
1018
  });
1018
1019
  return loadingPromise;