@browserless.io/browserless 2.0.0-beta-5 → 2.0.0-beta-7

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 (246) hide show
  1. package/LICENSE +2 -0
  2. package/README.md +11 -11
  3. package/bin/browserless.js +169 -11
  4. package/bin/scaffold/README.md +415 -0
  5. package/bin/scaffold/package.json +21 -0
  6. package/bin/scaffold/src/hello-world.http.ts +27 -0
  7. package/bin/scaffold/tsconfig.json +4 -0
  8. package/build/browserless.js +18 -15
  9. package/build/browsers/index.d.ts +2 -18
  10. package/build/browsers/index.js +43 -14
  11. package/build/file-system.d.ts +5 -0
  12. package/build/file-system.js +20 -5
  13. package/build/file-system.spec.d.ts +1 -0
  14. package/build/file-system.spec.js +44 -0
  15. package/build/http.d.ts +3 -3
  16. package/build/http.js +3 -3
  17. package/build/router.js +2 -4
  18. package/build/routes/chromium/http/content-post.body.json +8 -8
  19. package/build/routes/chromium/http/content-post.d.ts +15 -3
  20. package/build/routes/chromium/http/content-post.js +14 -15
  21. package/build/routes/chromium/http/download-post.d.ts +16 -3
  22. package/build/routes/chromium/http/download-post.js +17 -22
  23. package/build/routes/chromium/http/function-post.d.ts +16 -3
  24. package/build/routes/chromium/http/function-post.js +17 -22
  25. package/build/routes/chromium/http/pdf-post.body.json +8 -8
  26. package/build/routes/chromium/http/pdf-post.d.ts +15 -3
  27. package/build/routes/chromium/http/pdf-post.js +19 -15
  28. package/build/routes/chromium/http/performance.d.ts +15 -3
  29. package/build/routes/chromium/http/performance.js +15 -23
  30. package/build/routes/chromium/http/scrape-post.body.json +8 -8
  31. package/build/routes/chromium/http/scrape-post.d.ts +15 -3
  32. package/build/routes/chromium/http/scrape-post.js +15 -16
  33. package/build/routes/chromium/http/screenshot-post.body.json +8 -8
  34. package/build/routes/chromium/http/screenshot-post.d.ts +15 -3
  35. package/build/routes/chromium/http/screenshot-post.js +18 -15
  36. package/build/routes/chromium/tests/websocket.spec.js +20 -1
  37. package/build/routes/chromium/utils/function/handler.js +2 -2
  38. package/build/routes/chromium/ws/browser.d.ts +13 -3
  39. package/build/routes/chromium/ws/browser.js +10 -11
  40. package/build/routes/chromium/ws/cdp-chromium.d.ts +13 -3
  41. package/build/routes/chromium/ws/cdp-chromium.js +10 -11
  42. package/build/routes/chromium/ws/page.d.ts +13 -3
  43. package/build/routes/chromium/ws/page.js +10 -11
  44. package/build/routes/chromium/ws/playwright-chromium.d.ts +13 -3
  45. package/build/routes/chromium/ws/playwright-chromium.js +11 -12
  46. package/build/routes/firefox/ws/playwright-firefox.d.ts +13 -3
  47. package/build/routes/firefox/ws/playwright-firefox.js +11 -12
  48. package/build/routes/management/http/config-get.d.ts +15 -3
  49. package/build/routes/management/http/config-get.js +15 -20
  50. package/build/routes/management/http/metrics-get.d.ts +15 -3
  51. package/build/routes/management/http/metrics-get.js +16 -21
  52. package/build/routes/management/http/metrics-total-get.d.ts +15 -3
  53. package/build/routes/management/http/metrics-total-get.js +16 -21
  54. package/build/routes/management/http/sessions-get.d.ts +15 -3
  55. package/build/routes/management/http/sessions-get.js +16 -20
  56. package/build/routes/management/http/static-get.d.ts +15 -3
  57. package/build/routes/management/http/static-get.js +15 -20
  58. package/build/routes/webkit/ws/playwright-webkit.d.ts +13 -3
  59. package/build/routes/webkit/ws/playwright-webkit.js +11 -12
  60. package/build/server.js +0 -1
  61. package/build/types.d.ts +48 -38
  62. package/build/types.js +135 -0
  63. package/extensions/ublock/1p-filters.html +0 -1
  64. package/extensions/ublock/3p-filters.html +0 -2
  65. package/extensions/ublock/_locales/bg/messages.json +6 -6
  66. package/extensions/ublock/_locales/br_FR/messages.json +14 -14
  67. package/extensions/ublock/_locales/bs/messages.json +8 -8
  68. package/extensions/ublock/_locales/ca/messages.json +1 -1
  69. package/extensions/ublock/_locales/da/messages.json +5 -5
  70. package/extensions/ublock/_locales/fa/messages.json +1 -1
  71. package/extensions/ublock/_locales/fi/messages.json +6 -6
  72. package/extensions/ublock/_locales/hr/messages.json +4 -4
  73. package/extensions/ublock/_locales/nb/messages.json +1 -1
  74. package/extensions/ublock/_locales/no/messages.json +1 -1
  75. package/extensions/ublock/_locales/ro/messages.json +2 -2
  76. package/extensions/ublock/_locales/ru/messages.json +1 -1
  77. package/extensions/ublock/_locales/sk/messages.json +1 -1
  78. package/extensions/ublock/_locales/sv/messages.json +2 -2
  79. package/extensions/ublock/_locales/te/messages.json +17 -17
  80. package/extensions/ublock/_locales/vi/messages.json +12 -12
  81. package/extensions/ublock/_locales/zh_TW/messages.json +13 -13
  82. package/extensions/ublock/assets/assets.json +3 -3
  83. package/extensions/ublock/assets/resources/scriptlets.js +218 -97
  84. package/extensions/ublock/assets/thirdparties/easylist/easylist.txt +3010 -2056
  85. package/extensions/ublock/assets/thirdparties/easylist/easyprivacy.txt +624 -433
  86. package/extensions/ublock/assets/thirdparties/pgl.yoyo.org/as/serverlist +93 -24
  87. package/extensions/ublock/assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat +7 -15
  88. package/extensions/ublock/assets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt +795 -777
  89. package/extensions/ublock/assets/ublock/badware.min.txt +138 -72
  90. package/extensions/ublock/assets/ublock/filters.min.txt +1929 -2735
  91. package/extensions/ublock/assets/ublock/privacy.min.txt +57 -26
  92. package/extensions/ublock/assets/ublock/quick-fixes.min.txt +125 -74
  93. package/extensions/ublock/assets/ublock/unbreak.min.txt +46 -53
  94. package/extensions/ublock/css/codemirror.css +8 -7
  95. package/extensions/ublock/css/dom-inspector.css +40 -0
  96. package/extensions/ublock/css/logger-ui-inspector.css +7 -1
  97. package/extensions/ublock/css/logger-ui.css +12 -5
  98. package/extensions/ublock/css/popup-fenix.css +1 -1
  99. package/extensions/ublock/devtools.html +1 -0
  100. package/extensions/ublock/js/1p-filters.js +4 -3
  101. package/extensions/ublock/js/3p-filters.js +25 -31
  102. package/extensions/ublock/js/about.js +1 -1
  103. package/extensions/ublock/js/advanced-settings.js +1 -1
  104. package/extensions/ublock/js/asset-viewer.js +1 -1
  105. package/extensions/ublock/js/assets.js +74 -44
  106. package/extensions/ublock/js/background.js +9 -3
  107. package/extensions/ublock/js/base64-custom.js +1 -1
  108. package/extensions/ublock/js/benchmarks.js +1 -1
  109. package/extensions/ublock/js/biditrie.js +1 -1
  110. package/extensions/ublock/js/broadcast.js +75 -0
  111. package/extensions/ublock/js/cachestorage.js +68 -45
  112. package/extensions/ublock/js/click2load.js +1 -1
  113. package/extensions/ublock/js/cloud-ui.js +1 -1
  114. package/extensions/ublock/js/code-viewer.js +1 -1
  115. package/extensions/ublock/js/codemirror/search-thread.js +1 -1
  116. package/extensions/ublock/js/codemirror/search.js +1 -1
  117. package/extensions/ublock/js/codemirror/ubo-dynamic-filtering.js +1 -1
  118. package/extensions/ublock/js/codemirror/ubo-static-filtering.js +98 -24
  119. package/extensions/ublock/js/commands.js +1 -1
  120. package/extensions/ublock/js/console.js +1 -1
  121. package/extensions/ublock/js/contentscript-extra.js +1 -1
  122. package/extensions/ublock/js/contentscript.js +1 -3
  123. package/extensions/ublock/js/contextmenu.js +1 -1
  124. package/extensions/ublock/js/cosmetic-filtering.js +4 -4
  125. package/extensions/ublock/js/dashboard-common.js +1 -1
  126. package/extensions/ublock/js/dashboard.js +1 -1
  127. package/extensions/ublock/js/devtools.js +23 -15
  128. package/extensions/ublock/js/diff-updater.js +3 -3
  129. package/extensions/ublock/js/document-blocked.js +1 -1
  130. package/extensions/ublock/js/dom-inspector.js +68 -0
  131. package/extensions/ublock/js/dom.js +1 -1
  132. package/extensions/ublock/js/dyna-rules.js +1 -1
  133. package/extensions/ublock/js/dynamic-net-filtering.js +1 -1
  134. package/extensions/ublock/js/epicker-ui.js +35 -59
  135. package/extensions/ublock/js/fa-icons.js +1 -1
  136. package/extensions/ublock/js/filtering-context.js +1 -1
  137. package/extensions/ublock/js/filtering-engines.js +1 -1
  138. package/extensions/ublock/js/hnswitches.js +1 -1
  139. package/extensions/ublock/js/hntrie.js +1 -1
  140. package/extensions/ublock/js/html-filtering.js +1 -1
  141. package/extensions/ublock/js/httpheader-filtering.js +1 -1
  142. package/extensions/ublock/js/i18n.js +1 -1
  143. package/extensions/ublock/js/is-webrtc-supported.js +1 -1
  144. package/extensions/ublock/js/logger-ui-inspector.js +203 -145
  145. package/extensions/ublock/js/logger-ui.js +21 -5
  146. package/extensions/ublock/js/logger.js +6 -2
  147. package/extensions/ublock/js/lz4.js +2 -2
  148. package/extensions/ublock/js/messaging.js +266 -166
  149. package/extensions/ublock/js/mrucache.js +58 -0
  150. package/extensions/ublock/js/pagestore.js +1 -1
  151. package/extensions/ublock/js/popup-fenix.js +2 -1
  152. package/extensions/ublock/js/redirect-engine.js +1 -1
  153. package/extensions/ublock/js/redirect-resources.js +1 -12
  154. package/extensions/ublock/js/reverselookup-worker.js +1 -1
  155. package/extensions/ublock/js/reverselookup.js +1 -1
  156. package/extensions/ublock/js/scriptlet-filtering-core.js +300 -0
  157. package/extensions/ublock/js/scriptlet-filtering.js +122 -350
  158. package/extensions/ublock/js/scriptlets/cosmetic-logger.js +36 -47
  159. package/extensions/ublock/js/scriptlets/cosmetic-off.js +1 -1
  160. package/extensions/ublock/js/scriptlets/cosmetic-on.js +1 -1
  161. package/extensions/ublock/js/scriptlets/cosmetic-report.js +1 -1
  162. package/extensions/ublock/js/scriptlets/dom-inspector.js +341 -323
  163. package/extensions/ublock/js/scriptlets/dom-survey-elements.js +1 -1
  164. package/extensions/ublock/js/scriptlets/dom-survey-scripts.js +1 -1
  165. package/extensions/ublock/js/scriptlets/epicker.js +80 -89
  166. package/extensions/ublock/js/scriptlets/load-3p-css.js +1 -1
  167. package/extensions/ublock/js/scriptlets/load-large-media-all.js +1 -1
  168. package/extensions/ublock/js/scriptlets/load-large-media-interactive.js +1 -1
  169. package/extensions/ublock/js/scriptlets/noscript-spoof.js +1 -1
  170. package/extensions/ublock/js/scriptlets/should-inject-contentscript.js +1 -1
  171. package/extensions/ublock/js/scriptlets/subscriber.js +1 -1
  172. package/extensions/ublock/js/scriptlets/updater.js +20 -3
  173. package/extensions/ublock/js/settings.js +1 -1
  174. package/extensions/ublock/js/start.js +19 -20
  175. package/extensions/ublock/js/static-dnr-filtering.js +1 -1
  176. package/extensions/ublock/js/static-ext-filtering-db.js +1 -1
  177. package/extensions/ublock/js/static-ext-filtering.js +1 -1
  178. package/extensions/ublock/js/static-filtering-io.js +1 -1
  179. package/extensions/ublock/js/static-filtering-parser.js +5 -3
  180. package/extensions/ublock/js/static-net-filtering.js +57 -37
  181. package/extensions/ublock/js/storage.js +49 -29
  182. package/extensions/ublock/js/support.js +4 -4
  183. package/extensions/ublock/js/tab.js +1 -1
  184. package/extensions/ublock/js/tasks.js +1 -1
  185. package/extensions/ublock/js/text-encode.js +1 -1
  186. package/extensions/ublock/js/text-utils.js +1 -1
  187. package/extensions/ublock/js/theme.js +1 -1
  188. package/extensions/ublock/js/traffic.js +2 -1
  189. package/extensions/ublock/js/ublock.js +15 -11
  190. package/extensions/ublock/js/uri-utils.js +1 -1
  191. package/extensions/ublock/js/url-net-filtering.js +1 -1
  192. package/extensions/ublock/js/utils.js +1 -73
  193. package/extensions/ublock/js/vapi-background-ext.js +1 -1
  194. package/extensions/ublock/js/vapi-background.js +92 -83
  195. package/extensions/ublock/js/vapi-client.js +4 -33
  196. package/extensions/ublock/js/vapi-common.js +16 -30
  197. package/extensions/ublock/js/vapi.js +1 -1
  198. package/extensions/ublock/js/wasm/biditrie.wat +1 -1
  199. package/extensions/ublock/js/wasm/hntrie.wat +1 -1
  200. package/extensions/ublock/js/webext.js +1 -1
  201. package/extensions/ublock/js/whitelist.js +1 -1
  202. package/extensions/ublock/logger-ui.html +2 -2
  203. package/extensions/ublock/manifest.json +1 -1
  204. package/extensions/ublock/support.html +0 -1
  205. package/extensions/ublock/web_accessible_resources/dom-inspector.html +25 -0
  206. package/extensions/ublock/web_accessible_resources/epicker-ui.html +0 -1
  207. package/extensions/ublock/web_accessible_resources/googletagservices_gpt.js +1 -0
  208. package/package.json +7 -19
  209. package/scripts/build-open-api.js +7 -4
  210. package/src/browserless.ts +42 -18
  211. package/src/browsers/index.ts +48 -20
  212. package/src/file-system.spec.ts +58 -0
  213. package/src/file-system.ts +36 -8
  214. package/src/http.ts +3 -3
  215. package/src/router.ts +2 -6
  216. package/src/routes/chromium/http/content-post.ts +13 -16
  217. package/src/routes/chromium/http/download-post.ts +16 -27
  218. package/src/routes/chromium/http/function-post.ts +16 -25
  219. package/src/routes/chromium/http/pdf-post.ts +19 -15
  220. package/src/routes/chromium/http/performance.ts +14 -26
  221. package/src/routes/chromium/http/scrape-post.ts +14 -16
  222. package/src/routes/chromium/http/screenshot-post.ts +18 -15
  223. package/src/routes/chromium/tests/websocket.spec.ts +28 -1
  224. package/src/routes/chromium/utils/function/handler.ts +2 -1
  225. package/src/routes/chromium/ws/browser.ts +10 -12
  226. package/src/routes/chromium/ws/cdp-chromium.ts +10 -12
  227. package/src/routes/chromium/ws/page.ts +10 -12
  228. package/src/routes/chromium/ws/playwright-chromium.ts +10 -12
  229. package/src/routes/firefox/ws/playwright-firefox.ts +10 -12
  230. package/src/routes/management/http/config-get.ts +14 -23
  231. package/src/routes/management/http/metrics-get.ts +15 -24
  232. package/src/routes/management/http/metrics-total-get.ts +15 -26
  233. package/src/routes/management/http/sessions-get.ts +15 -23
  234. package/src/routes/management/http/static-get.ts +14 -22
  235. package/src/routes/webkit/ws/playwright-webkit.ts +10 -12
  236. package/src/server.ts +0 -1
  237. package/src/types.ts +59 -45
  238. package/static/docs/browserless-logo-inline.svg +1 -0
  239. package/static/docs/index.html +27 -0
  240. package/static/docs/swagger.json +33 -33
  241. package/static/function/client.js +626 -78
  242. package/extensions/ublock/js/vapi-client-extra.js +0 -312
  243. package/extensions/ublock/web_accessible_resources/addthis_widget.js +0 -39
  244. package/extensions/ublock/web_accessible_resources/ligatus_angular-tag.js +0 -29
  245. package/extensions/ublock/web_accessible_resources/monkeybroker.js +0 -43
  246. package/extensions/ublock/web_accessible_resources/mxpnl_mixpanel.js +0 -51
@@ -1,6 +1,6 @@
1
1
  /*******************************************************************************
2
2
 
3
- uBlock Origin - a browser extension to block requests.
3
+ uBlock Origin - a comprehensive, efficient content blocker
4
4
  Copyright (C) 2014-present Raymond Hill
5
5
 
6
6
  This program is free software: you can redistribute it and/or modify
@@ -71,7 +71,7 @@ const keyvalStore = typeof vAPI !== 'undefined'
71
71
  // ||||+---------------- bit 12: removeparam filters
72
72
  // |||+----------------- bit 13: csp filters
73
73
  // ||+------------------ bit 14: permissions filters
74
- // |+------------------- bit 15: urltransform filters
74
+ // |+------------------- bit 15: uritransform filters
75
75
  // +-------------------- bit 16: replace filters
76
76
  // TODO: bit 11-16 can be converted into 3-bit value, as these options are not
77
77
  // meant to be combined.
@@ -217,7 +217,7 @@ const modifierTypeFromName = new Map([
217
217
  [ 'removeparam', MODIFIER_TYPE_REMOVEPARAM ],
218
218
  [ 'csp', MODIFIER_TYPE_CSP ],
219
219
  [ 'permissions', MODIFIER_TYPE_PERMISSIONS ],
220
- [ 'urltransform', MODIFIER_TYPE_URLTRANSFORM ],
220
+ [ 'uritransform', MODIFIER_TYPE_URLTRANSFORM ],
221
221
  [ 'replace', MODIFIER_TYPE_REPLACE ],
222
222
  ]);
223
223
 
@@ -227,7 +227,7 @@ const modifierNameFromType = new Map([
227
227
  [ MODIFIER_TYPE_REMOVEPARAM, 'removeparam' ],
228
228
  [ MODIFIER_TYPE_CSP, 'csp' ],
229
229
  [ MODIFIER_TYPE_PERMISSIONS, 'permissions' ],
230
- [ MODIFIER_TYPE_URLTRANSFORM, 'urltransform' ],
230
+ [ MODIFIER_TYPE_URLTRANSFORM, 'uritransform' ],
231
231
  [ MODIFIER_TYPE_REPLACE, 'replace' ],
232
232
  ]);
233
233
 
@@ -1925,13 +1925,13 @@ class FilterFromDomainMissSet extends FilterFromDomainHitSet {
1925
1925
  return super.match(idata) === false;
1926
1926
  }
1927
1927
 
1928
- static logData(idata, details) {
1929
- details.fromDomains.push('~' + this.getDomainOpt(idata).replace(/\|/g, '|~'));
1930
- }
1931
-
1932
1928
  static get dnrConditionName() {
1933
1929
  return 'excludedInitiatorDomains';
1934
1930
  }
1931
+
1932
+ static logData(idata, details) {
1933
+ details.fromDomains.push('~' + this.getDomainOpt(idata).replace(/\|/g, '|~'));
1934
+ }
1935
1935
  }
1936
1936
 
1937
1937
  class FilterFromRegexHit extends FilterDomainRegexHit {
@@ -1939,6 +1939,10 @@ class FilterFromRegexHit extends FilterDomainRegexHit {
1939
1939
  return $docHostname;
1940
1940
  }
1941
1941
 
1942
+ static get dnrConditionName() {
1943
+ return 'initiatorDomains';
1944
+ }
1945
+
1942
1946
  static logData(idata, details) {
1943
1947
  details.fromDomains.push(`${this.getDomainOpt(idata)}`);
1944
1948
  }
@@ -1949,6 +1953,10 @@ class FilterFromRegexMiss extends FilterFromRegexHit {
1949
1953
  return super.match(idata) === false;
1950
1954
  }
1951
1955
 
1956
+ static get dnrConditionName() {
1957
+ return 'excludedInitiatorDomains';
1958
+ }
1959
+
1952
1960
  static logData(idata, details) {
1953
1961
  details.fromDomains.push(`~${this.getDomainOpt(idata)}`);
1954
1962
  }
@@ -2064,6 +2072,10 @@ class FilterToRegexHit extends FilterDomainRegexHit {
2064
2072
  return $requestHostname;
2065
2073
  }
2066
2074
 
2075
+ static get dnrConditionName() {
2076
+ return 'requestDomains';
2077
+ }
2078
+
2067
2079
  static logData(idata, details) {
2068
2080
  details.toDomains.push(`${this.getDomainOpt(idata)}`);
2069
2081
  }
@@ -2074,6 +2086,10 @@ class FilterToRegexMiss extends FilterToRegexHit {
2074
2086
  return super.match(idata) === false;
2075
2087
  }
2076
2088
 
2089
+ static get dnrConditionName() {
2090
+ return 'excludedRequestDomains';
2091
+ }
2092
+
2077
2093
  static logData(idata, details) {
2078
2094
  details.toDomains.push(`~${this.getDomainOpt(idata)}`);
2079
2095
  }
@@ -4362,7 +4378,7 @@ FilterContainer.prototype.dnrFromCompiled = function(op, context, ...args) {
4362
4378
  [ REMOVEPARAM_REALM, 'removeparam' ],
4363
4379
  [ CSP_REALM, 'csp' ],
4364
4380
  [ PERMISSIONS_REALM, 'permissions' ],
4365
- [ URLTRANSFORM_REALM, 'urltransform' ],
4381
+ [ URLTRANSFORM_REALM, 'uritransform' ],
4366
4382
  ]);
4367
4383
  const partyness = new Map([
4368
4384
  [ ANYPARTY_REALM, '' ],
@@ -4430,34 +4446,38 @@ FilterContainer.prototype.dnrFromCompiled = function(op, context, ...args) {
4430
4446
  }
4431
4447
  }
4432
4448
 
4433
- // Detect and attempt salvage of rules with entity-based hostnames.
4449
+ // Detect and attempt salvage of rules with entity-based hostnames and/or
4450
+ // regex-based domains.
4451
+ const isUnsupportedDomain = hn => hn.endsWith('.*') || hn.startsWith('/');
4434
4452
  for ( const rule of ruleset ) {
4435
4453
  if ( rule.condition === undefined ) { continue; }
4436
- if (
4437
- Array.isArray(rule.condition.initiatorDomains) &&
4438
- rule.condition.initiatorDomains.some(hn => hn.endsWith('.*'))
4439
- ) {
4440
- const domains = rule.condition.initiatorDomains.filter(
4441
- hn => hn.endsWith('.*') === false
4442
- );
4443
- if ( domains.length === 0 ) {
4444
- dnrAddRuleError(rule, `Can't salvage rule with only entity-based domain= option: ${rule.condition.initiatorDomains.join('|')}`);
4445
- } else {
4446
- dnrAddRuleWarning(rule, `Salvaged rule by ignoring ${rule.condition.initiatorDomains.length - domains.length} entity-based domain= option: ${rule.condition.initiatorDomains.join('|')}`);
4447
- rule.condition.initiatorDomains = domains;
4454
+ for ( const prop of [ 'Initiator', 'Request' ] ) {
4455
+ const hitProp = `${prop.toLowerCase()}Domains`;
4456
+ if ( Array.isArray(rule.condition[hitProp]) ) {
4457
+ if ( rule.condition[hitProp].some(hn => isUnsupportedDomain(hn)) ) {
4458
+ const domains = rule.condition[hitProp].filter(
4459
+ hn => isUnsupportedDomain(hn) === false
4460
+ );
4461
+ if ( domains.length === 0 ) {
4462
+ dnrAddRuleError(rule, `Can't salvage rule with unsupported domain= option: ${rule.condition[hitProp].join('|')}`);
4463
+ } else {
4464
+ dnrAddRuleWarning(rule, `Salvaged rule by ignoring ${rule.condition[hitProp].length - domains.length} unsupported domain= option: ${rule.condition[hitProp].join('|')}`);
4465
+ rule.condition[hitProp] = domains;
4466
+ }
4467
+ }
4468
+ }
4469
+ const missProp = `excluded${prop}Domains`;
4470
+ if ( Array.isArray(rule.condition[missProp]) ) {
4471
+ if ( rule.condition[missProp].some(hn => isUnsupportedDomain(hn)) ) {
4472
+ const domains = rule.condition[missProp].filter(
4473
+ hn => isUnsupportedDomain(hn) === false
4474
+ );
4475
+ rule.condition[missProp] =
4476
+ domains.length !== 0
4477
+ ? domains
4478
+ : undefined;
4479
+ }
4448
4480
  }
4449
- }
4450
- if (
4451
- Array.isArray(rule.condition.excludedInitiatorDomains) &&
4452
- rule.condition.excludedInitiatorDomains.some(hn => hn.endsWith('.*'))
4453
- ) {
4454
- const domains = rule.condition.excludedInitiatorDomains.filter(
4455
- hn => hn.endsWith('.*') === false
4456
- );
4457
- rule.condition.excludedInitiatorDomains =
4458
- domains.length !== 0
4459
- ? domains
4460
- : undefined;
4461
4481
  }
4462
4482
  }
4463
4483
 
@@ -4550,7 +4570,7 @@ FilterContainer.prototype.dnrFromCompiled = function(op, context, ...args) {
4550
4570
  dnrAddRuleError(rule, `Unsupported removeparam exception: ${rule.__modifierValue}`);
4551
4571
  }
4552
4572
  break;
4553
- case 'urltransform': {
4573
+ case 'uritransform': {
4554
4574
  const path = rule.__modifierValue;
4555
4575
  let priority = rule.priority || 1;
4556
4576
  if ( rule.__modifierAction !== ALLOW_REALM ) {
@@ -5277,7 +5297,7 @@ FilterContainer.prototype.redirectRequest = function(redirectEngine, fctxt) {
5277
5297
  };
5278
5298
 
5279
5299
  FilterContainer.prototype.transformRequest = function(fctxt) {
5280
- const directives = this.matchAndFetchModifiers(fctxt, 'urltransform');
5300
+ const directives = this.matchAndFetchModifiers(fctxt, 'uritransform');
5281
5301
  if ( directives === undefined ) { return; }
5282
5302
  const directive = directives[directives.length-1];
5283
5303
  if ( (directive.bits & ALLOW_REALM) !== 0 ) { return directives; }
@@ -5564,7 +5584,7 @@ FilterContainer.prototype.dump = function() {
5564
5584
  [ REMOVEPARAM_REALM, 'removeparam' ],
5565
5585
  [ CSP_REALM, 'csp' ],
5566
5586
  [ PERMISSIONS_REALM, 'permissions' ],
5567
- [ URLTRANSFORM_REALM, 'urltransform' ],
5587
+ [ URLTRANSFORM_REALM, 'uritransform' ],
5568
5588
  [ REPLACE_REALM, 'replace' ],
5569
5589
  ]);
5570
5590
  const partyness = new Map([
@@ -1,6 +1,6 @@
1
1
  /*******************************************************************************
2
2
 
3
- uBlock Origin - a browser extension to block requests.
3
+ uBlock Origin - a comprehensive, efficient content blocker
4
4
  Copyright (C) 2014-present Raymond Hill
5
5
 
6
6
  This program is free software: you can redistribute it and/or modify
@@ -19,8 +19,6 @@
19
19
  Home: https://github.com/gorhill/uBlock
20
20
  */
21
21
 
22
- /* globals WebAssembly */
23
-
24
22
  'use strict';
25
23
 
26
24
  /******************************************************************************/
@@ -28,8 +26,9 @@
28
26
  import publicSuffixList from '../lib/publicsuffixlist/publicsuffixlist.js';
29
27
  import punycode from '../lib/punycode.js';
30
28
 
31
- import cosmeticFilteringEngine from './cosmetic-filtering.js';
32
29
  import io from './assets.js';
30
+ import { broadcast, filteringBehaviorChanged, onBroadcast } from './broadcast.js';
31
+ import cosmeticFilteringEngine from './cosmetic-filtering.js';
33
32
  import logger from './logger.js';
34
33
  import lz4Codec from './lz4.js';
35
34
  import staticExtFilteringEngine from './static-ext-filtering.js';
@@ -109,9 +108,9 @@ import {
109
108
  };
110
109
 
111
110
  const saveTimer = vAPI.defer.create(shouldSave);
112
- const saveDelay = { min: 4 };
111
+ const saveDelay = { sec: 23 };
113
112
 
114
- saveTimer.on(saveDelay);
113
+ saveTimer.onidle(saveDelay);
115
114
 
116
115
  µb.saveLocalSettings = function() {
117
116
  localSettingsLastSaved = Date.now();
@@ -243,7 +242,7 @@ import {
243
242
  if ( typeof hs[key] !== typeof hsDefault[key] ) { continue; }
244
243
  this.hiddenSettings[key] = hs[key];
245
244
  }
246
- this.fireEvent('hiddenSettingsChanged');
245
+ broadcast({ what: 'hiddenSettingsChanged' });
247
246
  };
248
247
 
249
248
  // Note: Save only the settings which values differ from the default ones.
@@ -259,7 +258,8 @@ import {
259
258
  });
260
259
  };
261
260
 
262
- µb.onEvent('hiddenSettingsChanged', ( ) => {
261
+ onBroadcast(msg => {
262
+ if ( msg.what !== 'hiddenSettingsChanged' ) { return; }
263
263
  const µbhs = µb.hiddenSettings;
264
264
  ubologSet(µbhs.consoleLogLevel === 'info');
265
265
  vAPI.net.setOptions({
@@ -391,7 +391,8 @@ import {
391
391
  return false;
392
392
  };
393
393
 
394
- µb.onEvent('hiddenSettingsChanged', ( ) => {
394
+ onBroadcast(msg => {
395
+ if ( msg.what !== 'hiddenSettingsChanged' ) { return; }
395
396
  µb.parsedTrustedListPrefixes = [];
396
397
  });
397
398
 
@@ -614,9 +615,8 @@ import {
614
615
 
615
616
  // https://www.reddit.com/r/uBlockOrigin/comments/cj7g7m/
616
617
  // https://www.reddit.com/r/uBlockOrigin/comments/cnq0bi/
617
- µb.filteringBehaviorChanged();
618
-
619
- vAPI.messaging.broadcast({ what: 'userFiltersUpdated' });
618
+ filteringBehaviorChanged();
619
+ broadcast({ what: 'userFiltersUpdated' });
620
620
  };
621
621
 
622
622
  µb.createUserFilters = function(details) {
@@ -635,6 +635,7 @@ import {
635
635
  for ( const key in lists ) {
636
636
  if ( lists.hasOwnProperty(key) === false ) { continue; }
637
637
  const list = lists[key];
638
+ if ( list.content !== 'filters' ) { continue; }
638
639
  if ( list.off !== true ) {
639
640
  selectedListKeys.push(key);
640
641
  continue;
@@ -851,7 +852,7 @@ import {
851
852
  staticExtFilteringEngine.freeze();
852
853
  redirectEngine.freeze();
853
854
  vAPI.net.unsuspend();
854
- µb.filteringBehaviorChanged();
855
+ filteringBehaviorChanged();
855
856
 
856
857
  vAPI.storage.set({ 'availableFilterLists': µb.availableFilterLists });
857
858
 
@@ -861,7 +862,7 @@ import {
861
862
  text: 'Reloading all filter lists: done'
862
863
  });
863
864
 
864
- vAPI.messaging.broadcast({
865
+ broadcast({
865
866
  what: 'staticFilteringDataChanged',
866
867
  parseCosmeticFilters: µb.userSettings.parseAllABPHideFilters,
867
868
  ignoreGenericCosmeticFilters: µb.userSettings.ignoreGenericCosmeticFilters,
@@ -1240,6 +1241,8 @@ import {
1240
1241
  // memory usage at selfie-load time. For some reasons.
1241
1242
 
1242
1243
  const create = async function() {
1244
+ vAPI.alarms.clear('createSelfie');
1245
+ createTimer.off();
1243
1246
  if ( µb.inMemoryFilters.length !== 0 ) { return; }
1244
1247
  if ( Object.keys(µb.availableFilterLists).length === 0 ) { return; }
1245
1248
  await Promise.all([
@@ -1313,11 +1316,23 @@ import {
1313
1316
  io.remove(/^selfie\//);
1314
1317
  µb.selfieIsInvalid = true;
1315
1318
  }
1319
+ if ( µb.wakeupReason === 'createSelfie' ) {
1320
+ µb.wakeupReason = '';
1321
+ return createTimer.offon({ sec: 27 });
1322
+ }
1323
+ vAPI.alarms.create('createSelfie', {
1324
+ delayInMinutes: µb.hiddenSettings.selfieAfter
1325
+ });
1316
1326
  createTimer.offon({ min: µb.hiddenSettings.selfieAfter });
1317
1327
  };
1318
1328
 
1319
1329
  const createTimer = vAPI.defer.create(create);
1320
1330
 
1331
+ vAPI.alarms.onAlarm.addListener(alarm => {
1332
+ if ( alarm.name !== 'createSelfie') { return; }
1333
+ µb.wakeupReason = 'createSelfie';
1334
+ });
1335
+
1321
1336
  µb.selfieManager = { load, destroy };
1322
1337
  }
1323
1338
 
@@ -1482,17 +1497,28 @@ import {
1482
1497
 
1483
1498
  const launchTimer = vAPI.defer.create(fetchDelay => {
1484
1499
  next = 0;
1485
- io.updateStart({ delay: fetchDelay, auto: true });
1500
+ io.updateStart({ fetchDelay, auto: true });
1486
1501
  });
1487
1502
 
1488
- µb.scheduleAssetUpdater = async function(updateDelay) {
1503
+ µb.scheduleAssetUpdater = async function(details = {}) {
1489
1504
  launchTimer.off();
1490
1505
 
1491
- if ( updateDelay === 0 ) {
1506
+ if ( details.now ) {
1492
1507
  next = 0;
1508
+ io.updateStart(details);
1493
1509
  return;
1494
1510
  }
1495
1511
 
1512
+ if ( µb.userSettings.autoUpdate === false ) {
1513
+ if ( Boolean(details.updateDelay) === false ) {
1514
+ next = 0;
1515
+ return;
1516
+ }
1517
+ }
1518
+
1519
+ let updateDelay = details.updateDelay ||
1520
+ this.hiddenSettings.autoUpdatePeriod * 3600000;
1521
+
1496
1522
  const now = Date.now();
1497
1523
  let needEmergencyUpdate = false;
1498
1524
 
@@ -1583,10 +1609,10 @@ import {
1583
1609
  } else if ( details.assetKey === 'ublock-badlists' ) {
1584
1610
  this.badLists = new Map();
1585
1611
  }
1586
- vAPI.messaging.broadcast({
1612
+ broadcast({
1587
1613
  what: 'assetUpdated',
1588
1614
  key: details.assetKey,
1589
- cached: cached
1615
+ cached,
1590
1616
  });
1591
1617
  // https://github.com/gorhill/uBlock/issues/2585
1592
1618
  // Whenever an asset is overwritten, the current selfie is quite
@@ -1597,10 +1623,10 @@ import {
1597
1623
 
1598
1624
  // Update failed.
1599
1625
  if ( topic === 'asset-update-failed' ) {
1600
- vAPI.messaging.broadcast({
1626
+ broadcast({
1601
1627
  what: 'assetUpdated',
1602
1628
  key: details.assetKey,
1603
- failed: true
1629
+ failed: true,
1604
1630
  });
1605
1631
  return;
1606
1632
  }
@@ -1617,14 +1643,8 @@ import {
1617
1643
  }
1618
1644
  this.loadFilterLists();
1619
1645
  }
1620
- if ( this.userSettings.autoUpdate ) {
1621
- this.scheduleAssetUpdater(
1622
- this.hiddenSettings.autoUpdatePeriod * 3600000 || 25200000
1623
- );
1624
- } else {
1625
- this.scheduleAssetUpdater(0);
1626
- }
1627
- vAPI.messaging.broadcast({
1646
+ this.scheduleAssetUpdater();
1647
+ broadcast({
1628
1648
  what: 'assetsUpdated',
1629
1649
  assetKeys: details.assetKeys
1630
1650
  });
@@ -1,6 +1,6 @@
1
1
  /*******************************************************************************
2
2
 
3
- uBlock Origin - a browser extension to block requests.
3
+ uBlock Origin - a comprehensive, efficient content blocker
4
4
  Copyright (C) 2014-present Raymond Hill
5
5
 
6
6
  This program is free software: you can redistribute it and/or modify
@@ -23,6 +23,7 @@
23
23
 
24
24
  'use strict';
25
25
 
26
+ import { onBroadcast } from './broadcast.js';
26
27
  import { dom, qs$ } from './dom.js';
27
28
 
28
29
  /******************************************************************************/
@@ -254,8 +255,7 @@ async function updateFilterLists() {
254
255
  if ( dom.body.dataset.shouldUpdateLists === undefined ) { return false; }
255
256
  dom.cl.add(dom.body, 'updating');
256
257
  const assetKeys = JSON.parse(dom.body.dataset.shouldUpdateLists);
257
- vAPI.messaging.send('dashboard', { what: 'purgeCaches', assetKeys });
258
- vAPI.messaging.send('dashboard', { what: 'forceUpdateAssets' });
258
+ vAPI.messaging.send('dashboard', { what: 'supportUpdateNow', assetKeys });
259
259
  return true;
260
260
  }
261
261
 
@@ -316,7 +316,7 @@ uBlockDashboard.patchCodeMirrorEditor(cmEditor);
316
316
  });
317
317
  }
318
318
 
319
- vAPI.broadcastListener.add(msg => {
319
+ onBroadcast(msg => {
320
320
  if ( msg.what === 'assetsUpdated' ) {
321
321
  dom.cl.remove(dom.body, 'updating');
322
322
  dom.cl.add(dom.body, 'updated');
@@ -1,6 +1,6 @@
1
1
  /*******************************************************************************
2
2
 
3
- uBlock Origin - a browser extension to block requests.
3
+ uBlock Origin - a comprehensive, efficient content blocker
4
4
  Copyright (C) 2014-present Raymond Hill
5
5
 
6
6
  This program is free software: you can redistribute it and/or modify
@@ -1,6 +1,6 @@
1
1
  /*******************************************************************************
2
2
 
3
- uBlock Origin - a browser extension to block requests.
3
+ uBlock Origin - a comprehensive, efficient content blocker
4
4
  Copyright (C) 2014-present Raymond Hill
5
5
 
6
6
  This program is free software: you can redistribute it and/or modify
@@ -1,6 +1,6 @@
1
1
  /*******************************************************************************
2
2
 
3
- uBlock Origin - a browser extension to block requests.
3
+ uBlock Origin - a comprehensive, efficient content blocker
4
4
  Copyright (C) 2018 Raymond Hill
5
5
 
6
6
  This program is free software: you can redistribute it and/or modify
@@ -1,6 +1,6 @@
1
1
  /*******************************************************************************
2
2
 
3
- uBlock Origin - a browser extension to block requests.
3
+ uBlock Origin - a comprehensive, efficient content blocker
4
4
  Copyright (C) 2014-present Raymond Hill
5
5
 
6
6
  This program is free software: you can redistribute it and/or modify
@@ -1,6 +1,6 @@
1
1
  /*******************************************************************************
2
2
 
3
- uBlock Origin - a browser extension to block requests.
3
+ uBlock Origin - a comprehensive, efficient content blocker
4
4
  Copyright (C) 2014-present Raymond Hill
5
5
 
6
6
  This program is free software: you can redistribute it and/or modify
@@ -1,6 +1,6 @@
1
1
  /*******************************************************************************
2
2
 
3
- uBlock Origin - a browser extension to block requests.
3
+ uBlock Origin - a comprehensive, efficient content blocker
4
4
  Copyright (C) 2014-present Raymond Hill
5
5
 
6
6
  This program is free software: you can redistribute it and/or modify
@@ -687,6 +687,7 @@ const bodyFilterer = (( ) => {
687
687
  'application/vnd.api+json',
688
688
  'application/vnd.apple.mpegurl',
689
689
  'application/vnd.apple.mpegurl.audio',
690
+ 'application/x-javascript',
690
691
  'application/x-mpegurl',
691
692
  'application/xhtml+xml',
692
693
  'application/xml',
@@ -1,6 +1,6 @@
1
1
  /*******************************************************************************
2
2
 
3
- uBlock Origin - a browser extension to block requests.
3
+ uBlock Origin - a comprehensive, efficient content blocker
4
4
  Copyright (C) 2014-present Raymond Hill
5
5
 
6
6
  This program is free software: you can redistribute it and/or modify
@@ -23,12 +23,13 @@
23
23
 
24
24
  /******************************************************************************/
25
25
 
26
- import contextMenu from './contextmenu.js';
27
- import cosmeticFilteringEngine from './cosmetic-filtering.js';
28
26
  import io from './assets.js';
29
27
  import µb from './background.js';
30
- import { hostnameFromURI } from './uri-utils.js';
28
+ import { broadcast, filteringBehaviorChanged, onBroadcast } from './broadcast.js';
29
+ import contextMenu from './contextmenu.js';
30
+ import cosmeticFilteringEngine from './cosmetic-filtering.js';
31
31
  import { redirectEngine } from './redirect-engine.js';
32
+ import { hostnameFromURI } from './uri-utils.js';
32
33
 
33
34
  import {
34
35
  permanentFirewall,
@@ -147,7 +148,7 @@ const matchBucket = function(url, hostname, bucket, start) {
147
148
  }
148
149
  bucket.push(directive);
149
150
  this.saveWhitelist();
150
- µb.filteringBehaviorChanged({ hostname: targetHostname });
151
+ filteringBehaviorChanged({ hostname: targetHostname });
151
152
  return true;
152
153
  }
153
154
 
@@ -188,7 +189,7 @@ const matchBucket = function(url, hostname, bucket, start) {
188
189
  }
189
190
  }
190
191
  this.saveWhitelist();
191
- µb.filteringBehaviorChanged({ direction: 1 });
192
+ filteringBehaviorChanged({ direction: 1 });
192
193
  return true;
193
194
  };
194
195
 
@@ -344,7 +345,7 @@ const matchBucket = function(url, hostname, bucket, start) {
344
345
  }
345
346
  break;
346
347
  case 'autoUpdate':
347
- this.scheduleAssetUpdater(value ? 7 * 60 * 1000 : 0);
348
+ this.scheduleAssetUpdater({ updateDelay: value ? 2000 : 0 });
348
349
  break;
349
350
  case 'cnameUncloakEnabled':
350
351
  if ( vAPI.net.canUncloakCnames === true ) {
@@ -423,7 +424,7 @@ const matchBucket = function(url, hostname, bucket, start) {
423
424
  redirectEngine.invalidateResourcesSelfie(io);
424
425
  this.loadRedirectResources();
425
426
  }
426
- this.fireEvent('hiddenSettingsChanged');
427
+ broadcast({ what: 'hiddenSettingsChanged' });
427
428
  };
428
429
 
429
430
  /******************************************************************************/
@@ -524,7 +525,7 @@ const matchBucket = function(url, hostname, bucket, start) {
524
525
  cosmeticFilteringEngine.removeFromSelectorCache(srcHostname, 'net');
525
526
 
526
527
  // Flush caches
527
- µb.filteringBehaviorChanged({
528
+ filteringBehaviorChanged({
528
529
  direction: action === 1 ? 1 : 0,
529
530
  hostname: srcHostname,
530
531
  });
@@ -613,7 +614,7 @@ const matchBucket = function(url, hostname, bucket, start) {
613
614
  switch ( details.name ) {
614
615
  case 'no-scripting':
615
616
  case 'no-remote-fonts':
616
- µb.filteringBehaviorChanged({
617
+ filteringBehaviorChanged({
617
618
  direction: details.state ? 1 : 0,
618
619
  hostname: details.hostname,
619
620
  });
@@ -677,7 +678,10 @@ const matchBucket = function(url, hostname, bucket, start) {
677
678
 
678
679
  parse();
679
680
 
680
- µb.onEvent('hiddenSettingsChanged', ( ) => { parse(); });
681
+ onBroadcast(msg => {
682
+ if ( msg.what !== 'hiddenSettingsChanged' ) { return; }
683
+ parse();
684
+ });
681
685
  }
682
686
 
683
687
  /******************************************************************************/
@@ -1,6 +1,6 @@
1
1
  /*******************************************************************************
2
2
 
3
- uBlock Origin - a browser extension to block requests.
3
+ uBlock Origin - a comprehensive, efficient content blocker
4
4
  Copyright (C) 2014-present Raymond Hill
5
5
 
6
6
  This program is free software: you can redistribute it and/or modify
@@ -1,6 +1,6 @@
1
1
  /*******************************************************************************
2
2
 
3
- uBlock Origin - a browser extension to black/white list requests.
3
+ uBlock Origin - a comprehensive, efficient content blocker
4
4
  Copyright (C) 2015-present Raymond Hill
5
5
 
6
6
  This program is free software: you can redistribute it and/or modify