@browserless.io/browserless 2.16.0 → 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.
- package/CHANGELOG.md +5 -1
- package/bin/browserless.js +6 -4
- package/bin/scaffold/src/hello-world.http.ts +1 -1
- package/build/routes/chrome/http/content.post.body.json +38 -8
- package/build/routes/chrome/http/pdf.post.body.json +38 -8
- package/build/routes/chrome/http/scrape.post.body.json +38 -8
- package/build/routes/chrome/http/screenshot.post.body.json +38 -8
- package/build/routes/chromium/http/content.post.body.json +38 -8
- package/build/routes/chromium/http/pdf.post.body.json +38 -8
- package/build/routes/chromium/http/scrape.post.body.json +38 -8
- package/build/routes/chromium/http/screenshot.post.body.json +38 -8
- package/extensions/ublock/_locales/be/messages.json +1 -1
- package/extensions/ublock/_locales/br_FR/messages.json +2 -2
- package/extensions/ublock/_locales/bs/messages.json +5 -5
- package/extensions/ublock/_locales/eu/messages.json +1 -1
- package/extensions/ublock/_locales/it/messages.json +21 -21
- package/extensions/ublock/_locales/kn/messages.json +13 -13
- package/extensions/ublock/_locales/lt/messages.json +1 -1
- package/extensions/ublock/_locales/ms/messages.json +9 -9
- package/extensions/ublock/_locales/nb/messages.json +2 -2
- package/extensions/ublock/_locales/no/messages.json +2 -2
- package/extensions/ublock/_locales/sv/messages.json +2 -2
- package/extensions/ublock/_locales/tr/messages.json +4 -4
- package/extensions/ublock/_locales/zh_TW/messages.json +17 -17
- package/extensions/ublock/assets/assets.json +4 -3
- package/extensions/ublock/assets/resources/scriptlets.js +208 -57
- package/extensions/ublock/assets/thirdparties/easylist/easylist.txt +3584 -4032
- package/extensions/ublock/assets/thirdparties/easylist/easyprivacy.txt +3732 -1683
- package/extensions/ublock/assets/thirdparties/pgl.yoyo.org/as/serverlist +27 -205
- package/extensions/ublock/assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat +465 -434
- package/extensions/ublock/assets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt +3232 -1382
- package/extensions/ublock/assets/ublock/badware.min.txt +867 -408
- package/extensions/ublock/assets/ublock/filters.min.txt +1382 -937
- package/extensions/ublock/assets/ublock/privacy.min.txt +43 -56
- package/extensions/ublock/assets/ublock/quick-fixes.min.txt +127 -71
- package/extensions/ublock/assets/ublock/unbreak.min.txt +145 -27
- package/extensions/ublock/js/contentscript-extra.js +25 -0
- package/extensions/ublock/js/contentscript.js +3 -1
- package/extensions/ublock/js/cosmetic-filtering.js +8 -7
- package/extensions/ublock/js/dom.js +8 -4
- package/extensions/ublock/js/epicker-ui.js +1 -1
- package/extensions/ublock/js/s14e-serializer.js +2 -1
- package/extensions/ublock/js/static-filtering-parser.js +255 -254
- package/extensions/ublock/js/storage.js +7 -6
- package/extensions/ublock/js/traffic.js +33 -34
- package/extensions/ublock/manifest.json +1 -1
- package/extensions/ublock/popup-fenix.html +1 -1
- package/package.json +15 -15
- package/static/debugger/index.html +1 -1
- package/static/debugger/router.js +1 -0
- package/static/debugger/tracker.js +1 -1
- package/static/docs/swagger.json +40 -10
- package/static/docs/swagger.min.json +39 -9
- package/static/function/client.js +4120 -16782
- package/static/function/index.html +4120 -16782
- package/static/debugger/router.bundle.js +0 -2
- package/static/debugger/router.bundle.js.map +0 -1
- 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
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
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
|
|
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
|
|
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 = /[
|
|
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
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
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 =
|
|
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
|
-
|
|
1477
|
-
|
|
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 =
|
|
1396
|
+
realBad = hasValue;
|
|
1397
|
+
if ( realBad ) { break; }
|
|
1398
|
+
modifierType = type;
|
|
1399
|
+
unredirectableTypeCount += 1;
|
|
1482
1400
|
break;
|
|
1483
|
-
case
|
|
1484
|
-
realBad =
|
|
1401
|
+
case NODE_TYPE_NET_OPTION_NAME_MATCHCASE:
|
|
1402
|
+
realBad = this.isRegexPattern() === false;
|
|
1485
1403
|
break;
|
|
1486
|
-
case
|
|
1487
|
-
|
|
1488
|
-
|
|
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
|
|
1491
|
-
case
|
|
1492
|
-
realBad =
|
|
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
|
|
1496
|
-
realBad =
|
|
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
|
-
|
|
1499
|
-
|
|
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
|
|
1511
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
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
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
|
|
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
|
-
|
|
2307
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
|
|
2481
|
-
|
|
2482
|
-
|
|
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(
|
|
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 =
|
|
1011
|
-
|
|
1012
|
-
this.
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
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;
|