patchright-core 1.51.3 → 1.52.1
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/browsers.json +15 -13
- package/lib/androidServerImpl.js +42 -48
- package/lib/browserServerImpl.js +54 -67
- package/lib/cli/driver.js +71 -69
- package/lib/cli/program.js +312 -328
- package/lib/cli/programWithTestStub.js +51 -45
- package/lib/client/accessibility.js +31 -32
- package/lib/client/android.js +141 -228
- package/lib/client/api.js +135 -283
- package/lib/client/artifact.js +39 -36
- package/lib/client/browser.js +57 -61
- package/lib/client/browserContext.js +297 -326
- package/lib/client/browserType.js +92 -106
- package/lib/client/cdpSession.js +29 -31
- package/lib/client/channelOwner.js +82 -95
- package/lib/client/clientHelper.js +46 -38
- package/lib/client/clientInstrumentation.js +40 -37
- package/lib/client/clientStackTrace.js +41 -37
- package/lib/client/clock.js +36 -36
- package/lib/client/connection.js +190 -212
- package/lib/client/consoleMessage.js +31 -28
- package/lib/client/coverage.js +25 -22
- package/lib/client/dialog.js +30 -31
- package/lib/client/download.js +25 -25
- package/lib/client/electron.js +73 -75
- package/lib/client/elementHandle.js +111 -147
- package/lib/client/errors.js +53 -53
- package/lib/client/eventEmitter.js +124 -121
- package/lib/client/events.js +72 -68
- package/lib/client/fetch.js +135 -158
- package/lib/client/fileChooser.js +25 -24
- package/lib/client/fileUtils.js +31 -28
- package/lib/client/frame.js +187 -306
- package/lib/client/harRouter.js +42 -52
- package/lib/client/input.js +40 -69
- package/lib/client/jsHandle.js +56 -71
- package/lib/client/jsonPipe.js +27 -23
- package/lib/client/localUtils.js +29 -28
- package/lib/client/locator.js +161 -245
- package/lib/client/network.js +277 -295
- package/lib/client/page.js +270 -318
- package/lib/client/platform.js +46 -43
- package/lib/client/playwright.js +51 -66
- package/lib/client/selectors.js +48 -46
- package/lib/client/stream.js +29 -25
- package/lib/client/timeoutSettings.js +49 -39
- package/lib/client/tracing.js +48 -84
- package/lib/client/types.js +26 -22
- package/lib/client/video.js +35 -27
- package/lib/client/waiter.js +69 -88
- package/lib/client/webError.js +25 -23
- package/lib/client/webSocket.js +61 -56
- package/lib/client/worker.js +48 -58
- package/lib/client/writableStream.js +27 -23
- package/lib/generated/clockSource.js +26 -5
- package/lib/generated/consoleApiSource.js +26 -5
- package/lib/generated/injectedScriptSource.js +26 -5
- package/lib/generated/pollingRecorderSource.js +26 -5
- package/lib/generated/utilityScriptSource.js +26 -5
- package/lib/generated/webSocketMockSource.js +371 -4
- package/lib/inProcessFactory.js +53 -53
- package/lib/inprocess.js +2 -19
- package/lib/outofprocess.js +53 -46
- package/lib/protocol/debug.js +209 -25
- package/lib/protocol/serializers.js +153 -134
- package/lib/protocol/validator.js +2714 -2714
- package/lib/protocol/validatorPrimitives.js +114 -73
- package/lib/remote/playwrightConnection.js +140 -157
- package/lib/remote/playwrightServer.js +99 -84
- package/lib/server/accessibility.js +44 -37
- package/lib/server/android/android.js +216 -209
- package/lib/server/android/backendAdb.js +89 -82
- package/lib/server/artifact.js +78 -55
- package/lib/server/bidi/bidiBrowser.js +221 -155
- package/lib/server/bidi/bidiChromium.js +106 -79
- package/lib/server/bidi/bidiConnection.js +66 -83
- package/lib/server/bidi/bidiExecutionContext.js +128 -113
- package/lib/server/bidi/bidiFirefox.js +76 -69
- package/lib/server/bidi/bidiInput.js +86 -97
- package/lib/server/bidi/bidiNetworkManager.js +137 -154
- package/lib/server/bidi/bidiOverCdp.js +57 -58
- package/lib/server/bidi/bidiPage.js +247 -219
- package/lib/server/bidi/bidiPdf.js +52 -86
- package/lib/server/bidi/third_party/bidiCommands.d.js +22 -0
- package/lib/server/bidi/third_party/bidiDeserializer.js +55 -50
- package/lib/server/bidi/third_party/bidiKeyboard.js +236 -220
- package/lib/server/bidi/third_party/bidiProtocol.js +144 -131
- package/lib/server/bidi/third_party/bidiSerializer.js +67 -63
- package/lib/server/bidi/third_party/firefoxPrefs.js +141 -119
- package/lib/server/browser.js +76 -84
- package/lib/server/browserContext.js +321 -346
- package/lib/server/browserType.js +169 -182
- package/lib/server/callLog.js +47 -44
- package/lib/server/chromium/chromium.js +212 -190
- package/lib/server/chromium/chromiumSwitches.js +86 -64
- package/lib/server/chromium/crAccessibility.js +157 -131
- package/lib/server/chromium/crBrowser.js +253 -273
- package/lib/server/chromium/crConnection.js +91 -116
- package/lib/server/chromium/crCoverage.js +113 -127
- package/lib/server/chromium/crDevTools.js +59 -51
- package/lib/server/chromium/crDragDrop.js +62 -79
- package/lib/server/chromium/crExecutionContext.js +88 -83
- package/lib/server/chromium/crInput.js +97 -95
- package/lib/server/chromium/crNetworkManager.js +284 -404
- package/lib/server/chromium/crPage.js +522 -608
- package/lib/server/chromium/crPdf.js +54 -86
- package/lib/server/chromium/crProtocolHelper.js +92 -80
- package/lib/server/chromium/crServiceWorker.js +82 -67
- package/lib/server/chromium/defaultFontFamilies.js +152 -135
- package/lib/server/chromium/protocol.d.js +16 -0
- package/lib/server/chromium/videoRecorder.js +65 -99
- package/lib/server/clock.js +62 -50
- package/lib/server/codegen/csharp.js +185 -160
- package/lib/server/codegen/java.js +155 -128
- package/lib/server/codegen/javascript.js +163 -148
- package/lib/server/codegen/jsonl.js +32 -28
- package/lib/server/codegen/language.js +75 -52
- package/lib/server/codegen/languages.js +65 -27
- package/lib/server/codegen/python.js +140 -125
- package/lib/server/codegen/types.js +15 -4
- package/lib/server/console.js +28 -32
- package/lib/server/cookieStore.js +105 -86
- package/lib/server/debugController.js +97 -124
- package/lib/server/debugger.js +82 -78
- package/lib/server/deviceDescriptors.js +37 -24
- package/lib/server/deviceDescriptorsSource.json +50 -50
- package/lib/server/dialog.js +36 -35
- package/lib/server/dispatchers/androidDispatcher.js +196 -107
- package/lib/server/dispatchers/artifactDispatcher.js +62 -62
- package/lib/server/dispatchers/browserContextDispatcher.js +176 -205
- package/lib/server/dispatchers/browserDispatcher.js +78 -97
- package/lib/server/dispatchers/browserTypeDispatcher.js +35 -35
- package/lib/server/dispatchers/cdpSessionDispatcher.js +32 -36
- package/lib/server/dispatchers/debugControllerDispatcher.js +48 -66
- package/lib/server/dispatchers/dialogDispatcher.js +30 -27
- package/lib/server/dispatchers/dispatcher.js +169 -220
- package/lib/server/dispatchers/electronDispatcher.js +54 -57
- package/lib/server/dispatchers/elementHandlerDispatcher.js +77 -119
- package/lib/server/dispatchers/frameDispatcher.js +99 -163
- package/lib/server/dispatchers/jsHandleDispatcher.js +49 -66
- package/lib/server/dispatchers/jsonPipeDispatcher.js +35 -36
- package/lib/server/dispatchers/localUtilsDispatcher.js +95 -80
- package/lib/server/dispatchers/networkDispatchers.js +90 -107
- package/lib/server/dispatchers/pageDispatcher.js +128 -169
- package/lib/server/dispatchers/playwrightDispatcher.js +69 -76
- package/lib/server/dispatchers/selectorsDispatcher.js +28 -24
- package/lib/server/dispatchers/streamDispatcher.js +42 -45
- package/lib/server/dispatchers/tracingDispatcher.js +36 -41
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +96 -131
- package/lib/server/dispatchers/writableStreamDispatcher.js +54 -38
- package/lib/server/dom.js +413 -443
- package/lib/server/download.js +45 -35
- package/lib/server/electron/electron.js +156 -176
- package/lib/server/electron/loader.js +8 -36
- package/lib/server/errors.js +47 -46
- package/lib/server/fetch.js +289 -323
- package/lib/server/fileChooser.js +25 -24
- package/lib/server/fileUploadUtils.js +65 -59
- package/lib/server/firefox/ffAccessibility.js +153 -131
- package/lib/server/firefox/ffBrowser.js +213 -277
- package/lib/server/firefox/ffConnection.js +63 -84
- package/lib/server/firefox/ffExecutionContext.js +91 -73
- package/lib/server/firefox/ffInput.js +67 -69
- package/lib/server/firefox/ffNetworkManager.js +131 -110
- package/lib/server/firefox/ffPage.js +236 -273
- package/lib/server/firefox/firefox.js +76 -67
- package/lib/server/firefox/protocol.d.js +16 -0
- package/lib/server/formData.js +107 -35
- package/lib/server/frameSelectors.js +221 -112
- package/lib/server/frames.js +731 -894
- package/lib/server/har/harRecorder.js +85 -77
- package/lib/server/har/harTracer.js +287 -222
- package/lib/server/harBackend.js +80 -80
- package/lib/server/helper.js +56 -59
- package/lib/server/index.js +59 -99
- package/lib/server/input.js +134 -163
- package/lib/server/instrumentation.js +49 -44
- package/lib/server/javascript.js +143 -134
- package/lib/server/launchApp.js +92 -73
- package/lib/server/localUtils.js +130 -122
- package/lib/server/macEditingCommands.js +141 -137
- package/lib/server/network.js +262 -296
- package/lib/server/page.js +326 -423
- package/lib/server/pageBinding.js +88 -0
- package/lib/server/pipeTransport.js +49 -45
- package/lib/server/playwright.js +60 -67
- package/lib/server/progress.js +56 -51
- package/lib/server/protocolError.js +34 -31
- package/lib/server/recorder/chat.js +70 -86
- package/lib/server/recorder/contextRecorder.js +134 -138
- package/lib/server/recorder/recorderApp.js +127 -136
- package/lib/server/recorder/recorderCollection.js +56 -44
- package/lib/server/recorder/recorderFrontend.js +15 -4
- package/lib/server/recorder/recorderRunner.js +79 -103
- package/lib/server/recorder/recorderUtils.js +56 -45
- package/lib/server/recorder/throttledFile.js +42 -30
- package/lib/server/recorder.js +177 -186
- package/lib/server/registry/browserFetcher.js +106 -101
- package/lib/server/registry/dependencies.js +245 -196
- package/lib/server/registry/index.js +904 -792
- package/lib/server/registry/nativeDeps.js +1073 -464
- package/lib/server/registry/oopDownloadBrowserMain.js +57 -75
- package/lib/server/screenshotter.js +166 -182
- package/lib/server/selectors.js +85 -46
- package/lib/server/socksClientCertificatesInterceptor.js +166 -185
- package/lib/server/socksInterceptor.js +62 -70
- package/lib/server/storageScript.js +94 -100
- package/lib/server/timeoutSettings.js +58 -43
- package/lib/server/trace/recorder/snapshotter.js +70 -89
- package/lib/server/trace/recorder/snapshotterInjected.js +238 -217
- package/lib/server/trace/recorder/tracing.js +321 -333
- package/lib/server/trace/test/inMemorySnapshotter.js +46 -52
- package/lib/server/trace/viewer/traceViewer.js +168 -146
- package/lib/server/transport.js +124 -133
- package/lib/server/types.js +26 -22
- package/lib/server/usKeyboardLayout.js +135 -545
- package/lib/server/utils/ascii.js +39 -26
- package/lib/server/utils/comparators.js +105 -103
- package/lib/server/utils/crypto.js +157 -112
- package/lib/server/utils/debug.js +37 -28
- package/lib/server/utils/debugLogger.js +69 -48
- package/lib/server/utils/env.js +52 -37
- package/lib/server/utils/eventsHelper.js +29 -28
- package/lib/server/utils/expectUtils.js +31 -26
- package/lib/server/utils/fileUtils.js +123 -136
- package/lib/server/utils/happyEyeballs.js +138 -123
- package/lib/server/utils/hostPlatform.js +84 -120
- package/lib/server/utils/httpServer.js +106 -121
- package/lib/server/utils/image_tools/colorUtils.js +42 -51
- package/lib/server/utils/image_tools/compare.js +44 -43
- package/lib/server/utils/image_tools/imageChannel.js +38 -30
- package/lib/server/utils/image_tools/stats.js +40 -40
- package/lib/server/utils/linuxUtils.js +50 -37
- package/lib/server/utils/network.js +143 -86
- package/lib/server/utils/nodePlatform.js +87 -79
- package/lib/server/utils/pipeTransport.js +44 -42
- package/lib/server/utils/processLauncher.js +111 -121
- package/lib/server/utils/profiler.js +52 -39
- package/lib/server/utils/socksProxy.js +280 -339
- package/lib/server/utils/spawnAsync.js +37 -41
- package/lib/server/utils/task.js +31 -38
- package/lib/server/utils/userAgent.js +73 -66
- package/lib/server/utils/wsServer.js +73 -69
- package/lib/server/utils/zipFile.js +36 -37
- package/lib/server/utils/zones.js +37 -34
- package/lib/server/webkit/protocol.d.js +16 -0
- package/lib/server/webkit/webkit.js +76 -63
- package/lib/server/webkit/wkAccessibility.js +161 -118
- package/lib/server/webkit/wkBrowser.js +159 -176
- package/lib/server/webkit/wkConnection.js +59 -83
- package/lib/server/webkit/wkExecutionContext.js +84 -70
- package/lib/server/webkit/wkInput.js +82 -80
- package/lib/server/webkit/wkInterceptableRequest.js +102 -95
- package/lib/server/webkit/wkPage.js +525 -619
- package/lib/server/webkit/wkProvisionalPage.js +45 -56
- package/lib/server/webkit/wkWorkers.js +77 -77
- package/lib/utils/isomorphic/ariaSnapshot.js +144 -152
- package/lib/utils/isomorphic/assert.js +28 -22
- package/lib/utils/isomorphic/builtins.js +86 -0
- package/lib/utils/isomorphic/colors.js +66 -59
- package/lib/utils/isomorphic/cssParser.js +121 -125
- package/lib/utils/isomorphic/cssTokenizer.js +436 -364
- package/lib/utils/isomorphic/headers.js +38 -37
- package/lib/utils/isomorphic/locatorGenerators.js +340 -357
- package/lib/utils/isomorphic/locatorParser.js +96 -105
- package/lib/utils/isomorphic/locatorUtils.js +63 -44
- package/lib/utils/isomorphic/manualPromise.js +47 -39
- package/lib/utils/isomorphic/mimeType.js +448 -25
- package/lib/utils/isomorphic/multimap.js +35 -27
- package/lib/utils/isomorphic/rtti.js +35 -33
- package/lib/utils/isomorphic/selectorParser.js +183 -193
- package/lib/utils/isomorphic/semaphore.js +27 -24
- package/lib/utils/isomorphic/stackTrace.js +87 -98
- package/lib/utils/isomorphic/stringUtils.js +113 -106
- package/lib/utils/isomorphic/time.js +41 -22
- package/lib/utils/isomorphic/timeoutRunner.js +55 -54
- package/lib/utils/isomorphic/traceUtils.js +38 -41
- package/lib/utils/isomorphic/types.js +15 -4
- package/lib/utils/isomorphic/urlMatch.js +112 -67
- package/lib/utils/isomorphic/utilityScriptSerializers.js +248 -0
- package/lib/utils.js +97 -443
- package/lib/utilsBundle.js +101 -52
- package/lib/vite/htmlReport/index.html +21 -15
- package/lib/vite/recorder/assets/{codeMirrorModule-B9YMkrwa.js → codeMirrorModule-CXVeovup.js} +1 -1
- package/lib/vite/recorder/assets/index-BsWQsSGl.js +184 -0
- package/lib/vite/recorder/index.html +1 -1
- package/lib/vite/traceViewer/assets/{codeMirrorModule-1DiydmYA.js → codeMirrorModule-_GLjJL-7.js} +1 -1
- package/lib/vite/traceViewer/assets/defaultSettingsView-DtCQiGHe.js +265 -0
- package/lib/vite/traceViewer/{defaultSettingsView.5fN5lw10.css → defaultSettingsView.QdHITyLI.css} +1 -1
- package/lib/vite/traceViewer/index.cFZzK9RN.js +2 -0
- package/lib/vite/traceViewer/index.html +3 -3
- package/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/lib/vite/traceViewer/uiMode.XVPIqBeS.js +5 -0
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/lib/zipBundle.js +32 -23
- package/package.json +1 -1
- package/types/protocol.d.ts +436 -17
- package/types/types.d.ts +35 -16
- package/lib/server/isomorphic/utilityScriptSerializers.js +0 -229
- package/lib/vite/recorder/assets/index-ELPgmkwA.js +0 -184
- package/lib/vite/traceViewer/assets/defaultSettingsView-l0TyP_G8.js +0 -259
- package/lib/vite/traceViewer/index.BqUZLSro.js +0 -2
- package/lib/vite/traceViewer/uiMode.C1d2m5sF.js +0 -5
|
@@ -1,71 +1,83 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty
|
|
4
|
-
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var android_exports = {};
|
|
30
|
+
__export(android_exports, {
|
|
31
|
+
Android: () => Android,
|
|
32
|
+
AndroidDevice: () => AndroidDevice
|
|
5
33
|
});
|
|
6
|
-
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
var
|
|
21
|
-
var
|
|
22
|
-
var
|
|
23
|
-
var
|
|
24
|
-
var
|
|
25
|
-
var
|
|
26
|
-
var
|
|
27
|
-
var
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
*
|
|
32
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
33
|
-
* you may not use this file except in compliance with the License.
|
|
34
|
-
* You may obtain a copy of the License at
|
|
35
|
-
*
|
|
36
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
37
|
-
*
|
|
38
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
39
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
40
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
41
|
-
* See the License for the specific language governing permissions and
|
|
42
|
-
* limitations under the License.
|
|
43
|
-
*/
|
|
44
|
-
|
|
45
|
-
const ARTIFACTS_FOLDER = _path.default.join(_os.default.tmpdir(), 'playwright-artifacts-');
|
|
46
|
-
class Android extends _instrumentation.SdkObject {
|
|
34
|
+
module.exports = __toCommonJS(android_exports);
|
|
35
|
+
var import_events = require("events");
|
|
36
|
+
var import_fs = __toESM(require("fs"));
|
|
37
|
+
var import_os = __toESM(require("os"));
|
|
38
|
+
var import_path = __toESM(require("path"));
|
|
39
|
+
var import_timeoutSettings = require("../timeoutSettings");
|
|
40
|
+
var import_pipeTransport = require("../utils/pipeTransport");
|
|
41
|
+
var import_crypto = require("../utils/crypto");
|
|
42
|
+
var import_debug = require("../utils/debug");
|
|
43
|
+
var import_env = require("../utils/env");
|
|
44
|
+
var import_task = require("../utils/task");
|
|
45
|
+
var import_debugLogger = require("../utils/debugLogger");
|
|
46
|
+
var import_utilsBundle = require("../../utilsBundle");
|
|
47
|
+
var import_utilsBundle2 = require("../../utilsBundle");
|
|
48
|
+
var import_browserContext = require("../browserContext");
|
|
49
|
+
var import_chromiumSwitches = require("../chromium/chromiumSwitches");
|
|
50
|
+
var import_crBrowser = require("../chromium/crBrowser");
|
|
51
|
+
var import_fileUtils = require("../utils/fileUtils");
|
|
52
|
+
var import_helper = require("../helper");
|
|
53
|
+
var import_instrumentation = require("../instrumentation");
|
|
54
|
+
var import_processLauncher = require("../utils/processLauncher");
|
|
55
|
+
var import_progress = require("../progress");
|
|
56
|
+
var import_registry = require("../registry");
|
|
57
|
+
const ARTIFACTS_FOLDER = import_path.default.join(import_os.default.tmpdir(), "playwright-artifacts-");
|
|
58
|
+
class Android extends import_instrumentation.SdkObject {
|
|
47
59
|
constructor(parent, backend) {
|
|
48
|
-
super(parent,
|
|
49
|
-
this.
|
|
50
|
-
this._devices = new Map();
|
|
51
|
-
this._timeoutSettings = void 0;
|
|
60
|
+
super(parent, "android");
|
|
61
|
+
this._devices = /* @__PURE__ */ new Map();
|
|
52
62
|
this._backend = backend;
|
|
53
|
-
this._timeoutSettings = new
|
|
63
|
+
this._timeoutSettings = new import_timeoutSettings.TimeoutSettings();
|
|
54
64
|
}
|
|
55
65
|
setDefaultTimeout(timeout) {
|
|
56
66
|
this._timeoutSettings.setDefaultTimeout(timeout);
|
|
57
67
|
}
|
|
58
68
|
async devices(options) {
|
|
59
|
-
const devices = (await this._backend.devices(options)).filter(d => d.status ===
|
|
60
|
-
const newSerials = new Set();
|
|
69
|
+
const devices = (await this._backend.devices(options)).filter((d) => d.status === "device");
|
|
70
|
+
const newSerials = /* @__PURE__ */ new Set();
|
|
61
71
|
for (const d of devices) {
|
|
62
72
|
newSerials.add(d.serial);
|
|
63
|
-
if (this._devices.has(d.serial))
|
|
73
|
+
if (this._devices.has(d.serial))
|
|
74
|
+
continue;
|
|
64
75
|
const device = await AndroidDevice.create(this, d, options);
|
|
65
76
|
this._devices.set(d.serial, device);
|
|
66
77
|
}
|
|
67
78
|
for (const d of this._devices.keys()) {
|
|
68
|
-
if (!newSerials.has(d))
|
|
79
|
+
if (!newSerials.has(d))
|
|
80
|
+
this._devices.delete(d);
|
|
69
81
|
}
|
|
70
82
|
return [...this._devices.values()];
|
|
71
83
|
}
|
|
@@ -73,33 +85,31 @@ class Android extends _instrumentation.SdkObject {
|
|
|
73
85
|
this._devices.delete(device.serial);
|
|
74
86
|
}
|
|
75
87
|
}
|
|
76
|
-
|
|
77
|
-
class AndroidDevice extends _instrumentation.SdkObject {
|
|
88
|
+
class AndroidDevice extends import_instrumentation.SdkObject {
|
|
78
89
|
constructor(android, backend, model, options) {
|
|
79
|
-
super(android,
|
|
80
|
-
this._backend = void 0;
|
|
81
|
-
this.model = void 0;
|
|
82
|
-
this.serial = void 0;
|
|
83
|
-
this._options = void 0;
|
|
84
|
-
this._driverPromise = void 0;
|
|
90
|
+
super(android, "android-device");
|
|
85
91
|
this._lastId = 0;
|
|
86
|
-
this._callbacks = new Map();
|
|
87
|
-
this.
|
|
88
|
-
this.
|
|
89
|
-
this._webViews = new Map();
|
|
90
|
-
this._browserConnections = new Set();
|
|
91
|
-
this._android = void 0;
|
|
92
|
+
this._callbacks = /* @__PURE__ */ new Map();
|
|
93
|
+
this._webViews = /* @__PURE__ */ new Map();
|
|
94
|
+
this._browserConnections = /* @__PURE__ */ new Set();
|
|
92
95
|
this._isClosed = false;
|
|
93
96
|
this._android = android;
|
|
94
97
|
this._backend = backend;
|
|
95
98
|
this.model = model;
|
|
96
99
|
this.serial = backend.serial;
|
|
97
100
|
this._options = options;
|
|
98
|
-
this._timeoutSettings = new
|
|
101
|
+
this._timeoutSettings = new import_timeoutSettings.TimeoutSettings(android._timeoutSettings);
|
|
102
|
+
}
|
|
103
|
+
static {
|
|
104
|
+
this.Events = {
|
|
105
|
+
WebViewAdded: "webViewAdded",
|
|
106
|
+
WebViewRemoved: "webViewRemoved",
|
|
107
|
+
Close: "close"
|
|
108
|
+
};
|
|
99
109
|
}
|
|
100
110
|
static async create(android, backend, options) {
|
|
101
111
|
await backend.init();
|
|
102
|
-
const model = await backend.runCommand(
|
|
112
|
+
const model = await backend.runCommand("shell:getprop ro.product.model");
|
|
103
113
|
const device = new AndroidDevice(android, backend, model.toString().trim(), options);
|
|
104
114
|
await device._init();
|
|
105
115
|
return device;
|
|
@@ -108,7 +118,8 @@ class AndroidDevice extends _instrumentation.SdkObject {
|
|
|
108
118
|
await this._refreshWebViews();
|
|
109
119
|
const poll = () => {
|
|
110
120
|
this._pollingWebViews = setTimeout(() => this._refreshWebViews().then(poll).catch(() => {
|
|
111
|
-
this.close().catch(() => {
|
|
121
|
+
this.close().catch(() => {
|
|
122
|
+
});
|
|
112
123
|
}), 500);
|
|
113
124
|
};
|
|
114
125
|
poll();
|
|
@@ -128,127 +139,131 @@ class AndroidDevice extends _instrumentation.SdkObject {
|
|
|
128
139
|
return await this._backend.runCommand(`shell:screencap -p`);
|
|
129
140
|
}
|
|
130
141
|
async _driver() {
|
|
131
|
-
if (this._isClosed)
|
|
132
|
-
|
|
142
|
+
if (this._isClosed)
|
|
143
|
+
return;
|
|
144
|
+
if (!this._driverPromise)
|
|
145
|
+
this._driverPromise = this._installDriver();
|
|
133
146
|
return this._driverPromise;
|
|
134
147
|
}
|
|
135
148
|
async _installDriver() {
|
|
136
|
-
(0,
|
|
149
|
+
(0, import_utilsBundle.debug)("pw:android")("Stopping the old driver");
|
|
137
150
|
await this.shell(`am force-stop com.microsoft.playwright.androiddriver`);
|
|
138
|
-
|
|
139
|
-
// uninstall and install driver on every execution
|
|
140
151
|
if (!this._options.omitDriverInstall) {
|
|
141
|
-
(0,
|
|
152
|
+
(0, import_utilsBundle.debug)("pw:android")("Uninstalling the old driver");
|
|
142
153
|
await this.shell(`cmd package uninstall com.microsoft.playwright.androiddriver`);
|
|
143
154
|
await this.shell(`cmd package uninstall com.microsoft.playwright.androiddriver.test`);
|
|
144
|
-
(0,
|
|
145
|
-
const executable =
|
|
146
|
-
const packageManagerCommand = (0,
|
|
147
|
-
for (const file of [
|
|
148
|
-
const fullName =
|
|
149
|
-
if (!
|
|
150
|
-
|
|
155
|
+
(0, import_utilsBundle.debug)("pw:android")("Installing the new driver");
|
|
156
|
+
const executable = import_registry.registry.findExecutable("android");
|
|
157
|
+
const packageManagerCommand = (0, import_env.getPackageManagerExecCommand)();
|
|
158
|
+
for (const file of ["android-driver.apk", "android-driver-target.apk"]) {
|
|
159
|
+
const fullName = import_path.default.join(executable.directory, file);
|
|
160
|
+
if (!import_fs.default.existsSync(fullName))
|
|
161
|
+
throw new Error(`Please install Android driver apk using '${packageManagerCommand} playwright install android'`);
|
|
162
|
+
await this.installApk(await import_fs.default.promises.readFile(fullName));
|
|
151
163
|
}
|
|
152
164
|
} else {
|
|
153
|
-
(0,
|
|
165
|
+
(0, import_utilsBundle.debug)("pw:android")("Skipping the driver installation");
|
|
154
166
|
}
|
|
155
|
-
(0,
|
|
156
|
-
this.shell(
|
|
157
|
-
const socket = await this._waitForLocalAbstract(
|
|
158
|
-
const transport = new
|
|
159
|
-
transport.onmessage = message => {
|
|
167
|
+
(0, import_utilsBundle.debug)("pw:android")("Starting the new driver");
|
|
168
|
+
this.shell("am instrument -w com.microsoft.playwright.androiddriver.test/androidx.test.runner.AndroidJUnitRunner").catch((e) => (0, import_utilsBundle.debug)("pw:android")(e));
|
|
169
|
+
const socket = await this._waitForLocalAbstract("playwright_android_driver_socket");
|
|
170
|
+
const transport = new import_pipeTransport.PipeTransport(socket, socket, socket, "be");
|
|
171
|
+
transport.onmessage = (message) => {
|
|
160
172
|
const response = JSON.parse(message);
|
|
161
|
-
const {
|
|
162
|
-
id,
|
|
163
|
-
result,
|
|
164
|
-
error
|
|
165
|
-
} = response;
|
|
173
|
+
const { id, result, error } = response;
|
|
166
174
|
const callback = this._callbacks.get(id);
|
|
167
|
-
if (!callback)
|
|
168
|
-
|
|
175
|
+
if (!callback)
|
|
176
|
+
return;
|
|
177
|
+
if (error)
|
|
178
|
+
callback.reject(new Error(error));
|
|
179
|
+
else
|
|
180
|
+
callback.fulfill(result);
|
|
169
181
|
this._callbacks.delete(id);
|
|
170
182
|
};
|
|
171
183
|
return transport;
|
|
172
184
|
}
|
|
173
185
|
async _waitForLocalAbstract(socketName) {
|
|
174
186
|
let socket;
|
|
175
|
-
(0,
|
|
187
|
+
(0, import_utilsBundle.debug)("pw:android")(`Polling the socket localabstract:${socketName}`);
|
|
176
188
|
while (!socket) {
|
|
177
189
|
try {
|
|
178
190
|
socket = await this._backend.open(`localabstract:${socketName}`);
|
|
179
191
|
} catch (e) {
|
|
180
|
-
await new Promise(f => setTimeout(f, 250));
|
|
192
|
+
await new Promise((f) => setTimeout(f, 250));
|
|
181
193
|
}
|
|
182
194
|
}
|
|
183
|
-
(0,
|
|
195
|
+
(0, import_utilsBundle.debug)("pw:android")(`Connected to localabstract:${socketName}`);
|
|
184
196
|
return socket;
|
|
185
197
|
}
|
|
186
198
|
async send(method, params = {}) {
|
|
187
|
-
// Patch the timeout in!
|
|
188
199
|
params.timeout = this._timeoutSettings.timeout(params);
|
|
189
200
|
const driver = await this._driver();
|
|
190
|
-
if (!driver)
|
|
201
|
+
if (!driver)
|
|
202
|
+
throw new Error("Device is closed");
|
|
191
203
|
const id = ++this._lastId;
|
|
192
|
-
const result = new Promise((fulfill, reject) => this._callbacks.set(id, {
|
|
193
|
-
|
|
194
|
-
reject
|
|
195
|
-
}));
|
|
196
|
-
driver.send(JSON.stringify({
|
|
197
|
-
id,
|
|
198
|
-
method,
|
|
199
|
-
params
|
|
200
|
-
}));
|
|
204
|
+
const result = new Promise((fulfill, reject) => this._callbacks.set(id, { fulfill, reject }));
|
|
205
|
+
driver.send(JSON.stringify({ id, method, params }));
|
|
201
206
|
return result;
|
|
202
207
|
}
|
|
203
208
|
async close() {
|
|
204
|
-
if (this._isClosed)
|
|
209
|
+
if (this._isClosed)
|
|
210
|
+
return;
|
|
205
211
|
this._isClosed = true;
|
|
206
|
-
if (this._pollingWebViews)
|
|
207
|
-
|
|
212
|
+
if (this._pollingWebViews)
|
|
213
|
+
clearTimeout(this._pollingWebViews);
|
|
214
|
+
for (const connection of this._browserConnections)
|
|
215
|
+
await connection.close();
|
|
208
216
|
if (this._driverPromise) {
|
|
209
217
|
const driver = await this._driver();
|
|
210
|
-
driver
|
|
218
|
+
driver?.close();
|
|
211
219
|
}
|
|
212
220
|
await this._backend.close();
|
|
213
221
|
this._android._deviceClosed(this);
|
|
214
222
|
this.emit(AndroidDevice.Events.Close);
|
|
215
223
|
}
|
|
216
|
-
async launchBrowser(pkg =
|
|
217
|
-
(0,
|
|
224
|
+
async launchBrowser(pkg = "com.android.chrome", options) {
|
|
225
|
+
(0, import_utilsBundle.debug)("pw:android")("Force-stopping", pkg);
|
|
218
226
|
await this._backend.runCommand(`shell:am force-stop ${pkg}`);
|
|
219
|
-
const socketName = (0,
|
|
220
|
-
const commandLine = this._defaultArgs(options, socketName).join(
|
|
221
|
-
(0,
|
|
222
|
-
|
|
223
|
-
await this._backend.runCommand(`shell:echo "${Buffer.from(commandLine).toString('base64')}" | base64 -d > /data/local/tmp/chrome-command-line`);
|
|
227
|
+
const socketName = (0, import_debug.isUnderTest)() ? "webview_devtools_remote_playwright_test" : "playwright_" + (0, import_crypto.createGuid)() + "_devtools_remote";
|
|
228
|
+
const commandLine = this._defaultArgs(options, socketName).join(" ");
|
|
229
|
+
(0, import_utilsBundle.debug)("pw:android")("Starting", pkg, commandLine);
|
|
230
|
+
await this._backend.runCommand(`shell:echo "${Buffer.from(commandLine).toString("base64")}" | base64 -d > /data/local/tmp/chrome-command-line`);
|
|
224
231
|
await this._backend.runCommand(`shell:am start -a android.intent.action.VIEW -d about:blank ${pkg}`);
|
|
225
232
|
const browserContext = await this._connectToBrowser(socketName, options);
|
|
226
233
|
await this._backend.runCommand(`shell:rm /data/local/tmp/chrome-command-line`);
|
|
227
234
|
return browserContext;
|
|
228
235
|
}
|
|
229
236
|
_defaultArgs(options, socketName) {
|
|
230
|
-
const chromeArguments = [
|
|
237
|
+
const chromeArguments = [
|
|
238
|
+
"_",
|
|
239
|
+
"--disable-fre",
|
|
240
|
+
"--no-default-browser-check",
|
|
241
|
+
`--remote-debugging-socket-name=${socketName}`,
|
|
242
|
+
...import_chromiumSwitches.chromiumSwitches,
|
|
243
|
+
...this._innerDefaultArgs(options)
|
|
244
|
+
];
|
|
231
245
|
return chromeArguments;
|
|
232
246
|
}
|
|
233
247
|
_innerDefaultArgs(options) {
|
|
234
|
-
const {
|
|
235
|
-
args = [],
|
|
236
|
-
proxy
|
|
237
|
-
} = options;
|
|
248
|
+
const { args = [], proxy } = options;
|
|
238
249
|
const chromeArguments = [];
|
|
239
250
|
if (proxy) {
|
|
240
251
|
chromeArguments.push(`--proxy-server=${proxy.server}`);
|
|
241
252
|
const proxyBypassRules = [];
|
|
242
|
-
if (proxy.bypass)
|
|
243
|
-
|
|
244
|
-
if (
|
|
253
|
+
if (proxy.bypass)
|
|
254
|
+
proxyBypassRules.push(...proxy.bypass.split(",").map((t) => t.trim()).map((t) => t.startsWith(".") ? "*" + t : t));
|
|
255
|
+
if (!process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK && !proxyBypassRules.includes("<-loopback>"))
|
|
256
|
+
proxyBypassRules.push("<-loopback>");
|
|
257
|
+
if (proxyBypassRules.length > 0)
|
|
258
|
+
chromeArguments.push(`--proxy-bypass-list=${proxyBypassRules.join(";")}`);
|
|
245
259
|
}
|
|
246
260
|
chromeArguments.push(...args);
|
|
247
261
|
return chromeArguments;
|
|
248
262
|
}
|
|
249
263
|
async connectToWebView(socketName) {
|
|
250
264
|
const webView = this._webViews.get(socketName);
|
|
251
|
-
if (!webView)
|
|
265
|
+
if (!webView)
|
|
266
|
+
throw new Error("WebView has been closed");
|
|
252
267
|
return await this._connectToBrowser(socketName);
|
|
253
268
|
}
|
|
254
269
|
async _connectToBrowser(socketName, options = {}) {
|
|
@@ -256,38 +271,36 @@ class AndroidDevice extends _instrumentation.SdkObject {
|
|
|
256
271
|
const androidBrowser = new AndroidBrowser(this, socket);
|
|
257
272
|
await androidBrowser._init();
|
|
258
273
|
this._browserConnections.add(androidBrowser);
|
|
259
|
-
const artifactsDir = await
|
|
274
|
+
const artifactsDir = await import_fs.default.promises.mkdtemp(ARTIFACTS_FOLDER);
|
|
260
275
|
const cleanupArtifactsDir = async () => {
|
|
261
|
-
const errors = await (0,
|
|
262
|
-
for (let i = 0; i < (errors || []).length; ++i)
|
|
276
|
+
const errors = (await (0, import_fileUtils.removeFolders)([artifactsDir])).filter(Boolean);
|
|
277
|
+
for (let i = 0; i < (errors || []).length; ++i)
|
|
278
|
+
(0, import_utilsBundle.debug)("pw:android")(`exception while removing ${artifactsDir}: ${errors[i]}`);
|
|
263
279
|
};
|
|
264
|
-
|
|
265
|
-
socket.on(
|
|
266
|
-
|
|
267
|
-
cleanupArtifactsDir().catch(e => (0,
|
|
280
|
+
import_processLauncher.gracefullyCloseSet.add(cleanupArtifactsDir);
|
|
281
|
+
socket.on("close", async () => {
|
|
282
|
+
import_processLauncher.gracefullyCloseSet.delete(cleanupArtifactsDir);
|
|
283
|
+
cleanupArtifactsDir().catch((e) => (0, import_utilsBundle.debug)("pw:android")(`could not cleanup artifacts dir: ${e}`));
|
|
268
284
|
});
|
|
269
285
|
const browserOptions = {
|
|
270
|
-
name:
|
|
286
|
+
name: "clank",
|
|
271
287
|
isChromium: true,
|
|
272
288
|
slowMo: 0,
|
|
273
|
-
persistent: {
|
|
274
|
-
...options,
|
|
275
|
-
noDefaultViewport: true
|
|
276
|
-
},
|
|
289
|
+
persistent: { ...options, noDefaultViewport: true },
|
|
277
290
|
artifactsDir,
|
|
278
291
|
downloadsPath: artifactsDir,
|
|
279
292
|
tracesDir: artifactsDir,
|
|
280
293
|
browserProcess: new ClankBrowserProcess(androidBrowser),
|
|
281
294
|
proxy: options.proxy,
|
|
282
|
-
protocolLogger:
|
|
283
|
-
browserLogsCollector: new
|
|
295
|
+
protocolLogger: import_helper.helper.debugProtocolLogger(),
|
|
296
|
+
browserLogsCollector: new import_debugLogger.RecentLogsCollector(),
|
|
284
297
|
originalLaunchOptions: {}
|
|
285
298
|
};
|
|
286
|
-
(0,
|
|
287
|
-
const browser = await
|
|
288
|
-
const controller = new
|
|
299
|
+
(0, import_browserContext.validateBrowserContextOptions)(options, browserOptions);
|
|
300
|
+
const browser = await import_crBrowser.CRBrowser.connect(this.attribution.playwright, androidBrowser, browserOptions);
|
|
301
|
+
const controller = new import_progress.ProgressController((0, import_instrumentation.serverSideCallMetadata)(), this);
|
|
289
302
|
const defaultContext = browser._defaultContext;
|
|
290
|
-
await controller.run(async progress => {
|
|
303
|
+
await controller.run(async (progress) => {
|
|
291
304
|
await defaultContext._loadDefaultContextAsIs(progress);
|
|
292
305
|
});
|
|
293
306
|
return defaultContext;
|
|
@@ -296,16 +309,16 @@ class AndroidDevice extends _instrumentation.SdkObject {
|
|
|
296
309
|
return [...this._webViews.values()];
|
|
297
310
|
}
|
|
298
311
|
async installApk(content, options) {
|
|
299
|
-
const args = options && options.args ? options.args : [
|
|
300
|
-
(0,
|
|
301
|
-
const installSocket = await this._backend.open(`shell:cmd package install ${args.join(
|
|
302
|
-
(0,
|
|
312
|
+
const args = options && options.args ? options.args : ["-r", "-t", "-S"];
|
|
313
|
+
(0, import_utilsBundle.debug)("pw:android")("Opening install socket");
|
|
314
|
+
const installSocket = await this._backend.open(`shell:cmd package install ${args.join(" ")} ${content.length}`);
|
|
315
|
+
(0, import_utilsBundle.debug)("pw:android")("Writing driver bytes: " + content.length);
|
|
303
316
|
await installSocket.write(content);
|
|
304
|
-
const success = await new Promise(f => installSocket.on(
|
|
305
|
-
(0,
|
|
317
|
+
const success = await new Promise((f) => installSocket.on("data", f));
|
|
318
|
+
(0, import_utilsBundle.debug)("pw:android")("Written driver bytes: " + success);
|
|
306
319
|
installSocket.close();
|
|
307
320
|
}
|
|
308
|
-
async push(content,
|
|
321
|
+
async push(content, path2, mode = 420) {
|
|
309
322
|
const socket = await this._backend.open(`sync:`);
|
|
310
323
|
const sendHeader = async (command, length) => {
|
|
311
324
|
const buffer = Buffer.alloc(command.length + 4);
|
|
@@ -317,39 +330,38 @@ class AndroidDevice extends _instrumentation.SdkObject {
|
|
|
317
330
|
await sendHeader(command, data.length);
|
|
318
331
|
await socket.write(data);
|
|
319
332
|
};
|
|
320
|
-
await send(
|
|
333
|
+
await send("SEND", Buffer.from(`${path2},${mode}`));
|
|
321
334
|
const maxChunk = 65535;
|
|
322
|
-
for (let i = 0; i < content.length; i += maxChunk)
|
|
323
|
-
|
|
324
|
-
|
|
335
|
+
for (let i = 0; i < content.length; i += maxChunk)
|
|
336
|
+
await send("DATA", content.slice(i, i + maxChunk));
|
|
337
|
+
await sendHeader("DONE", Date.now() / 1e3 | 0);
|
|
338
|
+
const result = await new Promise((f) => socket.once("data", f));
|
|
325
339
|
const code = result.slice(0, 4).toString();
|
|
326
|
-
if (code !==
|
|
340
|
+
if (code !== "OKAY")
|
|
341
|
+
throw new Error("Could not push: " + code);
|
|
327
342
|
socket.close();
|
|
328
343
|
}
|
|
329
344
|
async _refreshWebViews() {
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
const socketNames = new Set();
|
|
345
|
+
const sockets = (await this._backend.runCommand(`shell:cat /proc/net/unix | grep webview_devtools_remote`)).toString().split("\n");
|
|
346
|
+
if (this._isClosed)
|
|
347
|
+
return;
|
|
348
|
+
const socketNames = /* @__PURE__ */ new Set();
|
|
334
349
|
for (const line of sockets) {
|
|
335
350
|
const matchSocketName = line.match(/[^@]+@(.*?webview_devtools_remote_?.*)/);
|
|
336
|
-
if (!matchSocketName)
|
|
351
|
+
if (!matchSocketName)
|
|
352
|
+
continue;
|
|
337
353
|
const socketName = matchSocketName[1];
|
|
338
354
|
socketNames.add(socketName);
|
|
339
|
-
if (this._webViews.has(socketName))
|
|
340
|
-
|
|
341
|
-
// possible line: 0000000000000000: 00000002 00000000 00010000 0001 01 5841881 @webview_devtools_remote_zeus
|
|
342
|
-
// the result: match[1] = ''
|
|
355
|
+
if (this._webViews.has(socketName))
|
|
356
|
+
continue;
|
|
343
357
|
const match = line.match(/[^@]+@.*?webview_devtools_remote_?(\d*)/);
|
|
344
358
|
let pid = -1;
|
|
345
|
-
if (match && match[1])
|
|
359
|
+
if (match && match[1])
|
|
360
|
+
pid = +match[1];
|
|
346
361
|
const pkg = await this._extractPkg(pid);
|
|
347
|
-
if (this._isClosed)
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
pkg,
|
|
351
|
-
socketName
|
|
352
|
-
};
|
|
362
|
+
if (this._isClosed)
|
|
363
|
+
return;
|
|
364
|
+
const webView = { pid, pkg, socketName };
|
|
353
365
|
this._webViews.set(socketName, webView);
|
|
354
366
|
this.emit(AndroidDevice.Events.WebViewAdded, webView);
|
|
355
367
|
}
|
|
@@ -361,44 +373,37 @@ class AndroidDevice extends _instrumentation.SdkObject {
|
|
|
361
373
|
}
|
|
362
374
|
}
|
|
363
375
|
async _extractPkg(pid) {
|
|
364
|
-
let pkg =
|
|
365
|
-
if (pid === -1)
|
|
366
|
-
|
|
376
|
+
let pkg = "";
|
|
377
|
+
if (pid === -1)
|
|
378
|
+
return pkg;
|
|
379
|
+
const procs = (await this._backend.runCommand(`shell:ps -A | grep ${pid}`)).toString().split("\n");
|
|
367
380
|
for (const proc of procs) {
|
|
368
381
|
const match = proc.match(/[^\s]+\s+(\d+).*$/);
|
|
369
|
-
if (!match)
|
|
370
|
-
|
|
382
|
+
if (!match)
|
|
383
|
+
continue;
|
|
384
|
+
pkg = proc.substring(proc.lastIndexOf(" ") + 1);
|
|
371
385
|
}
|
|
372
386
|
return pkg;
|
|
373
387
|
}
|
|
374
388
|
}
|
|
375
|
-
|
|
376
|
-
AndroidDevice.Events = {
|
|
377
|
-
WebViewAdded: 'webViewAdded',
|
|
378
|
-
WebViewRemoved: 'webViewRemoved',
|
|
379
|
-
Close: 'close'
|
|
380
|
-
};
|
|
381
|
-
class AndroidBrowser extends _events.EventEmitter {
|
|
389
|
+
class AndroidBrowser extends import_events.EventEmitter {
|
|
382
390
|
constructor(device, socket) {
|
|
383
391
|
super();
|
|
384
|
-
this.
|
|
385
|
-
this._socket = void 0;
|
|
386
|
-
this._receiver = void 0;
|
|
387
|
-
this._waitForNextTask = (0, _task.makeWaitForNextTask)();
|
|
388
|
-
this.onmessage = void 0;
|
|
389
|
-
this.onclose = void 0;
|
|
392
|
+
this._waitForNextTask = (0, import_task.makeWaitForNextTask)();
|
|
390
393
|
this.setMaxListeners(0);
|
|
391
394
|
this.device = device;
|
|
392
395
|
this._socket = socket;
|
|
393
|
-
this._socket.on(
|
|
396
|
+
this._socket.on("close", () => {
|
|
394
397
|
this._waitForNextTask(() => {
|
|
395
|
-
if (this.onclose)
|
|
398
|
+
if (this.onclose)
|
|
399
|
+
this.onclose();
|
|
396
400
|
});
|
|
397
401
|
});
|
|
398
|
-
this._receiver = new
|
|
399
|
-
this._receiver.on(
|
|
402
|
+
this._receiver = new import_utilsBundle2.wsReceiver();
|
|
403
|
+
this._receiver.on("message", (message) => {
|
|
400
404
|
this._waitForNextTask(() => {
|
|
401
|
-
if (this.onmessage)
|
|
405
|
+
if (this.onmessage)
|
|
406
|
+
this.onmessage(JSON.parse(message));
|
|
402
407
|
});
|
|
403
408
|
});
|
|
404
409
|
}
|
|
@@ -410,11 +415,9 @@ Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r
|
|
|
410
415
|
Sec-WebSocket-Version: 13\r
|
|
411
416
|
\r
|
|
412
417
|
`));
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
// Start sending web frame to receiver.
|
|
417
|
-
this._socket.on('data', data => this._receiver._write(data, 'binary', () => {}));
|
|
418
|
+
await new Promise((f) => this._socket.once("data", f));
|
|
419
|
+
this._socket.on("data", (data) => this._receiver._write(data, "binary", () => {
|
|
420
|
+
}));
|
|
418
421
|
}
|
|
419
422
|
async send(s) {
|
|
420
423
|
await this._socket.write(encodeWebFrame(JSON.stringify(s)));
|
|
@@ -424,7 +427,7 @@ Sec-WebSocket-Version: 13\r
|
|
|
424
427
|
}
|
|
425
428
|
}
|
|
426
429
|
function encodeWebFrame(data) {
|
|
427
|
-
return
|
|
430
|
+
return import_utilsBundle2.wsSender.frame(Buffer.from(data), {
|
|
428
431
|
opcode: 1,
|
|
429
432
|
mask: true,
|
|
430
433
|
fin: true,
|
|
@@ -433,12 +436,16 @@ function encodeWebFrame(data) {
|
|
|
433
436
|
}
|
|
434
437
|
class ClankBrowserProcess {
|
|
435
438
|
constructor(browser) {
|
|
436
|
-
this._browser = void 0;
|
|
437
|
-
this.onclose = void 0;
|
|
438
439
|
this._browser = browser;
|
|
439
440
|
}
|
|
440
|
-
async kill() {
|
|
441
|
+
async kill() {
|
|
442
|
+
}
|
|
441
443
|
async close() {
|
|
442
444
|
await this._browser.close();
|
|
443
445
|
}
|
|
444
|
-
}
|
|
446
|
+
}
|
|
447
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
448
|
+
0 && (module.exports = {
|
|
449
|
+
Android,
|
|
450
|
+
AndroidDevice
|
|
451
|
+
});
|