@browserless.io/browserless 2.5.0 → 2.6.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 (191) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/README.md +55 -36
  3. package/build/config.d.ts +2 -2
  4. package/build/config.js +3 -3
  5. package/build/data/classes.json +1 -1
  6. package/build/data/selectors.json +1 -1
  7. package/build/http.d.ts +1 -0
  8. package/build/http.js +1 -0
  9. package/build/routes/chrome/http/content.post.body.json +8 -8
  10. package/build/routes/chrome/http/pdf.post.body.json +8 -8
  11. package/build/routes/chrome/http/scrape.post.body.json +8 -8
  12. package/build/routes/chrome/http/screenshot.post.body.json +9 -9
  13. package/build/routes/chromium/http/content.post.body.json +8 -8
  14. package/build/routes/chromium/http/pdf.post.body.json +8 -8
  15. package/build/routes/chromium/http/scrape.post.body.json +8 -8
  16. package/build/routes/chromium/http/screenshot.post.body.json +9 -9
  17. package/build/routes/management/http/active.get.d.ts +16 -0
  18. package/build/routes/management/http/active.get.js +17 -0
  19. package/build/routes/management/tests/management.spec.js +7 -0
  20. package/build/server.js +1 -1
  21. package/build/types.d.ts +6 -4
  22. package/build/types.js +1 -0
  23. package/build/utils.d.ts +1 -1
  24. package/docker/base/Dockerfile +1 -1
  25. package/extensions/ublock/1p-filters.html +4 -3
  26. package/extensions/ublock/3p-filters.html +3 -3
  27. package/extensions/ublock/_locales/ar/messages.json +16 -4
  28. package/extensions/ublock/_locales/az/messages.json +16 -4
  29. package/extensions/ublock/_locales/be/messages.json +19 -7
  30. package/extensions/ublock/_locales/bg/messages.json +16 -4
  31. package/extensions/ublock/_locales/bn/messages.json +33 -21
  32. package/extensions/ublock/_locales/br_FR/messages.json +33 -21
  33. package/extensions/ublock/_locales/bs/messages.json +16 -4
  34. package/extensions/ublock/_locales/ca/messages.json +16 -4
  35. package/extensions/ublock/_locales/cs/messages.json +16 -4
  36. package/extensions/ublock/_locales/cv/messages.json +16 -4
  37. package/extensions/ublock/_locales/cy/messages.json +16 -4
  38. package/extensions/ublock/_locales/da/messages.json +21 -9
  39. package/extensions/ublock/_locales/de/messages.json +17 -5
  40. package/extensions/ublock/_locales/el/messages.json +16 -4
  41. package/extensions/ublock/_locales/en/messages.json +16 -4
  42. package/extensions/ublock/_locales/en_GB/messages.json +16 -4
  43. package/extensions/ublock/_locales/eo/messages.json +17 -5
  44. package/extensions/ublock/_locales/es/messages.json +16 -4
  45. package/extensions/ublock/_locales/et/messages.json +16 -4
  46. package/extensions/ublock/_locales/eu/messages.json +16 -4
  47. package/extensions/ublock/_locales/fa/messages.json +24 -12
  48. package/extensions/ublock/_locales/fi/messages.json +16 -4
  49. package/extensions/ublock/_locales/fil/messages.json +16 -4
  50. package/extensions/ublock/_locales/fr/messages.json +16 -4
  51. package/extensions/ublock/_locales/fy/messages.json +16 -4
  52. package/extensions/ublock/_locales/gl/messages.json +16 -4
  53. package/extensions/ublock/_locales/gu/messages.json +16 -4
  54. package/extensions/ublock/_locales/he/messages.json +25 -13
  55. package/extensions/ublock/_locales/hi/messages.json +31 -19
  56. package/extensions/ublock/_locales/hr/messages.json +16 -4
  57. package/extensions/ublock/_locales/hu/messages.json +16 -4
  58. package/extensions/ublock/_locales/hy/messages.json +17 -5
  59. package/extensions/ublock/_locales/id/messages.json +16 -4
  60. package/extensions/ublock/_locales/it/messages.json +17 -5
  61. package/extensions/ublock/_locales/ja/messages.json +16 -4
  62. package/extensions/ublock/_locales/ka/messages.json +16 -4
  63. package/extensions/ublock/_locales/kk/messages.json +16 -4
  64. package/extensions/ublock/_locales/kn/messages.json +74 -62
  65. package/extensions/ublock/_locales/ko/messages.json +16 -4
  66. package/extensions/ublock/_locales/lt/messages.json +23 -11
  67. package/extensions/ublock/_locales/lv/messages.json +16 -4
  68. package/extensions/ublock/_locales/mk/messages.json +16 -4
  69. package/extensions/ublock/_locales/ml/messages.json +19 -7
  70. package/extensions/ublock/_locales/mr/messages.json +16 -4
  71. package/extensions/ublock/_locales/ms/messages.json +16 -4
  72. package/extensions/ublock/_locales/nb/messages.json +16 -4
  73. package/extensions/ublock/_locales/nl/messages.json +16 -4
  74. package/extensions/ublock/_locales/no/messages.json +16 -4
  75. package/extensions/ublock/_locales/oc/messages.json +16 -4
  76. package/extensions/ublock/_locales/pa/messages.json +16 -4
  77. package/extensions/ublock/_locales/pl/messages.json +17 -5
  78. package/extensions/ublock/_locales/pt_BR/messages.json +16 -4
  79. package/extensions/ublock/_locales/pt_PT/messages.json +16 -4
  80. package/extensions/ublock/_locales/ro/messages.json +17 -5
  81. package/extensions/ublock/_locales/ru/messages.json +16 -4
  82. package/extensions/ublock/_locales/si/messages.json +16 -4
  83. package/extensions/ublock/_locales/sk/messages.json +16 -4
  84. package/extensions/ublock/_locales/sl/messages.json +16 -4
  85. package/extensions/ublock/_locales/so/messages.json +16 -4
  86. package/extensions/ublock/_locales/sq/messages.json +16 -4
  87. package/extensions/ublock/_locales/sr/messages.json +16 -4
  88. package/extensions/ublock/_locales/sv/messages.json +20 -8
  89. package/extensions/ublock/_locales/sw/messages.json +16 -4
  90. package/extensions/ublock/_locales/ta/messages.json +16 -4
  91. package/extensions/ublock/_locales/te/messages.json +16 -4
  92. package/extensions/ublock/_locales/th/messages.json +42 -30
  93. package/extensions/ublock/_locales/tr/messages.json +19 -7
  94. package/extensions/ublock/_locales/uk/messages.json +16 -4
  95. package/extensions/ublock/_locales/ur/messages.json +16 -4
  96. package/extensions/ublock/_locales/vi/messages.json +16 -4
  97. package/extensions/ublock/_locales/zh_CN/messages.json +16 -4
  98. package/extensions/ublock/_locales/zh_TW/messages.json +42 -30
  99. package/extensions/ublock/assets/assets.json +95 -78
  100. package/extensions/ublock/assets/resources/scriptlets.js +70 -24
  101. package/extensions/ublock/assets/thirdparties/easylist/easylist.txt +6258 -3453
  102. package/extensions/ublock/assets/thirdparties/easylist/easyprivacy.txt +277 -40
  103. package/extensions/ublock/assets/thirdparties/pgl.yoyo.org/as/serverlist +8 -32
  104. package/extensions/ublock/assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat +107 -12
  105. package/extensions/ublock/assets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt +1160 -954
  106. package/extensions/ublock/assets/ublock/badlists.txt +1 -2
  107. package/extensions/ublock/assets/ublock/badware.min.txt +395 -270
  108. package/extensions/ublock/assets/ublock/filters.min.txt +1176 -1238
  109. package/extensions/ublock/assets/ublock/privacy.min.txt +32 -31
  110. package/extensions/ublock/assets/ublock/quick-fixes.min.txt +120 -110
  111. package/extensions/ublock/assets/ublock/unbreak.min.txt +75 -36
  112. package/extensions/ublock/css/1p-filters.css +2 -1
  113. package/extensions/ublock/css/3p-filters.css +1 -16
  114. package/extensions/ublock/css/advanced-settings.css +1 -0
  115. package/extensions/ublock/css/asset-viewer.css +1 -0
  116. package/extensions/ublock/css/code-viewer.css +1 -0
  117. package/extensions/ublock/css/codemirror.css +37 -10
  118. package/extensions/ublock/css/common.css +36 -2
  119. package/extensions/ublock/css/dashboard.css +9 -3
  120. package/extensions/ublock/css/devtools.css +1 -0
  121. package/extensions/ublock/css/document-blocked.css +3 -3
  122. package/extensions/ublock/css/dom-inspector.css +1 -0
  123. package/extensions/ublock/css/dyna-rules.css +1 -0
  124. package/extensions/ublock/css/epicker-ui.css +76 -66
  125. package/extensions/ublock/css/fa-icons.css +1 -0
  126. package/extensions/ublock/css/logger-ui.css +2 -0
  127. package/extensions/ublock/css/popup-fenix.css +1 -0
  128. package/extensions/ublock/css/whitelist.css +1 -0
  129. package/extensions/ublock/dashboard.html +20 -13
  130. package/extensions/ublock/devtools.html +2 -0
  131. package/extensions/ublock/dyna-rules.html +2 -2
  132. package/extensions/ublock/img/flags-of-the-world/np.png +0 -0
  133. package/extensions/ublock/img/fontawesome/fontawesome-defs.svg +1 -0
  134. package/extensions/ublock/js/1p-filters.js +72 -23
  135. package/extensions/ublock/js/3p-filters.js +71 -25
  136. package/extensions/ublock/js/asset-viewer.js +1 -0
  137. package/extensions/ublock/js/assets.js +83 -89
  138. package/extensions/ublock/js/background.js +20 -27
  139. package/extensions/ublock/js/base64-custom.js +1 -102
  140. package/extensions/ublock/js/benchmarks.js +36 -21
  141. package/extensions/ublock/js/biditrie.js +8 -23
  142. package/extensions/ublock/js/broadcast.js +2 -4
  143. package/extensions/ublock/js/cachestorage.js +594 -396
  144. package/extensions/ublock/js/codemirror/search.js +49 -37
  145. package/extensions/ublock/js/codemirror/ubo-static-filtering.js +233 -215
  146. package/extensions/ublock/js/contentscript-extra.js +31 -1
  147. package/extensions/ublock/js/cosmetic-filtering.js +35 -33
  148. package/extensions/ublock/js/dashboard.js +11 -7
  149. package/extensions/ublock/js/devtools.js +22 -0
  150. package/extensions/ublock/js/dom.js +2 -2
  151. package/extensions/ublock/js/dyna-rules.js +17 -16
  152. package/extensions/ublock/js/epicker-ui.js +41 -16
  153. package/extensions/ublock/js/fa-icons.js +1 -0
  154. package/extensions/ublock/js/hntrie.js +10 -25
  155. package/extensions/ublock/js/i18n.js +15 -15
  156. package/extensions/ublock/js/logger-ui.js +9 -6
  157. package/extensions/ublock/js/messaging.js +51 -26
  158. package/extensions/ublock/js/pagestore.js +21 -23
  159. package/extensions/ublock/js/popup-fenix.js +35 -22
  160. package/extensions/ublock/js/redirect-engine.js +15 -30
  161. package/extensions/ublock/js/reverselookup.js +1 -1
  162. package/extensions/ublock/js/s14e-serializer.js +1405 -0
  163. package/extensions/ublock/js/scriptlet-filtering-core.js +1 -1
  164. package/extensions/ublock/js/scriptlets/epicker.js +27 -18
  165. package/extensions/ublock/js/settings.js +32 -21
  166. package/extensions/ublock/js/start.js +121 -62
  167. package/extensions/ublock/js/static-ext-filtering-db.js +6 -6
  168. package/extensions/ublock/js/static-ext-filtering.js +17 -28
  169. package/extensions/ublock/js/static-filtering-parser.js +26 -4
  170. package/extensions/ublock/js/static-net-filtering.js +69 -168
  171. package/extensions/ublock/js/storage.js +178 -155
  172. package/extensions/ublock/js/traffic.js +11 -7
  173. package/extensions/ublock/js/vapi-background.js +49 -62
  174. package/extensions/ublock/js/vapi-client.js +13 -16
  175. package/extensions/ublock/js/webext.js +10 -2
  176. package/extensions/ublock/js/whitelist.js +27 -25
  177. package/extensions/ublock/lib/publicsuffixlist/publicsuffixlist.js +3 -7
  178. package/extensions/ublock/manifest.json +2 -1
  179. package/extensions/ublock/web_accessible_resources/epicker-ui.html +5 -8
  180. package/extensions/ublock/whitelist.html +3 -4
  181. package/package.json +12 -12
  182. package/src/config.ts +3 -4
  183. package/src/http.ts +1 -0
  184. package/src/routes/management/http/active.get.ts +30 -0
  185. package/src/routes/management/tests/management.spec.ts +13 -0
  186. package/src/server.ts +1 -1
  187. package/src/types.ts +2 -1
  188. package/static/docs/swagger.json +57 -11
  189. package/static/docs/swagger.min.json +56 -10
  190. package/static/function/client.js +4155 -3350
  191. package/extensions/ublock/_locales/ku/messages.json +0 -1294
@@ -21,8 +21,6 @@
21
21
 
22
22
  /* global CodeMirror */
23
23
 
24
- 'use strict';
25
-
26
24
  /******************************************************************************/
27
25
 
28
26
  import * as sfp from '../static-filtering-parser.js';
@@ -39,10 +37,10 @@ let hintHelperRegistered = false;
39
37
 
40
38
  /******************************************************************************/
41
39
 
42
- CodeMirror.defineOption('trustedSource', false, (cm, state) => {
43
- if ( typeof state !== 'boolean' ) { return; }
40
+ CodeMirror.defineOption('trustedSource', false, (cm, trusted) => {
41
+ if ( typeof trusted !== 'boolean' ) { return; }
44
42
  self.dispatchEvent(new CustomEvent('trustedSource', {
45
- detail: state,
43
+ detail: { cm, trusted },
46
44
  }));
47
45
  });
48
46
 
@@ -56,220 +54,232 @@ CodeMirror.defineOption('trustedScriptletTokens', undefined, (cm, tokens) => {
56
54
 
57
55
  /******************************************************************************/
58
56
 
59
- CodeMirror.defineMode('ubo-static-filtering', function() {
60
- const astParser = new sfp.AstFilterParser({
61
- interactive: true,
62
- nativeCssHas: vAPI.webextFlavor.env.includes('native_css_has'),
63
- });
64
- const astWalker = astParser.getWalker();
65
- let currentWalkerNode = 0;
66
- let lastNetOptionType = 0;
67
-
68
- const redirectTokenStyle = node => {
69
- const rawToken = astParser.getNodeString(node || currentWalkerNode);
57
+ const uBOStaticFilteringMode = (( ) => {
58
+ const redirectTokenStyle = (mode, node) => {
59
+ const rawToken = mode.astParser.getNodeString(node || mode.currentWalkerNode);
70
60
  const { token } = sfp.parseRedirectValue(rawToken);
71
61
  return redirectNames.has(token) ? 'value' : 'value warning';
72
62
  };
73
63
 
74
- const nodeHasError = node => {
75
- return astParser.getNodeFlags(
76
- node || currentWalkerNode, sfp.NODE_FLAG_ERROR
64
+ const nodeHasError = (mode, node) => {
65
+ return mode.astParser.getNodeFlags(
66
+ node || mode.currentWalkerNode, sfp.NODE_FLAG_ERROR
77
67
  ) !== 0;
78
68
  };
79
69
 
80
- const colorFromAstNode = function() {
81
- if ( astParser.nodeIsEmptyString(currentWalkerNode) ) { return '+'; }
82
- if ( nodeHasError() ) { return 'error'; }
83
- const nodeType = astParser.getNodeType(currentWalkerNode);
70
+ const colorFromAstNode = mode => {
71
+ if ( mode.astParser.nodeIsEmptyString(mode.currentWalkerNode) ) { return '+'; }
72
+ if ( nodeHasError(mode) ) { return 'error'; }
73
+ const nodeType = mode.astParser.getNodeType(mode.currentWalkerNode);
84
74
  switch ( nodeType ) {
85
- case sfp.NODE_TYPE_WHITESPACE:
86
- return '';
87
- case sfp.NODE_TYPE_COMMENT:
88
- if ( astWalker.canGoDown() ) { break; }
89
- return 'comment';
90
- case sfp.NODE_TYPE_COMMENT_URL:
91
- return 'comment link';
92
- case sfp.NODE_TYPE_IGNORE:
93
- return 'comment';
94
- case sfp.NODE_TYPE_PREPARSE_DIRECTIVE:
95
- case sfp.NODE_TYPE_PREPARSE_DIRECTIVE_VALUE:
96
- return 'directive';
97
- case sfp.NODE_TYPE_PREPARSE_DIRECTIVE_IF_VALUE: {
98
- const raw = astParser.getNodeString(currentWalkerNode);
99
- const state = sfp.utils.preparser.evaluateExpr(raw, preparseDirectiveEnv);
100
- return state ? 'positive strong' : 'negative strong';
75
+ case sfp.NODE_TYPE_WHITESPACE:
76
+ return '';
77
+ case sfp.NODE_TYPE_COMMENT:
78
+ if ( mode.astWalker.canGoDown() ) { break; }
79
+ return 'comment';
80
+ case sfp.NODE_TYPE_COMMENT_URL:
81
+ return 'comment link';
82
+ case sfp.NODE_TYPE_IGNORE:
83
+ return 'comment';
84
+ case sfp.NODE_TYPE_PREPARSE_DIRECTIVE:
85
+ case sfp.NODE_TYPE_PREPARSE_DIRECTIVE_VALUE:
86
+ return 'directive';
87
+ case sfp.NODE_TYPE_PREPARSE_DIRECTIVE_IF_VALUE: {
88
+ const raw = mode.astParser.getNodeString(mode.currentWalkerNode);
89
+ const state = sfp.utils.preparser.evaluateExpr(raw, preparseDirectiveEnv);
90
+ return state ? 'positive strong' : 'negative strong';
91
+ }
92
+ case sfp.NODE_TYPE_EXT_OPTIONS_ANCHOR:
93
+ return mode.astParser.getFlags(sfp.AST_FLAG_IS_EXCEPTION)
94
+ ? 'tag strong'
95
+ : 'def strong';
96
+ case sfp.NODE_TYPE_EXT_DECORATION:
97
+ return 'def';
98
+ case sfp.NODE_TYPE_EXT_PATTERN_RAW:
99
+ if ( mode.astWalker.canGoDown() ) { break; }
100
+ return 'variable';
101
+ case sfp.NODE_TYPE_EXT_PATTERN_COSMETIC:
102
+ case sfp.NODE_TYPE_EXT_PATTERN_HTML:
103
+ return 'variable';
104
+ case sfp.NODE_TYPE_EXT_PATTERN_RESPONSEHEADER:
105
+ case sfp.NODE_TYPE_EXT_PATTERN_SCRIPTLET:
106
+ if ( mode.astWalker.canGoDown() ) { break; }
107
+ return 'variable';
108
+ case sfp.NODE_TYPE_EXT_PATTERN_SCRIPTLET_TOKEN: {
109
+ const token = mode.astParser.getNodeString(mode.currentWalkerNode);
110
+ if ( scriptletNames.has(token) === false ) {
111
+ return 'warning';
101
112
  }
102
- case sfp.NODE_TYPE_EXT_OPTIONS_ANCHOR:
103
- return astParser.getFlags(sfp.AST_FLAG_IS_EXCEPTION)
104
- ? 'tag strong'
105
- : 'def strong';
106
- case sfp.NODE_TYPE_EXT_DECORATION:
107
- return 'def';
108
- case sfp.NODE_TYPE_EXT_PATTERN_RAW:
109
- if ( astWalker.canGoDown() ) { break; }
110
- return 'variable';
111
- case sfp.NODE_TYPE_EXT_PATTERN_COSMETIC:
112
- case sfp.NODE_TYPE_EXT_PATTERN_HTML:
113
- return 'variable';
114
- case sfp.NODE_TYPE_EXT_PATTERN_RESPONSEHEADER:
115
- case sfp.NODE_TYPE_EXT_PATTERN_SCRIPTLET:
116
- if ( astWalker.canGoDown() ) { break; }
117
- return 'variable';
118
- case sfp.NODE_TYPE_EXT_PATTERN_SCRIPTLET_TOKEN: {
119
- const token = astParser.getNodeString(currentWalkerNode);
120
- if ( scriptletNames.has(token) === false ) {
121
- return 'warning';
113
+ return 'variable';
114
+ }
115
+ case sfp.NODE_TYPE_EXT_PATTERN_SCRIPTLET_ARG:
116
+ return 'variable';
117
+ case sfp.NODE_TYPE_NET_EXCEPTION:
118
+ return 'tag strong';
119
+ case sfp.NODE_TYPE_NET_PATTERN:
120
+ if ( mode.astWalker.canGoDown() ) { break; }
121
+ if ( mode.astParser.isRegexPattern() ) {
122
+ if ( mode.astParser.getNodeFlags(mode.currentWalkerNode, sfp.NODE_FLAG_PATTERN_UNTOKENIZABLE) !== 0 ) {
123
+ return 'variable warning';
122
124
  }
123
- return 'variable';
125
+ return 'variable notice';
124
126
  }
125
- case sfp.NODE_TYPE_EXT_PATTERN_SCRIPTLET_ARG:
126
- return 'variable';
127
- case sfp.NODE_TYPE_NET_EXCEPTION:
128
- return 'tag strong';
129
- case sfp.NODE_TYPE_NET_PATTERN:
130
- if ( astWalker.canGoDown() ) { break; }
131
- if ( astParser.isRegexPattern() ) {
132
- if ( astParser.getNodeFlags(currentWalkerNode, sfp.NODE_FLAG_PATTERN_UNTOKENIZABLE) !== 0 ) {
133
- return 'variable warning';
134
- }
135
- return 'variable notice';
136
- }
137
- return 'variable';
138
- case sfp.NODE_TYPE_NET_PATTERN_PART:
139
- return 'variable';
140
- case sfp.NODE_TYPE_NET_PATTERN_PART_SPECIAL:
141
- return 'keyword strong';
142
- case sfp.NODE_TYPE_NET_PATTERN_PART_UNICODE:
143
- return 'variable unicode';
144
- case sfp.NODE_TYPE_NET_PATTERN_LEFT_HNANCHOR:
145
- case sfp.NODE_TYPE_NET_PATTERN_LEFT_ANCHOR:
146
- case sfp.NODE_TYPE_NET_PATTERN_RIGHT_ANCHOR:
147
- case sfp.NODE_TYPE_NET_OPTION_NAME_NOT:
148
- return 'keyword strong';
149
- case sfp.NODE_TYPE_NET_OPTIONS_ANCHOR:
150
- case sfp.NODE_TYPE_NET_OPTION_SEPARATOR:
151
- lastNetOptionType = 0;
152
- return 'def strong';
153
- case sfp.NODE_TYPE_NET_OPTION_NAME_UNKNOWN:
154
- lastNetOptionType = 0;
155
- return 'error';
156
- case sfp.NODE_TYPE_NET_OPTION_NAME_1P:
157
- case sfp.NODE_TYPE_NET_OPTION_NAME_STRICT1P:
158
- case sfp.NODE_TYPE_NET_OPTION_NAME_3P:
159
- case sfp.NODE_TYPE_NET_OPTION_NAME_STRICT3P:
160
- case sfp.NODE_TYPE_NET_OPTION_NAME_ALL:
161
- case sfp.NODE_TYPE_NET_OPTION_NAME_BADFILTER:
162
- case sfp.NODE_TYPE_NET_OPTION_NAME_CNAME:
163
- case sfp.NODE_TYPE_NET_OPTION_NAME_CSP:
164
- case sfp.NODE_TYPE_NET_OPTION_NAME_CSS:
165
- case sfp.NODE_TYPE_NET_OPTION_NAME_DENYALLOW:
166
- case sfp.NODE_TYPE_NET_OPTION_NAME_DOC:
167
- case sfp.NODE_TYPE_NET_OPTION_NAME_EHIDE:
168
- case sfp.NODE_TYPE_NET_OPTION_NAME_EMPTY:
169
- case sfp.NODE_TYPE_NET_OPTION_NAME_FONT:
170
- case sfp.NODE_TYPE_NET_OPTION_NAME_FRAME:
171
- case sfp.NODE_TYPE_NET_OPTION_NAME_FROM:
172
- case sfp.NODE_TYPE_NET_OPTION_NAME_GENERICBLOCK:
173
- case sfp.NODE_TYPE_NET_OPTION_NAME_GHIDE:
174
- case sfp.NODE_TYPE_NET_OPTION_NAME_HEADER:
175
- case sfp.NODE_TYPE_NET_OPTION_NAME_IMAGE:
176
- case sfp.NODE_TYPE_NET_OPTION_NAME_IMPORTANT:
177
- case sfp.NODE_TYPE_NET_OPTION_NAME_INLINEFONT:
178
- case sfp.NODE_TYPE_NET_OPTION_NAME_INLINESCRIPT:
179
- case sfp.NODE_TYPE_NET_OPTION_NAME_MATCHCASE:
180
- case sfp.NODE_TYPE_NET_OPTION_NAME_MEDIA:
181
- case sfp.NODE_TYPE_NET_OPTION_NAME_METHOD:
182
- case sfp.NODE_TYPE_NET_OPTION_NAME_MP4:
183
- case sfp.NODE_TYPE_NET_OPTION_NAME_NOOP:
184
- case sfp.NODE_TYPE_NET_OPTION_NAME_OBJECT:
185
- case sfp.NODE_TYPE_NET_OPTION_NAME_OTHER:
186
- case sfp.NODE_TYPE_NET_OPTION_NAME_PING:
187
- case sfp.NODE_TYPE_NET_OPTION_NAME_POPUNDER:
188
- case sfp.NODE_TYPE_NET_OPTION_NAME_POPUP:
127
+ return 'variable';
128
+ case sfp.NODE_TYPE_NET_PATTERN_PART:
129
+ return 'variable';
130
+ case sfp.NODE_TYPE_NET_PATTERN_PART_SPECIAL:
131
+ return 'keyword strong';
132
+ case sfp.NODE_TYPE_NET_PATTERN_PART_UNICODE:
133
+ return 'variable unicode';
134
+ case sfp.NODE_TYPE_NET_PATTERN_LEFT_HNANCHOR:
135
+ case sfp.NODE_TYPE_NET_PATTERN_LEFT_ANCHOR:
136
+ case sfp.NODE_TYPE_NET_PATTERN_RIGHT_ANCHOR:
137
+ case sfp.NODE_TYPE_NET_OPTION_NAME_NOT:
138
+ return 'keyword strong';
139
+ case sfp.NODE_TYPE_NET_OPTIONS_ANCHOR:
140
+ case sfp.NODE_TYPE_NET_OPTION_SEPARATOR:
141
+ mode.lastNetOptionType = 0;
142
+ return 'def strong';
143
+ case sfp.NODE_TYPE_NET_OPTION_NAME_UNKNOWN:
144
+ mode.lastNetOptionType = 0;
145
+ return 'error';
146
+ case sfp.NODE_TYPE_NET_OPTION_NAME_1P:
147
+ case sfp.NODE_TYPE_NET_OPTION_NAME_STRICT1P:
148
+ case sfp.NODE_TYPE_NET_OPTION_NAME_3P:
149
+ case sfp.NODE_TYPE_NET_OPTION_NAME_STRICT3P:
150
+ case sfp.NODE_TYPE_NET_OPTION_NAME_ALL:
151
+ case sfp.NODE_TYPE_NET_OPTION_NAME_BADFILTER:
152
+ case sfp.NODE_TYPE_NET_OPTION_NAME_CNAME:
153
+ case sfp.NODE_TYPE_NET_OPTION_NAME_CSP:
154
+ case sfp.NODE_TYPE_NET_OPTION_NAME_CSS:
155
+ case sfp.NODE_TYPE_NET_OPTION_NAME_DENYALLOW:
156
+ case sfp.NODE_TYPE_NET_OPTION_NAME_DOC:
157
+ case sfp.NODE_TYPE_NET_OPTION_NAME_EHIDE:
158
+ case sfp.NODE_TYPE_NET_OPTION_NAME_EMPTY:
159
+ case sfp.NODE_TYPE_NET_OPTION_NAME_FONT:
160
+ case sfp.NODE_TYPE_NET_OPTION_NAME_FRAME:
161
+ case sfp.NODE_TYPE_NET_OPTION_NAME_FROM:
162
+ case sfp.NODE_TYPE_NET_OPTION_NAME_GENERICBLOCK:
163
+ case sfp.NODE_TYPE_NET_OPTION_NAME_GHIDE:
164
+ case sfp.NODE_TYPE_NET_OPTION_NAME_HEADER:
165
+ case sfp.NODE_TYPE_NET_OPTION_NAME_IMAGE:
166
+ case sfp.NODE_TYPE_NET_OPTION_NAME_IMPORTANT:
167
+ case sfp.NODE_TYPE_NET_OPTION_NAME_INLINEFONT:
168
+ case sfp.NODE_TYPE_NET_OPTION_NAME_INLINESCRIPT:
169
+ case sfp.NODE_TYPE_NET_OPTION_NAME_MATCHCASE:
170
+ case sfp.NODE_TYPE_NET_OPTION_NAME_MEDIA:
171
+ case sfp.NODE_TYPE_NET_OPTION_NAME_METHOD:
172
+ case sfp.NODE_TYPE_NET_OPTION_NAME_MP4:
173
+ case sfp.NODE_TYPE_NET_OPTION_NAME_NOOP:
174
+ case sfp.NODE_TYPE_NET_OPTION_NAME_OBJECT:
175
+ case sfp.NODE_TYPE_NET_OPTION_NAME_OTHER:
176
+ case sfp.NODE_TYPE_NET_OPTION_NAME_PING:
177
+ case sfp.NODE_TYPE_NET_OPTION_NAME_POPUNDER:
178
+ case sfp.NODE_TYPE_NET_OPTION_NAME_POPUP:
179
+ case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECT:
180
+ case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE:
181
+ case sfp.NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM:
182
+ case sfp.NODE_TYPE_NET_OPTION_NAME_SCRIPT:
183
+ case sfp.NODE_TYPE_NET_OPTION_NAME_SHIDE:
184
+ case sfp.NODE_TYPE_NET_OPTION_NAME_TO:
185
+ case sfp.NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM:
186
+ case sfp.NODE_TYPE_NET_OPTION_NAME_XHR:
187
+ case sfp.NODE_TYPE_NET_OPTION_NAME_WEBRTC:
188
+ case sfp.NODE_TYPE_NET_OPTION_NAME_WEBSOCKET:
189
+ mode.lastNetOptionType = nodeType;
190
+ return 'def';
191
+ case sfp.NODE_TYPE_NET_OPTION_ASSIGN:
192
+ return 'def';
193
+ case sfp.NODE_TYPE_NET_OPTION_VALUE:
194
+ if ( mode.astWalker.canGoDown() ) { break; }
195
+ switch ( mode.lastNetOptionType ) {
189
196
  case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECT:
190
197
  case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE:
191
- case sfp.NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM:
192
- case sfp.NODE_TYPE_NET_OPTION_NAME_SCRIPT:
193
- case sfp.NODE_TYPE_NET_OPTION_NAME_SHIDE:
194
- case sfp.NODE_TYPE_NET_OPTION_NAME_TO:
195
- case sfp.NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM:
196
- case sfp.NODE_TYPE_NET_OPTION_NAME_XHR:
197
- case sfp.NODE_TYPE_NET_OPTION_NAME_WEBRTC:
198
- case sfp.NODE_TYPE_NET_OPTION_NAME_WEBSOCKET:
199
- lastNetOptionType = nodeType;
200
- return 'def';
201
- case sfp.NODE_TYPE_NET_OPTION_ASSIGN:
202
- return 'def';
203
- case sfp.NODE_TYPE_NET_OPTION_VALUE:
204
- if ( astWalker.canGoDown() ) { break; }
205
- switch ( lastNetOptionType ) {
206
- case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECT:
207
- case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE:
208
- return redirectTokenStyle();
209
- default:
210
- break;
211
- }
212
- return 'value';
213
- case sfp.NODE_TYPE_OPTION_VALUE_NOT:
214
- return 'keyword strong';
215
- case sfp.NODE_TYPE_OPTION_VALUE_DOMAIN:
216
- return 'value';
217
- case sfp.NODE_TYPE_OPTION_VALUE_SEPARATOR:
218
- return 'def';
198
+ return redirectTokenStyle(mode);
219
199
  default:
220
200
  break;
201
+ }
202
+ return 'value';
203
+ case sfp.NODE_TYPE_OPTION_VALUE_NOT:
204
+ return 'keyword strong';
205
+ case sfp.NODE_TYPE_OPTION_VALUE_DOMAIN:
206
+ return 'value';
207
+ case sfp.NODE_TYPE_OPTION_VALUE_SEPARATOR:
208
+ return 'def';
209
+ default:
210
+ break;
221
211
  }
222
212
  return '+';
223
213
  };
224
214
 
225
- self.addEventListener('trustedSource', ev => {
226
- astParser.options.trustedSource = ev.detail;
227
- });
228
-
229
- self.addEventListener('trustedScriptletTokens', ev => {
230
- astParser.options.trustedScriptletTokens = ev.detail;
231
- });
215
+ class ModeState {
216
+ constructor() {
217
+ this.astParser = new sfp.AstFilterParser({
218
+ interactive: true,
219
+ nativeCssHas: vAPI.webextFlavor.env.includes('native_css_has'),
220
+ });
221
+ this.astWalker = this.astParser.getWalker();
222
+ this.currentWalkerNode = 0;
223
+ this.lastNetOptionType = 0;
224
+ self.addEventListener('trustedSource', ev => {
225
+ const { trusted } = ev.detail;
226
+ this.astParser.options.trustedSource = trusted;
227
+ });
228
+ self.addEventListener('trustedScriptletTokens', ev => {
229
+ this.astParser.options.trustedScriptletTokens = ev.detail;
230
+ });
231
+ }
232
+ }
232
233
 
233
- return {
234
- lineComment: '!',
235
- token: function(stream) {
234
+ return {
235
+ state: null,
236
+ startState() {
237
+ if ( this.state === null ) {
238
+ this.state = new ModeState();
239
+ }
240
+ return this.state;
241
+ },
242
+ copyState(other) {
243
+ return other;
244
+ },
245
+ token(stream, state) {
236
246
  if ( stream.sol() ) {
237
- astParser.parse(stream.string);
238
- if ( astParser.getFlags(sfp.AST_FLAG_UNSUPPORTED) !== 0 ) {
247
+ state.astParser.parse(stream.string);
248
+ if ( state.astParser.getFlags(sfp.AST_FLAG_UNSUPPORTED) !== 0 ) {
239
249
  stream.skipToEnd();
240
250
  return 'error';
241
251
  }
242
- if ( astParser.getType() === sfp.AST_TYPE_NONE ) {
252
+ if ( state.astParser.getType() === sfp.AST_TYPE_NONE ) {
243
253
  stream.skipToEnd();
244
254
  return 'comment';
245
255
  }
246
- currentWalkerNode = astWalker.reset();
247
- } else if ( nodeHasError() ) {
248
- currentWalkerNode = astWalker.right();
256
+ state.currentWalkerNode = state.astWalker.reset();
257
+ } else if ( nodeHasError(state) ) {
258
+ state.currentWalkerNode = state.astWalker.right();
249
259
  } else {
250
- currentWalkerNode = astWalker.next();
260
+ state.currentWalkerNode = state.astWalker.next();
251
261
  }
252
262
  let style = '';
253
- while ( currentWalkerNode !== 0 ) {
254
- style = colorFromAstNode(stream);
263
+ while ( state.currentWalkerNode !== 0 ) {
264
+ style = colorFromAstNode(state, stream);
255
265
  if ( style !== '+' ) { break; }
256
- currentWalkerNode = astWalker.next();
266
+ state.currentWalkerNode = state.astWalker.next();
257
267
  }
258
268
  if ( style === '+' ) {
259
269
  stream.skipToEnd();
260
270
  return null;
261
271
  }
262
- stream.pos = astParser.getNodeStringEnd(currentWalkerNode);
263
- if ( astParser.isNetworkFilter() ) {
272
+ stream.pos = state.astParser.getNodeStringEnd(state.currentWalkerNode);
273
+ if ( state.astParser.isNetworkFilter() ) {
264
274
  return style ? `line-cm-net ${style}` : 'line-cm-net';
265
275
  }
266
- if ( astParser.isExtendedFilter() ) {
276
+ if ( state.astParser.isExtendedFilter() ) {
267
277
  let flavor = '';
268
- if ( astParser.isCosmeticFilter() ) {
278
+ if ( state.astParser.isCosmeticFilter() ) {
269
279
  flavor = 'line-cm-ext-dom';
270
- } else if ( astParser.isScriptletFilter() ) {
280
+ } else if ( state.astParser.isScriptletFilter() ) {
271
281
  flavor = 'line-cm-ext-js';
272
- } else if ( astParser.isHtmlFilter() ) {
282
+ } else if ( state.astParser.isHtmlFilter() ) {
273
283
  flavor = 'line-cm-ext-html';
274
284
  }
275
285
  if ( flavor !== '' ) {
@@ -279,9 +289,11 @@ CodeMirror.defineMode('ubo-static-filtering', function() {
279
289
  style = style.trim();
280
290
  return style !== '' ? style : null;
281
291
  },
282
- parser: astParser,
292
+ lineComment: '!',
283
293
  };
284
- });
294
+ })();
295
+
296
+ CodeMirror.defineMode('ubo-static-filtering', ( ) => uBOStaticFilteringMode);
285
297
 
286
298
  /******************************************************************************/
287
299
 
@@ -328,7 +340,7 @@ function initHints() {
328
340
  });
329
341
  const proceduralOperatorNames = new Map(
330
342
  Array.from(sfp.proceduralOperatorTokens)
331
- .filter(item => (item[1] & 0b01) !== 0)
343
+ .filter(item => (item[1] & 0b01) !== 0)
332
344
  );
333
345
  const excludedHints = new Set([
334
346
  'genericblock',
@@ -563,7 +575,7 @@ function initHints() {
563
575
 
564
576
  const getExtScriptletHints = function(cursor, line) {
565
577
  const beg = cursor.ch;
566
- const matchLeft = /#\+\js\(([^,]*)$/.exec(line.slice(0, beg));
578
+ const matchLeft = /#\+js\(([^,]*)$/.exec(line.slice(0, beg));
567
579
  const matchRight = /^([^,)]*)/.exec(line.slice(beg));
568
580
  if ( matchLeft === null || matchRight === null ) { return; }
569
581
  const hints = [];
@@ -710,38 +722,38 @@ CodeMirror.registerHelper('fold', 'ubo-static-filtering', (( ) => {
710
722
  if ( astParser.hasError() ) {
711
723
  let msg = 'Invalid filter';
712
724
  switch ( astParser.astError ) {
713
- case sfp.AST_ERROR_UNSUPPORTED:
714
- msg = `${msg}: Unsupported filter syntax`;
715
- break;
716
- case sfp.AST_ERROR_REGEX:
717
- msg = `${msg}: Bad regular expression`;
718
- break;
719
- case sfp.AST_ERROR_PATTERN:
720
- msg = `${msg}: Bad pattern`;
721
- break;
722
- case sfp.AST_ERROR_DOMAIN_NAME:
723
- msg = `${msg}: Bad domain name`;
724
- break;
725
- case sfp.AST_ERROR_OPTION_BADVALUE:
726
- msg = `${msg}: Bad value assigned to a valid option`;
727
- break;
728
- case sfp.AST_ERROR_OPTION_DUPLICATE:
729
- msg = `${msg}: Duplicate filter option`;
730
- break;
731
- case sfp.AST_ERROR_OPTION_UNKNOWN:
732
- msg = `${msg}: Unsupported filter option`;
733
- break;
734
- case sfp.AST_ERROR_IF_TOKEN_UNKNOWN:
735
- msg = `${msg}: Unknown preparsing token`;
736
- break;
737
- case sfp.AST_ERROR_UNTRUSTED_SOURCE:
738
- msg = `${msg}: Filter requires trusted source`;
739
- break;
740
- default:
741
- if ( astParser.isCosmeticFilter() && astParser.result.error ) {
742
- msg = `${msg}: ${astParser.result.error}`;
743
- }
744
- break;
725
+ case sfp.AST_ERROR_UNSUPPORTED:
726
+ msg = `${msg}: Unsupported filter syntax`;
727
+ break;
728
+ case sfp.AST_ERROR_REGEX:
729
+ msg = `${msg}: Bad regular expression`;
730
+ break;
731
+ case sfp.AST_ERROR_PATTERN:
732
+ msg = `${msg}: Bad pattern`;
733
+ break;
734
+ case sfp.AST_ERROR_DOMAIN_NAME:
735
+ msg = `${msg}: Bad domain name`;
736
+ break;
737
+ case sfp.AST_ERROR_OPTION_BADVALUE:
738
+ msg = `${msg}: Bad value assigned to a valid option`;
739
+ break;
740
+ case sfp.AST_ERROR_OPTION_DUPLICATE:
741
+ msg = `${msg}: Duplicate filter option`;
742
+ break;
743
+ case sfp.AST_ERROR_OPTION_UNKNOWN:
744
+ msg = `${msg}: Unsupported filter option`;
745
+ break;
746
+ case sfp.AST_ERROR_IF_TOKEN_UNKNOWN:
747
+ msg = `${msg}: Unknown preparsing token`;
748
+ break;
749
+ case sfp.AST_ERROR_UNTRUSTED_SOURCE:
750
+ msg = `${msg}: Filter requires trusted source`;
751
+ break;
752
+ default:
753
+ if ( astParser.isCosmeticFilter() && astParser.result.error ) {
754
+ msg = `${msg}: ${astParser.result.error}`;
755
+ }
756
+ break;
745
757
  }
746
758
  return { lint: 'error', msg };
747
759
  }
@@ -878,6 +890,11 @@ CodeMirror.registerHelper('fold', 'ubo-static-filtering', (( ) => {
878
890
  ifendifSet.add(lineHandle);
879
891
  ifendifSetChanged = true;
880
892
  }
893
+ } else if ( marker.dataset.lint === 'error' ) {
894
+ if ( marker.dataset.error !== 'y' ) {
895
+ marker.dataset.error = 'y';
896
+ errorCount += 1;
897
+ }
881
898
  }
882
899
  if ( typeof details.msg !== 'string' || details.msg === '' ) { return; }
883
900
  const msgElem = qs$(marker, '.msg');
@@ -1084,7 +1101,8 @@ CodeMirror.registerHelper('fold', 'ubo-static-filtering', (( ) => {
1084
1101
  };
1085
1102
 
1086
1103
  self.addEventListener('trustedSource', ev => {
1087
- astParser.options.trustedSource = ev.detail;
1104
+ const { trusted } = ev.detail;
1105
+ astParser.options.trustedSource = trusted;
1088
1106
  });
1089
1107
 
1090
1108
  self.addEventListener('trustedScriptletTokens', ev => {
@@ -242,6 +242,36 @@ class PSelectorOthersTask extends PSelectorTask {
242
242
  }
243
243
  }
244
244
 
245
+ class PSelectorShadowTask extends PSelectorTask {
246
+ constructor(task) {
247
+ super();
248
+ this.selector = task[1];
249
+ }
250
+ transpose(node, output) {
251
+ const root = this.openOrClosedShadowRoot(node);
252
+ if ( root === null ) { return; }
253
+ const nodes = root.querySelectorAll(this.selector);
254
+ output.push(...nodes);
255
+ }
256
+ get openOrClosedShadowRoot() {
257
+ if ( PSelectorShadowTask.openOrClosedShadowRoot !== undefined ) {
258
+ return PSelectorShadowTask.openOrClosedShadowRoot;
259
+ }
260
+ if ( typeof chrome === 'object' && chrome !== null ) {
261
+ if ( chrome.dom instanceof Object ) {
262
+ if ( typeof chrome.dom.openOrClosedShadowRoot === 'function' ) {
263
+ PSelectorShadowTask.openOrClosedShadowRoot =
264
+ chrome.dom.openOrClosedShadowRoot;
265
+ return PSelectorShadowTask.openOrClosedShadowRoot;
266
+ }
267
+ }
268
+ }
269
+ PSelectorShadowTask.openOrClosedShadowRoot = node =>
270
+ node.openOrClosedShadowRoot || null;
271
+ return PSelectorShadowTask.openOrClosedShadowRoot;
272
+ }
273
+ }
274
+
245
275
  // https://github.com/AdguardTeam/ExtendedCss/issues/31#issuecomment-302391277
246
276
  // Prepend `:scope ` if needed.
247
277
  class PSelectorSpathTask extends PSelectorTask {
@@ -366,7 +396,6 @@ class PSelectorXpathTask extends PSelectorTask {
366
396
 
367
397
  class PSelector {
368
398
  constructor(o) {
369
- this.raw = o.raw;
370
399
  this.selector = o.selector;
371
400
  this.tasks = [];
372
401
  const tasks = [];
@@ -437,6 +466,7 @@ PSelector.prototype.operatorToTaskMap = new Map([
437
466
  [ 'min-text-length', PSelectorMinTextLengthTask ],
438
467
  [ 'not', PSelectorIfNotTask ],
439
468
  [ 'others', PSelectorOthersTask ],
469
+ [ 'shadow', PSelectorShadowTask ],
440
470
  [ 'spath', PSelectorSpathTask ],
441
471
  [ 'upward', PSelectorUpwardTask ],
442
472
  [ 'watch-attr', PSelectorWatchAttrs ],