@browserless.io/browserless 2.30.0 → 2.31.0

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 (429) hide show
  1. package/CHANGELOG.md +16 -3
  2. package/build/browsers/index.js +3 -0
  3. package/build/limiter.js +3 -1
  4. package/build/routes/chrome/http/content.post.body.json +8 -8
  5. package/build/routes/chrome/http/pdf.post.body.json +8 -8
  6. package/build/routes/chrome/http/scrape.post.body.json +8 -8
  7. package/build/routes/chrome/http/screenshot.post.body.json +22 -9
  8. package/build/routes/chromium/http/content.post.body.json +8 -8
  9. package/build/routes/chromium/http/pdf.post.body.json +8 -8
  10. package/build/routes/chromium/http/scrape.post.body.json +8 -8
  11. package/build/routes/chromium/http/screenshot.post.body.json +22 -9
  12. package/build/routes/chromium/tests/websocket.spec.js +1 -1
  13. package/build/routes/edge/http/content.post.body.json +8 -8
  14. package/build/routes/edge/http/pdf.post.body.json +8 -8
  15. package/build/routes/edge/http/scrape.post.body.json +8 -8
  16. package/build/routes/edge/http/screenshot.post.body.json +22 -9
  17. package/extensions/ublocklite/README.md +5 -4
  18. package/extensions/ublocklite/_locales/ar/messages.json +36 -0
  19. package/extensions/ublocklite/_locales/az/messages.json +36 -0
  20. package/extensions/ublocklite/_locales/be/messages.json +36 -0
  21. package/extensions/ublocklite/_locales/bg/messages.json +36 -0
  22. package/extensions/ublocklite/_locales/bn/messages.json +38 -2
  23. package/extensions/ublocklite/_locales/br_FR/messages.json +39 -3
  24. package/extensions/ublocklite/_locales/bs/messages.json +36 -0
  25. package/extensions/ublocklite/_locales/ca/messages.json +36 -0
  26. package/extensions/ublocklite/_locales/cs/messages.json +36 -0
  27. package/extensions/ublocklite/_locales/cv/messages.json +36 -0
  28. package/extensions/ublocklite/_locales/cy/messages.json +36 -0
  29. package/extensions/ublocklite/_locales/da/messages.json +37 -1
  30. package/extensions/ublocklite/_locales/de/messages.json +36 -0
  31. package/extensions/ublocklite/_locales/el/messages.json +36 -0
  32. package/extensions/ublocklite/_locales/en/messages.json +36 -0
  33. package/extensions/ublocklite/_locales/en_GB/messages.json +36 -0
  34. package/extensions/ublocklite/_locales/eo/messages.json +36 -0
  35. package/extensions/ublocklite/_locales/es/messages.json +36 -0
  36. package/extensions/ublocklite/_locales/et/messages.json +36 -0
  37. package/extensions/ublocklite/_locales/eu/messages.json +36 -0
  38. package/extensions/ublocklite/_locales/fa/messages.json +36 -0
  39. package/extensions/ublocklite/_locales/fi/messages.json +41 -5
  40. package/extensions/ublocklite/_locales/fil/messages.json +36 -0
  41. package/extensions/ublocklite/_locales/fr/messages.json +36 -0
  42. package/extensions/ublocklite/_locales/fy/messages.json +36 -0
  43. package/extensions/ublocklite/_locales/gl/messages.json +36 -0
  44. package/extensions/ublocklite/_locales/gu/messages.json +36 -0
  45. package/extensions/ublocklite/_locales/he/messages.json +36 -0
  46. package/extensions/ublocklite/_locales/hi/messages.json +36 -0
  47. package/extensions/ublocklite/_locales/hr/messages.json +37 -1
  48. package/extensions/ublocklite/_locales/hu/messages.json +36 -0
  49. package/extensions/ublocklite/_locales/hy/messages.json +36 -0
  50. package/extensions/ublocklite/_locales/id/messages.json +36 -0
  51. package/extensions/ublocklite/_locales/it/messages.json +36 -0
  52. package/extensions/ublocklite/_locales/ja/messages.json +36 -0
  53. package/extensions/ublocklite/_locales/ka/messages.json +36 -0
  54. package/extensions/ublocklite/_locales/kk/messages.json +36 -0
  55. package/extensions/ublocklite/_locales/kn/messages.json +36 -0
  56. package/extensions/ublocklite/_locales/ko/messages.json +37 -1
  57. package/extensions/ublocklite/_locales/lt/messages.json +36 -0
  58. package/extensions/ublocklite/_locales/lv/messages.json +36 -0
  59. package/extensions/ublocklite/_locales/mk/messages.json +36 -0
  60. package/extensions/ublocklite/_locales/ml/messages.json +36 -0
  61. package/extensions/ublocklite/_locales/mr/messages.json +36 -0
  62. package/extensions/ublocklite/_locales/ms/messages.json +36 -0
  63. package/extensions/ublocklite/_locales/nb/messages.json +40 -4
  64. package/extensions/ublocklite/_locales/nl/messages.json +40 -4
  65. package/extensions/ublocklite/_locales/oc/messages.json +36 -0
  66. package/extensions/ublocklite/_locales/pa/messages.json +36 -0
  67. package/extensions/ublocklite/_locales/pl/messages.json +36 -0
  68. package/extensions/ublocklite/_locales/pt_BR/messages.json +36 -0
  69. package/extensions/ublocklite/_locales/pt_PT/messages.json +38 -2
  70. package/extensions/ublocklite/_locales/ro/messages.json +36 -0
  71. package/extensions/ublocklite/_locales/ru/messages.json +36 -0
  72. package/extensions/ublocklite/_locales/si/messages.json +63 -27
  73. package/extensions/ublocklite/_locales/sk/messages.json +36 -0
  74. package/extensions/ublocklite/_locales/sl/messages.json +36 -0
  75. package/extensions/ublocklite/_locales/so/messages.json +36 -0
  76. package/extensions/ublocklite/_locales/sq/messages.json +37 -1
  77. package/extensions/ublocklite/_locales/sr/messages.json +36 -0
  78. package/extensions/ublocklite/_locales/sv/messages.json +36 -0
  79. package/extensions/ublocklite/_locales/sw/messages.json +36 -0
  80. package/extensions/ublocklite/_locales/ta/messages.json +36 -0
  81. package/extensions/ublocklite/_locales/te/messages.json +36 -0
  82. package/extensions/ublocklite/_locales/th/messages.json +36 -0
  83. package/extensions/ublocklite/_locales/tr/messages.json +37 -1
  84. package/extensions/ublocklite/_locales/uk/messages.json +36 -0
  85. package/extensions/ublocklite/_locales/ur/messages.json +36 -0
  86. package/extensions/ublocklite/_locales/vi/messages.json +36 -0
  87. package/extensions/ublocklite/_locales/zh_CN/messages.json +36 -0
  88. package/extensions/ublocklite/_locales/zh_TW/messages.json +36 -0
  89. package/extensions/ublocklite/css/common.css +2 -1
  90. package/extensions/ublocklite/css/dashboard-common.css +6 -1
  91. package/extensions/ublocklite/css/dashboard.css +15 -8
  92. package/extensions/ublocklite/css/default.css +1 -1
  93. package/extensions/ublocklite/css/develop.css +112 -0
  94. package/extensions/ublocklite/css/filtering-mode.css +29 -20
  95. package/extensions/ublocklite/css/popup.css +14 -16
  96. package/extensions/ublocklite/css/report.css +11 -0
  97. package/extensions/ublocklite/css/settings.css +11 -6
  98. package/extensions/ublocklite/css/zapper-ui.css +15 -10
  99. package/extensions/ublocklite/dashboard.html +39 -6
  100. package/extensions/ublocklite/img/icon_512.png +0 -0
  101. package/extensions/ublocklite/js/background.js +28 -5
  102. package/extensions/ublocklite/js/dashboard.js +18 -1
  103. package/extensions/ublocklite/js/develop.js +889 -0
  104. package/extensions/ublocklite/js/dnr-parser.js +561 -0
  105. package/extensions/ublocklite/js/ext-compat.js +3 -3
  106. package/extensions/ublocklite/js/filter-lists.js +6 -1
  107. package/extensions/ublocklite/js/report.js +48 -3
  108. package/extensions/ublocklite/js/ruleset-manager.js +121 -22
  109. package/extensions/ublocklite/js/scripting-manager.js +45 -16
  110. package/extensions/ublocklite/js/settings.js +33 -19
  111. package/extensions/ublocklite/js/theme.js +3 -1
  112. package/extensions/ublocklite/js/zapper-ui.js +11 -0
  113. package/extensions/ublocklite/lib/codemirror/LICENSE +21 -0
  114. package/extensions/ublocklite/lib/codemirror/README.md +9 -0
  115. package/extensions/ublocklite/lib/codemirror/cm6.bundle.ubol.min.js +1 -0
  116. package/extensions/ublocklite/manifest.json +6 -6
  117. package/extensions/ublocklite/popup.html +7 -11
  118. package/extensions/ublocklite/report.html +4 -2
  119. package/extensions/ublocklite/rulesets/generic-details.json +16 -5
  120. package/extensions/ublocklite/rulesets/main/adguard-mobile.json +533 -0
  121. package/extensions/ublocklite/rulesets/main/alb-0.json +23 -23
  122. package/extensions/ublocklite/rulesets/main/annoyances-cookies.json +29 -14
  123. package/extensions/ublocklite/rulesets/main/annoyances-others.json +3 -1
  124. package/extensions/ublocklite/rulesets/main/annoyances-overlays.json +10 -4
  125. package/extensions/ublocklite/rulesets/main/annoyances-social.json +1 -0
  126. package/extensions/ublocklite/rulesets/main/annoyances-widgets.json +3 -2
  127. package/extensions/ublocklite/rulesets/main/chn-0.json +59 -39
  128. package/extensions/ublocklite/rulesets/main/deu-0.json +11 -3
  129. package/extensions/ublocklite/rulesets/main/easylist.json +28 -36
  130. package/extensions/ublocklite/rulesets/main/easyprivacy.json +44 -12
  131. package/extensions/ublocklite/rulesets/main/fin-0.json +168 -168
  132. package/extensions/ublocklite/rulesets/main/fra-0.json +10 -11
  133. package/extensions/ublocklite/rulesets/main/hun-0.json +17 -6
  134. package/extensions/ublocklite/rulesets/main/idn-0.json +16 -4
  135. package/extensions/ublocklite/rulesets/main/ind-0.json +112 -77
  136. package/extensions/ublocklite/rulesets/main/isr-0.json +7 -19
  137. package/extensions/ublocklite/rulesets/main/ita-0.json +3 -2
  138. package/extensions/ublocklite/rulesets/main/jpn-1.json +26 -15
  139. package/extensions/ublocklite/rulesets/main/kor-1.json +7 -1
  140. package/extensions/ublocklite/rulesets/main/nor-0.json +38 -2
  141. package/extensions/ublocklite/rulesets/main/pgl.json +6 -18
  142. package/extensions/ublocklite/rulesets/main/pol-0.json +1 -1
  143. package/extensions/ublocklite/rulesets/main/rou-1.json +1 -1
  144. package/extensions/ublocklite/rulesets/main/rus-0.json +25 -16
  145. package/extensions/ublocklite/rulesets/main/rus-1.json +11 -13
  146. package/extensions/ublocklite/rulesets/main/spa-0.json +9 -2
  147. package/extensions/ublocklite/rulesets/main/spa-1.json +9 -6
  148. package/extensions/ublocklite/rulesets/main/stevenblack-hosts.json +14117 -4504
  149. package/extensions/ublocklite/rulesets/main/swe-1.json +35 -30
  150. package/extensions/ublocklite/rulesets/main/tur-0.json +31 -9
  151. package/extensions/ublocklite/rulesets/main/ublock-badware.json +49 -115
  152. package/extensions/ublocklite/rulesets/main/ublock-filters.json +72 -37
  153. package/extensions/ublocklite/rulesets/main/ukr-0.json +6 -2
  154. package/extensions/ublocklite/rulesets/main/urlhaus-full.json +439 -846
  155. package/extensions/ublocklite/rulesets/main/vie-1.json +80 -69
  156. package/extensions/ublocklite/rulesets/modify-headers/chn-0.json +46 -2
  157. package/extensions/ublocklite/rulesets/modify-headers/vie-1.json +1 -1
  158. package/extensions/ublocklite/rulesets/redirect/adguard-mobile.json +20 -0
  159. package/extensions/ublocklite/rulesets/redirect/annoyances-overlays.json +0 -1
  160. package/extensions/ublocklite/rulesets/redirect/easylist.json +19 -0
  161. package/extensions/ublocklite/rulesets/redirect/fin-0.json +25 -25
  162. package/extensions/ublocklite/rulesets/redirect/isr-0.json +2 -1
  163. package/extensions/ublocklite/rulesets/redirect/rou-1.json +1 -0
  164. package/extensions/ublocklite/rulesets/redirect/rus-1.json +33 -17
  165. package/extensions/ublocklite/rulesets/redirect/swe-1.json +11 -156
  166. package/extensions/ublocklite/rulesets/redirect/tur-0.json +0 -1
  167. package/extensions/ublocklite/rulesets/redirect/ublock-filters.json +14 -9
  168. package/extensions/ublocklite/rulesets/redirect/vie-1.json +20 -4
  169. package/extensions/ublocklite/rulesets/regex/adguard-mobile.json +101 -0
  170. package/extensions/ublocklite/rulesets/regex/chn-0.json +3 -3
  171. package/extensions/ublocklite/rulesets/regex/jpn-1.json +3 -5
  172. package/extensions/ublocklite/rulesets/regex/kor-1.json +2 -1
  173. package/extensions/ublocklite/rulesets/regex/nor-0.json +1 -1
  174. package/extensions/ublocklite/rulesets/regex/swe-1.json +1 -0
  175. package/extensions/ublocklite/rulesets/regex/tur-0.json +1 -0
  176. package/extensions/ublocklite/rulesets/regex/ublock-badware.json +5 -4
  177. package/extensions/ublocklite/rulesets/regex/ublock-filters.json +17 -4
  178. package/extensions/ublocklite/rulesets/removeparam/adguard-spyware-url.json +13 -6
  179. package/extensions/ublocklite/rulesets/removeparam/fin-0.json +12 -12
  180. package/extensions/ublocklite/rulesets/removeparam/rus-1.json +2 -2
  181. package/extensions/ublocklite/rulesets/removeparam/swe-1.json +25 -0
  182. package/extensions/ublocklite/rulesets/removeparam/ublock-filters.json +2 -2
  183. package/extensions/ublocklite/rulesets/ruleset-details.json +259 -262
  184. package/extensions/ublocklite/rulesets/scripting/declarative/adguard-mobile.js +42 -0
  185. package/extensions/ublocklite/rulesets/scripting/declarative/annoyances-cookies.js +3 -3
  186. package/extensions/ublocklite/rulesets/scripting/declarative/annoyances-overlays.js +3 -3
  187. package/extensions/ublocklite/rulesets/scripting/declarative/chn-0.js +3 -3
  188. package/extensions/ublocklite/rulesets/scripting/declarative/isr-0.js +3 -3
  189. package/extensions/ublocklite/rulesets/scripting/declarative/jpn-1.js +2 -2
  190. package/extensions/ublocklite/rulesets/scripting/declarative/nor-0.js +3 -3
  191. package/extensions/ublocklite/rulesets/scripting/declarative/rou-1.js +3 -3
  192. package/extensions/ublocklite/rulesets/scripting/declarative/rus-0.js +3 -3
  193. package/extensions/ublocklite/rulesets/scripting/declarative/rus-1.js +1 -1
  194. package/extensions/ublocklite/rulesets/scripting/declarative/spa-1.js +3 -3
  195. package/extensions/ublocklite/rulesets/scripting/declarative/swe-1.js +3 -3
  196. package/extensions/ublocklite/rulesets/scripting/declarative/tur-0.js +3 -3
  197. package/extensions/ublocklite/rulesets/scripting/declarative/ublock-filters.js +3 -3
  198. package/extensions/ublocklite/rulesets/scripting/declarative/vie-1.js +1 -1
  199. package/extensions/ublocklite/rulesets/scripting/generic/adguard-mobile.js +87 -0
  200. package/extensions/ublocklite/rulesets/scripting/generic/annoyances-cookies.js +3 -3
  201. package/extensions/ublocklite/rulesets/scripting/generic/annoyances-others.js +3 -3
  202. package/extensions/ublocklite/rulesets/scripting/generic/annoyances-social.js +3 -3
  203. package/extensions/ublocklite/rulesets/scripting/generic/chn-0.js +3 -3
  204. package/extensions/ublocklite/rulesets/scripting/generic/deu-0.js +2 -2
  205. package/extensions/ublocklite/rulesets/scripting/generic/easylist.js +3 -3
  206. package/extensions/ublocklite/rulesets/scripting/generic/fin-0.js +1 -1
  207. package/extensions/ublocklite/rulesets/scripting/generic/fra-0.js +2 -2
  208. package/extensions/ublocklite/rulesets/scripting/generic/idn-0.js +3 -3
  209. package/extensions/ublocklite/rulesets/scripting/generic/isr-0.js +1 -1
  210. package/extensions/ublocklite/rulesets/scripting/generic/nor-0.js +3 -3
  211. package/extensions/ublocklite/rulesets/scripting/generic/rus-0.js +3 -3
  212. package/extensions/ublocklite/rulesets/scripting/generic/spa-0.js +2 -2
  213. package/extensions/ublocklite/rulesets/scripting/generic/spa-1.js +2 -2
  214. package/extensions/ublocklite/rulesets/scripting/generic/swe-1.js +1 -1
  215. package/extensions/ublocklite/rulesets/scripting/generic/tur-0.js +1 -1
  216. package/extensions/ublocklite/rulesets/scripting/generic/ublock-filters.js +3 -3
  217. package/extensions/ublocklite/rulesets/scripting/generic/vie-1.js +3 -3
  218. package/extensions/ublocklite/rulesets/scripting/generichigh/adguard-mobile.css +39 -0
  219. package/extensions/ublocklite/rulesets/scripting/generichigh/annoyances-cookies.css +0 -2
  220. package/extensions/ublocklite/rulesets/scripting/generichigh/chn-0.css +1 -1
  221. package/extensions/ublocklite/rulesets/scripting/generichigh/easylist.css +3 -14
  222. package/extensions/ublocklite/rulesets/scripting/generichigh/fra-0.css +0 -2
  223. package/extensions/ublocklite/rulesets/scripting/generichigh/idn-0.css +129 -139
  224. package/extensions/ublocklite/rulesets/scripting/generichigh/rus-0.css +1 -0
  225. package/extensions/ublocklite/rulesets/scripting/generichigh/tur-0.css +1 -0
  226. package/extensions/ublocklite/rulesets/scripting/generichigh/ublock-filters.css +1 -0
  227. package/extensions/ublocklite/rulesets/scripting/procedural/adguard-mobile.js +42 -0
  228. package/extensions/ublocklite/rulesets/scripting/procedural/annoyances-cookies.js +3 -3
  229. package/extensions/ublocklite/rulesets/scripting/procedural/annoyances-others.js +3 -3
  230. package/extensions/ublocklite/rulesets/scripting/procedural/annoyances-overlays.js +3 -3
  231. package/extensions/ublocklite/rulesets/scripting/procedural/chn-0.js +1 -1
  232. package/extensions/ublocklite/rulesets/scripting/procedural/deu-0.js +3 -3
  233. package/extensions/ublocklite/rulesets/scripting/procedural/easylist.js +3 -3
  234. package/extensions/ublocklite/rulesets/scripting/procedural/hun-0.js +3 -3
  235. package/extensions/ublocklite/rulesets/scripting/procedural/idn-0.js +2 -2
  236. package/extensions/ublocklite/rulesets/scripting/procedural/ind-0.js +3 -3
  237. package/extensions/ublocklite/rulesets/scripting/procedural/ita-0.js +3 -3
  238. package/extensions/ublocklite/rulesets/scripting/procedural/jpn-1.js +3 -3
  239. package/extensions/ublocklite/rulesets/scripting/procedural/kor-1.js +1 -1
  240. package/extensions/ublocklite/rulesets/scripting/procedural/rus-0.js +3 -3
  241. package/extensions/ublocklite/rulesets/scripting/procedural/spa-0.js +3 -3
  242. package/extensions/ublocklite/rulesets/scripting/procedural/spa-1.js +3 -3
  243. package/extensions/ublocklite/rulesets/scripting/procedural/swe-1.js +3 -3
  244. package/extensions/ublocklite/rulesets/scripting/procedural/ublock-filters.js +3 -3
  245. package/extensions/ublocklite/rulesets/scripting/procedural/ukr-0.js +3 -3
  246. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.abort-current-script.js +451 -0
  247. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.abort-on-property-read.js +369 -0
  248. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.abort-on-property-write.js +347 -0
  249. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.addEventListener-defuser.js +498 -0
  250. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.adjust-setInterval.js +332 -0
  251. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.prevent-setTimeout.js +443 -0
  252. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.remove-attr.js +405 -0
  253. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.remove-class.js +396 -0
  254. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.remove-node-text.js +449 -0
  255. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.set-constant.js +541 -0
  256. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.set-cookie-reload.js +437 -0
  257. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.set-cookie.js +433 -0
  258. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.set-local-storage-item.js +399 -0
  259. package/extensions/ublocklite/rulesets/scripting/scriptlet/adguard-mobile.set-session-storage-item.js +399 -0
  260. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-cookies.remove-class.js +2 -2
  261. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-cookies.set-constant.js +1 -1
  262. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-cookies.set-cookie.js +2 -2
  263. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-cookies.set-local-storage-item.js +2 -2
  264. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-cookies.trusted-click-element.js +2 -2
  265. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-cookies.trusted-set-cookie-reload.js +2 -2
  266. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-cookies.trusted-set-cookie.js +2 -2
  267. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-cookies.trusted-set-local-storage-item.js +2 -2
  268. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-overlays.abort-current-script.js +2 -2
  269. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-overlays.abort-on-property-read.js +1 -1
  270. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-overlays.addEventListener-defuser.js +1 -1
  271. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-overlays.remove-cookie.js +2 -2
  272. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-overlays.remove-node-text.js +2 -2
  273. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-overlays.set-constant.js +1 -1
  274. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-overlays.set-cookie.js +2 -2
  275. package/extensions/ublocklite/rulesets/scripting/scriptlet/annoyances-overlays.trusted-set-local-storage-item.js +1 -1
  276. package/extensions/ublocklite/rulesets/scripting/scriptlet/chn-0.abort-current-script.js +2 -2
  277. package/extensions/ublocklite/rulesets/scripting/scriptlet/chn-0.prevent-setTimeout.js +1 -1
  278. package/extensions/ublocklite/rulesets/scripting/scriptlet/chn-0.remove-attr.js +1 -1
  279. package/extensions/ublocklite/rulesets/scripting/scriptlet/easyprivacy.set-constant.js +2 -2
  280. package/extensions/ublocklite/rulesets/scripting/scriptlet/idn-0.addEventListener-defuser.js +2 -2
  281. package/extensions/ublocklite/rulesets/scripting/scriptlet/jpn-1.addEventListener-defuser.js +2 -2
  282. package/extensions/ublocklite/rulesets/scripting/scriptlet/jpn-1.prevent-fetch.js +2 -2
  283. package/extensions/ublocklite/rulesets/scripting/scriptlet/jpn-1.prevent-refresh.js +330 -0
  284. package/extensions/ublocklite/rulesets/scripting/scriptlet/jpn-1.remove-attr.js +1 -1
  285. package/extensions/ublocklite/rulesets/scripting/scriptlet/jpn-1.set-constant.js +2 -2
  286. package/extensions/ublocklite/rulesets/scripting/scriptlet/kor-1.abort-current-script.js +2 -2
  287. package/extensions/ublocklite/rulesets/scripting/scriptlet/nld-0.adjust-setTimeout.js +2 -2
  288. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.abort-on-property-read.js +2 -2
  289. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.addEventListener-defuser.js +3 -3
  290. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.json-prune-fetch-response.js +2 -2
  291. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.remove-node-text.js +3 -3
  292. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.set-constant.js +3 -3
  293. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-0.set-cookie.js +2 -2
  294. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-1.json-prune.js +1 -1
  295. package/extensions/ublocklite/rulesets/scripting/scriptlet/rus-1.set-constant.js +1 -1
  296. package/extensions/ublocklite/rulesets/scripting/scriptlet/spa-1.abort-on-property-read.js +2 -2
  297. package/extensions/ublocklite/rulesets/scripting/scriptlet/spa-1.adjust-setInterval.js +2 -2
  298. package/extensions/ublocklite/rulesets/scripting/scriptlet/spa-1.adjust-setTimeout.js +2 -2
  299. package/extensions/ublocklite/rulesets/scripting/scriptlet/spa-1.noeval-if.js +2 -2
  300. package/extensions/ublocklite/rulesets/scripting/scriptlet/spa-1.prevent-fetch.js +1 -1
  301. package/extensions/ublocklite/rulesets/scripting/scriptlet/spa-1.prevent-setTimeout.js +3 -3
  302. package/extensions/ublocklite/rulesets/scripting/scriptlet/spa-1.set-constant.js +2 -2
  303. package/extensions/ublocklite/rulesets/scripting/scriptlet/spa-1.set-cookie.js +3 -3
  304. package/extensions/ublocklite/rulesets/scripting/scriptlet/spa-1.set-local-storage-item.js +3 -3
  305. package/extensions/ublocklite/rulesets/scripting/scriptlet/spa-1.set-session-storage-item.js +399 -0
  306. package/extensions/ublocklite/rulesets/scripting/scriptlet/swe-1.addEventListener-defuser.js +1 -1
  307. package/extensions/ublocklite/rulesets/scripting/scriptlet/swe-1.href-sanitizer.js +2 -2
  308. package/extensions/ublocklite/rulesets/scripting/scriptlet/swe-1.remove-cookie.js +2 -2
  309. package/extensions/ublocklite/rulesets/scripting/scriptlet/swe-1.remove-node-text.js +2 -2
  310. package/extensions/ublocklite/rulesets/scripting/scriptlet/tur-0.abort-current-script.js +2 -2
  311. package/extensions/ublocklite/rulesets/scripting/scriptlet/tur-0.abort-on-property-read.js +2 -2
  312. package/extensions/ublocklite/rulesets/scripting/scriptlet/tur-0.abort-on-stack-trace.js +421 -0
  313. package/extensions/ublocklite/rulesets/scripting/scriptlet/tur-0.addEventListener-defuser.js +2 -2
  314. package/extensions/ublocklite/rulesets/scripting/scriptlet/tur-0.prevent-window-open.js +2 -2
  315. package/extensions/ublocklite/rulesets/scripting/scriptlet/tur-0.prevent-xhr.js +2 -2
  316. package/extensions/ublocklite/rulesets/scripting/scriptlet/tur-0.remove-node-text.js +3 -3
  317. package/extensions/ublocklite/rulesets/scripting/scriptlet/tur-0.set-constant.js +2 -2
  318. package/extensions/ublocklite/rulesets/scripting/scriptlet/tur-0.set-local-storage-item.js +2 -2
  319. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.abort-current-script.js +3 -3
  320. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.abort-on-property-read.js +1 -1
  321. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.abort-on-property-write.js +2 -2
  322. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.abort-on-stack-trace.js +3 -3
  323. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.addEventListener-defuser.js +3 -3
  324. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.adjust-setInterval.js +1 -1
  325. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.disable-newtab-links.js +1 -1
  326. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.href-sanitizer.js +2 -2
  327. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.json-edit.js +788 -0
  328. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.json-prune-fetch-response.js +2 -2
  329. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.json-prune-xhr-response.js +3 -3
  330. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.json-prune.js +3 -3
  331. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.jsonl-edit-xhr-response.js +809 -0
  332. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.noeval-if.js +1 -1
  333. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.nowebrtc.js +1 -1
  334. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.prevent-fetch.js +2 -2
  335. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.prevent-requestAnimationFrame.js +2 -2
  336. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.prevent-setInterval.js +2 -2
  337. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.prevent-setTimeout.js +3 -3
  338. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.prevent-window-open.js +3 -3
  339. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.prevent-xhr.js +2 -2
  340. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.remove-attr.js +2 -2
  341. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.remove-cookie.js +2 -2
  342. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.remove-node-text.js +4 -4
  343. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.set-constant.js +3 -3
  344. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.set-cookie.js +2 -2
  345. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.set-local-storage-item.js +2 -2
  346. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.set-session-storage-item.js +2 -2
  347. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.spoof-css.js +2 -2
  348. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.trusted-replace-node-text.js +3 -3
  349. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.trusted-replace-xhr-response.js +2 -2
  350. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.trusted-set-constant.js +1 -1
  351. package/extensions/ublocklite/rulesets/scripting/scriptlet/ublock-filters.trusted-suppress-native-method.js +2 -2
  352. package/extensions/ublocklite/rulesets/scripting/scriptlet/ubol-tests.jsonl-edit-fetch-response.js +5 -3
  353. package/extensions/ublocklite/rulesets/scripting/scriptlet/ubol-tests.jsonl-edit-xhr-response.js +5 -3
  354. package/extensions/ublocklite/rulesets/scripting/scriptlet/vie-1.abort-current-script.js +2 -2
  355. package/extensions/ublocklite/rulesets/scripting/scriptlet/vie-1.abort-on-property-read.js +2 -2
  356. package/extensions/ublocklite/rulesets/scripting/scriptlet/vie-1.m3u-prune.js +1 -1
  357. package/extensions/ublocklite/rulesets/scripting/scriptlet/vie-1.set-constant.js +2 -2
  358. package/extensions/ublocklite/rulesets/scripting/specific/adguard-mobile.js +42 -0
  359. package/extensions/ublocklite/rulesets/scripting/specific/annoyances-cookies.js +3 -3
  360. package/extensions/ublocklite/rulesets/scripting/specific/annoyances-others.js +3 -3
  361. package/extensions/ublocklite/rulesets/scripting/specific/annoyances-overlays.js +3 -3
  362. package/extensions/ublocklite/rulesets/scripting/specific/annoyances-social.js +3 -3
  363. package/extensions/ublocklite/rulesets/scripting/specific/chn-0.js +3 -3
  364. package/extensions/ublocklite/rulesets/scripting/specific/deu-0.js +3 -3
  365. package/extensions/ublocklite/rulesets/scripting/specific/easylist.js +3 -3
  366. package/extensions/ublocklite/rulesets/scripting/specific/fin-0.js +3 -3
  367. package/extensions/ublocklite/rulesets/scripting/specific/fra-0.js +3 -3
  368. package/extensions/ublocklite/rulesets/scripting/specific/grc-0.js +3 -3
  369. package/extensions/ublocklite/rulesets/scripting/specific/hun-0.js +3 -3
  370. package/extensions/ublocklite/rulesets/scripting/specific/idn-0.js +3 -3
  371. package/extensions/ublocklite/rulesets/scripting/specific/ind-0.js +3 -3
  372. package/extensions/ublocklite/rulesets/scripting/specific/isr-0.js +3 -3
  373. package/extensions/ublocklite/rulesets/scripting/specific/ita-0.js +3 -3
  374. package/extensions/ublocklite/rulesets/scripting/specific/jpn-1.js +3 -3
  375. package/extensions/ublocklite/rulesets/scripting/specific/kor-1.js +3 -3
  376. package/extensions/ublocklite/rulesets/scripting/specific/nld-0.js +3 -3
  377. package/extensions/ublocklite/rulesets/scripting/specific/nor-0.js +3 -3
  378. package/extensions/ublocklite/rulesets/scripting/specific/rou-1.js +3 -3
  379. package/extensions/ublocklite/rulesets/scripting/specific/rus-0.js +3 -3
  380. package/extensions/ublocklite/rulesets/scripting/specific/spa-0.js +3 -3
  381. package/extensions/ublocklite/rulesets/scripting/specific/spa-1.js +3 -3
  382. package/extensions/ublocklite/rulesets/scripting/specific/swe-1.js +3 -3
  383. package/extensions/ublocklite/rulesets/scripting/specific/tur-0.js +3 -3
  384. package/extensions/ublocklite/rulesets/scripting/specific/ublock-filters.js +3 -3
  385. package/extensions/ublocklite/rulesets/scripting/specific/ukr-0.js +3 -3
  386. package/extensions/ublocklite/rulesets/scripting/specific/vie-1.js +3 -3
  387. package/extensions/ublocklite/rulesets/scriptlet-details.json +431 -273
  388. package/extensions/ublocklite/rulesets/strictblock/adguard-mobile.json +891 -0
  389. package/extensions/ublocklite/rulesets/strictblock/annoyances-cookies.json +8 -1
  390. package/extensions/ublocklite/rulesets/strictblock/annoyances-widgets.json +1 -0
  391. package/extensions/ublocklite/rulesets/strictblock/chn-0.json +257 -4
  392. package/extensions/ublocklite/rulesets/strictblock/deu-0.json +1 -0
  393. package/extensions/ublocklite/rulesets/strictblock/easylist.json +15 -13
  394. package/extensions/ublocklite/rulesets/strictblock/easyprivacy.json +137 -695
  395. package/extensions/ublocklite/rulesets/strictblock/fra-0.json +245 -78
  396. package/extensions/ublocklite/rulesets/strictblock/hun-0.json +1 -1
  397. package/extensions/ublocklite/rulesets/strictblock/isr-0.json +0 -12
  398. package/extensions/ublocklite/rulesets/strictblock/ita-0.json +1 -1
  399. package/extensions/ublocklite/rulesets/strictblock/jpn-1.json +157 -152
  400. package/extensions/ublocklite/rulesets/strictblock/kor-1.json +2 -0
  401. package/extensions/ublocklite/rulesets/strictblock/pgl.json +6 -18
  402. package/extensions/ublocklite/rulesets/strictblock/pol-0.json +1 -0
  403. package/extensions/ublocklite/rulesets/strictblock/rou-1.json +1 -0
  404. package/extensions/ublocklite/rulesets/strictblock/rus-0.json +0 -1
  405. package/extensions/ublocklite/rulesets/strictblock/rus-1.json +1 -0
  406. package/extensions/ublocklite/rulesets/strictblock/spa-0.json +2 -0
  407. package/extensions/ublocklite/rulesets/strictblock/spa-1.json +1 -0
  408. package/extensions/ublocklite/rulesets/strictblock/stevenblack-hosts.json +14117 -4504
  409. package/extensions/ublocklite/rulesets/strictblock/swe-1.json +0 -2
  410. package/extensions/ublocklite/rulesets/strictblock/tur-0.json +3 -0
  411. package/extensions/ublocklite/rulesets/strictblock/ublock-badware.json +584 -614
  412. package/extensions/ublocklite/rulesets/strictblock/ublock-filters.json +1 -1
  413. package/extensions/ublocklite/rulesets/strictblock/ukr-0.json +2 -0
  414. package/extensions/ublocklite/rulesets/strictblock/urlhaus-full.json +439 -846
  415. package/extensions/ublocklite/rulesets/strictblock/vie-1.json +2 -9
  416. package/extensions/ublocklite/rulesets/urlskip/ublock-filters.json +61 -1
  417. package/extensions/ublocklite/ublock.zip +0 -0
  418. package/extensions/ublocklite/zapper-ui.html +7 -1
  419. package/package.json +14 -14
  420. package/scripts/build-open-api.js +16 -4
  421. package/src/browsers/index.ts +6 -0
  422. package/src/limiter.ts +7 -2
  423. package/src/routes/chromium/tests/websocket.spec.ts +1 -1
  424. package/static/docs/swagger.json +57 -44
  425. package/static/docs/swagger.min.json +56 -43
  426. package/static/function/client.js +8 -5
  427. package/static/function/index.html +8 -5
  428. package/extensions/ublocklite/rulesets/main/pol-3.json +0 -56707
  429. package/extensions/ublocklite/rulesets/strictblock/pol-3.json +0 -56714
@@ -0,0 +1,889 @@
1
+ /*******************************************************************************
2
+
3
+ uBlock Origin Lite - a comprehensive, MV3-compliant content blocker
4
+ Copyright (C) 2014-present Raymond Hill
5
+
6
+ This program is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program. If not, see {http://www.gnu.org/licenses/}.
18
+
19
+ Home: https://github.com/gorhill/uBlock
20
+ */
21
+
22
+ import {
23
+ browser,
24
+ localRead,
25
+ localRemove,
26
+ localWrite,
27
+ sendMessage,
28
+ } from './ext.js';
29
+ import { dom, qs$ } from './dom.js';
30
+ import { rulesFromText, textFromRules } from './dnr-parser.js';
31
+ import { dnr } from './ext-compat.js';
32
+ import { i18n$ } from './i18n.js';
33
+
34
+ /******************************************************************************/
35
+
36
+ // Details of YAML document(s) intersecting with a text span. If the text span
37
+ // starts on a YAML document divider, the previous YAML document will be
38
+ // included. If the text span ends on a YAML document divider, the next YAML
39
+ // document will be included.
40
+
41
+ function snapToYamlDocument(doc, start, end) {
42
+ let yamlDocStart = doc.lineAt(start).number;
43
+ if ( reYamlDocSeparator.test(doc.line(yamlDocStart).text) ) {
44
+ if ( yamlDocStart > 1 ) {
45
+ yamlDocStart -= 1;
46
+ }
47
+ }
48
+ while ( yamlDocStart > 1 ) {
49
+ const line = doc.line(yamlDocStart);
50
+ if ( reYamlDocSeparator.test(line.text) ) { break; }
51
+ yamlDocStart -= 1;
52
+ }
53
+ const lastLine = doc.lines;
54
+ let yamlDocEnd = doc.lineAt(end).number;
55
+ if ( reYamlDocSeparator.test(doc.line(yamlDocEnd).text) ) {
56
+ if ( yamlDocEnd < lastLine ) {
57
+ yamlDocEnd += 1;
58
+ }
59
+ }
60
+ while ( yamlDocEnd < lastLine ) {
61
+ const line = doc.line(yamlDocEnd);
62
+ if ( reYamlDocSeparator.test(line.text) ) { break; }
63
+ yamlDocEnd += 1;
64
+ }
65
+ return { yamlDocStart, yamlDocEnd };
66
+ }
67
+
68
+ function rangeFromTransaction(transaction) {
69
+ let from, to;
70
+ transaction.changes.iterChangedRanges((fromA, toA, fromB, toB) => {
71
+ if ( from === undefined || fromB < from ) { from = fromB; }
72
+ if ( to === undefined || toB > to ) { to = toB; }
73
+ });
74
+ return { from, to };
75
+ }
76
+
77
+ function addToModifiedRange(transaction) {
78
+ const { from, to } = rangeFromTransaction(transaction);
79
+ if ( from === undefined || to === undefined ) { return; }
80
+ const { newDoc } = transaction;
81
+ const { yamlDocStart, yamlDocEnd } = snapToYamlDocument(newDoc, from, to);
82
+ if ( modifiedRange.start === -1 || yamlDocStart < modifiedRange.start ) {
83
+ modifiedRange.start = yamlDocStart;
84
+ }
85
+ if ( modifiedRange.end === -1 || yamlDocEnd > modifiedRange.end ) {
86
+ modifiedRange.end = yamlDocEnd;
87
+ }
88
+ }
89
+
90
+ const reYamlDocSeparator = /^(?:---|...)\s*$/;
91
+ const modifiedRange = { start: -1, end: -1 };
92
+
93
+ /******************************************************************************/
94
+
95
+ function rulesFromJSON(json) {
96
+ let content = json.trim();
97
+ if ( /^[[{]/.test(content) === false ) {
98
+ const match = /^[^[{]+/.exec(content);
99
+ if ( match === null ) { return; }
100
+ content = content.slice(match[0].length);
101
+ }
102
+ const firstChar = content.charAt(0);
103
+ const expectedLastChar = firstChar === '[' ? ']' : '}';
104
+ if ( content.at(-1) !== expectedLastChar ) {
105
+ const re = new RegExp(`\\${expectedLastChar}[^\\${expectedLastChar}]+$`);
106
+ const match = re.exec(content);
107
+ if ( match === null ) { return; }
108
+ content = content.slice(0, match.index+1);
109
+ }
110
+ if ( content.startsWith('{') && content.endsWith('}') ) {
111
+ content = `[${content}]`;
112
+ }
113
+ try {
114
+ const rules = JSON.parse(content);
115
+ if ( Array.isArray(rules) ) { return rules; }
116
+ }
117
+ catch {
118
+ }
119
+ }
120
+
121
+ /******************************************************************************/
122
+
123
+ function lineIndentAt(line) {
124
+ const match = /^(?: {2})*/.exec(line.text);
125
+ const indent = match !== null ? match[0].length : -1;
126
+ if ( indent === -1 || (indent & 1) !== 0 ) { return -1; }
127
+ return indent / 2;
128
+ }
129
+
130
+ function getScopeAt(from) {
131
+ const { doc } = cmRules.state;
132
+ const lineFrom = doc.lineAt(from);
133
+ let depth = lineIndentAt(lineFrom);
134
+ if ( depth === -1 ) { return; }
135
+ const text = lineFrom.text.trim();
136
+ if ( text.startsWith('#') ) { return; }
137
+ const path = [];
138
+ const pos = text.indexOf(':');
139
+ if ( pos !== -1 ) {
140
+ path.push(text.slice(0, pos+1));
141
+ }
142
+ let lineNo = lineFrom.number;
143
+ while ( depth > 0 && lineNo > 1 ) {
144
+ lineNo -= 1;
145
+ const lineBefore = doc.line(lineNo);
146
+ const text = lineBefore.text.trim();
147
+ if ( text.startsWith('#') ) { continue; }
148
+ if ( lineIndentAt(lineBefore) > (depth-1) ) { continue; }
149
+ const match = /^- ([^:]+:)/.exec(text);
150
+ if ( match !== null ) {
151
+ path.unshift(match[1]);
152
+ } else {
153
+ path.unshift(text);
154
+ }
155
+ depth -= 1;
156
+ }
157
+ return path.join('');
158
+ }
159
+
160
+ function getAutocompleteCandidates(from) {
161
+ const scope = getScopeAt(from);
162
+ switch ( scope ) {
163
+ case '':
164
+ return {
165
+ before: /^$/,
166
+ candidates: [
167
+ { token: 'action:', after: '\n ' },
168
+ { token: 'condition:', after: '\n ' },
169
+ { token: 'priority:', after: ' ' },
170
+ { token: '---', after: '\n' },
171
+ ]
172
+ };
173
+ case 'action:':
174
+ return {
175
+ before: /^ {2}$/,
176
+ candidates: [
177
+ { token: 'type:', after: ' ' },
178
+ { token: 'redirect:', after: '\n ' },
179
+ { token: 'requestHeaders:', after: '\n - header: ' },
180
+ { token: 'responseHeaders:', after: '\n - header: ' },
181
+ ],
182
+ };
183
+ case 'action:type:':
184
+ return {
185
+ before: /: $/,
186
+ candidates: [
187
+ { token: 'block', after: '\n ' },
188
+ { token: 'redirect', after: '\n ' },
189
+ { token: 'allow', after: '\n ' },
190
+ { token: 'modifyHeaders', after: '\n ' },
191
+ { token: 'upgradeScheme', after: '\n ' },
192
+ { token: 'allowAllRequest', after: '\n ' },
193
+ ],
194
+ };
195
+ case 'action:redirect:':
196
+ return {
197
+ before: /^ {4}$/,
198
+ candidates: [
199
+ { token: 'extensionPath:', after: ' ' },
200
+ { token: 'regexSubstitution:', after: ' ' },
201
+ { token: 'transform:', after: '\n ' },
202
+ { token: 'url:', after: ' ' },
203
+ ],
204
+ };
205
+ case 'action:redirect:transform:':
206
+ return {
207
+ before: /^ {6}$/,
208
+ candidates: [
209
+ { token: 'fragment:', after: ' ' },
210
+ { token: 'host:', after: ' ' },
211
+ { token: 'path:', after: ' ' },
212
+ { token: 'port:', after: ' ' },
213
+ { token: 'query:', after: ' ' },
214
+ { token: 'scheme:', after: ' ' },
215
+ { token: 'queryTransform:', after: '\n ' },
216
+ ],
217
+ };
218
+ case 'action:redirect:transform:queryTransform:':
219
+ return {
220
+ before: /^ {8}$/,
221
+ candidates: [
222
+ { token: 'addOrReplaceParams:', after: '\n - ' },
223
+ { token: 'removeParams:', after: '\n - ' },
224
+ ],
225
+ };
226
+ case 'action:responseHeaders:':
227
+ case 'action:requestHeaders:':
228
+ return {
229
+ before: /^ {4}- $/,
230
+ candidates: [
231
+ { token: 'header:', after: ' ' },
232
+ ],
233
+ };
234
+ case 'action:responseHeaders:header:':
235
+ case 'action:requestHeaders:header:':
236
+ return {
237
+ before: /^ {6}$/,
238
+ candidates: [
239
+ { token: 'operation:', after: ' ' },
240
+ { token: 'value:', after: ' ' },
241
+ ],
242
+ };
243
+ case 'action:responseHeaders:header:operation:':
244
+ case 'action:requestHeaders:header:operation:':
245
+ return {
246
+ before: /: $/,
247
+ candidates: [
248
+ { token: 'append', after: '\n value: ' },
249
+ { token: 'set', after: '\n value: ' },
250
+ { token: 'remove', after: '\n ' },
251
+ ],
252
+ };
253
+ case 'condition:':
254
+ return {
255
+ before: /^ {2}$/,
256
+ candidates: [
257
+ { token: 'domainType:', after: ' ' },
258
+ { token: 'isUrlFilterCaseSensitive:', after: ' ' },
259
+ { token: 'regexFilter:', after: ' ' },
260
+ { token: 'urlFilter:', after: ' ' },
261
+ { token: 'initiatorDomains:', after: '\n - ' },
262
+ { token: 'excludedInitiatorDomains:', after: '\n - ' },
263
+ { token: 'requestDomains:', after: '\n - ' },
264
+ { token: 'excludedRequestDomains:', after: '\n - ' },
265
+ { token: 'resourceTypes:', after: '\n - ' },
266
+ { token: 'excludedResourceTypes:', after: '\n - ' },
267
+ { token: 'requestMethods:', after: '\n - ' },
268
+ { token: 'excludedRequestMethods:', after: '\n - ' },
269
+ { token: 'responseHeaders:', after: '\n - ' },
270
+ { token: 'excludedResponseHeaders:', after: '\n - ' },
271
+ ],
272
+ };
273
+ case 'condition:domainType:':
274
+ return {
275
+ before: /: $/,
276
+ candidates: [
277
+ { token: 'firstParty', after: '\n ' },
278
+ { token: 'thirdParty', after: '\n ' },
279
+ ],
280
+ };
281
+ case 'condition:isUrlFilterCaseSensitive:':
282
+ return {
283
+ before: /: $/,
284
+ candidates: [
285
+ { token: 'true', after: '\n ' },
286
+ { token: 'false', after: '\n ' },
287
+ ],
288
+ };
289
+ case 'condition:requestMethods:':
290
+ case 'condition:excludedRequestMethods:':
291
+ return {
292
+ before: /^ {4}- $/,
293
+ candidates: [
294
+ { token: 'connect', after: '\n - ' },
295
+ { token: 'delete', after: '\n - ' },
296
+ { token: 'get', after: '\n - ' },
297
+ { token: 'head', after: '\n - ' },
298
+ { token: 'options', after: '\n - ' },
299
+ { token: 'patch', after: '\n - ' },
300
+ { token: 'post', after: '\n - ' },
301
+ { token: 'put', after: '\n - ' },
302
+ { token: 'other', after: '\n ' },
303
+ ],
304
+ };
305
+ case 'condition:resourceTypes:':
306
+ case 'condition:excludedResourceTypes:':
307
+ return {
308
+ before: /^ {4}- $/,
309
+ candidates: [
310
+ { token: 'main_frame', after: '\n - ' },
311
+ { token: 'sub_frame', after: '\n - ' },
312
+ { token: 'stylesheet', after: '\n - ' },
313
+ { token: 'script', after: '\n - ' },
314
+ { token: 'image', after: '\n - ' },
315
+ { token: 'font', after: '\n - ' },
316
+ { token: 'object', after: '\n - ' },
317
+ { token: 'xmlhttprequest', after: '\n - ' },
318
+ { token: 'ping', after: '\n - ' },
319
+ { token: 'csp_report', after: '\n - ' },
320
+ { token: 'media', after: '\n - ' },
321
+ { token: 'websocket', after: '\n - ' },
322
+ { token: 'webtransport', after: '\n - ' },
323
+ { token: 'webbundle', after: '\n - ' },
324
+ { token: 'other', after: '\n ' },
325
+ ],
326
+ };
327
+ }
328
+ }
329
+
330
+ function autoComplete(context) {
331
+ const match = context.matchBefore(/[\w-]*/);
332
+ if ( match === undefined ) { return null; }
333
+ const result = getAutocompleteCandidates(match.from);
334
+ if ( result === undefined ) { return null; }
335
+ if ( result.before !== undefined ) {
336
+ const { doc } = context.state;
337
+ const line = doc.lineAt(context.pos);
338
+ const before = doc.sliceString(line.from, match.from);
339
+ if ( result.before.test(before) === false ) { return null; }
340
+ }
341
+ const filtered = result.candidates.filter(e =>
342
+ e.token !== match.text || e.after !== '\n'
343
+ );
344
+ return {
345
+ from: match.from,
346
+ options: filtered.map(e => ({ label: e.token, apply: `${e.token}${e.after}` })),
347
+ validFor: /\w*/,
348
+ };
349
+ }
350
+
351
+ /******************************************************************************/
352
+
353
+ function setEditorText(text) {
354
+ if ( text === undefined ) { return; }
355
+ if ( text !== '' ) { text += '\n'; }
356
+ cmRules.dispatch({
357
+ changes: {
358
+ from: 0, to: cmRules.state.doc.length,
359
+ insert: text,
360
+ },
361
+ });
362
+ cmRules.focus();
363
+ }
364
+
365
+ function getEditorText() {
366
+ return cmRules.state.doc.toString();
367
+ }
368
+
369
+ /******************************************************************************/
370
+
371
+ function saveEditorText() {
372
+ const text = getEditorText().trim();
373
+ const promise = text.length !== 0
374
+ ? localWrite('userDnrRules', text)
375
+ : localRemove('userDnrRules');
376
+ promise.then(( ) => {
377
+ lastSavedText = text;
378
+ updateView();
379
+ }).then(( ) =>
380
+ sendMessage({ what: 'updateUserDnrRules' })
381
+ ).then(result => {
382
+ if ( result instanceof Object === false ) { return; }
383
+ updateFeedbackPanel(result);
384
+ });
385
+ }
386
+
387
+ /******************************************************************************/
388
+
389
+ async function validateRegexes(regexes) {
390
+ if ( regexes.length === 0 ) { return; }
391
+ const promises = regexes.map(regex => validateRegex(regex));
392
+ await Promise.all(promises);
393
+ for ( const regex of regexes ) {
394
+ const i = validatedRegexes.regexes.indexOf(regex);
395
+ if ( i === -1 ) { continue; }
396
+ const reason = validatedRegexes.results[i];
397
+ if ( reason === true ) { continue; }
398
+ const entries = self.cm6.findAll(cmRules,
399
+ `(?<=\\bregexFilter: )${RegExp.escape(regex)}`
400
+ );
401
+ for ( const entry of entries ) {
402
+ self.cm6.spanErrorAdd(cmRules, entry.from, entry.to, reason);
403
+ }
404
+ }
405
+ }
406
+
407
+ async function validateRegex(regex) {
408
+ const details = await dnr.isRegexSupported({ regex });
409
+ const result = details.isSupported || details.reason;
410
+ if ( validatedRegexes.regexes.length > 32 ) {
411
+ validatedRegexes.regexes.pop();
412
+ validatedRegexes.results.pop();
413
+ }
414
+ validatedRegexes.regexes.unshift(regex);
415
+ validatedRegexes.results.unshift(result);
416
+ }
417
+
418
+ const validatedRegexes = {
419
+ regexes: [],
420
+ results: [],
421
+ };
422
+
423
+ /******************************************************************************/
424
+
425
+ function updateView() {
426
+ const { doc } = cmRules.state;
427
+ const changed = doc.toString().trim() !==
428
+ lastSavedText.trim();
429
+ dom.attr('#dnrRulesApply', 'disabled', changed ? null : '');
430
+ dom.attr('#dnrRulesRevert', 'disabled', changed ? null : '');
431
+ const { start, end } = modifiedRange;
432
+ if ( start === -1 || end === -1 ) { return; }
433
+ modifiedRange.start = modifiedRange.end = -1;
434
+ self.cm6.lineErrorClear(cmRules, start, end);
435
+ self.cm6.spanErrorClear(cmRules, start, end);
436
+ const firstLine = doc.line(start);
437
+ const lastLine = doc.line(end);
438
+ const text = doc.sliceString(firstLine.from, lastLine.to);
439
+ const { bad } = rulesFromText(text);
440
+ if ( Array.isArray(bad) && bad.length !== 0 ) {
441
+ self.cm6.lineErrorAdd(cmRules, bad.map(i => i + start));
442
+ }
443
+ const entries = self.cm6.findAll(
444
+ cmRules,
445
+ '\\bregexFilter: (\\S+)',
446
+ firstLine.from,
447
+ lastLine.to
448
+ );
449
+ const regexes = [];
450
+ for ( const entry of entries ) {
451
+ const regex = entry.match[1];
452
+ const i = validatedRegexes.regexes.indexOf(regex);
453
+ if ( i !== -1 ) {
454
+ const reason = validatedRegexes.results[i];
455
+ if ( reason === true ) { continue; }
456
+ self.cm6.spanErrorAdd(cmRules, entry.from+13, entry.to, reason);
457
+ } else {
458
+ regexes.push(regex);
459
+ }
460
+ }
461
+ validateRegexes(regexes);
462
+ }
463
+
464
+ function updateViewAsync() {
465
+ if ( updateViewAsync.timer !== undefined ) { return; }
466
+ updateViewAsync.timer = self.setTimeout(( ) => {
467
+ updateViewAsync.timer = undefined;
468
+ updateView();
469
+ }, 71);
470
+ }
471
+
472
+ /******************************************************************************/
473
+
474
+ function updateSummaryPanel(info) {
475
+ self.cm6.showSummaryPanel(cmRules, {
476
+ template: '.summary-panel',
477
+ text: i18n$('dnrRulesCountInfo')
478
+ .replace('{count}', (info.userDnrRuleCount || 0).toLocaleString()),
479
+ });
480
+ }
481
+
482
+ function updateFeedbackPanel(info) {
483
+ const errors = [];
484
+ if ( Array.isArray(info.errors) ) {
485
+ info.errors.forEach(e => errors.push(e));
486
+ }
487
+ const text = errors.join('\n');
488
+ self.cm6.showFeedbackPanel(cmRules, { template: '.feedback-panel', text });
489
+ }
490
+
491
+ /******************************************************************************/
492
+
493
+ function importRulesFromFile() {
494
+ const input = qs$('input[type="file"]');
495
+ input.onchange = ev => {
496
+ input.onchange = null;
497
+ const file = ev.target.files[0];
498
+ if ( file === undefined || file.name === '' ) { return; }
499
+ if ( file.type !== 'application/json' ) { return; }
500
+ const fr = new FileReader();
501
+ fr.onload = ( ) => {
502
+ if ( typeof fr.result !== 'string' ) { return; }
503
+ const rules = rulesFromJSON(fr.result);
504
+ if ( rules === undefined ) { return; }
505
+ const text = textFromRules(rules);
506
+ if ( text === undefined ) { return; }
507
+ const { doc } = cmRules.state;
508
+ const lastChars = doc.toString().trimEnd().slice(-4);
509
+ const lastLine = doc.line(doc.lines);
510
+ let from = lastLine.to;
511
+ let prepend = '';
512
+ if ( lastLine.text !== '' ) {
513
+ prepend = '\n';
514
+ } else {
515
+ from = lastLine.from;
516
+ }
517
+ if ( /(?:^|\n)---$/.test(lastChars) === false ) {
518
+ prepend = `${prepend}---\n`;
519
+ }
520
+ cmRules.dispatch({ changes: { from, insert: `${prepend}${text}` } });
521
+ self.cm6.foldAll(cmRules);
522
+ cmRules.focus();
523
+ };
524
+ fr.readAsText(file);
525
+ };
526
+ // Reset to empty string, this will ensure a change event is properly
527
+ // triggered if the user pick a file, even if it's the same as the last
528
+ // one picked.
529
+ input.value = '';
530
+ input.click();
531
+ }
532
+
533
+ /******************************************************************************/
534
+
535
+ function exportRulesToFile() {
536
+ const text = getEditorText();
537
+ const { rules } = rulesFromText(text);
538
+ if ( Array.isArray(rules) === false ) { return; }
539
+ let ruleId = 1;
540
+ for ( const rule of rules ) {
541
+ rule.id = ruleId++;
542
+ }
543
+ const filename = 'my-ubol-dnr-rules.json';
544
+ const a = document.createElement('a');
545
+ a.href = `data:application/json;charset=utf-8,${JSON.stringify(rules, null, 2)}`;
546
+ dom.attr(a, 'download', filename || '');
547
+ dom.attr(a, 'type', 'application/json');
548
+ a.click();
549
+ }
550
+
551
+ /******************************************************************************/
552
+
553
+ function importRulesFromPaste(transaction) {
554
+ const { from, to } = rangeFromTransaction(transaction);
555
+ if ( from === undefined || to === undefined ) { return; }
556
+ // Paste position must match start of a line
557
+ const { newDoc } = transaction;
558
+ const lineFrom = newDoc.lineAt(from);
559
+ if ( lineFrom.from !== from ) { return; }
560
+ // Paste position must match a rule boundary
561
+ if ( lineFrom.number !== 1 ) {
562
+ const lineBefore = newDoc.line(lineFrom.number-1);
563
+ if ( /^---\s*$/.test(lineBefore.text) === false ) { return; }
564
+ }
565
+ const pastedText = newDoc.sliceString(from, to);
566
+ const rules = rulesFromJSON(pastedText);
567
+ if ( rules === undefined ) { return; }
568
+ const yamlText = textFromRules(rules);
569
+ if ( yamlText === undefined ) { return; }
570
+ cmRules.dispatch({ changes: { from, to, insert: yamlText } });
571
+ self.cm6.foldAll(cmRules);
572
+ return true;
573
+ }
574
+
575
+ /******************************************************************************/
576
+
577
+ function foldService(state, from) {
578
+ const { doc } = state;
579
+ const lineFrom = doc.lineAt(from);
580
+ if ( reFoldable.test(lineFrom.text) === false ) { return null; }
581
+ if ( lineFrom.number <= 5 ) { return null ; }
582
+ const lineBlockStart = doc.line(lineFrom.number - 5);
583
+ if ( reFoldCandidates.test(lineBlockStart.text) === false ) { return null; }
584
+ for ( let i = lineFrom.number-4; i < lineFrom.number; i++ ) {
585
+ const line = doc.line(i);
586
+ if ( reFoldable.test(line.text) === false ) { return null; }
587
+ }
588
+ let i = lineFrom.number + 1;
589
+ for ( ; i <= doc.lines; i++ ) {
590
+ const lineNext = doc.line(i);
591
+ if ( reFoldable.test(lineNext.text) === false ) { break; }
592
+ }
593
+ i -= 1;
594
+ if ( i === lineFrom.number ) { return null; }
595
+ const lineFoldEnd = doc.line(i);
596
+ return { from: lineFrom.from+6, to: lineFoldEnd.to };
597
+ }
598
+
599
+ const reFoldable = /^ {4}- \S/;
600
+ const reFoldCandidates = new RegExp(`^(?: {2})+${[
601
+ 'initiatorDomains',
602
+ 'excludedInitiatorDomains',
603
+ 'requestDomains',
604
+ 'excludedRequestDomains',
605
+ ].join('|')}:$`);
606
+
607
+ /******************************************************************************/
608
+
609
+ function smartBackspace(transaction) {
610
+ const { from, to } = rangeFromTransaction(transaction);
611
+ if ( from === undefined || to === undefined ) { return; }
612
+ if ( to !== from ) { return; }
613
+ const { newDoc } = transaction;
614
+ const line = newDoc.lineAt(from);
615
+ if ( /^(?: {2})+-$/.test(line.text) === false ) { return; }
616
+ cmRules.dispatch({ changes: { from: from-3, to: from, insert: '' } });
617
+ return true;
618
+ }
619
+
620
+ /******************************************************************************/
621
+
622
+ function lineIsArrayItem(doc, lineNo) {
623
+ if ( lineNo < 1 || lineNo > doc.lines ) { return false; }
624
+ const line = doc.line(lineNo);
625
+ return line.text.startsWith(' - ');
626
+ }
627
+
628
+ /******************************************************************************/
629
+
630
+ function smartArrayItem(doc, from) {
631
+ const line = doc.lineAt(from);
632
+ if ( lineIsArrayItem(doc, line.number-1) === false ) {
633
+ if ( lineIsArrayItem(doc, line.number+1) === false ) { return ''; }
634
+ }
635
+ const blanks = /^ {2,4}$/.exec(line.text);
636
+ if ( blanks === null ) { return ''; }
637
+ const count = blanks[0].length;
638
+ return `${' '.repeat(4-count)}- `;
639
+ }
640
+
641
+ /******************************************************************************/
642
+
643
+ function smartReturn(transaction) {
644
+ const { from, to } = rangeFromTransaction(transaction);
645
+ if ( from === undefined || to === undefined ) { return; }
646
+ const { newDoc } = transaction;
647
+ const insert = smartArrayItem(newDoc, to);
648
+ if ( insert === '' ) { return; }
649
+ cmRules.dispatch({
650
+ changes: { from: to, insert },
651
+ selection: { anchor: to + insert.length },
652
+ });
653
+ return true;
654
+ }
655
+
656
+ /******************************************************************************/
657
+
658
+ function smartSpacebar(transaction) {
659
+ const { from, to } = rangeFromTransaction(transaction);
660
+ if ( from === undefined || to === undefined ) { return; }
661
+ if ( (to - from) !== 1 ) { return; }
662
+ const { newDoc } = transaction;
663
+ const line = newDoc.lineAt(to);
664
+ const localTo = to - line.from;
665
+ const before = line.text.slice(0, localTo);
666
+ if ( /^(?: {1}| {3})$/.test(before) === false ) { return; }
667
+ const insert = smartArrayItem(newDoc, to) || ' ';
668
+ cmRules.dispatch({
669
+ changes: { from: to, insert },
670
+ selection: { anchor: to + insert.length },
671
+ });
672
+ return true;
673
+ }
674
+
675
+ /******************************************************************************/
676
+
677
+ const dnryamlStreamParser = {
678
+ name: 'dnryaml',
679
+ startState() {
680
+ return {
681
+ scope: 0,
682
+ reKeywords: new RegExp(`\\b(${[
683
+ 'block',
684
+ 'redirect',
685
+ 'allow',
686
+ 'modifyHeaders',
687
+ 'upgradeScheme',
688
+ 'allowAllRequest',
689
+ 'append',
690
+ 'set',
691
+ 'remove',
692
+ 'firstParty',
693
+ 'thirdParty',
694
+ 'true',
695
+ 'false',
696
+ 'connect',
697
+ 'delete',
698
+ 'get',
699
+ 'head',
700
+ 'options',
701
+ 'patch',
702
+ 'post',
703
+ 'put',
704
+ 'other',
705
+ 'main_frame',
706
+ 'sub_frame',
707
+ 'stylesheet',
708
+ 'script',
709
+ 'image',
710
+ 'font',
711
+ 'object',
712
+ 'xmlhttprequest',
713
+ 'ping',
714
+ 'csp_report',
715
+ 'media',
716
+ 'websocket',
717
+ 'webtransport',
718
+ 'webbundle',
719
+ 'other',
720
+ ].join('|')})\\b`),
721
+ };
722
+ },
723
+ token(stream, state) {
724
+ const c = stream.peek();
725
+ if ( c === '#' ) {
726
+ if ( (stream.pos === 0 || /\s/.test(stream.string.charAt(stream.pos - 1))) ) {
727
+ stream.skipToEnd();
728
+ return 'comment';
729
+ }
730
+ }
731
+ if ( stream.sol() ) {
732
+ if ( stream.match('---') ) { return 'contentSeparator'; }
733
+ if ( stream.match('...') ) { return 'contentSeparator'; }
734
+ }
735
+ if ( stream.eatSpace() ) {
736
+ return null;
737
+ }
738
+ const { scope } = state;
739
+ state.scope = 0;
740
+ if ( scope === 0 && stream.match(/^[^:]+(?=:)/) ) {
741
+ state.scope = 1;
742
+ return 'keyword';
743
+ }
744
+ if ( scope === 1 && stream.match(/^:(?: |$)/) ) {
745
+ return 'meta';
746
+ }
747
+ if ( stream.match(/^- /) ) {
748
+ return 'meta';
749
+ }
750
+ if ( stream.match(state.reKeywords) ) {
751
+ return 'literal';
752
+ }
753
+ if ( stream.match(/^\S+/) ) {
754
+ return null;
755
+ }
756
+ stream.next();
757
+ return null;
758
+ },
759
+ };
760
+
761
+ /******************************************************************************/
762
+
763
+ function cmUpdateListener(info) {
764
+ if ( info.docChanged === false ) { return; }
765
+ for ( const transaction of info.transactions ) {
766
+ if ( transaction.docChanged === false ) { continue; }
767
+ addToModifiedRange(transaction);
768
+ if ( transaction.isUserEvent('delete.backward') ) {
769
+ smartBackspace(transaction);
770
+ } else if ( transaction.isUserEvent('input.paste') ) {
771
+ importRulesFromPaste(transaction);
772
+ } else if ( transaction.isUserEvent('input') ) {
773
+ if ( smartReturn(transaction) ) { continue; }
774
+ smartSpacebar(transaction);
775
+ }
776
+ }
777
+ updateViewAsync();
778
+ }
779
+
780
+ /******************************************************************************/
781
+
782
+ function gutterClick(view, info) {
783
+ const reSeparator = /^---\s*/;
784
+ const { doc } = view.state;
785
+ const lineFirst = doc.lineAt(info.from);
786
+ if ( lineFirst.text === '' ) { return false; }
787
+ let { from, to } = lineFirst;
788
+ if ( reSeparator.test(lineFirst.text) ) {
789
+ let lineNo = lineFirst.number + 1;
790
+ while ( lineNo < doc.lines ) {
791
+ const line = doc.line(lineNo);
792
+ if ( reSeparator.test(line.text) ) { break; }
793
+ to = line.to;
794
+ lineNo += 1;
795
+ }
796
+ }
797
+ view.dispatch({
798
+ selection: { anchor: from, head: to+1 }
799
+ });
800
+ view.focus();
801
+ return true;
802
+ }
803
+
804
+ /******************************************************************************/
805
+
806
+ function hoverTooltip(view, pos, side) {
807
+ const details = view.domAtPos(pos);
808
+ const textNode = details.node;
809
+ if ( textNode.nodeType !== 3 ) { return null; }
810
+ const { parentElement } = textNode;
811
+ const targetElement = parentElement.closest('[data-tooltip]');
812
+ if ( targetElement === null ) { return null; }
813
+ const tooltipText = targetElement.getAttribute('data-tooltip');
814
+ if ( Boolean(tooltipText) === false ) { return null; }
815
+ const start = pos - details.offset;
816
+ const end = start + textNode.nodeValue.length;
817
+ if ( start === pos && side < 0 || end === pos && side > 0 ) { return null; }
818
+ return {
819
+ above: true,
820
+ pos: start,
821
+ end,
822
+ create() {
823
+ const template = document.querySelector('.badmark-tooltip');
824
+ const fragment = template.content.cloneNode(true);
825
+ const dom = fragment.querySelector('.badmark-tooltip');
826
+ dom.textContent = tooltipText;
827
+ return { dom };
828
+ },
829
+ };
830
+ }
831
+
832
+ /******************************************************************************/
833
+
834
+ let lastSavedText = '';
835
+
836
+ const cmRules = await localRead('userDnrRules').then(text => {
837
+ text ||= '';
838
+
839
+ const view = self.cm6.createEditorView({
840
+ text,
841
+ dnrRules: true,
842
+ oneDark: dom.cl.has(':root', 'dark'),
843
+ updateListener: cmUpdateListener,
844
+ saveListener: ( ) => {
845
+ saveEditorText();
846
+ },
847
+ lineError: true,
848
+ spanError: true,
849
+ // https://codemirror.net/examples/autocompletion/
850
+ autocompletion: {
851
+ override: [ autoComplete ],
852
+ activateOnCompletion: ( ) => true,
853
+ },
854
+ gutterClick,
855
+ hoverTooltip,
856
+ streamParser: dnryamlStreamParser,
857
+ foldService,
858
+ }, qs$('#cm-dnrRules'));
859
+
860
+ lastSavedText = text;
861
+ self.cm6.foldAll(view);
862
+ self.cm6.resetUndoRedo(view);
863
+
864
+ browser.storage.onChanged.addListener((changes, area) => {
865
+ if ( area !== 'local' ) { return; }
866
+ const { userDnrRuleCount } = changes;
867
+ if ( userDnrRuleCount instanceof Object === false ) { return; }
868
+ const { newValue } = changes.userDnrRuleCount;
869
+ updateSummaryPanel({ userDnrRuleCount: newValue });
870
+ });
871
+
872
+ localRead('userDnrRuleCount').then(userDnrRuleCount => {
873
+ updateSummaryPanel({ userDnrRuleCount })
874
+ });
875
+
876
+ dom.on('#dnrRulesApply', 'click', ( ) => {
877
+ saveEditorText();
878
+ });
879
+ dom.on('#dnrRulesRevert', 'click', ( ) => {
880
+ setEditorText(lastSavedText);
881
+ sendMessage({ what: 'updateUserDnrRules' });
882
+ });
883
+ dom.on('#dnrRulesImport', 'click', importRulesFromFile);
884
+ dom.on('#dnrRulesExport', 'click', exportRulesToFile);
885
+
886
+ return view;
887
+ });
888
+
889
+ /******************************************************************************/