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.
- package/CHANGELOG.md +6 -0
- package/LICENSE +21 -21
- package/bin/testcafe-with-v8-flag-filter.js +0 -0
- package/lib/api/exportable-lib/index.js +49 -49
- package/lib/api/request-hooks/assert-type.js +7 -7
- package/lib/api/request-hooks/hook-method-names.js +9 -9
- package/lib/api/request-hooks/hook.js +32 -32
- package/lib/api/request-hooks/interfaces.js +2 -2
- package/lib/api/request-hooks/request-logger.js +112 -112
- package/lib/api/request-hooks/request-mock/create-request-mock.js +10 -10
- package/lib/api/request-hooks/request-mock/index.js +44 -44
- package/lib/api/request-hooks/request-mock.js +46 -46
- package/lib/api/structure/base-unit.js +11 -11
- package/lib/api/structure/fixture.js +75 -75
- package/lib/api/structure/interfaces.js +2 -2
- package/lib/api/structure/test-file.js +31 -31
- package/lib/api/structure/test-timeout.js +9 -9
- package/lib/api/structure/test.js +85 -85
- package/lib/api/structure/testing-unit.js +89 -89
- package/lib/api/structure/unit-type.js +9 -9
- package/lib/api/test-controller/assertion.js +88 -88
- package/lib/api/test-controller/execution-context.js +82 -82
- package/lib/api/test-controller/index.js +358 -358
- package/lib/api/test-controller/proxy.js +28 -28
- package/lib/api/test-page-url.js +60 -60
- package/lib/api/test-run-tracker.js +68 -68
- package/lib/api/wrap-test-function.js +49 -49
- package/lib/assertions/executor.js +74 -74
- package/lib/assertions/get-fn.js +46 -46
- package/lib/assertions/type.js +20 -20
- package/lib/assets/content-types.js +9 -9
- package/lib/assets/injectables.js +18 -18
- package/lib/browser/connection/command.js +10 -10
- package/lib/browser/connection/error-hints.js +9 -9
- package/lib/browser/connection/gateway.js +159 -159
- package/lib/browser/connection/get-hints.js +33 -33
- package/lib/browser/connection/heartbeat-status.js +8 -8
- package/lib/browser/connection/index.js +328 -328
- package/lib/browser/connection/remotes-queue.js +46 -46
- package/lib/browser/connection/service-routes.js +12 -12
- package/lib/browser/connection/status.js +12 -12
- package/lib/browser/interfaces.js +2 -2
- package/lib/browser/provider/built-in/dedicated/base.js +80 -80
- package/lib/browser/provider/built-in/dedicated/chrome/browser-client.js +204 -204
- package/lib/browser/provider/built-in/dedicated/chrome/build-chrome-args.js +17 -17
- package/lib/browser/provider/built-in/dedicated/chrome/config.js +110 -110
- package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +45 -45
- package/lib/browser/provider/built-in/dedicated/chrome/elapsed-upperbounds.js +15 -15
- package/lib/browser/provider/built-in/dedicated/chrome/index.js +102 -102
- package/lib/browser/provider/built-in/dedicated/chrome/interfaces.js +2 -2
- package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +24 -24
- package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +29 -29
- package/lib/browser/provider/built-in/dedicated/edge/index.js +10 -10
- package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +29 -29
- package/lib/browser/provider/built-in/dedicated/firefox/config.js +33 -33
- package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +78 -78
- package/lib/browser/provider/built-in/dedicated/firefox/index.js +73 -73
- package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +36 -36
- package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/commands.js +13 -13
- package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +200 -200
- package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +17 -17
- package/lib/browser/provider/built-in/index.js +21 -21
- package/lib/browser/provider/built-in/locally-installed.js +30 -30
- package/lib/browser/provider/built-in/path.js +47 -47
- package/lib/browser/provider/built-in/remote.js +58 -58
- package/lib/browser/provider/index.js +303 -303
- package/lib/browser/provider/parse-provider-name.js +16 -16
- package/lib/browser/provider/plugin-host.js +121 -121
- package/lib/browser/provider/pool.js +115 -115
- package/lib/browser/provider/utils/argument-parsing.js +74 -74
- package/lib/browser/provider/utils/browser-starter.js +34 -34
- package/lib/browser/provider/utils/client-functions.js +24 -24
- package/lib/browser/provider/utils/get-maximized-headless-window-size.js +9 -9
- package/lib/cli/argument-parser.js +284 -284
- package/lib/cli/authentication-helper.js +35 -35
- package/lib/cli/cli.js +134 -134
- package/lib/cli/correct-browsers-and-sources.js +40 -40
- package/lib/cli/index.js +19 -19
- package/lib/cli/log.js +43 -43
- package/lib/cli/remotes-wizard.js +36 -36
- package/lib/cli/termination-handler.js +38 -38
- package/lib/client/automation/index.js +34 -16
- package/lib/client/automation/index.min.js +1 -1
- package/lib/client/browser/idle-page/index.html.mustache +35 -35
- package/lib/client/browser/idle-page/logo.svg +86 -86
- package/lib/client/core/index.js +14 -14
- package/lib/client/driver/index.js +46 -16
- package/lib/client/driver/index.min.js +1 -1
- package/lib/client/driver/internal-properties.js +9 -9
- package/lib/client/test-run/iframe.js.mustache +17 -17
- package/lib/client/test-run/index.js.mustache +51 -51
- package/lib/client/ui/index.js +14 -14
- package/lib/client/ui/sprite.svg +42 -42
- package/lib/client-functions/builder-symbol.js +4 -4
- package/lib/client-functions/client-function-builder.js +155 -155
- package/lib/client-functions/replicator.js +61 -61
- package/lib/client-functions/return-single-prop-mode.js +8 -8
- package/lib/client-functions/selector-api-execution-mode.js +20 -20
- package/lib/client-functions/selectors/add-api.js +645 -645
- package/lib/client-functions/selectors/create-snapshot-methods.js +13 -13
- package/lib/client-functions/selectors/prepare-api-args.js +20 -20
- package/lib/client-functions/selectors/selector-attribute-filter.js +22 -22
- package/lib/client-functions/selectors/selector-builder.js +153 -153
- package/lib/client-functions/selectors/selector-text-filter.js +43 -43
- package/lib/client-functions/selectors/snapshot-properties.js +48 -48
- package/lib/client-functions/types.js +18 -18
- package/lib/compiler/babel/format-babel-produced-code.js +10 -10
- package/lib/compiler/babel/get-base-babel-options.js +11 -11
- package/lib/compiler/babel/load-libs.js +63 -63
- package/lib/compiler/babel/preset-stage-2.js +19 -19
- package/lib/compiler/compile-client-function.js +73 -73
- package/lib/compiler/compilers.js +33 -33
- package/lib/compiler/index.js +92 -92
- package/lib/compiler/interfaces.js +2 -2
- package/lib/compiler/test-file/api-based.js +146 -146
- package/lib/compiler/test-file/base.js +36 -36
- package/lib/compiler/test-file/exportble-lib-path.js +5 -5
- package/lib/compiler/test-file/formats/coffeescript/compiler.js +38 -38
- package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +29 -29
- package/lib/compiler/test-file/formats/es-next/compiler.js +42 -42
- package/lib/compiler/test-file/formats/es-next/get-test-list.js +166 -166
- package/lib/compiler/test-file/formats/es-next/is-flow-code.js +7 -7
- package/lib/compiler/test-file/formats/raw.js +85 -85
- package/lib/compiler/test-file/formats/typescript/compiler.js +135 -135
- package/lib/compiler/test-file/formats/typescript/get-test-list.js +185 -185
- package/lib/compiler/test-file/test-file-parser-base.js +214 -214
- package/lib/configuration/configuration-base.js +165 -165
- package/lib/configuration/constants.js +9 -9
- package/lib/configuration/customizable-compilers.js +7 -7
- package/lib/configuration/default-values.js +51 -51
- package/lib/configuration/interfaces.js +2 -2
- package/lib/configuration/option-names.js +53 -53
- package/lib/configuration/option-source.js +9 -9
- package/lib/configuration/option.js +14 -14
- package/lib/configuration/quarantine-option-names.js +8 -8
- package/lib/configuration/run-option-names.js +26 -26
- package/lib/configuration/screenshot-option-names.js +10 -10
- package/lib/configuration/testcafe-configuration.js +163 -163
- package/lib/configuration/types.js +2 -2
- package/lib/configuration/typescript-configuration.js +62 -62
- package/lib/custom-client-scripts/assert-type.js +7 -7
- package/lib/custom-client-scripts/client-script-init.js +2 -2
- package/lib/custom-client-scripts/client-script.js +106 -106
- package/lib/custom-client-scripts/get-code.js +11 -11
- package/lib/custom-client-scripts/get-url.js +6 -6
- package/lib/custom-client-scripts/load.js +15 -15
- package/lib/custom-client-scripts/problematic-scripts.js +2 -2
- package/lib/custom-client-scripts/routing.js +36 -36
- package/lib/custom-client-scripts/utils.js +60 -60
- package/lib/embedding-utils.js +83 -83
- package/lib/errors/create-stack-filter.js +18 -18
- package/lib/errors/error-list.js +26 -26
- package/lib/errors/get-callsite.js +31 -31
- package/lib/errors/internal-modules-prefix.js +8 -8
- package/lib/errors/is-internal-stack-frame.js +45 -45
- package/lib/errors/process-test-fn-error.js +37 -37
- package/lib/errors/runtime/index.js +123 -123
- package/lib/errors/runtime/templates.js +115 -115
- package/lib/errors/runtime/type-assertions.js +112 -112
- package/lib/errors/stack-cleaning-hook.js +64 -64
- package/lib/errors/test-run/formattable-adapter.js +59 -59
- package/lib/errors/test-run/index.js +301 -301
- package/lib/errors/test-run/render-error-template.js +31 -31
- package/lib/errors/test-run/templates.js +91 -91
- package/lib/errors/test-run/utils.js +89 -89
- package/lib/errors/types.js +156 -156
- package/lib/index.js +81 -81
- package/lib/live/bootstrapper.js +43 -43
- package/lib/live/controller.js +107 -107
- package/lib/live/file-watcher/index.js +67 -67
- package/lib/live/file-watcher/modules-graph.js +58 -58
- package/lib/live/keyboard-observer.js +76 -76
- package/lib/live/logger/index.js +64 -64
- package/lib/live/test-run-controller.js +96 -96
- package/lib/live/test-run-state.js +6 -6
- package/lib/live/test-run.js +56 -56
- package/lib/live/test-runner.js +167 -167
- package/lib/load-assets.js +29 -29
- package/lib/notifications/add-rendered-warning.js +16 -16
- package/lib/notifications/debug-logger.js +78 -78
- package/lib/notifications/deprecated.js +24 -24
- package/lib/notifications/information-message.js +9 -9
- package/lib/notifications/warning-log.js +31 -31
- package/lib/notifications/warning-message.js +47 -47
- package/lib/reporter/command/command-formatter.js +120 -109
- package/lib/reporter/command/format-command.js +8 -8
- package/lib/reporter/command/interfaces.js +2 -2
- package/lib/reporter/index.js +319 -314
- package/lib/reporter/interfaces.js +2 -2
- package/lib/reporter/plugin-host.js +135 -135
- package/lib/reporter/plugin-methods.js +12 -12
- package/lib/role/index.js +74 -74
- package/lib/role/marker-symbol.js +7 -7
- package/lib/role/phase.js +9 -9
- package/lib/runner/bootstrapper.js +271 -271
- package/lib/runner/browser-job-result.js +9 -9
- package/lib/runner/browser-job.js +152 -152
- package/lib/runner/browser-set.js +114 -114
- package/lib/runner/fixture-hook-controller.js +85 -85
- package/lib/runner/index.js +449 -449
- package/lib/runner/interfaces.js +2 -2
- package/lib/runner/reporter-stream-controller.js +27 -27
- package/lib/runner/task/index.js +151 -151
- package/lib/runner/task/phase.js +9 -9
- package/lib/runner/test-run-controller.js +165 -165
- package/lib/runner/tested-app.js +72 -72
- package/lib/screenshots/capturer.js +141 -141
- package/lib/screenshots/constants.js +11 -11
- package/lib/screenshots/crop.js +111 -111
- package/lib/screenshots/default-extension.js +4 -4
- package/lib/screenshots/index.js +67 -67
- package/lib/screenshots/utils.js +39 -39
- package/lib/services/compiler/host.js +190 -190
- package/lib/services/compiler/io.js +9 -9
- package/lib/services/compiler/protocol.js +17 -16
- package/lib/services/compiler/service.js +225 -212
- package/lib/services/compiler/test-run-proxy.js +111 -111
- package/lib/services/interfaces.js +2 -2
- package/lib/services/process-title.js +8 -8
- package/lib/services/serialization/prepare-options.js +17 -17
- package/lib/services/serialization/replicator/create-replicator.js +25 -25
- package/lib/services/serialization/replicator/custom-error-transform.js +26 -26
- package/lib/services/serialization/test-structure.js +92 -92
- package/lib/services/utils/ipc/interfaces.js +30 -30
- package/lib/services/utils/ipc/io.js +108 -108
- package/lib/services/utils/ipc/message.js +75 -75
- package/lib/services/utils/ipc/packet.js +55 -55
- package/lib/services/utils/ipc/proxy.js +109 -109
- package/lib/services/utils/ipc/transport.js +64 -64
- package/lib/shared/errors/index.js +382 -382
- package/lib/shared/node-modules-folder-name.js +4 -4
- package/lib/test-run/bookmark.js +90 -90
- package/lib/test-run/browser-console-messages.js +73 -73
- package/lib/test-run/browser-manipulation-queue.js +92 -92
- package/lib/test-run/client-messages.js +9 -9
- package/lib/test-run/commands/actions.js +486 -483
- package/lib/test-run/commands/assertion.js +45 -45
- package/lib/test-run/commands/base.js +14 -14
- package/lib/test-run/commands/browser-manipulation.js +95 -95
- package/lib/test-run/commands/from-object.js +82 -82
- package/lib/test-run/commands/observation.js +61 -61
- package/lib/test-run/commands/options.js +231 -215
- package/lib/test-run/commands/service.js +54 -48
- package/lib/test-run/commands/type.js +65 -64
- package/lib/test-run/commands/utils.js +87 -87
- package/lib/test-run/commands/validations/argument.js +90 -90
- package/lib/test-run/commands/validations/factories.js +47 -47
- package/lib/test-run/commands/validations/initializers.js +44 -44
- package/lib/test-run/debug-log.js +32 -32
- package/lib/test-run/execute-js-expression.js +74 -74
- package/lib/test-run/index.js +823 -799
- package/lib/test-run/marker-symbol.js +7 -7
- package/lib/test-run/observed-callsites-storage.js +17 -17
- package/lib/test-run/phase.js +16 -16
- package/lib/test-run/session-controller.js +104 -104
- package/lib/testcafe.js +118 -118
- package/lib/utils/assignable.js +39 -39
- package/lib/utils/async-event-emitter.js +28 -28
- package/lib/utils/async-queue.js +14 -14
- package/lib/utils/browser-connection-timeouts.js +19 -19
- package/lib/utils/callsite.js +17 -17
- package/lib/utils/check-file-path.js +31 -31
- package/lib/utils/check-url.js +51 -51
- package/lib/utils/convert-to-best-fit-type.js +16 -16
- package/lib/utils/correct-file-path.js +21 -21
- package/lib/utils/define-lazy-property.js +13 -13
- package/lib/utils/delay.js +6 -6
- package/lib/utils/delegated-api.js +44 -44
- package/lib/utils/detect-display.js +6 -6
- package/lib/utils/detect-ffmpeg.js +44 -44
- package/lib/utils/diff/colors.js +29 -29
- package/lib/utils/diff/index.js +52 -52
- package/lib/utils/diff/util.js +23 -23
- package/lib/utils/diff.js +29 -29
- package/lib/utils/escape-user-agent.js +10 -10
- package/lib/utils/flag-list.js +17 -17
- package/lib/utils/get-any-key.js +8 -8
- package/lib/utils/get-browser.js +8 -8
- package/lib/utils/get-common-path.js +34 -34
- package/lib/utils/get-filter-fn.js +40 -40
- package/lib/utils/get-options/base.js +36 -36
- package/lib/utils/get-options/compiler.js +33 -33
- package/lib/utils/get-options/grep.js +15 -15
- package/lib/utils/get-options/index.js +20 -20
- package/lib/utils/get-options/meta.js +22 -22
- package/lib/utils/get-options/quarantine.js +91 -91
- package/lib/utils/get-options/screenshot.js +17 -17
- package/lib/utils/get-options/ssl.js +45 -45
- package/lib/utils/get-options/video.js +10 -10
- package/lib/utils/get-viewport-width.js +17 -17
- package/lib/utils/guard-time-execution.js +10 -10
- package/lib/utils/handle-errors.js +74 -74
- package/lib/utils/handle-tag-args.js +8 -8
- package/lib/utils/http.js +30 -30
- package/lib/utils/is-localhost.js +11 -11
- package/lib/utils/is-password-input.js +11 -0
- package/lib/utils/is-repl.js +10 -10
- package/lib/utils/is-window-in-iframe.js +6 -6
- package/lib/utils/limit-number.js +10 -10
- package/lib/utils/make-reg-exp.js +7 -7
- package/lib/utils/moment-loader.js +20 -20
- package/lib/utils/parse-file-list.js +71 -71
- package/lib/utils/parse-user-agent.js +55 -55
- package/lib/utils/path-pattern.js +114 -114
- package/lib/utils/prepare-reporters.js +30 -30
- package/lib/utils/prerender-callsite.js +18 -18
- package/lib/utils/process.js +119 -119
- package/lib/utils/promisified-functions.js +46 -46
- package/lib/utils/re-executable-promise.js +39 -39
- package/lib/utils/render-callsite-sync.js +29 -29
- package/lib/utils/render-template.js +9 -9
- package/lib/utils/reporter.js +30 -30
- package/lib/utils/resolve-path-relatively-cwd.js +7 -7
- package/lib/utils/string.js +105 -105
- package/lib/utils/temp-directory/cleanup-process/commands.js +7 -7
- package/lib/utils/temp-directory/cleanup-process/index.js +143 -143
- package/lib/utils/temp-directory/cleanup-process/worker.js +58 -58
- package/lib/utils/temp-directory/index.js +87 -87
- package/lib/utils/temp-directory/lockfile.js +56 -56
- package/lib/utils/thennable.js +7 -7
- package/lib/utils/timer.js +15 -15
- package/lib/utils/to-posix-path.js +8 -8
- package/lib/utils/types.js +2 -2
- package/lib/video-recorder/interfaces.js +2 -2
- package/lib/video-recorder/process.js +126 -126
- package/lib/video-recorder/recorder.js +136 -136
- package/lib/video-recorder/test-run-video-recorder.js +69 -69
- package/lib/video-recorder/videos.js +37 -37
- package/package.json +2 -2
- package/ts-defs/index.d.ts +25 -14
- package/ts-defs/selectors.d.ts +16 -5
- 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
|