testcafe 1.14.1 → 1.14.2

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 (332) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/LICENSE +21 -21
  3. package/bin/testcafe-with-v8-flag-filter.js +0 -0
  4. package/lib/api/exportable-lib/index.js +49 -49
  5. package/lib/api/request-hooks/assert-type.js +7 -7
  6. package/lib/api/request-hooks/hook-method-names.js +9 -9
  7. package/lib/api/request-hooks/hook.js +32 -32
  8. package/lib/api/request-hooks/interfaces.js +2 -2
  9. package/lib/api/request-hooks/request-logger.js +112 -112
  10. package/lib/api/request-hooks/request-mock/create-request-mock.js +10 -10
  11. package/lib/api/request-hooks/request-mock/index.js +44 -44
  12. package/lib/api/request-hooks/request-mock.js +46 -46
  13. package/lib/api/structure/base-unit.js +11 -11
  14. package/lib/api/structure/fixture.js +75 -75
  15. package/lib/api/structure/interfaces.js +2 -2
  16. package/lib/api/structure/test-file.js +31 -31
  17. package/lib/api/structure/test-timeout.js +9 -9
  18. package/lib/api/structure/test.js +85 -85
  19. package/lib/api/structure/testing-unit.js +89 -89
  20. package/lib/api/structure/unit-type.js +9 -9
  21. package/lib/api/test-controller/assertion.js +88 -88
  22. package/lib/api/test-controller/execution-context.js +82 -82
  23. package/lib/api/test-controller/index.js +358 -358
  24. package/lib/api/test-controller/proxy.js +28 -28
  25. package/lib/api/test-page-url.js +60 -60
  26. package/lib/api/test-run-tracker.js +68 -68
  27. package/lib/api/wrap-test-function.js +49 -49
  28. package/lib/assertions/executor.js +74 -74
  29. package/lib/assertions/get-fn.js +46 -46
  30. package/lib/assertions/type.js +20 -20
  31. package/lib/assets/content-types.js +9 -9
  32. package/lib/assets/injectables.js +18 -18
  33. package/lib/browser/connection/command.js +10 -10
  34. package/lib/browser/connection/error-hints.js +9 -9
  35. package/lib/browser/connection/gateway.js +159 -159
  36. package/lib/browser/connection/get-hints.js +33 -33
  37. package/lib/browser/connection/heartbeat-status.js +8 -8
  38. package/lib/browser/connection/index.js +328 -328
  39. package/lib/browser/connection/remotes-queue.js +46 -46
  40. package/lib/browser/connection/service-routes.js +12 -12
  41. package/lib/browser/connection/status.js +12 -12
  42. package/lib/browser/interfaces.js +2 -2
  43. package/lib/browser/provider/built-in/dedicated/base.js +80 -80
  44. package/lib/browser/provider/built-in/dedicated/chrome/browser-client.js +204 -204
  45. package/lib/browser/provider/built-in/dedicated/chrome/build-chrome-args.js +17 -17
  46. package/lib/browser/provider/built-in/dedicated/chrome/config.js +110 -110
  47. package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +45 -45
  48. package/lib/browser/provider/built-in/dedicated/chrome/elapsed-upperbounds.js +15 -15
  49. package/lib/browser/provider/built-in/dedicated/chrome/index.js +102 -102
  50. package/lib/browser/provider/built-in/dedicated/chrome/interfaces.js +2 -2
  51. package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +24 -24
  52. package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +29 -29
  53. package/lib/browser/provider/built-in/dedicated/edge/index.js +10 -10
  54. package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +29 -29
  55. package/lib/browser/provider/built-in/dedicated/firefox/config.js +33 -33
  56. package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +78 -78
  57. package/lib/browser/provider/built-in/dedicated/firefox/index.js +73 -73
  58. package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +36 -36
  59. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/commands.js +13 -13
  60. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +200 -200
  61. package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +17 -17
  62. package/lib/browser/provider/built-in/index.js +21 -21
  63. package/lib/browser/provider/built-in/locally-installed.js +30 -30
  64. package/lib/browser/provider/built-in/path.js +47 -47
  65. package/lib/browser/provider/built-in/remote.js +58 -58
  66. package/lib/browser/provider/index.js +303 -303
  67. package/lib/browser/provider/parse-provider-name.js +16 -16
  68. package/lib/browser/provider/plugin-host.js +121 -121
  69. package/lib/browser/provider/pool.js +115 -115
  70. package/lib/browser/provider/utils/argument-parsing.js +74 -74
  71. package/lib/browser/provider/utils/browser-starter.js +34 -34
  72. package/lib/browser/provider/utils/client-functions.js +24 -24
  73. package/lib/browser/provider/utils/get-maximized-headless-window-size.js +9 -9
  74. package/lib/cli/argument-parser.js +284 -284
  75. package/lib/cli/authentication-helper.js +35 -35
  76. package/lib/cli/cli.js +134 -134
  77. package/lib/cli/correct-browsers-and-sources.js +40 -40
  78. package/lib/cli/index.js +19 -19
  79. package/lib/cli/log.js +43 -43
  80. package/lib/cli/remotes-wizard.js +36 -36
  81. package/lib/cli/termination-handler.js +38 -38
  82. package/lib/client/automation/index.js +34 -16
  83. package/lib/client/automation/index.min.js +1 -1
  84. package/lib/client/browser/idle-page/index.html.mustache +35 -35
  85. package/lib/client/browser/idle-page/logo.svg +86 -86
  86. package/lib/client/core/index.js +14 -14
  87. package/lib/client/driver/index.js +46 -16
  88. package/lib/client/driver/index.min.js +1 -1
  89. package/lib/client/driver/internal-properties.js +9 -9
  90. package/lib/client/test-run/iframe.js.mustache +17 -17
  91. package/lib/client/test-run/index.js.mustache +51 -51
  92. package/lib/client/ui/index.js +14 -14
  93. package/lib/client/ui/sprite.svg +42 -42
  94. package/lib/client-functions/builder-symbol.js +4 -4
  95. package/lib/client-functions/client-function-builder.js +155 -155
  96. package/lib/client-functions/replicator.js +61 -61
  97. package/lib/client-functions/return-single-prop-mode.js +8 -8
  98. package/lib/client-functions/selector-api-execution-mode.js +20 -20
  99. package/lib/client-functions/selectors/add-api.js +645 -645
  100. package/lib/client-functions/selectors/create-snapshot-methods.js +13 -13
  101. package/lib/client-functions/selectors/prepare-api-args.js +20 -20
  102. package/lib/client-functions/selectors/selector-attribute-filter.js +22 -22
  103. package/lib/client-functions/selectors/selector-builder.js +153 -153
  104. package/lib/client-functions/selectors/selector-text-filter.js +43 -43
  105. package/lib/client-functions/selectors/snapshot-properties.js +48 -48
  106. package/lib/client-functions/types.js +18 -18
  107. package/lib/compiler/babel/format-babel-produced-code.js +10 -10
  108. package/lib/compiler/babel/get-base-babel-options.js +11 -11
  109. package/lib/compiler/babel/load-libs.js +63 -63
  110. package/lib/compiler/babel/preset-stage-2.js +19 -19
  111. package/lib/compiler/compile-client-function.js +73 -73
  112. package/lib/compiler/compilers.js +33 -33
  113. package/lib/compiler/index.js +92 -92
  114. package/lib/compiler/interfaces.js +2 -2
  115. package/lib/compiler/test-file/api-based.js +146 -146
  116. package/lib/compiler/test-file/base.js +36 -36
  117. package/lib/compiler/test-file/exportble-lib-path.js +5 -5
  118. package/lib/compiler/test-file/formats/coffeescript/compiler.js +38 -38
  119. package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +29 -29
  120. package/lib/compiler/test-file/formats/es-next/compiler.js +42 -42
  121. package/lib/compiler/test-file/formats/es-next/get-test-list.js +166 -166
  122. package/lib/compiler/test-file/formats/es-next/is-flow-code.js +7 -7
  123. package/lib/compiler/test-file/formats/raw.js +85 -85
  124. package/lib/compiler/test-file/formats/typescript/compiler.js +135 -135
  125. package/lib/compiler/test-file/formats/typescript/get-test-list.js +185 -185
  126. package/lib/compiler/test-file/test-file-parser-base.js +214 -214
  127. package/lib/configuration/configuration-base.js +165 -165
  128. package/lib/configuration/constants.js +9 -9
  129. package/lib/configuration/customizable-compilers.js +7 -7
  130. package/lib/configuration/default-values.js +51 -51
  131. package/lib/configuration/interfaces.js +2 -2
  132. package/lib/configuration/option-names.js +53 -53
  133. package/lib/configuration/option-source.js +9 -9
  134. package/lib/configuration/option.js +14 -14
  135. package/lib/configuration/quarantine-option-names.js +8 -8
  136. package/lib/configuration/run-option-names.js +26 -26
  137. package/lib/configuration/screenshot-option-names.js +10 -10
  138. package/lib/configuration/testcafe-configuration.js +163 -163
  139. package/lib/configuration/types.js +2 -2
  140. package/lib/configuration/typescript-configuration.js +62 -62
  141. package/lib/custom-client-scripts/assert-type.js +7 -7
  142. package/lib/custom-client-scripts/client-script-init.js +2 -2
  143. package/lib/custom-client-scripts/client-script.js +106 -106
  144. package/lib/custom-client-scripts/get-code.js +11 -11
  145. package/lib/custom-client-scripts/get-url.js +6 -6
  146. package/lib/custom-client-scripts/load.js +15 -15
  147. package/lib/custom-client-scripts/problematic-scripts.js +2 -2
  148. package/lib/custom-client-scripts/routing.js +36 -36
  149. package/lib/custom-client-scripts/utils.js +60 -60
  150. package/lib/embedding-utils.js +83 -83
  151. package/lib/errors/create-stack-filter.js +18 -18
  152. package/lib/errors/error-list.js +26 -26
  153. package/lib/errors/get-callsite.js +31 -31
  154. package/lib/errors/internal-modules-prefix.js +8 -8
  155. package/lib/errors/is-internal-stack-frame.js +45 -45
  156. package/lib/errors/process-test-fn-error.js +37 -37
  157. package/lib/errors/runtime/index.js +123 -123
  158. package/lib/errors/runtime/templates.js +115 -115
  159. package/lib/errors/runtime/type-assertions.js +112 -112
  160. package/lib/errors/stack-cleaning-hook.js +64 -64
  161. package/lib/errors/test-run/formattable-adapter.js +59 -59
  162. package/lib/errors/test-run/index.js +301 -301
  163. package/lib/errors/test-run/render-error-template.js +31 -31
  164. package/lib/errors/test-run/templates.js +91 -91
  165. package/lib/errors/test-run/utils.js +89 -89
  166. package/lib/errors/types.js +156 -156
  167. package/lib/index.js +81 -81
  168. package/lib/live/bootstrapper.js +43 -43
  169. package/lib/live/controller.js +107 -107
  170. package/lib/live/file-watcher/index.js +67 -67
  171. package/lib/live/file-watcher/modules-graph.js +58 -58
  172. package/lib/live/keyboard-observer.js +76 -76
  173. package/lib/live/logger/index.js +64 -64
  174. package/lib/live/test-run-controller.js +96 -96
  175. package/lib/live/test-run-state.js +6 -6
  176. package/lib/live/test-run.js +56 -56
  177. package/lib/live/test-runner.js +167 -167
  178. package/lib/load-assets.js +29 -29
  179. package/lib/notifications/add-rendered-warning.js +16 -16
  180. package/lib/notifications/debug-logger.js +78 -78
  181. package/lib/notifications/deprecated.js +24 -24
  182. package/lib/notifications/information-message.js +9 -9
  183. package/lib/notifications/warning-log.js +31 -31
  184. package/lib/notifications/warning-message.js +47 -47
  185. package/lib/reporter/command/command-formatter.js +120 -109
  186. package/lib/reporter/command/format-command.js +8 -8
  187. package/lib/reporter/command/interfaces.js +2 -2
  188. package/lib/reporter/index.js +319 -314
  189. package/lib/reporter/interfaces.js +2 -2
  190. package/lib/reporter/plugin-host.js +135 -135
  191. package/lib/reporter/plugin-methods.js +12 -12
  192. package/lib/role/index.js +74 -74
  193. package/lib/role/marker-symbol.js +7 -7
  194. package/lib/role/phase.js +9 -9
  195. package/lib/runner/bootstrapper.js +271 -271
  196. package/lib/runner/browser-job-result.js +9 -9
  197. package/lib/runner/browser-job.js +152 -152
  198. package/lib/runner/browser-set.js +114 -114
  199. package/lib/runner/fixture-hook-controller.js +85 -85
  200. package/lib/runner/index.js +449 -449
  201. package/lib/runner/interfaces.js +2 -2
  202. package/lib/runner/reporter-stream-controller.js +27 -27
  203. package/lib/runner/task/index.js +151 -151
  204. package/lib/runner/task/phase.js +9 -9
  205. package/lib/runner/test-run-controller.js +165 -165
  206. package/lib/runner/tested-app.js +72 -72
  207. package/lib/screenshots/capturer.js +141 -141
  208. package/lib/screenshots/constants.js +11 -11
  209. package/lib/screenshots/crop.js +111 -111
  210. package/lib/screenshots/default-extension.js +4 -4
  211. package/lib/screenshots/index.js +67 -67
  212. package/lib/screenshots/utils.js +39 -39
  213. package/lib/services/compiler/host.js +190 -190
  214. package/lib/services/compiler/io.js +9 -9
  215. package/lib/services/compiler/protocol.js +17 -16
  216. package/lib/services/compiler/service.js +225 -212
  217. package/lib/services/compiler/test-run-proxy.js +111 -111
  218. package/lib/services/interfaces.js +2 -2
  219. package/lib/services/process-title.js +8 -8
  220. package/lib/services/serialization/prepare-options.js +17 -17
  221. package/lib/services/serialization/replicator/create-replicator.js +25 -25
  222. package/lib/services/serialization/replicator/custom-error-transform.js +26 -26
  223. package/lib/services/serialization/test-structure.js +92 -92
  224. package/lib/services/utils/ipc/interfaces.js +30 -30
  225. package/lib/services/utils/ipc/io.js +108 -108
  226. package/lib/services/utils/ipc/message.js +75 -75
  227. package/lib/services/utils/ipc/packet.js +55 -55
  228. package/lib/services/utils/ipc/proxy.js +109 -109
  229. package/lib/services/utils/ipc/transport.js +64 -64
  230. package/lib/shared/errors/index.js +382 -382
  231. package/lib/shared/node-modules-folder-name.js +4 -4
  232. package/lib/test-run/bookmark.js +90 -90
  233. package/lib/test-run/browser-console-messages.js +73 -73
  234. package/lib/test-run/browser-manipulation-queue.js +92 -92
  235. package/lib/test-run/client-messages.js +9 -9
  236. package/lib/test-run/commands/actions.js +486 -483
  237. package/lib/test-run/commands/assertion.js +45 -45
  238. package/lib/test-run/commands/base.js +14 -14
  239. package/lib/test-run/commands/browser-manipulation.js +95 -95
  240. package/lib/test-run/commands/from-object.js +82 -82
  241. package/lib/test-run/commands/observation.js +61 -61
  242. package/lib/test-run/commands/options.js +231 -215
  243. package/lib/test-run/commands/service.js +54 -48
  244. package/lib/test-run/commands/type.js +65 -64
  245. package/lib/test-run/commands/utils.js +87 -87
  246. package/lib/test-run/commands/validations/argument.js +90 -90
  247. package/lib/test-run/commands/validations/factories.js +47 -47
  248. package/lib/test-run/commands/validations/initializers.js +44 -44
  249. package/lib/test-run/debug-log.js +32 -32
  250. package/lib/test-run/execute-js-expression.js +74 -74
  251. package/lib/test-run/index.js +823 -799
  252. package/lib/test-run/marker-symbol.js +7 -7
  253. package/lib/test-run/observed-callsites-storage.js +17 -17
  254. package/lib/test-run/phase.js +16 -16
  255. package/lib/test-run/session-controller.js +104 -104
  256. package/lib/testcafe.js +118 -118
  257. package/lib/utils/assignable.js +39 -39
  258. package/lib/utils/async-event-emitter.js +28 -28
  259. package/lib/utils/async-queue.js +14 -14
  260. package/lib/utils/browser-connection-timeouts.js +19 -19
  261. package/lib/utils/callsite.js +17 -17
  262. package/lib/utils/check-file-path.js +31 -31
  263. package/lib/utils/check-url.js +51 -51
  264. package/lib/utils/convert-to-best-fit-type.js +16 -16
  265. package/lib/utils/correct-file-path.js +21 -21
  266. package/lib/utils/define-lazy-property.js +13 -13
  267. package/lib/utils/delay.js +6 -6
  268. package/lib/utils/delegated-api.js +44 -44
  269. package/lib/utils/detect-display.js +6 -6
  270. package/lib/utils/detect-ffmpeg.js +44 -44
  271. package/lib/utils/diff/colors.js +29 -29
  272. package/lib/utils/diff/index.js +52 -52
  273. package/lib/utils/diff/util.js +23 -23
  274. package/lib/utils/diff.js +29 -29
  275. package/lib/utils/escape-user-agent.js +10 -10
  276. package/lib/utils/flag-list.js +17 -17
  277. package/lib/utils/get-any-key.js +8 -8
  278. package/lib/utils/get-browser.js +8 -8
  279. package/lib/utils/get-common-path.js +34 -34
  280. package/lib/utils/get-filter-fn.js +40 -40
  281. package/lib/utils/get-options/base.js +36 -36
  282. package/lib/utils/get-options/compiler.js +33 -33
  283. package/lib/utils/get-options/grep.js +15 -15
  284. package/lib/utils/get-options/index.js +20 -20
  285. package/lib/utils/get-options/meta.js +22 -22
  286. package/lib/utils/get-options/quarantine.js +91 -91
  287. package/lib/utils/get-options/screenshot.js +17 -17
  288. package/lib/utils/get-options/ssl.js +45 -45
  289. package/lib/utils/get-options/video.js +10 -10
  290. package/lib/utils/get-viewport-width.js +17 -17
  291. package/lib/utils/guard-time-execution.js +10 -10
  292. package/lib/utils/handle-errors.js +74 -74
  293. package/lib/utils/handle-tag-args.js +8 -8
  294. package/lib/utils/http.js +30 -30
  295. package/lib/utils/is-localhost.js +11 -11
  296. package/lib/utils/is-password-input.js +11 -0
  297. package/lib/utils/is-repl.js +10 -10
  298. package/lib/utils/is-window-in-iframe.js +6 -6
  299. package/lib/utils/limit-number.js +10 -10
  300. package/lib/utils/make-reg-exp.js +7 -7
  301. package/lib/utils/moment-loader.js +20 -20
  302. package/lib/utils/parse-file-list.js +71 -71
  303. package/lib/utils/parse-user-agent.js +55 -55
  304. package/lib/utils/path-pattern.js +114 -114
  305. package/lib/utils/prepare-reporters.js +30 -30
  306. package/lib/utils/prerender-callsite.js +18 -18
  307. package/lib/utils/process.js +119 -119
  308. package/lib/utils/promisified-functions.js +46 -46
  309. package/lib/utils/re-executable-promise.js +39 -39
  310. package/lib/utils/render-callsite-sync.js +29 -29
  311. package/lib/utils/render-template.js +9 -9
  312. package/lib/utils/reporter.js +30 -30
  313. package/lib/utils/resolve-path-relatively-cwd.js +7 -7
  314. package/lib/utils/string.js +105 -105
  315. package/lib/utils/temp-directory/cleanup-process/commands.js +7 -7
  316. package/lib/utils/temp-directory/cleanup-process/index.js +143 -143
  317. package/lib/utils/temp-directory/cleanup-process/worker.js +58 -58
  318. package/lib/utils/temp-directory/index.js +87 -87
  319. package/lib/utils/temp-directory/lockfile.js +56 -56
  320. package/lib/utils/thennable.js +7 -7
  321. package/lib/utils/timer.js +15 -15
  322. package/lib/utils/to-posix-path.js +8 -8
  323. package/lib/utils/types.js +2 -2
  324. package/lib/video-recorder/interfaces.js +2 -2
  325. package/lib/video-recorder/process.js +126 -126
  326. package/lib/video-recorder/recorder.js +136 -136
  327. package/lib/video-recorder/test-run-video-recorder.js +69 -69
  328. package/lib/video-recorder/videos.js +37 -37
  329. package/package.json +2 -2
  330. package/ts-defs/index.d.ts +25 -14
  331. package/ts-defs/selectors.d.ts +16 -5
  332. package/ts-defs/testcafe-scripts.d.ts +17 -6
@@ -1,205 +1,205 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.BrowserClient = void 0;
7
- const path_1 = __importDefault(require("path"));
8
- const os_1 = __importDefault(require("os"));
9
- const chrome_remote_interface_1 = __importDefault(require("chrome-remote-interface"));
10
- const debug_1 = __importDefault(require("debug"));
11
- const client_functions_1 = require("../../../utils/client-functions");
12
- const warning_message_1 = __importDefault(require("../../../../../notifications/warning-message"));
13
- const pretty_hrtime_1 = __importDefault(require("pretty-hrtime"));
14
- const elapsed_upperbounds_1 = require("./elapsed-upperbounds");
15
- const guard_time_execution_1 = __importDefault(require("../../../../../utils/guard-time-execution"));
16
- const DEBUG_SCOPE = (id) => `testcafe:browser:provider:built-in:chrome:browser-client:${id}`;
17
- const DOWNLOADS_DIR = path_1.default.join(os_1.default.homedir(), 'Downloads');
18
- const debugLog = debug_1.default('testcafe:browser:provider:built-in:dedicated:chrome');
19
- class BrowserClient {
20
- constructor(runtimeInfo) {
21
- this._clients = {};
22
- this._runtimeInfo = runtimeInfo;
23
- this.debugLogger = debug_1.default(DEBUG_SCOPE(runtimeInfo.browserId));
24
- runtimeInfo.browserClient = this;
25
- }
26
- get _clientKey() {
27
- return this._runtimeInfo.activeWindowId || this._runtimeInfo.browserId;
28
- }
29
- get _config() {
30
- return this._runtimeInfo.config;
31
- }
32
- async _getTabs() {
33
- const tabs = await chrome_remote_interface_1.default.listTabs({ port: this._runtimeInfo.cdpPort });
34
- return tabs.filter(t => t.type === 'page');
35
- }
36
- async _getActiveTab() {
37
- let tabs = await this._getTabs();
38
- if (this._runtimeInfo.activeWindowId)
39
- tabs = tabs.filter(t => t.title.includes(this._runtimeInfo.activeWindowId));
40
- return tabs[0];
41
- }
42
- _checkDropOfPerformance(method, elapsedTime) {
43
- this.debugLogger(`CDP method '${method}' took ${pretty_hrtime_1.default(elapsedTime)}`);
44
- const [elapsedSeconds] = elapsedTime;
45
- if (elapsedSeconds > elapsed_upperbounds_1.ELAPSED_TIME_UPPERBOUNDS[method]) {
46
- this._runtimeInfo.providerMethods.reportWarning(warning_message_1.default.browserProviderDropOfPerformance, this._runtimeInfo.browserName);
47
- }
48
- }
49
- async _createClient() {
50
- const target = await this._getActiveTab();
51
- const client = await chrome_remote_interface_1.default({ target, port: this._runtimeInfo.cdpPort });
52
- const { Page, Network, Runtime } = client;
53
- this._clients[this._clientKey] = client;
54
- await guard_time_execution_1.default(async () => await Page.enable(), elapsedTime => this._checkDropOfPerformance(elapsed_upperbounds_1.CheckedCDPMethod.PageEnable, elapsedTime));
55
- await Network.enable({});
56
- await Runtime.enable();
57
- return client;
58
- }
59
- async _setupClient(client) {
60
- if (this._config.emulation)
61
- await this._setEmulation(client);
62
- if (this._config.headless)
63
- await this._setupDownloads(client);
64
- }
65
- async _setDeviceMetricsOverride(client, width, height, deviceScaleFactor, mobile) {
66
- await guard_time_execution_1.default(async () => {
67
- await client.Emulation.setDeviceMetricsOverride({
68
- width,
69
- height,
70
- deviceScaleFactor,
71
- mobile,
72
- // @ts-ignore
73
- fitWindow: false
74
- });
75
- }, elapsedTime => this._checkDropOfPerformance(elapsed_upperbounds_1.CheckedCDPMethod.SetDeviceMetricsOverride, elapsedTime));
76
- }
77
- async _setUserAgentEmulation(client) {
78
- if (this._config.userAgent === void 0)
79
- return;
80
- await client.Network.setUserAgentOverride({ userAgent: this._config.userAgent });
81
- }
82
- async _setTouchEmulation(client) {
83
- if (this._config.touch === void 0)
84
- return;
85
- const touchConfig = {
86
- enabled: this._config.touch,
87
- configuration: this._config.mobile ? 'mobile' : 'desktop',
88
- maxTouchPoints: 1
89
- };
90
- if (client.Emulation.setEmitTouchEventsForMouse)
91
- await client.Emulation.setEmitTouchEventsForMouse(touchConfig);
92
- if (client.Emulation.setTouchEmulationEnabled)
93
- await client.Emulation.setTouchEmulationEnabled(touchConfig);
94
- }
95
- async _setEmulation(client) {
96
- await this._setUserAgentEmulation(client);
97
- await this._setTouchEmulation(client);
98
- await this.resizeWindow({
99
- width: this._config.width,
100
- height: this._config.height
101
- });
102
- }
103
- async _setupDownloads(client) {
104
- await client.Page.setDownloadBehavior({
105
- behavior: 'allow',
106
- downloadPath: DOWNLOADS_DIR
107
- });
108
- }
109
- async _evaluateRuntime(client, expression, returnByValue = false) {
110
- return client.Runtime.evaluate({ expression, returnByValue });
111
- }
112
- async _calculateEmulatedDevicePixelRatio(client) {
113
- if (!client)
114
- return;
115
- const devicePixelRatioQueryResult = await client.Runtime.evaluate({ expression: 'window.devicePixelRatio' });
116
- this._runtimeInfo.originalDevicePixelRatio = devicePixelRatioQueryResult.result.value;
117
- this._runtimeInfo.emulatedDevicePixelRatio = this._config.scaleFactor || this._runtimeInfo.originalDevicePixelRatio;
118
- }
119
- async resizeWindow(newDimensions) {
120
- const { browserId, config, viewportSize, providerMethods, emulatedDevicePixelRatio } = this._runtimeInfo;
121
- const currentWidth = viewportSize.width;
122
- const currentHeight = viewportSize.height;
123
- const newWidth = newDimensions.width || currentWidth;
124
- const newHeight = newDimensions.height || currentHeight;
125
- if (!config.headless)
126
- await providerMethods.resizeLocalBrowserWindow(browserId, newWidth, newHeight, currentWidth, currentHeight);
127
- viewportSize.width = newWidth;
128
- viewportSize.height = newHeight;
129
- const client = await this.getActiveClient();
130
- if (client && config.emulation) {
131
- await this._setDeviceMetricsOverride(client, viewportSize.width, viewportSize.height, emulatedDevicePixelRatio, config.mobile);
132
- await guard_time_execution_1.default(async () => {
133
- await client.Emulation.setVisibleSize({ width: viewportSize.width, height: viewportSize.height });
134
- }, elapsedTime => this._checkDropOfPerformance(elapsed_upperbounds_1.CheckedCDPMethod.SetVisibleSize, elapsedTime));
135
- }
136
- }
137
- isHeadlessTab() {
138
- return !!this._parentTarget && this._config.headless;
139
- }
140
- async getActiveClient() {
141
- try {
142
- if (!this._clients[this._clientKey])
143
- this._clients[this._clientKey] = await this._createClient();
144
- }
145
- catch (err) {
146
- debugLog(err);
147
- return void 0;
148
- }
149
- return this._clients[this._clientKey];
150
- }
151
- async init() {
152
- try {
153
- const tabs = await this._getTabs();
154
- this._parentTarget = tabs.find(t => t.url.includes(this._runtimeInfo.browserId));
155
- if (!this._parentTarget)
156
- return;
157
- const client = await this.getActiveClient();
158
- if (client) {
159
- await this._calculateEmulatedDevicePixelRatio(client);
160
- await this._setupClient(client);
161
- }
162
- }
163
- catch (e) {
164
- return;
165
- }
166
- }
167
- async getScreenshotData(fullPage) {
168
- let viewportWidth = 0;
169
- let viewportHeight = 0;
170
- const { config, emulatedDevicePixelRatio } = this._runtimeInfo;
171
- const client = await this.getActiveClient();
172
- if (!client)
173
- return Buffer.alloc(0);
174
- if (fullPage) {
175
- const { contentSize, visualViewport } = await client.Page.getLayoutMetrics();
176
- await this._setDeviceMetricsOverride(client, Math.ceil(contentSize.width), Math.ceil(contentSize.height), emulatedDevicePixelRatio, config.mobile);
177
- viewportWidth = visualViewport.clientWidth;
178
- viewportHeight = visualViewport.clientHeight;
179
- }
180
- const screenshotData = await client.Page.captureScreenshot({});
181
- if (fullPage) {
182
- if (config.emulation) {
183
- await this._setDeviceMetricsOverride(client, config.width || viewportWidth, config.height || viewportHeight, emulatedDevicePixelRatio, config.mobile);
184
- }
185
- else
186
- await client.Emulation.clearDeviceMetricsOverride();
187
- }
188
- return Buffer.from(screenshotData.data, 'base64');
189
- }
190
- async closeTab() {
191
- if (this._parentTarget)
192
- await chrome_remote_interface_1.default.closeTab({ id: this._parentTarget.id, port: this._runtimeInfo.cdpPort });
193
- }
194
- async updateMobileViewportSize() {
195
- const client = await this.getActiveClient();
196
- if (!client)
197
- return;
198
- const windowDimensionsQueryResult = await this._evaluateRuntime(client, `(${client_functions_1.GET_WINDOW_DIMENSIONS_INFO_SCRIPT})()`, true);
199
- const windowDimensions = windowDimensionsQueryResult.result.value;
200
- this._runtimeInfo.viewportSize.width = windowDimensions.outerWidth;
201
- this._runtimeInfo.viewportSize.height = windowDimensions.outerHeight;
202
- }
203
- }
204
- exports.BrowserClient = BrowserClient;
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BrowserClient = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const os_1 = __importDefault(require("os"));
9
+ const chrome_remote_interface_1 = __importDefault(require("chrome-remote-interface"));
10
+ const debug_1 = __importDefault(require("debug"));
11
+ const client_functions_1 = require("../../../utils/client-functions");
12
+ const warning_message_1 = __importDefault(require("../../../../../notifications/warning-message"));
13
+ const pretty_hrtime_1 = __importDefault(require("pretty-hrtime"));
14
+ const elapsed_upperbounds_1 = require("./elapsed-upperbounds");
15
+ const guard_time_execution_1 = __importDefault(require("../../../../../utils/guard-time-execution"));
16
+ const DEBUG_SCOPE = (id) => `testcafe:browser:provider:built-in:chrome:browser-client:${id}`;
17
+ const DOWNLOADS_DIR = path_1.default.join(os_1.default.homedir(), 'Downloads');
18
+ const debugLog = debug_1.default('testcafe:browser:provider:built-in:dedicated:chrome');
19
+ class BrowserClient {
20
+ constructor(runtimeInfo) {
21
+ this._clients = {};
22
+ this._runtimeInfo = runtimeInfo;
23
+ this.debugLogger = debug_1.default(DEBUG_SCOPE(runtimeInfo.browserId));
24
+ runtimeInfo.browserClient = this;
25
+ }
26
+ get _clientKey() {
27
+ return this._runtimeInfo.activeWindowId || this._runtimeInfo.browserId;
28
+ }
29
+ get _config() {
30
+ return this._runtimeInfo.config;
31
+ }
32
+ async _getTabs() {
33
+ const tabs = await chrome_remote_interface_1.default.listTabs({ port: this._runtimeInfo.cdpPort });
34
+ return tabs.filter(t => t.type === 'page');
35
+ }
36
+ async _getActiveTab() {
37
+ let tabs = await this._getTabs();
38
+ if (this._runtimeInfo.activeWindowId)
39
+ tabs = tabs.filter(t => t.title.includes(this._runtimeInfo.activeWindowId));
40
+ return tabs[0];
41
+ }
42
+ _checkDropOfPerformance(method, elapsedTime) {
43
+ this.debugLogger(`CDP method '${method}' took ${pretty_hrtime_1.default(elapsedTime)}`);
44
+ const [elapsedSeconds] = elapsedTime;
45
+ if (elapsedSeconds > elapsed_upperbounds_1.ELAPSED_TIME_UPPERBOUNDS[method]) {
46
+ this._runtimeInfo.providerMethods.reportWarning(warning_message_1.default.browserProviderDropOfPerformance, this._runtimeInfo.browserName);
47
+ }
48
+ }
49
+ async _createClient() {
50
+ const target = await this._getActiveTab();
51
+ const client = await chrome_remote_interface_1.default({ target, port: this._runtimeInfo.cdpPort });
52
+ const { Page, Network, Runtime } = client;
53
+ this._clients[this._clientKey] = client;
54
+ await guard_time_execution_1.default(async () => await Page.enable(), elapsedTime => this._checkDropOfPerformance(elapsed_upperbounds_1.CheckedCDPMethod.PageEnable, elapsedTime));
55
+ await Network.enable({});
56
+ await Runtime.enable();
57
+ return client;
58
+ }
59
+ async _setupClient(client) {
60
+ if (this._config.emulation)
61
+ await this._setEmulation(client);
62
+ if (this._config.headless)
63
+ await this._setupDownloads(client);
64
+ }
65
+ async _setDeviceMetricsOverride(client, width, height, deviceScaleFactor, mobile) {
66
+ await guard_time_execution_1.default(async () => {
67
+ await client.Emulation.setDeviceMetricsOverride({
68
+ width,
69
+ height,
70
+ deviceScaleFactor,
71
+ mobile,
72
+ // @ts-ignore
73
+ fitWindow: false
74
+ });
75
+ }, elapsedTime => this._checkDropOfPerformance(elapsed_upperbounds_1.CheckedCDPMethod.SetDeviceMetricsOverride, elapsedTime));
76
+ }
77
+ async _setUserAgentEmulation(client) {
78
+ if (this._config.userAgent === void 0)
79
+ return;
80
+ await client.Network.setUserAgentOverride({ userAgent: this._config.userAgent });
81
+ }
82
+ async _setTouchEmulation(client) {
83
+ if (this._config.touch === void 0)
84
+ return;
85
+ const touchConfig = {
86
+ enabled: this._config.touch,
87
+ configuration: this._config.mobile ? 'mobile' : 'desktop',
88
+ maxTouchPoints: 1
89
+ };
90
+ if (client.Emulation.setEmitTouchEventsForMouse)
91
+ await client.Emulation.setEmitTouchEventsForMouse(touchConfig);
92
+ if (client.Emulation.setTouchEmulationEnabled)
93
+ await client.Emulation.setTouchEmulationEnabled(touchConfig);
94
+ }
95
+ async _setEmulation(client) {
96
+ await this._setUserAgentEmulation(client);
97
+ await this._setTouchEmulation(client);
98
+ await this.resizeWindow({
99
+ width: this._config.width,
100
+ height: this._config.height
101
+ });
102
+ }
103
+ async _setupDownloads(client) {
104
+ await client.Page.setDownloadBehavior({
105
+ behavior: 'allow',
106
+ downloadPath: DOWNLOADS_DIR
107
+ });
108
+ }
109
+ async _evaluateRuntime(client, expression, returnByValue = false) {
110
+ return client.Runtime.evaluate({ expression, returnByValue });
111
+ }
112
+ async _calculateEmulatedDevicePixelRatio(client) {
113
+ if (!client)
114
+ return;
115
+ const devicePixelRatioQueryResult = await client.Runtime.evaluate({ expression: 'window.devicePixelRatio' });
116
+ this._runtimeInfo.originalDevicePixelRatio = devicePixelRatioQueryResult.result.value;
117
+ this._runtimeInfo.emulatedDevicePixelRatio = this._config.scaleFactor || this._runtimeInfo.originalDevicePixelRatio;
118
+ }
119
+ async resizeWindow(newDimensions) {
120
+ const { browserId, config, viewportSize, providerMethods, emulatedDevicePixelRatio } = this._runtimeInfo;
121
+ const currentWidth = viewportSize.width;
122
+ const currentHeight = viewportSize.height;
123
+ const newWidth = newDimensions.width || currentWidth;
124
+ const newHeight = newDimensions.height || currentHeight;
125
+ if (!config.headless)
126
+ await providerMethods.resizeLocalBrowserWindow(browserId, newWidth, newHeight, currentWidth, currentHeight);
127
+ viewportSize.width = newWidth;
128
+ viewportSize.height = newHeight;
129
+ const client = await this.getActiveClient();
130
+ if (client && config.emulation) {
131
+ await this._setDeviceMetricsOverride(client, viewportSize.width, viewportSize.height, emulatedDevicePixelRatio, config.mobile);
132
+ await guard_time_execution_1.default(async () => {
133
+ await client.Emulation.setVisibleSize({ width: viewportSize.width, height: viewportSize.height });
134
+ }, elapsedTime => this._checkDropOfPerformance(elapsed_upperbounds_1.CheckedCDPMethod.SetVisibleSize, elapsedTime));
135
+ }
136
+ }
137
+ isHeadlessTab() {
138
+ return !!this._parentTarget && this._config.headless;
139
+ }
140
+ async getActiveClient() {
141
+ try {
142
+ if (!this._clients[this._clientKey])
143
+ this._clients[this._clientKey] = await this._createClient();
144
+ }
145
+ catch (err) {
146
+ debugLog(err);
147
+ return void 0;
148
+ }
149
+ return this._clients[this._clientKey];
150
+ }
151
+ async init() {
152
+ try {
153
+ const tabs = await this._getTabs();
154
+ this._parentTarget = tabs.find(t => t.url.includes(this._runtimeInfo.browserId));
155
+ if (!this._parentTarget)
156
+ return;
157
+ const client = await this.getActiveClient();
158
+ if (client) {
159
+ await this._calculateEmulatedDevicePixelRatio(client);
160
+ await this._setupClient(client);
161
+ }
162
+ }
163
+ catch (e) {
164
+ return;
165
+ }
166
+ }
167
+ async getScreenshotData(fullPage) {
168
+ let viewportWidth = 0;
169
+ let viewportHeight = 0;
170
+ const { config, emulatedDevicePixelRatio } = this._runtimeInfo;
171
+ const client = await this.getActiveClient();
172
+ if (!client)
173
+ return Buffer.alloc(0);
174
+ if (fullPage) {
175
+ const { contentSize, visualViewport } = await client.Page.getLayoutMetrics();
176
+ await this._setDeviceMetricsOverride(client, Math.ceil(contentSize.width), Math.ceil(contentSize.height), emulatedDevicePixelRatio, config.mobile);
177
+ viewportWidth = visualViewport.clientWidth;
178
+ viewportHeight = visualViewport.clientHeight;
179
+ }
180
+ const screenshotData = await client.Page.captureScreenshot({});
181
+ if (fullPage) {
182
+ if (config.emulation) {
183
+ await this._setDeviceMetricsOverride(client, config.width || viewportWidth, config.height || viewportHeight, emulatedDevicePixelRatio, config.mobile);
184
+ }
185
+ else
186
+ await client.Emulation.clearDeviceMetricsOverride();
187
+ }
188
+ return Buffer.from(screenshotData.data, 'base64');
189
+ }
190
+ async closeTab() {
191
+ if (this._parentTarget)
192
+ await chrome_remote_interface_1.default.closeTab({ id: this._parentTarget.id, port: this._runtimeInfo.cdpPort });
193
+ }
194
+ async updateMobileViewportSize() {
195
+ const client = await this.getActiveClient();
196
+ if (!client)
197
+ return;
198
+ const windowDimensionsQueryResult = await this._evaluateRuntime(client, `(${client_functions_1.GET_WINDOW_DIMENSIONS_INFO_SCRIPT})()`, true);
199
+ const windowDimensions = windowDimensionsQueryResult.result.value;
200
+ this._runtimeInfo.viewportSize.width = windowDimensions.outerWidth;
201
+ this._runtimeInfo.viewportSize.height = windowDimensions.outerHeight;
202
+ }
203
+ }
204
+ exports.BrowserClient = BrowserClient;
205
205
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYnJvd3Nlci9wcm92aWRlci9idWlsdC1pbi9kZWRpY2F0ZWQvY2hyb21lL2Jyb3dzZXItY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIsc0ZBQW1EO0FBQ25ELGtEQUEwQjtBQUMxQixzRUFBb0Y7QUFDcEYsbUdBQTJFO0FBUTNFLGtFQUF1QztBQUN2QywrREFBbUY7QUFDbkYscUdBQTJFO0FBRTNFLE1BQU0sV0FBVyxHQUFHLENBQUMsRUFBVSxFQUFVLEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxFQUFFLENBQUM7QUFDN0csTUFBTSxhQUFhLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFFM0QsTUFBTSxRQUFRLEdBQUcsZUFBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7QUFFOUUsTUFBYSxhQUFhO0lBTXRCLFlBQW9CLFdBQXdCO1FBTHBDLGFBQVEsR0FBeUMsRUFBRSxDQUFDO1FBTXhELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUksZUFBSyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUU5RCxXQUFXLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBWSxVQUFVO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7SUFDM0UsQ0FBQztJQUVELElBQVksT0FBTztRQUNmLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFDcEMsQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUFRO1FB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LE1BQU0sQ0FBQyxTQUFTLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztTQUMzRDtRQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUTtRQUNqQixJQUFJLElBQUksQ0FBQyxhQUFhO1lBQ2xCLE1BQU0saUNBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRU0sS0FBSyxDQUFDLHdCQUF3QjtRQUNqQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxJQUFJLENBQUMsTUFBTTtZQUNQLE9BQU87UUFFWCxNQUFNLDJCQUEyQixHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLG9EQUFpQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFMUgsTUFBTSxnQkFBZ0IsR0FBRywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBRWxFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7UUFDbkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQztJQUN6RSxDQUFDO0NBQ0o7QUFsUkQsc0NBa1JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24vaW50ZXJmYWNlcyc7XG5pbXBvcnQgUHJvdG9jb2wgZnJvbSAnZGV2dG9vbHMtcHJvdG9jb2wnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHJlbW90ZUNocm9tZSBmcm9tICdjaHJvbWUtcmVtb3RlLWludGVyZmFjZSc7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgR0VUX1dJTkRPV19ESU1FTlNJT05TX0lORk9fU0NSSVBUIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvY2xpZW50LWZ1bmN0aW9ucyc7XG5pbXBvcnQgV0FSTklOR19NRVNTQUdFIGZyb20gJy4uLy4uLy4uLy4uLy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1tZXNzYWdlJztcblxuaW1wb3J0IHtcbiAgICBDb25maWcsXG4gICAgUnVudGltZUluZm8sXG4gICAgVG91Y2hDb25maWdPcHRpb25zLFxuICAgIFNpemVcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCBwcmV0dHlUaW1lIGZyb20gJ3ByZXR0eS1ocnRpbWUnO1xuaW1wb3J0IHsgQ2hlY2tlZENEUE1ldGhvZCwgRUxBUFNFRF9USU1FX1VQUEVSQk9VTkRTIH0gZnJvbSAnLi9lbGFwc2VkLXVwcGVyYm91bmRzJztcbmltcG9ydCBndWFyZFRpbWVFeGVjdXRpb24gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvZ3VhcmQtdGltZS1leGVjdXRpb24nO1xuXG5jb25zdCBERUJVR19TQ09QRSA9IChpZDogc3RyaW5nKTogc3RyaW5nID0+IGB0ZXN0Y2FmZTpicm93c2VyOnByb3ZpZGVyOmJ1aWx0LWluOmNocm9tZTpicm93c2VyLWNsaWVudDoke2lkfWA7XG5jb25zdCBET1dOTE9BRFNfRElSID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJ0Rvd25sb2FkcycpO1xuXG5jb25zdCBkZWJ1Z0xvZyA9IGRlYnVnKCd0ZXN0Y2FmZTpicm93c2VyOnByb3ZpZGVyOmJ1aWx0LWluOmRlZGljYXRlZDpjaHJvbWUnKTtcblxuZXhwb3J0IGNsYXNzIEJyb3dzZXJDbGllbnQge1xuICAgIHByaXZhdGUgX2NsaWVudHM6IERpY3Rpb25hcnk8cmVtb3RlQ2hyb21lLlByb3RvY29sQXBpPiA9IHt9O1xuICAgIHByaXZhdGUgX3J1bnRpbWVJbmZvOiBSdW50aW1lSW5mbztcbiAgICBwcml2YXRlIF9wYXJlbnRUYXJnZXQ/OiByZW1vdGVDaHJvbWUuVGFyZ2V0SW5mbztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnTG9nZ2VyOiBkZWJ1Zy5EZWJ1Z2dlcjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAocnVudGltZUluZm86IFJ1bnRpbWVJbmZvKSB7XG4gICAgICAgIHRoaXMuX3J1bnRpbWVJbmZvID0gcnVudGltZUluZm87XG4gICAgICAgIHRoaXMuZGVidWdMb2dnZXIgID0gZGVidWcoREVCVUdfU0NPUEUocnVudGltZUluZm8uYnJvd3NlcklkKSk7XG5cbiAgICAgICAgcnVudGltZUluZm8uYnJvd3NlckNsaWVudCA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgX2NsaWVudEtleSAoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bnRpbWVJbmZvLmFjdGl2ZVdpbmRvd0lkIHx8IHRoaXMuX3J1bnRpbWVJbmZvLmJyb3dzZXJJZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBfY29uZmlnICgpOiBDb25maWcge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVudGltZUluZm8uY29uZmlnO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2dldFRhYnMgKCk6IFByb21pc2U8cmVtb3RlQ2hyb21lLlRhcmdldEluZm9bXT4ge1xuICAgICAgICBjb25zdCB0YWJzID0gYXdhaXQgcmVtb3RlQ2hyb21lLmxpc3RUYWJzKHsgcG9ydDogdGhpcy5fcnVudGltZUluZm8uY2RwUG9ydCB9KTtcblxuICAgICAgICByZXR1cm4gdGFicy5maWx0ZXIodCA9PiB0LnR5cGUgPT09ICdwYWdlJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0QWN0aXZlVGFiICgpOiBQcm9taXNlPHJlbW90ZUNocm9tZS5UYXJnZXRJbmZvPiB7XG4gICAgICAgIGxldCB0YWJzID0gYXdhaXQgdGhpcy5fZ2V0VGFicygpO1xuXG4gICAgICAgIGlmICh0aGlzLl9ydW50aW1lSW5mby5hY3RpdmVXaW5kb3dJZClcbiAgICAgICAgICAgIHRhYnMgPSB0YWJzLmZpbHRlcih0ID0+IHQudGl0bGUuaW5jbHVkZXModGhpcy5fcnVudGltZUluZm8uYWN0aXZlV2luZG93SWQpKTtcblxuICAgICAgICByZXR1cm4gdGFic1swXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jaGVja0Ryb3BPZlBlcmZvcm1hbmNlIChtZXRob2Q6IENoZWNrZWRDRFBNZXRob2QsIGVsYXBzZWRUaW1lOiBbbnVtYmVyLCBudW1iZXJdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVidWdMb2dnZXIoYENEUCBtZXRob2QgJyR7bWV0aG9kfScgdG9vayAke3ByZXR0eVRpbWUoZWxhcHNlZFRpbWUpfWApO1xuXG4gICAgICAgIGNvbnN0IFsgZWxhcHNlZFNlY29uZHMgXSA9IGVsYXBzZWRUaW1lO1xuXG4gICAgICAgIGlmIChlbGFwc2VkU2Vjb25kcyA+IEVMQVBTRURfVElNRV9VUFBFUkJPVU5EU1ttZXRob2RdKSB7XG4gICAgICAgICAgICB0aGlzLl9ydW50aW1lSW5mby5wcm92aWRlck1ldGhvZHMucmVwb3J0V2FybmluZyhcbiAgICAgICAgICAgICAgICBXQVJOSU5HX01FU1NBR0UuYnJvd3NlclByb3ZpZGVyRHJvcE9mUGVyZm9ybWFuY2UsXG4gICAgICAgICAgICAgICAgdGhpcy5fcnVudGltZUluZm8uYnJvd3Nlck5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9jcmVhdGVDbGllbnQgKCk6IFByb21pc2U8cmVtb3RlQ2hyb21lLlByb3RvY29sQXBpPiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCAgICAgICAgICAgICAgICAgICAgID0gYXdhaXQgdGhpcy5fZ2V0QWN0aXZlVGFiKCk7XG4gICAgICAgIGNvbnN0IGNsaWVudCAgICAgICAgICAgICAgICAgICAgID0gYXdhaXQgcmVtb3RlQ2hyb21lKHsgdGFyZ2V0LCBwb3J0OiB0aGlzLl9ydW50aW1lSW5mby5jZHBQb3J0IH0pO1xuICAgICAgICBjb25zdCB7IFBhZ2UsIE5ldHdvcmssIFJ1bnRpbWUgfSA9IGNsaWVudDtcblxuICAgICAgICB0aGlzLl9jbGllbnRzW3RoaXMuX2NsaWVudEtleV0gPSBjbGllbnQ7XG5cbiAgICAgICAgYXdhaXQgZ3VhcmRUaW1lRXhlY3V0aW9uKFxuICAgICAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgUGFnZS5lbmFibGUoKSxcbiAgICAgICAgICAgIGVsYXBzZWRUaW1lID0+IHRoaXMuX2NoZWNrRHJvcE9mUGVyZm9ybWFuY2UoQ2hlY2tlZENEUE1ldGhvZC5QYWdlRW5hYmxlLCBlbGFwc2VkVGltZSlcbiAgICAgICAgKTtcblxuICAgICAgICBhd2FpdCBOZXR3b3JrLmVuYWJsZSh7fSk7XG4gICAgICAgIGF3YWl0IFJ1bnRpbWUuZW5hYmxlKCk7XG5cbiAgICAgICAgcmV0dXJuIGNsaWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9zZXR1cENsaWVudCAoY2xpZW50OiByZW1vdGVDaHJvbWUuUHJvdG9jb2xBcGkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5lbXVsYXRpb24pXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXRFbXVsYXRpb24oY2xpZW50KTtcblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmhlYWRsZXNzKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2V0dXBEb3dubG9hZHMoY2xpZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9zZXREZXZpY2VNZXRyaWNzT3ZlcnJpZGUgKGNsaWVudDogcmVtb3RlQ2hyb21lLlByb3RvY29sQXBpLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgZGV2aWNlU2NhbGVGYWN0b3I6IG51bWJlciwgbW9iaWxlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IGd1YXJkVGltZUV4ZWN1dGlvbihcbiAgICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuRW11bGF0aW9uLnNldERldmljZU1ldHJpY3NPdmVycmlkZSh7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICBtb2JpbGUsXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgZml0V2luZG93OiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVsYXBzZWRUaW1lID0+IHRoaXMuX2NoZWNrRHJvcE9mUGVyZm9ybWFuY2UoQ2hlY2tlZENEUE1ldGhvZC5TZXREZXZpY2VNZXRyaWNzT3ZlcnJpZGUsIGVsYXBzZWRUaW1lKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3NldFVzZXJBZ2VudEVtdWxhdGlvbiAoY2xpZW50OiByZW1vdGVDaHJvbWUuUHJvdG9jb2xBcGkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy51c2VyQWdlbnQgPT09IHZvaWQgMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhd2FpdCBjbGllbnQuTmV0d29yay5zZXRVc2VyQWdlbnRPdmVycmlkZSh7IHVzZXJBZ2VudDogdGhpcy5fY29uZmlnLnVzZXJBZ2VudCB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9zZXRUb3VjaEVtdWxhdGlvbiAoY2xpZW50OiByZW1vdGVDaHJvbWUuUHJvdG9jb2xBcGkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy50b3VjaCA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHRvdWNoQ29uZmlnOiBUb3VjaENvbmZpZ09wdGlvbnMgPSB7XG4gICAgICAgICAgICBlbmFibGVkOiAgICAgICAgdGhpcy5fY29uZmlnLnRvdWNoLFxuICAgICAgICAgICAgY29uZmlndXJhdGlvbjogIHRoaXMuX2NvbmZpZy5tb2JpbGUgPyAnbW9iaWxlJyA6ICdkZXNrdG9wJyxcbiAgICAgICAgICAgIG1heFRvdWNoUG9pbnRzOiAxXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGNsaWVudC5FbXVsYXRpb24uc2V0RW1pdFRvdWNoRXZlbnRzRm9yTW91c2UpXG4gICAgICAgICAgICBhd2FpdCBjbGllbnQuRW11bGF0aW9uLnNldEVtaXRUb3VjaEV2ZW50c0Zvck1vdXNlKHRvdWNoQ29uZmlnKTtcblxuICAgICAgICBpZiAoY2xpZW50LkVtdWxhdGlvbi5zZXRUb3VjaEVtdWxhdGlvbkVuYWJsZWQpXG4gICAgICAgICAgICBhd2FpdCBjbGllbnQuRW11bGF0aW9uLnNldFRvdWNoRW11bGF0aW9uRW5hYmxlZCh0b3VjaENvbmZpZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfc2V0RW11bGF0aW9uIChjbGllbnQ6IHJlbW90ZUNocm9tZS5Qcm90b2NvbEFwaSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9zZXRVc2VyQWdlbnRFbXVsYXRpb24oY2xpZW50KTtcbiAgICAgICAgYXdhaXQgdGhpcy5fc2V0VG91Y2hFbXVsYXRpb24oY2xpZW50KTtcblxuICAgICAgICBhd2FpdCB0aGlzLnJlc2l6ZVdpbmRvdyh7XG4gICAgICAgICAgICB3aWR0aDogIHRoaXMuX2NvbmZpZy53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5fY29uZmlnLmhlaWdodFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9zZXR1cERvd25sb2FkcyAoY2xpZW50OiByZW1vdGVDaHJvbWUuUHJvdG9jb2xBcGkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgY2xpZW50LlBhZ2Uuc2V0RG93bmxvYWRCZWhhdmlvcih7XG4gICAgICAgICAgICBiZWhhdmlvcjogICAgICdhbGxvdycsXG4gICAgICAgICAgICBkb3dubG9hZFBhdGg6IERPV05MT0FEU19ESVJcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZXZhbHVhdGVSdW50aW1lIChjbGllbnQ6IHJlbW90ZUNocm9tZS5Qcm90b2NvbEFwaSwgZXhwcmVzc2lvbjogc3RyaW5nLCByZXR1cm5CeVZhbHVlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPFByb3RvY29sLlJ1bnRpbWUuRXZhbHVhdGVSZXNwb25zZT4ge1xuICAgICAgICByZXR1cm4gY2xpZW50LlJ1bnRpbWUuZXZhbHVhdGUoeyBleHByZXNzaW9uLCByZXR1cm5CeVZhbHVlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2NhbGN1bGF0ZUVtdWxhdGVkRGV2aWNlUGl4ZWxSYXRpbyAoY2xpZW50OiByZW1vdGVDaHJvbWUuUHJvdG9jb2xBcGkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFjbGllbnQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZGV2aWNlUGl4ZWxSYXRpb1F1ZXJ5UmVzdWx0ID0gYXdhaXQgY2xpZW50LlJ1bnRpbWUuZXZhbHVhdGUoeyBleHByZXNzaW9uOiAnd2luZG93LmRldmljZVBpeGVsUmF0aW8nIH0pO1xuXG4gICAgICAgIHRoaXMuX3J1bnRpbWVJbmZvLm9yaWdpbmFsRGV2aWNlUGl4ZWxSYXRpbyA9IGRldmljZVBpeGVsUmF0aW9RdWVyeVJlc3VsdC5yZXN1bHQudmFsdWU7XG4gICAgICAgIHRoaXMuX3J1bnRpbWVJbmZvLmVtdWxhdGVkRGV2aWNlUGl4ZWxSYXRpbyA9IHRoaXMuX2NvbmZpZy5zY2FsZUZhY3RvciB8fCB0aGlzLl9ydW50aW1lSW5mby5vcmlnaW5hbERldmljZVBpeGVsUmF0aW87XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlc2l6ZVdpbmRvdyAobmV3RGltZW5zaW9uczogU2l6ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IGJyb3dzZXJJZCwgY29uZmlnLCB2aWV3cG9ydFNpemUsIHByb3ZpZGVyTWV0aG9kcywgZW11bGF0ZWREZXZpY2VQaXhlbFJhdGlvIH0gPSB0aGlzLl9ydW50aW1lSW5mbztcblxuICAgICAgICBjb25zdCBjdXJyZW50V2lkdGggPSB2aWV3cG9ydFNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRIZWlnaHQgPSB2aWV3cG9ydFNpemUuaGVpZ2h0O1xuICAgICAgICBjb25zdCBuZXdXaWR0aCA9IG5ld0RpbWVuc2lvbnMud2lkdGggfHwgY3VycmVudFdpZHRoO1xuICAgICAgICBjb25zdCBuZXdIZWlnaHQgPSBuZXdEaW1lbnNpb25zLmhlaWdodCB8fCBjdXJyZW50SGVpZ2h0O1xuXG4gICAgICAgIGlmICghY29uZmlnLmhlYWRsZXNzKVxuICAgICAgICAgICAgYXdhaXQgcHJvdmlkZXJNZXRob2RzLnJlc2l6ZUxvY2FsQnJvd3NlcldpbmRvdyhicm93c2VySWQsIG5ld1dpZHRoLCBuZXdIZWlnaHQsIGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCk7XG5cbiAgICAgICAgdmlld3BvcnRTaXplLndpZHRoID0gbmV3V2lkdGg7XG4gICAgICAgIHZpZXdwb3J0U2l6ZS5oZWlnaHQgPSBuZXdIZWlnaHQ7XG5cbiAgICAgICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRBY3RpdmVDbGllbnQoKTtcblxuICAgICAgICBpZiAoY2xpZW50ICYmIGNvbmZpZy5lbXVsYXRpb24pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NldERldmljZU1ldHJpY3NPdmVycmlkZShjbGllbnQsIHZpZXdwb3J0U2l6ZS53aWR0aCwgdmlld3BvcnRTaXplLmhlaWdodCwgZW11bGF0ZWREZXZpY2VQaXhlbFJhdGlvLCBjb25maWcubW9iaWxlKTtcblxuICAgICAgICAgICAgYXdhaXQgZ3VhcmRUaW1lRXhlY3V0aW9uKFxuICAgICAgICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LkVtdWxhdGlvbi5zZXRWaXNpYmxlU2l6ZSh7IHdpZHRoOiB2aWV3cG9ydFNpemUud2lkdGgsIGhlaWdodDogdmlld3BvcnRTaXplLmhlaWdodCB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lID0+IHRoaXMuX2NoZWNrRHJvcE9mUGVyZm9ybWFuY2UoQ2hlY2tlZENEUE1ldGhvZC5TZXRWaXNpYmxlU2l6ZSwgZWxhcHNlZFRpbWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGlzSGVhZGxlc3NUYWIgKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9wYXJlbnRUYXJnZXQgJiYgdGhpcy5fY29uZmlnLmhlYWRsZXNzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRBY3RpdmVDbGllbnQgKCk6IFByb21pc2U8cmVtb3RlQ2hyb21lLlByb3RvY29sQXBpIHwgdm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9jbGllbnRzW3RoaXMuX2NsaWVudEtleV0pXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpZW50c1t0aGlzLl9jbGllbnRLZXldID0gYXdhaXQgdGhpcy5fY3JlYXRlQ2xpZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZGVidWdMb2coZXJyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRzW3RoaXMuX2NsaWVudEtleV07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGluaXQgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdGFicyA9IGF3YWl0IHRoaXMuX2dldFRhYnMoKTtcblxuICAgICAgICAgICAgdGhpcy5fcGFyZW50VGFyZ2V0ID0gdGFicy5maW5kKHQgPT4gdC51cmwuaW5jbHVkZXModGhpcy5fcnVudGltZUluZm8uYnJvd3NlcklkKSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5fcGFyZW50VGFyZ2V0KVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRBY3RpdmVDbGllbnQoKTtcblxuICAgICAgICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2NhbGN1bGF0ZUVtdWxhdGVkRGV2aWNlUGl4ZWxSYXRpbyhjbGllbnQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NldHVwQ2xpZW50KGNsaWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRTY3JlZW5zaG90RGF0YSAoZnVsbFBhZ2U/OiBib29sZWFuKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICAgICAgbGV0IHZpZXdwb3J0V2lkdGggID0gMDtcbiAgICAgICAgbGV0IHZpZXdwb3J0SGVpZ2h0ID0gMDtcblxuICAgICAgICBjb25zdCB7IGNvbmZpZywgZW11bGF0ZWREZXZpY2VQaXhlbFJhdGlvIH0gPSB0aGlzLl9ydW50aW1lSW5mbztcblxuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUNsaWVudCgpO1xuXG4gICAgICAgIGlmICghY2xpZW50KVxuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcblxuICAgICAgICBpZiAoZnVsbFBhZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgY29udGVudFNpemUsIHZpc3VhbFZpZXdwb3J0IH0gPSBhd2FpdCBjbGllbnQuUGFnZS5nZXRMYXlvdXRNZXRyaWNzKCk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NldERldmljZU1ldHJpY3NPdmVycmlkZShcbiAgICAgICAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgICAgICAgTWF0aC5jZWlsKGNvbnRlbnRTaXplLndpZHRoKSxcbiAgICAgICAgICAgICAgICBNYXRoLmNlaWwoY29udGVudFNpemUuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICBlbXVsYXRlZERldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgY29uZmlnLm1vYmlsZSk7XG5cbiAgICAgICAgICAgIHZpZXdwb3J0V2lkdGggPSB2aXN1YWxWaWV3cG9ydC5jbGllbnRXaWR0aDtcbiAgICAgICAgICAgIHZpZXdwb3J0SGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NyZWVuc2hvdERhdGEgPSBhd2FpdCBjbGllbnQuUGFnZS5jYXB0dXJlU2NyZWVuc2hvdCh7fSk7XG5cbiAgICAgICAgaWYgKGZ1bGxQYWdlKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmVtdWxhdGlvbikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NldERldmljZU1ldHJpY3NPdmVycmlkZShcbiAgICAgICAgICAgICAgICAgICAgY2xpZW50LFxuICAgICAgICAgICAgICAgICAgICBjb25maWcud2lkdGggfHwgdmlld3BvcnRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLmhlaWdodCB8fCB2aWV3cG9ydEhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgZW11bGF0ZWREZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICBjb25maWcubW9iaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuRW11bGF0aW9uLmNsZWFyRGV2aWNlTWV0cmljc092ZXJyaWRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oc2NyZWVuc2hvdERhdGEuZGF0YSwgJ2Jhc2U2NCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbG9zZVRhYiAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnRUYXJnZXQpXG4gICAgICAgICAgICBhd2FpdCByZW1vdGVDaHJvbWUuY2xvc2VUYWIoeyBpZDogdGhpcy5fcGFyZW50VGFyZ2V0LmlkLCBwb3J0OiB0aGlzLl9ydW50aW1lSW5mby5jZHBQb3J0IH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGVNb2JpbGVWaWV3cG9ydFNpemUgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUNsaWVudCgpO1xuXG4gICAgICAgIGlmICghY2xpZW50KVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHdpbmRvd0RpbWVuc2lvbnNRdWVyeVJlc3VsdCA9IGF3YWl0IHRoaXMuX2V2YWx1YXRlUnVudGltZShjbGllbnQsIGAoJHtHRVRfV0lORE9XX0RJTUVOU0lPTlNfSU5GT19TQ1JJUFR9KSgpYCwgdHJ1ZSk7XG5cbiAgICAgICAgY29uc3Qgd2luZG93RGltZW5zaW9ucyA9IHdpbmRvd0RpbWVuc2lvbnNRdWVyeVJlc3VsdC5yZXN1bHQudmFsdWU7XG5cbiAgICAgICAgdGhpcy5fcnVudGltZUluZm8udmlld3BvcnRTaXplLndpZHRoID0gd2luZG93RGltZW5zaW9ucy5vdXRlcldpZHRoO1xuICAgICAgICB0aGlzLl9ydW50aW1lSW5mby52aWV3cG9ydFNpemUuaGVpZ2h0ID0gd2luZG93RGltZW5zaW9ucy5vdXRlckhlaWdodDtcbiAgICB9XG59XG4iXX0=
@@ -1,18 +1,18 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildChromeArgs = exports.IN_DOCKER_FLAGS = void 0;
4
- exports.IN_DOCKER_FLAGS = ['--no-sandbox', '--disable-dev-shm-usage'];
5
- function buildChromeArgs({ config, cdpPort, platformArgs, tempProfileDir, inDocker }) {
6
- let chromeArgs = []
7
- .concat(cdpPort ? [`--remote-debugging-port=${cdpPort}`] : [], !config.userProfile ? [`--user-data-dir=${tempProfileDir.path}`] : [], config.headless ? ['--headless'] : [], config.userArgs ? [config.userArgs] : [], platformArgs ? [platformArgs] : [])
8
- .join(' ');
9
- if (inDocker) {
10
- exports.IN_DOCKER_FLAGS.forEach(inDockerFlag => {
11
- if (!chromeArgs.includes(inDockerFlag))
12
- chromeArgs = chromeArgs.concat(' ', inDockerFlag);
13
- });
14
- }
15
- return chromeArgs;
16
- }
17
- exports.buildChromeArgs = buildChromeArgs;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildChromeArgs = exports.IN_DOCKER_FLAGS = void 0;
4
+ exports.IN_DOCKER_FLAGS = ['--no-sandbox', '--disable-dev-shm-usage'];
5
+ function buildChromeArgs({ config, cdpPort, platformArgs, tempProfileDir, inDocker }) {
6
+ let chromeArgs = []
7
+ .concat(cdpPort ? [`--remote-debugging-port=${cdpPort}`] : [], !config.userProfile ? [`--user-data-dir=${tempProfileDir.path}`] : [], config.headless ? ['--headless'] : [], config.userArgs ? [config.userArgs] : [], platformArgs ? [platformArgs] : [])
8
+ .join(' ');
9
+ if (inDocker) {
10
+ exports.IN_DOCKER_FLAGS.forEach(inDockerFlag => {
11
+ if (!chromeArgs.includes(inDockerFlag))
12
+ chromeArgs = chromeArgs.concat(' ', inDockerFlag);
13
+ });
14
+ }
15
+ return chromeArgs;
16
+ }
17
+ exports.buildChromeArgs = buildChromeArgs;
18
18
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtY2hyb21lLWFyZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYnJvd3Nlci9wcm92aWRlci9idWlsdC1pbi9kZWRpY2F0ZWQvY2hyb21lL2J1aWxkLWNocm9tZS1hcmdzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFhLFFBQUEsZUFBZSxHQUFHLENBQUMsY0FBYyxFQUFFLHlCQUF5QixDQUFDLENBQUM7QUFFM0UsU0FBZ0IsZUFBZSxDQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRTtJQUN4RixJQUFJLFVBQVUsR0FBRyxFQUFFO1NBQ2QsTUFBTSxDQUNILE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQywyQkFBMkIsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUNyRCxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQ3JFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFDckMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFDeEMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ3JDO1NBQ0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWYsSUFBSSxRQUFRLEVBQUU7UUFDVix1QkFBZSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNuQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7Z0JBQ2xDLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztLQUNOO0lBRUQsT0FBTyxVQUFVLENBQUM7QUFDdEIsQ0FBQztBQW5CRCwwQ0FtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgSU5fRE9DS0VSX0ZMQUdTID0gWyctLW5vLXNhbmRib3gnLCAnLS1kaXNhYmxlLWRldi1zaG0tdXNhZ2UnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2hyb21lQXJncyAoeyBjb25maWcsIGNkcFBvcnQsIHBsYXRmb3JtQXJncywgdGVtcFByb2ZpbGVEaXIsIGluRG9ja2VyIH0pIHtcbiAgICBsZXQgY2hyb21lQXJncyA9IFtdXG4gICAgICAgIC5jb25jYXQoXG4gICAgICAgICAgICBjZHBQb3J0ID8gW2AtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydD0ke2NkcFBvcnR9YF0gOiBbXSxcbiAgICAgICAgICAgICFjb25maWcudXNlclByb2ZpbGUgPyBbYC0tdXNlci1kYXRhLWRpcj0ke3RlbXBQcm9maWxlRGlyLnBhdGh9YF0gOiBbXSxcbiAgICAgICAgICAgIGNvbmZpZy5oZWFkbGVzcyA/IFsnLS1oZWFkbGVzcyddIDogW10sXG4gICAgICAgICAgICBjb25maWcudXNlckFyZ3MgPyBbY29uZmlnLnVzZXJBcmdzXSA6IFtdLFxuICAgICAgICAgICAgcGxhdGZvcm1BcmdzID8gW3BsYXRmb3JtQXJnc10gOiBbXVxuICAgICAgICApXG4gICAgICAgIC5qb2luKCcgJyk7XG5cbiAgICBpZiAoaW5Eb2NrZXIpIHtcbiAgICAgICAgSU5fRE9DS0VSX0ZMQUdTLmZvckVhY2goaW5Eb2NrZXJGbGFnID0+IHtcbiAgICAgICAgICAgIGlmICghY2hyb21lQXJncy5pbmNsdWRlcyhpbkRvY2tlckZsYWcpKVxuICAgICAgICAgICAgICAgIGNocm9tZUFyZ3MgPSBjaHJvbWVBcmdzLmNvbmNhdCgnICcsIGluRG9ja2VyRmxhZyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjaHJvbWVBcmdzO1xufVxuIl19