@checkly/playwright-core 1.51.17-beta.1 → 1.54.2-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ThirdPartyNotices.txt +65 -123
- package/browsers.json +16 -14
- package/index.js +1 -1
- package/lib/androidServerImpl.js +47 -50
- package/lib/browserServerImpl.js +89 -69
- package/lib/checkly/escapeRegExp.js +23 -27
- package/lib/checkly/fetch.js +64 -46
- package/lib/checkly/secretsFilter.js +49 -36
- package/lib/cli/driver.js +71 -69
- package/lib/cli/program.js +400 -359
- package/lib/cli/programWithTestStub.js +51 -45
- package/lib/client/accessibility.js +31 -32
- package/lib/client/android.js +151 -242
- package/lib/client/api.js +135 -283
- package/lib/client/artifact.js +39 -36
- package/lib/client/browser.js +96 -71
- package/lib/client/browserContext.js +314 -345
- package/lib/client/browserType.js +103 -127
- package/lib/client/cdpSession.js +29 -31
- package/lib/client/channelOwner.js +90 -113
- package/lib/client/clientHelper.js +48 -39
- 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 +188 -214
- 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 +80 -77
- package/lib/client/elementHandle.js +120 -159
- 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 +166 -190
- package/lib/client/fileChooser.js +25 -24
- package/lib/client/fileUtils.js +31 -28
- package/lib/client/frame.js +207 -306
- package/lib/client/harRouter.js +42 -52
- package/lib/client/input.js +42 -69
- package/lib/client/jsHandle.js +54 -69
- package/lib/client/jsonPipe.js +27 -23
- package/lib/client/localUtils.js +29 -29
- package/lib/client/locator.js +145 -237
- package/lib/client/network.js +282 -307
- package/lib/client/page.js +269 -318
- package/lib/client/platform.js +46 -43
- package/lib/client/playwright.js +51 -76
- package/lib/client/selectors.js +45 -63
- package/lib/client/stream.js +29 -25
- package/lib/client/timeoutSettings.js +55 -41
- package/lib/client/tracing.js +49 -96
- 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 +43 -56
- package/lib/client/worker.js +48 -56
- package/lib/client/writableStream.js +27 -23
- package/lib/generated/bindingsControllerSource.js +28 -0
- package/lib/generated/clockSource.js +26 -6
- package/lib/generated/consoleApiSource.js +26 -6
- package/lib/generated/injectedScriptSource.js +26 -6
- package/lib/generated/pollingRecorderSource.js +26 -6
- package/lib/generated/storageScriptSource.js +28 -0
- package/lib/generated/utilityScriptSource.js +26 -6
- package/lib/generated/webSocketMockSource.js +333 -5
- package/lib/inProcessFactory.js +51 -53
- package/lib/inprocess.js +2 -19
- package/lib/outofprocess.js +51 -46
- package/lib/protocol/serializers.js +153 -134
- package/lib/protocol/validator.js +2807 -2739
- package/lib/protocol/validatorPrimitives.js +114 -73
- package/lib/remote/playwrightConnection.js +88 -242
- package/lib/remote/playwrightServer.js +305 -92
- package/lib/server/accessibility.js +44 -37
- package/lib/server/android/android.js +251 -241
- package/lib/server/android/backendAdb.js +87 -82
- package/lib/server/artifact.js +78 -55
- package/lib/server/bidi/bidiBrowser.js +297 -158
- package/lib/server/bidi/bidiChromium.js +119 -89
- package/lib/server/bidi/bidiConnection.js +66 -83
- package/lib/server/bidi/bidiExecutionContext.js +129 -113
- package/lib/server/bidi/bidiFirefox.js +86 -76
- package/lib/server/bidi/bidiInput.js +106 -117
- package/lib/server/bidi/bidiNetworkManager.js +142 -159
- package/lib/server/bidi/bidiOverCdp.js +57 -58
- package/lib/server/bidi/bidiPage.js +260 -260
- 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 +22 -137
- package/lib/server/bidi/third_party/bidiProtocolCore.js +152 -0
- package/lib/server/bidi/third_party/bidiProtocolPermissions.js +42 -0
- 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 +93 -95
- package/lib/server/browserContext.js +419 -429
- package/lib/server/browserType.js +186 -216
- package/lib/server/callLog.js +47 -44
- package/lib/server/chromium/chromium.js +235 -203
- package/lib/server/chromium/chromiumSwitches.js +100 -67
- package/lib/server/chromium/crAccessibility.js +157 -131
- package/lib/server/chromium/crBrowser.js +310 -292
- package/lib/server/chromium/crConnection.js +95 -121
- package/lib/server/chromium/crCoverage.js +121 -131
- package/lib/server/chromium/crDevTools.js +60 -51
- package/lib/server/chromium/crDragDrop.js +68 -84
- package/lib/server/chromium/crExecutionContext.js +89 -83
- package/lib/server/chromium/crInput.js +118 -113
- package/lib/server/chromium/crNetworkManager.js +274 -375
- package/lib/server/chromium/crPage.js +536 -593
- package/lib/server/chromium/crPdf.js +54 -86
- package/lib/server/chromium/crProtocolHelper.js +92 -80
- package/lib/server/chromium/crServiceWorker.js +84 -73
- package/lib/server/chromium/defaultFontFamilies.js +152 -135
- package/lib/server/chromium/protocol.d.js +16 -0
- package/lib/server/chromium/videoRecorder.js +66 -99
- package/lib/server/clock.js +107 -83
- package/lib/server/codegen/csharp.js +192 -162
- package/lib/server/codegen/java.js +156 -129
- 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 +141 -126
- package/lib/server/codegen/types.js +15 -4
- package/lib/server/console.js +28 -32
- package/lib/server/cookieStore.js +108 -86
- package/lib/server/debugController.js +147 -151
- package/lib/server/debugger.js +86 -78
- package/lib/server/deviceDescriptors.js +37 -24
- package/lib/server/deviceDescriptorsSource.json +238 -128
- package/lib/server/dialog.js +84 -39
- package/lib/server/dispatchers/androidDispatcher.js +257 -148
- package/lib/server/dispatchers/artifactDispatcher.js +79 -79
- package/lib/server/dispatchers/browserContextDispatcher.js +289 -259
- package/lib/server/dispatchers/browserDispatcher.js +96 -148
- package/lib/server/dispatchers/browserTypeDispatcher.js +50 -41
- package/lib/server/dispatchers/cdpSessionDispatcher.js +35 -39
- package/lib/server/dispatchers/debugControllerDispatcher.js +65 -83
- package/lib/server/dispatchers/dialogDispatcher.js +34 -31
- package/lib/server/dispatchers/dispatcher.js +208 -248
- package/lib/server/dispatchers/electronDispatcher.js +66 -70
- package/lib/server/dispatchers/elementHandlerDispatcher.js +164 -216
- package/lib/server/dispatchers/frameDispatcher.js +211 -272
- package/lib/server/dispatchers/jsHandleDispatcher.js +63 -75
- package/lib/server/dispatchers/jsonPipeDispatcher.js +37 -38
- package/lib/server/dispatchers/localUtilsDispatcher.js +121 -119
- package/lib/server/dispatchers/networkDispatchers.js +117 -128
- package/lib/server/dispatchers/pageDispatcher.js +256 -248
- package/lib/server/dispatchers/playwrightDispatcher.js +92 -87
- package/lib/server/dispatchers/streamDispatcher.js +52 -48
- package/lib/server/dispatchers/tracingDispatcher.js +47 -52
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +126 -150
- package/lib/server/dispatchers/writableStreamDispatcher.js +65 -43
- package/lib/server/dom.js +485 -582
- package/lib/server/download.js +47 -37
- package/lib/server/electron/electron.js +216 -243
- package/lib/server/electron/loader.js +9 -37
- package/lib/server/errors.js +47 -46
- package/lib/server/fetch.js +317 -360
- package/lib/server/fileChooser.js +25 -24
- package/lib/server/fileUploadUtils.js +66 -60
- package/lib/server/firefox/ffAccessibility.js +153 -131
- package/lib/server/firefox/ffBrowser.js +268 -305
- package/lib/server/firefox/ffConnection.js +63 -84
- package/lib/server/firefox/ffExecutionContext.js +92 -73
- package/lib/server/firefox/ffInput.js +82 -84
- package/lib/server/firefox/ffNetworkManager.js +137 -114
- package/lib/server/firefox/ffPage.js +261 -293
- package/lib/server/firefox/firefox.js +80 -72
- package/lib/server/firefox/protocol.d.js +16 -0
- package/lib/server/formData.js +107 -35
- package/lib/server/frameSelectors.js +98 -114
- package/lib/server/frames.js +845 -1055
- package/lib/server/har/harRecorder.js +85 -77
- package/lib/server/har/harTracer.js +290 -223
- package/lib/server/harBackend.js +80 -80
- package/lib/server/helper.js +55 -59
- package/lib/server/index.js +59 -99
- package/lib/server/input.js +151 -189
- package/lib/server/instrumentation.js +57 -44
- package/lib/server/javascript.js +133 -134
- package/lib/server/launchApp.js +113 -75
- package/lib/server/localUtils.js +150 -142
- package/lib/server/macEditingCommands.js +141 -137
- package/lib/server/network.js +299 -303
- package/lib/server/page.js +513 -544
- package/lib/server/pipeTransport.js +49 -45
- package/lib/server/playwright.js +58 -67
- package/lib/server/progress.js +137 -68
- package/lib/server/protocolError.js +34 -31
- package/lib/server/recorder/chat.js +70 -86
- package/lib/server/recorder/recorderApp.js +341 -176
- package/lib/server/recorder/recorderInTraceViewer.js +65 -94
- package/lib/server/recorder/recorderRunner.js +93 -116
- package/lib/server/recorder/recorderSignalProcessor.js +83 -0
- package/lib/server/recorder/recorderUtils.js +104 -47
- package/lib/server/recorder/throttledFile.js +42 -30
- package/lib/server/recorder.js +395 -275
- package/lib/server/registry/browserFetcher.js +106 -101
- package/lib/server/registry/dependencies.js +245 -196
- package/lib/server/registry/index.js +930 -803
- package/lib/server/registry/nativeDeps.js +1073 -464
- package/lib/server/registry/oopDownloadBrowserMain.js +57 -75
- package/lib/server/screenshotter.js +160 -191
- package/lib/server/selectors.js +90 -51
- package/lib/server/socksClientCertificatesInterceptor.js +171 -186
- package/lib/server/socksInterceptor.js +62 -70
- package/lib/server/trace/recorder/snapshotter.js +76 -102
- package/lib/server/trace/recorder/snapshotterInjected.js +238 -217
- package/lib/server/trace/recorder/tracing.js +354 -362
- package/lib/server/trace/test/inMemorySnapshotter.js +46 -52
- package/lib/server/trace/viewer/traceViewer.js +160 -147
- package/lib/server/transport.js +119 -134
- 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 +36 -32
- package/lib/server/utils/debugLogger.js +77 -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 +141 -126
- 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 +152 -96
- 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 +68 -75
- 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 +77 -61
- package/lib/server/webkit/wkAccessibility.js +161 -118
- package/lib/server/webkit/wkBrowser.js +193 -184
- package/lib/server/webkit/wkConnection.js +59 -83
- package/lib/server/webkit/wkExecutionContext.js +85 -70
- package/lib/server/webkit/wkInput.js +97 -95
- package/lib/server/webkit/wkInterceptableRequest.js +102 -95
- package/lib/server/webkit/wkPage.js +568 -667
- package/lib/server/webkit/wkProvisionalPage.js +45 -56
- package/lib/server/webkit/wkWorkers.js +79 -79
- package/lib/utils/expectUtils.js +31 -26
- package/lib/utils/isomorphic/ariaSnapshot.js +149 -152
- package/lib/utils/isomorphic/assert.js +28 -22
- package/lib/utils/isomorphic/colors.js +66 -59
- package/lib/utils/isomorphic/cssParser.js +120 -125
- package/lib/utils/isomorphic/cssTokenizer.js +436 -364
- package/lib/utils/isomorphic/headers.js +38 -37
- package/lib/utils/isomorphic/locatorGenerators.js +358 -357
- package/lib/utils/isomorphic/locatorParser.js +96 -105
- package/lib/utils/isomorphic/locatorUtils.js +63 -44
- package/lib/utils/isomorphic/manualPromise.js +46 -39
- package/lib/utils/isomorphic/mimeType.js +447 -25
- package/lib/utils/isomorphic/multimap.js +34 -27
- package/lib/utils/isomorphic/protocolFormatter.js +68 -0
- package/lib/utils/isomorphic/protocolMetainfo.js +321 -0
- package/lib/utils/isomorphic/recorderUtils.js +140 -181
- package/lib/utils/isomorphic/rtti.js +35 -33
- package/lib/utils/isomorphic/selectorParser.js +182 -193
- package/lib/utils/isomorphic/semaphore.js +27 -24
- package/lib/utils/isomorphic/stackTrace.js +87 -98
- package/lib/utils/isomorphic/stringUtils.js +98 -112
- package/lib/utils/isomorphic/time.js +46 -22
- package/lib/utils/isomorphic/timeoutRunner.js +53 -53
- package/lib/utils/isomorphic/traceUtils.js +37 -41
- package/lib/utils/isomorphic/types.js +15 -4
- package/lib/utils/isomorphic/urlMatch.js +113 -67
- package/lib/utils/isomorphic/utilityScriptSerializers.js +251 -0
- package/lib/utils.js +101 -443
- package/lib/utilsBundle.js +101 -52
- package/lib/utilsBundleImpl/index.js +160 -150
- package/lib/zipBundle.js +32 -23
- package/lib/zipBundleImpl.js +4 -4
- package/package.json +1 -1
- package/types/protocol.d.ts +1267 -1057
- package/types/types.d.ts +131 -29
- package/lib/common/socksProxy.js +0 -569
- package/lib/common/timeoutSettings.js +0 -73
- package/lib/common/types.js +0 -5
- package/lib/image_tools/colorUtils.js +0 -98
- package/lib/image_tools/compare.js +0 -108
- package/lib/image_tools/imageChannel.js +0 -70
- package/lib/image_tools/stats.js +0 -102
- package/lib/protocol/debug.js +0 -27
- package/lib/protocol/transport.js +0 -82
- package/lib/server/dispatchers/selectorsDispatcher.js +0 -36
- package/lib/server/isomorphic/utilityScriptSerializers.js +0 -229
- package/lib/server/recorder/contextRecorder.js +0 -290
- package/lib/server/recorder/recorderCollection.js +0 -104
- package/lib/server/recorder/recorderFrontend.js +0 -5
- package/lib/server/storageScript.js +0 -160
- package/lib/server/timeoutSettings.js +0 -74
- package/lib/third_party/diff_match_patch.js +0 -2222
- package/lib/utils/ascii.js +0 -31
- package/lib/utils/comparators.js +0 -171
- package/lib/utils/crypto.js +0 -174
- package/lib/utils/debug.js +0 -46
- package/lib/utils/debugLogger.js +0 -91
- package/lib/utils/env.js +0 -49
- package/lib/utils/eventsHelper.js +0 -38
- package/lib/utils/fileUtils.js +0 -205
- package/lib/utils/happy-eyeballs.js +0 -210
- package/lib/utils/headers.js +0 -52
- package/lib/utils/hostPlatform.js +0 -133
- package/lib/utils/httpServer.js +0 -237
- package/lib/utils/index.js +0 -368
- package/lib/utils/linuxUtils.js +0 -78
- package/lib/utils/manualPromise.js +0 -109
- package/lib/utils/multimap.js +0 -75
- package/lib/utils/network.js +0 -160
- package/lib/utils/processLauncher.js +0 -248
- package/lib/utils/profiler.js +0 -53
- package/lib/utils/rtti.js +0 -44
- package/lib/utils/semaphore.js +0 -51
- package/lib/utils/spawnAsync.js +0 -45
- package/lib/utils/stackTrace.js +0 -121
- package/lib/utils/task.js +0 -58
- package/lib/utils/time.js +0 -37
- package/lib/utils/timeoutRunner.js +0 -66
- package/lib/utils/traceUtils.js +0 -44
- package/lib/utils/userAgent.js +0 -105
- package/lib/utils/wsServer.js +0 -127
- package/lib/utils/zipFile.js +0 -75
- package/lib/utils/zones.js +0 -62
- package/lib/vite/htmlReport/index.html +0 -69
- package/lib/vite/recorder/assets/codeMirrorModule-DrMbgOIo.js +0 -16684
- package/lib/vite/recorder/assets/codeMirrorModule-DuST8d_k.css +0 -344
- package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
- package/lib/vite/recorder/assets/index-5NM3V7eb.css +0 -2524
- package/lib/vite/recorder/assets/index-CT-scFHn.js +0 -16848
- package/lib/vite/recorder/index.html +0 -29
- package/lib/vite/recorder/playwright-logo.svg +0 -9
- package/lib/vite/traceViewer/assets/codeMirrorModule-CB-2okZ8.js +0 -16684
- package/lib/vite/traceViewer/assets/defaultSettingsView-CBiB4avC.js +0 -217
- package/lib/vite/traceViewer/assets/inspectorTab-CwgfffWb.js +0 -25143
- package/lib/vite/traceViewer/assets/workbench-CWZselvp.js +0 -2470
- package/lib/vite/traceViewer/assets/xtermModule-Es_gt_u7.js +0 -5994
- package/lib/vite/traceViewer/codeMirrorModule.DuST8d_k.css +0 -344
- package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- package/lib/vite/traceViewer/defaultSettingsView.Dp3b_92q.css +0 -41
- package/lib/vite/traceViewer/embedded.BeldSa2G.css +0 -68
- package/lib/vite/traceViewer/embedded.gzudoghF.js +0 -106
- package/lib/vite/traceViewer/embedded.html +0 -18
- package/lib/vite/traceViewer/index.DilotR1h.js +0 -314
- package/lib/vite/traceViewer/index.QewjJ85u.css +0 -131
- package/lib/vite/traceViewer/index.html +0 -47
- package/lib/vite/traceViewer/inspectorTab.DnGm18kV.css +0 -3178
- package/lib/vite/traceViewer/playwright-logo.svg +0 -9
- package/lib/vite/traceViewer/recorder.DLgqV9db.css +0 -15
- package/lib/vite/traceViewer/recorder.DVrkq3Um.js +0 -551
- package/lib/vite/traceViewer/recorder.html +0 -17
- package/lib/vite/traceViewer/snapshot.html +0 -21
- package/lib/vite/traceViewer/sw.bundle.js +0 -3
- package/lib/vite/traceViewer/uiMode.C9_OcpPU.js +0 -1756
- package/lib/vite/traceViewer/uiMode.c5ORgcrX.css +0 -1424
- package/lib/vite/traceViewer/uiMode.html +0 -21
- package/lib/vite/traceViewer/workbench.xUZSA8PY.css +0 -787
- package/lib/vite/traceViewer/xtermModule.EsaqrrTX.css +0 -209
|
@@ -1,115 +1,109 @@
|
|
|
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 crBrowser_exports = {};
|
|
30
|
+
__export(crBrowser_exports, {
|
|
31
|
+
CRBrowser: () => CRBrowser,
|
|
32
|
+
CRBrowserContext: () => CRBrowserContext
|
|
5
33
|
});
|
|
6
|
-
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var network =
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class CRBrowser extends _browser.Browser {
|
|
34
|
+
module.exports = __toCommonJS(crBrowser_exports);
|
|
35
|
+
var import_path = __toESM(require("path"));
|
|
36
|
+
var import_assert = require("../../utils/isomorphic/assert");
|
|
37
|
+
var import_crypto = require("../utils/crypto");
|
|
38
|
+
var import_artifact = require("../artifact");
|
|
39
|
+
var import_browser = require("../browser");
|
|
40
|
+
var import_browserContext = require("../browserContext");
|
|
41
|
+
var import_frames = require("../frames");
|
|
42
|
+
var network = __toESM(require("../network"));
|
|
43
|
+
var import_page = require("../page");
|
|
44
|
+
var import_crConnection = require("./crConnection");
|
|
45
|
+
var import_crPage = require("./crPage");
|
|
46
|
+
var import_crProtocolHelper = require("./crProtocolHelper");
|
|
47
|
+
var import_crServiceWorker = require("./crServiceWorker");
|
|
48
|
+
class CRBrowser extends import_browser.Browser {
|
|
49
|
+
constructor(parent, connection, options) {
|
|
50
|
+
super(parent, options);
|
|
51
|
+
this._clientRootSessionPromise = null;
|
|
52
|
+
this._contexts = /* @__PURE__ */ new Map();
|
|
53
|
+
this._crPages = /* @__PURE__ */ new Map();
|
|
54
|
+
this._backgroundPages = /* @__PURE__ */ new Map();
|
|
55
|
+
this._serviceWorkers = /* @__PURE__ */ new Map();
|
|
56
|
+
this._version = "";
|
|
57
|
+
this._tracingRecording = false;
|
|
58
|
+
this._userAgent = "";
|
|
59
|
+
this._connection = connection;
|
|
60
|
+
this._session = this._connection.rootSession;
|
|
61
|
+
this._connection.on(import_crConnection.ConnectionEvents.Disconnected, () => this._didDisconnect());
|
|
62
|
+
this._session.on("Target.attachedToTarget", this._onAttachedToTarget.bind(this));
|
|
63
|
+
this._session.on("Target.detachedFromTarget", this._onDetachedFromTarget.bind(this));
|
|
64
|
+
this._session.on("Browser.downloadWillBegin", this._onDownloadWillBegin.bind(this));
|
|
65
|
+
this._session.on("Browser.downloadProgress", this._onDownloadProgress.bind(this));
|
|
66
|
+
}
|
|
41
67
|
static async connect(parent, transport, options, devtools) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
...options
|
|
45
|
-
};
|
|
46
|
-
const connection = new _crConnection.CRConnection(transport, options.protocolLogger, options.browserLogsCollector);
|
|
68
|
+
options = { ...options };
|
|
69
|
+
const connection = new import_crConnection.CRConnection(parent, transport, options.protocolLogger, options.browserLogsCollector);
|
|
47
70
|
const browser = new CRBrowser(parent, connection, options);
|
|
48
71
|
browser._devtools = devtools;
|
|
49
|
-
if (browser.isClank())
|
|
72
|
+
if (browser.isClank())
|
|
73
|
+
browser._isCollocatedWithServer = false;
|
|
50
74
|
const session = connection.rootSession;
|
|
51
|
-
if (options.__testHookOnConnectToBrowser)
|
|
52
|
-
|
|
53
|
-
|
|
75
|
+
if (options.__testHookOnConnectToBrowser)
|
|
76
|
+
await options.__testHookOnConnectToBrowser();
|
|
77
|
+
const version = await session.send("Browser.getVersion");
|
|
78
|
+
browser._version = version.product.substring(version.product.indexOf("/") + 1);
|
|
54
79
|
browser._userAgent = version.userAgent;
|
|
55
|
-
|
|
56
|
-
// may have been launched with different options.
|
|
57
|
-
browser.options.headful = !version.userAgent.includes('Headless');
|
|
80
|
+
browser.options.headful = !version.userAgent.includes("Headless");
|
|
58
81
|
if (!options.persistent) {
|
|
59
|
-
await session.send(
|
|
60
|
-
autoAttach: true,
|
|
61
|
-
waitForDebuggerOnStart: true,
|
|
62
|
-
flatten: true
|
|
63
|
-
});
|
|
82
|
+
await session.send("Target.setAutoAttach", { autoAttach: true, waitForDebuggerOnStart: true, flatten: true });
|
|
64
83
|
return browser;
|
|
65
84
|
}
|
|
66
|
-
browser._defaultContext = new CRBrowserContext(browser,
|
|
67
|
-
await Promise.all([
|
|
68
|
-
autoAttach: true,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
// However making a dummy call afterwards fixes this.
|
|
74
|
-
// This can be removed after https://chromium-review.googlesource.com/c/chromium/src/+/2885888 lands in stable.
|
|
75
|
-
await session.send('Target.getTargetInfo');
|
|
76
|
-
}), browser._defaultContext._initialize()]);
|
|
85
|
+
browser._defaultContext = new CRBrowserContext(browser, void 0, options.persistent);
|
|
86
|
+
await Promise.all([
|
|
87
|
+
session.send("Target.setAutoAttach", { autoAttach: true, waitForDebuggerOnStart: true, flatten: true }).then(async () => {
|
|
88
|
+
await session.send("Target.getTargetInfo");
|
|
89
|
+
}),
|
|
90
|
+
browser._defaultContext._initialize()
|
|
91
|
+
]);
|
|
77
92
|
await browser._waitForAllPagesToBeInitialized();
|
|
78
93
|
return browser;
|
|
79
94
|
}
|
|
80
|
-
constructor(parent, connection, options) {
|
|
81
|
-
super(parent, options);
|
|
82
|
-
this._connection = void 0;
|
|
83
|
-
this._session = void 0;
|
|
84
|
-
this._clientRootSessionPromise = null;
|
|
85
|
-
this._contexts = new Map();
|
|
86
|
-
this._crPages = new Map();
|
|
87
|
-
this._backgroundPages = new Map();
|
|
88
|
-
this._serviceWorkers = new Map();
|
|
89
|
-
this._devtools = void 0;
|
|
90
|
-
this._version = '';
|
|
91
|
-
this._tracingRecording = false;
|
|
92
|
-
this._tracingClient = void 0;
|
|
93
|
-
this._userAgent = '';
|
|
94
|
-
this._connection = connection;
|
|
95
|
-
this._session = this._connection.rootSession;
|
|
96
|
-
this._connection.on(_crConnection.ConnectionEvents.Disconnected, () => this._didDisconnect());
|
|
97
|
-
this._session.on('Target.attachedToTarget', this._onAttachedToTarget.bind(this));
|
|
98
|
-
this._session.on('Target.detachedFromTarget', this._onDetachedFromTarget.bind(this));
|
|
99
|
-
this._session.on('Browser.downloadWillBegin', this._onDownloadWillBegin.bind(this));
|
|
100
|
-
this._session.on('Browser.downloadProgress', this._onDownloadProgress.bind(this));
|
|
101
|
-
}
|
|
102
95
|
async doCreateNewContext(options) {
|
|
103
96
|
const proxy = options.proxyOverride || options.proxy;
|
|
104
|
-
let proxyBypassList =
|
|
97
|
+
let proxyBypassList = void 0;
|
|
105
98
|
if (proxy) {
|
|
106
|
-
if (process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK)
|
|
99
|
+
if (process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK)
|
|
100
|
+
proxyBypassList = proxy.bypass;
|
|
101
|
+
else
|
|
102
|
+
proxyBypassList = "<-loopback>" + (proxy.bypass ? `,${proxy.bypass}` : "");
|
|
107
103
|
}
|
|
108
|
-
const {
|
|
109
|
-
browserContextId
|
|
110
|
-
} = await this._session.send('Target.createBrowserContext', {
|
|
104
|
+
const { browserContextId } = await this._session.send("Target.createBrowserContext", {
|
|
111
105
|
disposeOnDetach: true,
|
|
112
|
-
proxyServer: proxy ? proxy.server :
|
|
106
|
+
proxyServer: proxy ? proxy.server : void 0,
|
|
113
107
|
proxyBypassList
|
|
114
108
|
});
|
|
115
109
|
const context = new CRBrowserContext(this, browserContextId, options);
|
|
@@ -127,72 +121,59 @@ class CRBrowser extends _browser.Browser {
|
|
|
127
121
|
return this._userAgent;
|
|
128
122
|
}
|
|
129
123
|
_platform() {
|
|
130
|
-
if (this._userAgent.includes(
|
|
131
|
-
|
|
132
|
-
|
|
124
|
+
if (this._userAgent.includes("Windows"))
|
|
125
|
+
return "win";
|
|
126
|
+
if (this._userAgent.includes("Macintosh"))
|
|
127
|
+
return "mac";
|
|
128
|
+
return "linux";
|
|
133
129
|
}
|
|
134
130
|
isClank() {
|
|
135
|
-
return this.options.name ===
|
|
131
|
+
return this.options.name === "clank";
|
|
136
132
|
}
|
|
137
133
|
async _waitForAllPagesToBeInitialized() {
|
|
138
|
-
await Promise.all([...this._crPages.values()].map(crPage => crPage._page.waitForInitializedOrError()));
|
|
139
|
-
}
|
|
140
|
-
_onAttachedToTarget({
|
|
141
|
-
targetInfo
|
|
142
|
-
|
|
143
|
-
waitingForDebugger
|
|
144
|
-
}) {
|
|
145
|
-
if (targetInfo.type === 'browser') return;
|
|
134
|
+
await Promise.all([...this._crPages.values()].map((crPage) => crPage._page.waitForInitializedOrError()));
|
|
135
|
+
}
|
|
136
|
+
_onAttachedToTarget({ targetInfo, sessionId, waitingForDebugger }) {
|
|
137
|
+
if (targetInfo.type === "browser")
|
|
138
|
+
return;
|
|
146
139
|
const session = this._session.createChildSession(sessionId);
|
|
147
|
-
(0,
|
|
140
|
+
(0, import_assert.assert)(targetInfo.browserContextId, "targetInfo: " + JSON.stringify(targetInfo, null, 2));
|
|
148
141
|
let context = this._contexts.get(targetInfo.browserContextId) || null;
|
|
149
142
|
if (!context) {
|
|
150
|
-
// TODO: auto attach only to pages from our contexts.
|
|
151
|
-
// assert(this._defaultContext);
|
|
152
143
|
context = this._defaultContext;
|
|
153
144
|
}
|
|
154
|
-
if (targetInfo.type ===
|
|
145
|
+
if (targetInfo.type === "other" && targetInfo.url.startsWith("devtools://devtools") && this._devtools) {
|
|
155
146
|
this._devtools.install(session);
|
|
156
147
|
return;
|
|
157
148
|
}
|
|
158
|
-
const treatOtherAsPage = targetInfo.type ===
|
|
159
|
-
if (!context || targetInfo.type ===
|
|
160
|
-
session.detach().catch(() => {
|
|
149
|
+
const treatOtherAsPage = targetInfo.type === "other" && process.env.PW_CHROMIUM_ATTACH_TO_OTHER;
|
|
150
|
+
if (!context || targetInfo.type === "other" && !treatOtherAsPage) {
|
|
151
|
+
session.detach().catch(() => {
|
|
152
|
+
});
|
|
161
153
|
return;
|
|
162
154
|
}
|
|
163
|
-
(0,
|
|
164
|
-
(0,
|
|
165
|
-
(0,
|
|
166
|
-
if (targetInfo.type ===
|
|
167
|
-
const backgroundPage = new
|
|
168
|
-
hasUIWindow: false,
|
|
169
|
-
isBackgroundPage: true
|
|
170
|
-
});
|
|
155
|
+
(0, import_assert.assert)(!this._crPages.has(targetInfo.targetId), "Duplicate target " + targetInfo.targetId);
|
|
156
|
+
(0, import_assert.assert)(!this._backgroundPages.has(targetInfo.targetId), "Duplicate target " + targetInfo.targetId);
|
|
157
|
+
(0, import_assert.assert)(!this._serviceWorkers.has(targetInfo.targetId), "Duplicate target " + targetInfo.targetId);
|
|
158
|
+
if (targetInfo.type === "background_page") {
|
|
159
|
+
const backgroundPage = new import_crPage.CRPage(session, targetInfo.targetId, context, null, { hasUIWindow: false, isBackgroundPage: true });
|
|
171
160
|
this._backgroundPages.set(targetInfo.targetId, backgroundPage);
|
|
172
161
|
return;
|
|
173
162
|
}
|
|
174
|
-
if (targetInfo.type ===
|
|
163
|
+
if (targetInfo.type === "page" || treatOtherAsPage) {
|
|
175
164
|
const opener = targetInfo.openerId ? this._crPages.get(targetInfo.openerId) || null : null;
|
|
176
|
-
const crPage = new
|
|
177
|
-
hasUIWindow: targetInfo.type === 'page',
|
|
178
|
-
isBackgroundPage: false
|
|
179
|
-
});
|
|
165
|
+
const crPage = new import_crPage.CRPage(session, targetInfo.targetId, context, opener, { hasUIWindow: targetInfo.type === "page", isBackgroundPage: false });
|
|
180
166
|
this._crPages.set(targetInfo.targetId, crPage);
|
|
181
167
|
return;
|
|
182
168
|
}
|
|
183
|
-
if (targetInfo.type ===
|
|
184
|
-
const serviceWorker = new
|
|
169
|
+
if (targetInfo.type === "service_worker") {
|
|
170
|
+
const serviceWorker = new import_crServiceWorker.CRServiceWorker(context, session, targetInfo.url);
|
|
185
171
|
this._serviceWorkers.set(targetInfo.targetId, serviceWorker);
|
|
186
172
|
context.emit(CRBrowserContext.CREvents.ServiceWorker, serviceWorker);
|
|
187
173
|
return;
|
|
188
174
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
//
|
|
192
|
-
// One example of a side effect: upon shared worker restart, we receive
|
|
193
|
-
// Inspector.targetReloadedAfterCrash and backend waits for Runtime.runIfWaitingForDebugger
|
|
194
|
-
// from any attached client. If we do not resume, shared worker will stall.
|
|
195
|
-
session.detach().catch(() => {});
|
|
175
|
+
session.detach().catch(() => {
|
|
176
|
+
});
|
|
196
177
|
}
|
|
197
178
|
_onDetachedFromTarget(payload) {
|
|
198
179
|
const targetId = payload.targetId;
|
|
@@ -216,70 +197,89 @@ class CRBrowser extends _browser.Browser {
|
|
|
216
197
|
}
|
|
217
198
|
}
|
|
218
199
|
_didDisconnect() {
|
|
219
|
-
for (const crPage of this._crPages.values())
|
|
200
|
+
for (const crPage of this._crPages.values())
|
|
201
|
+
crPage.didClose();
|
|
220
202
|
this._crPages.clear();
|
|
221
|
-
for (const backgroundPage of this._backgroundPages.values())
|
|
203
|
+
for (const backgroundPage of this._backgroundPages.values())
|
|
204
|
+
backgroundPage.didClose();
|
|
222
205
|
this._backgroundPages.clear();
|
|
223
|
-
for (const serviceWorker of this._serviceWorkers.values())
|
|
206
|
+
for (const serviceWorker of this._serviceWorkers.values())
|
|
207
|
+
serviceWorker.didClose();
|
|
224
208
|
this._serviceWorkers.clear();
|
|
225
209
|
this._didClose();
|
|
226
210
|
}
|
|
227
211
|
_findOwningPage(frameId) {
|
|
228
212
|
for (const crPage of this._crPages.values()) {
|
|
229
|
-
const frame = crPage._page.
|
|
230
|
-
if (frame)
|
|
213
|
+
const frame = crPage._page.frameManager.frame(frameId);
|
|
214
|
+
if (frame)
|
|
215
|
+
return crPage;
|
|
231
216
|
}
|
|
232
217
|
return null;
|
|
233
218
|
}
|
|
234
219
|
_onDownloadWillBegin(payload) {
|
|
235
220
|
const page = this._findOwningPage(payload.frameId);
|
|
236
221
|
if (!page) {
|
|
237
|
-
// There might be no page when download originates from something unusual, like
|
|
238
|
-
// a DevTools window or maybe an extension page.
|
|
239
|
-
// See https://github.com/microsoft/playwright/issues/22551.
|
|
240
222
|
return;
|
|
241
223
|
}
|
|
242
224
|
page.willBeginDownload();
|
|
243
225
|
let originPage = page._page.initializedOrUndefined();
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
if (!originPage)
|
|
226
|
+
if (!originPage && page._opener)
|
|
227
|
+
originPage = page._opener._page.initializedOrUndefined();
|
|
228
|
+
if (!originPage)
|
|
229
|
+
return;
|
|
247
230
|
this._downloadCreated(originPage, payload.guid, payload.url, payload.suggestedFilename);
|
|
248
231
|
}
|
|
249
232
|
_onDownloadProgress(payload) {
|
|
250
|
-
if (payload.state ===
|
|
251
|
-
|
|
233
|
+
if (payload.state === "completed")
|
|
234
|
+
this._downloadFinished(payload.guid, "");
|
|
235
|
+
if (payload.state === "canceled")
|
|
236
|
+
this._downloadFinished(payload.guid, this._closeReason || "canceled");
|
|
252
237
|
}
|
|
253
238
|
async _closePage(crPage) {
|
|
254
|
-
await this._session.send(
|
|
255
|
-
targetId: crPage._targetId
|
|
256
|
-
});
|
|
239
|
+
await this._session.send("Target.closeTarget", { targetId: crPage._targetId });
|
|
257
240
|
}
|
|
258
241
|
async newBrowserCDPSession() {
|
|
259
242
|
return await this._connection.createBrowserSession();
|
|
260
243
|
}
|
|
261
244
|
async startTracing(page, options = {}) {
|
|
262
|
-
(0,
|
|
263
|
-
this._tracingClient = page ? page.
|
|
264
|
-
const defaultCategories = [
|
|
245
|
+
(0, import_assert.assert)(!this._tracingRecording, "Cannot start recording trace while already recording trace.");
|
|
246
|
+
this._tracingClient = page ? page.delegate._mainFrameSession._client : this._session;
|
|
247
|
+
const defaultCategories = [
|
|
248
|
+
"-*",
|
|
249
|
+
"devtools.timeline",
|
|
250
|
+
"v8.execute",
|
|
251
|
+
"disabled-by-default-devtools.timeline",
|
|
252
|
+
"disabled-by-default-devtools.timeline.frame",
|
|
253
|
+
"toplevel",
|
|
254
|
+
"blink.console",
|
|
255
|
+
"blink.user_timing",
|
|
256
|
+
"latencyInfo",
|
|
257
|
+
"disabled-by-default-devtools.timeline.stack",
|
|
258
|
+
"disabled-by-default-v8.cpu_profiler",
|
|
259
|
+
"disabled-by-default-v8.cpu_profiler.hires"
|
|
260
|
+
];
|
|
265
261
|
const {
|
|
266
262
|
screenshots = false,
|
|
267
263
|
categories = defaultCategories
|
|
268
264
|
} = options;
|
|
269
|
-
if (screenshots)
|
|
265
|
+
if (screenshots)
|
|
266
|
+
categories.push("disabled-by-default-devtools.screenshot");
|
|
270
267
|
this._tracingRecording = true;
|
|
271
|
-
await this._tracingClient.send(
|
|
272
|
-
transferMode:
|
|
273
|
-
categories: categories.join(
|
|
268
|
+
await this._tracingClient.send("Tracing.start", {
|
|
269
|
+
transferMode: "ReturnAsStream",
|
|
270
|
+
categories: categories.join(",")
|
|
274
271
|
});
|
|
275
272
|
}
|
|
276
273
|
async stopTracing() {
|
|
277
|
-
(0,
|
|
278
|
-
const [event] = await Promise.all([
|
|
279
|
-
|
|
280
|
-
|
|
274
|
+
(0, import_assert.assert)(this._tracingClient, "Tracing was not started.");
|
|
275
|
+
const [event] = await Promise.all([
|
|
276
|
+
new Promise((f) => this._tracingClient.once("Tracing.tracingComplete", f)),
|
|
277
|
+
this._tracingClient.send("Tracing.end")
|
|
278
|
+
]);
|
|
279
|
+
const tracingPath = import_path.default.join(this.options.artifactsDir, (0, import_crypto.createGuid)() + ".crtrace");
|
|
280
|
+
await (0, import_crProtocolHelper.saveProtocolStream)(this._tracingClient, event.stream, tracingPath);
|
|
281
281
|
this._tracingRecording = false;
|
|
282
|
-
const artifact = new
|
|
282
|
+
const artifact = new import_artifact.Artifact(this, tracingPath);
|
|
283
283
|
artifact.reportFinished();
|
|
284
284
|
return artifact;
|
|
285
285
|
}
|
|
@@ -287,22 +287,28 @@ class CRBrowser extends _browser.Browser {
|
|
|
287
287
|
return !this._connection._closed;
|
|
288
288
|
}
|
|
289
289
|
async _clientRootSession() {
|
|
290
|
-
if (!this._clientRootSessionPromise)
|
|
290
|
+
if (!this._clientRootSessionPromise)
|
|
291
|
+
this._clientRootSessionPromise = this._connection.createBrowserSession();
|
|
291
292
|
return this._clientRootSessionPromise;
|
|
292
293
|
}
|
|
293
294
|
}
|
|
294
|
-
|
|
295
|
-
|
|
295
|
+
class CRBrowserContext extends import_browserContext.BrowserContext {
|
|
296
|
+
static {
|
|
297
|
+
this.CREvents = {
|
|
298
|
+
BackgroundPage: "backgroundpage",
|
|
299
|
+
ServiceWorker: "serviceworker"
|
|
300
|
+
};
|
|
301
|
+
}
|
|
296
302
|
constructor(browser, browserContextId, options) {
|
|
297
303
|
super(browser, options, browserContextId);
|
|
298
304
|
this._authenticateProxyViaCredentials();
|
|
299
305
|
}
|
|
300
306
|
async _initialize() {
|
|
301
|
-
(0,
|
|
307
|
+
(0, import_assert.assert)(!Array.from(this._browser._crPages.values()).some((page) => page._browserContext === this));
|
|
302
308
|
const promises = [super._initialize()];
|
|
303
|
-
if (this._browser.options.name !==
|
|
304
|
-
promises.push(this._browser._session.send(
|
|
305
|
-
behavior: this._options.acceptDownloads ===
|
|
309
|
+
if (this._browser.options.name !== "clank" && this._options.acceptDownloads !== "internal-browser-default") {
|
|
310
|
+
promises.push(this._browser._session.send("Browser.setDownloadBehavior", {
|
|
311
|
+
behavior: this._options.acceptDownloads === "accept" ? "allowAndName" : "deny",
|
|
306
312
|
browserContextId: this._browserContextId,
|
|
307
313
|
downloadPath: this._browser.options.downloadsPath,
|
|
308
314
|
eventsEnabled: true
|
|
@@ -311,161 +317,173 @@ class CRBrowserContext extends _browserContext.BrowserContext {
|
|
|
311
317
|
await Promise.all(promises);
|
|
312
318
|
}
|
|
313
319
|
_crPages() {
|
|
314
|
-
return [...this._browser._crPages.values()].filter(crPage => crPage._browserContext === this);
|
|
320
|
+
return [...this._browser._crPages.values()].filter((crPage) => crPage._browserContext === this);
|
|
315
321
|
}
|
|
316
322
|
possiblyUninitializedPages() {
|
|
317
|
-
return this._crPages().map(crPage => crPage._page);
|
|
318
|
-
}
|
|
319
|
-
async doCreateNewPage() {
|
|
320
|
-
(
|
|
321
|
-
const
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
url: 'about:blank',
|
|
326
|
-
browserContextId: this._browserContextId
|
|
327
|
-
});
|
|
328
|
-
if (oldKeys) {
|
|
329
|
-
// Chrome for Android returns tab ids (1, 2, 3, 4, 5) instead of content target ids here, work around it via the
|
|
330
|
-
// heuristic assuming that there is only one page created at a time.
|
|
331
|
-
const newKeys = new Set(this._browser._crPages.keys());
|
|
332
|
-
// Remove old keys.
|
|
333
|
-
for (const key of oldKeys) newKeys.delete(key);
|
|
334
|
-
// Remove potential concurrent popups.
|
|
335
|
-
for (const key of newKeys) {
|
|
336
|
-
const page = this._browser._crPages.get(key);
|
|
337
|
-
if (page._opener) newKeys.delete(key);
|
|
338
|
-
}
|
|
339
|
-
(0, _assert.assert)(newKeys.size === 1);
|
|
340
|
-
[targetId] = [...newKeys];
|
|
341
|
-
}
|
|
342
|
-
return this._browser._crPages.get(targetId)._page;
|
|
323
|
+
return this._crPages().map((crPage) => crPage._page);
|
|
324
|
+
}
|
|
325
|
+
async doCreateNewPage(markAsServerSideOnly) {
|
|
326
|
+
const { targetId } = await this._browser._session.send("Target.createTarget", { url: "about:blank", browserContextId: this._browserContextId });
|
|
327
|
+
const page = this._browser._crPages.get(targetId)._page;
|
|
328
|
+
if (markAsServerSideOnly)
|
|
329
|
+
page.markAsServerSideOnly();
|
|
330
|
+
return page;
|
|
343
331
|
}
|
|
344
332
|
async doGetCookies(urls) {
|
|
345
|
-
const {
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
browserContextId: this._browserContextId
|
|
349
|
-
});
|
|
350
|
-
return network.filterCookies(cookies.map(c => {
|
|
333
|
+
const { cookies } = await this._browser._session.send("Storage.getCookies", { browserContextId: this._browserContextId });
|
|
334
|
+
return network.filterCookies(cookies.map((c) => {
|
|
335
|
+
const { name, value, domain, path: path2, expires, httpOnly, secure, sameSite } = c;
|
|
351
336
|
const copy = {
|
|
352
|
-
|
|
353
|
-
|
|
337
|
+
name,
|
|
338
|
+
value,
|
|
339
|
+
domain,
|
|
340
|
+
path: path2,
|
|
341
|
+
expires,
|
|
342
|
+
httpOnly,
|
|
343
|
+
secure,
|
|
344
|
+
sameSite: sameSite ?? "Lax"
|
|
354
345
|
};
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
delete copy.sourceScheme;
|
|
360
|
-
delete copy.sourcePort;
|
|
346
|
+
if (c.partitionKey) {
|
|
347
|
+
copy._crHasCrossSiteAncestor = c.partitionKey.hasCrossSiteAncestor;
|
|
348
|
+
copy.partitionKey = c.partitionKey.topLevelSite;
|
|
349
|
+
}
|
|
361
350
|
return copy;
|
|
362
351
|
}), urls);
|
|
363
352
|
}
|
|
364
353
|
async addCookies(cookies) {
|
|
365
|
-
|
|
366
|
-
|
|
354
|
+
function toChromiumCookie(cookie) {
|
|
355
|
+
const { name, value, url, domain, path: path2, expires, httpOnly, secure, sameSite, partitionKey, _crHasCrossSiteAncestor } = cookie;
|
|
356
|
+
const copy = {
|
|
357
|
+
name,
|
|
358
|
+
value,
|
|
359
|
+
url,
|
|
360
|
+
domain,
|
|
361
|
+
path: path2,
|
|
362
|
+
expires,
|
|
363
|
+
httpOnly,
|
|
364
|
+
secure,
|
|
365
|
+
sameSite
|
|
366
|
+
};
|
|
367
|
+
if (partitionKey) {
|
|
368
|
+
copy.partitionKey = {
|
|
369
|
+
topLevelSite: partitionKey,
|
|
370
|
+
// _crHasCrossSiteAncestor is non-standard, set it true by default if the cookie is partitioned.
|
|
371
|
+
hasCrossSiteAncestor: _crHasCrossSiteAncestor ?? true
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
return copy;
|
|
375
|
+
}
|
|
376
|
+
await this._browser._session.send("Storage.setCookies", {
|
|
377
|
+
cookies: network.rewriteCookies(cookies).map(toChromiumCookie),
|
|
367
378
|
browserContextId: this._browserContextId
|
|
368
379
|
});
|
|
369
380
|
}
|
|
370
381
|
async doClearCookies() {
|
|
371
|
-
await this._browser._session.send(
|
|
372
|
-
browserContextId: this._browserContextId
|
|
373
|
-
});
|
|
382
|
+
await this._browser._session.send("Storage.clearCookies", { browserContextId: this._browserContextId });
|
|
374
383
|
}
|
|
375
384
|
async doGrantPermissions(origin, permissions) {
|
|
376
|
-
const webPermissionToProtocol = new Map([
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
385
|
+
const webPermissionToProtocol = /* @__PURE__ */ new Map([
|
|
386
|
+
["geolocation", "geolocation"],
|
|
387
|
+
["midi", "midi"],
|
|
388
|
+
["notifications", "notifications"],
|
|
389
|
+
["camera", "videoCapture"],
|
|
390
|
+
["microphone", "audioCapture"],
|
|
391
|
+
["background-sync", "backgroundSync"],
|
|
392
|
+
["ambient-light-sensor", "sensors"],
|
|
393
|
+
["accelerometer", "sensors"],
|
|
394
|
+
["gyroscope", "sensors"],
|
|
395
|
+
["magnetometer", "sensors"],
|
|
396
|
+
["clipboard-read", "clipboardReadWrite"],
|
|
397
|
+
["clipboard-write", "clipboardSanitizedWrite"],
|
|
398
|
+
["payment-handler", "paymentHandler"],
|
|
399
|
+
// chrome-specific permissions we have.
|
|
400
|
+
["midi-sysex", "midiSysex"],
|
|
401
|
+
["storage-access", "storageAccess"],
|
|
402
|
+
["local-fonts", "localFonts"]
|
|
403
|
+
]);
|
|
404
|
+
const filtered = permissions.map((permission) => {
|
|
380
405
|
const protocolPermission = webPermissionToProtocol.get(permission);
|
|
381
|
-
if (!protocolPermission)
|
|
406
|
+
if (!protocolPermission)
|
|
407
|
+
throw new Error("Unknown permission: " + permission);
|
|
382
408
|
return protocolPermission;
|
|
383
409
|
});
|
|
384
|
-
await this._browser._session.send(
|
|
385
|
-
origin: origin === '*' ? undefined : origin,
|
|
386
|
-
browserContextId: this._browserContextId,
|
|
387
|
-
permissions: filtered
|
|
388
|
-
});
|
|
410
|
+
await this._browser._session.send("Browser.grantPermissions", { origin: origin === "*" ? void 0 : origin, browserContextId: this._browserContextId, permissions: filtered });
|
|
389
411
|
}
|
|
390
412
|
async doClearPermissions() {
|
|
391
|
-
await this._browser._session.send(
|
|
392
|
-
browserContextId: this._browserContextId
|
|
393
|
-
});
|
|
413
|
+
await this._browser._session.send("Browser.resetPermissions", { browserContextId: this._browserContextId });
|
|
394
414
|
}
|
|
395
415
|
async setGeolocation(geolocation) {
|
|
396
|
-
(0,
|
|
416
|
+
(0, import_browserContext.verifyGeolocation)(geolocation);
|
|
397
417
|
this._options.geolocation = geolocation;
|
|
398
|
-
for (const page of this.pages())
|
|
418
|
+
for (const page of this.pages())
|
|
419
|
+
await page.delegate.updateGeolocation();
|
|
399
420
|
}
|
|
400
|
-
async
|
|
401
|
-
this.
|
|
402
|
-
|
|
403
|
-
for (const sw of this.serviceWorkers())
|
|
421
|
+
async doUpdateExtraHTTPHeaders() {
|
|
422
|
+
for (const page of this.pages())
|
|
423
|
+
await page.delegate.updateExtraHTTPHeaders();
|
|
424
|
+
for (const sw of this.serviceWorkers())
|
|
425
|
+
await sw.updateExtraHTTPHeaders();
|
|
404
426
|
}
|
|
405
427
|
async setUserAgent(userAgent) {
|
|
406
428
|
this._options.userAgent = userAgent;
|
|
407
|
-
for (const page of this.pages())
|
|
408
|
-
|
|
429
|
+
for (const page of this.pages())
|
|
430
|
+
await page.delegate.updateUserAgent();
|
|
409
431
|
}
|
|
410
|
-
async
|
|
411
|
-
this.
|
|
412
|
-
|
|
413
|
-
for (const sw of this.serviceWorkers())
|
|
432
|
+
async doUpdateOffline() {
|
|
433
|
+
for (const page of this.pages())
|
|
434
|
+
await page.delegate.updateOffline();
|
|
435
|
+
for (const sw of this.serviceWorkers())
|
|
436
|
+
await sw.updateOffline();
|
|
414
437
|
}
|
|
415
438
|
async doSetHTTPCredentials(httpCredentials) {
|
|
416
439
|
this._options.httpCredentials = httpCredentials;
|
|
417
|
-
for (const page of this.pages())
|
|
418
|
-
|
|
440
|
+
for (const page of this.pages())
|
|
441
|
+
await page.delegate.updateHttpCredentials();
|
|
442
|
+
for (const sw of this.serviceWorkers())
|
|
443
|
+
await sw.updateHttpCredentials();
|
|
419
444
|
}
|
|
420
445
|
async doAddInitScript(initScript) {
|
|
421
|
-
for (const page of this.pages())
|
|
446
|
+
for (const page of this.pages())
|
|
447
|
+
await page.delegate.addInitScript(initScript);
|
|
422
448
|
}
|
|
423
|
-
async
|
|
424
|
-
for (const page of this.pages())
|
|
449
|
+
async doRemoveInitScripts(initScripts) {
|
|
450
|
+
for (const page of this.pages())
|
|
451
|
+
await page.delegate.removeInitScripts(initScripts);
|
|
425
452
|
}
|
|
426
453
|
async doUpdateRequestInterception() {
|
|
427
|
-
for (const page of this.pages())
|
|
428
|
-
|
|
454
|
+
for (const page of this.pages())
|
|
455
|
+
await page.delegate.updateRequestInterception();
|
|
456
|
+
for (const sw of this.serviceWorkers())
|
|
457
|
+
await sw.updateRequestInterception();
|
|
458
|
+
}
|
|
459
|
+
async doUpdateDefaultViewport() {
|
|
460
|
+
}
|
|
461
|
+
async doUpdateDefaultEmulatedMedia() {
|
|
462
|
+
}
|
|
463
|
+
async doExposePlaywrightBinding() {
|
|
464
|
+
for (const page of this._crPages())
|
|
465
|
+
await page.exposePlaywrightBinding();
|
|
429
466
|
}
|
|
430
467
|
async doClose(reason) {
|
|
431
|
-
|
|
432
|
-
// dialogs, so we should close all that are currently opened.
|
|
433
|
-
// We also won't get new ones since `Target.disposeBrowserContext` does not trigger
|
|
434
|
-
// beforeunload.
|
|
435
|
-
const openedBeforeUnloadDialogs = [];
|
|
436
|
-
for (const crPage of this._crPages()) {
|
|
437
|
-
const dialogs = [...crPage._page._frameManager._openedDialogs].filter(dialog => dialog.type() === 'beforeunload');
|
|
438
|
-
openedBeforeUnloadDialogs.push(...dialogs);
|
|
439
|
-
}
|
|
440
|
-
await Promise.all(openedBeforeUnloadDialogs.map(dialog => dialog.dismiss()));
|
|
468
|
+
await this.dialogManager.closeBeforeUnloadDialogs();
|
|
441
469
|
if (!this._browserContextId) {
|
|
442
470
|
await this.stopVideoRecording();
|
|
443
|
-
|
|
444
|
-
await this._browser.close({
|
|
445
|
-
reason
|
|
446
|
-
});
|
|
471
|
+
await this._browser.close({ reason });
|
|
447
472
|
return;
|
|
448
473
|
}
|
|
449
|
-
await this._browser._session.send(
|
|
450
|
-
browserContextId: this._browserContextId
|
|
451
|
-
});
|
|
474
|
+
await this._browser._session.send("Target.disposeBrowserContext", { browserContextId: this._browserContextId });
|
|
452
475
|
this._browser._contexts.delete(this._browserContextId);
|
|
453
476
|
for (const [targetId, serviceWorker] of this._browser._serviceWorkers) {
|
|
454
|
-
if (serviceWorker.
|
|
455
|
-
|
|
456
|
-
// asynchronously and we get detached from them later.
|
|
457
|
-
// To avoid the wrong order of notifications, we manually fire
|
|
458
|
-
// "close" event here and forget about the service worker.
|
|
477
|
+
if (serviceWorker.browserContext !== this)
|
|
478
|
+
continue;
|
|
459
479
|
serviceWorker.didClose();
|
|
460
480
|
this._browser._serviceWorkers.delete(targetId);
|
|
461
481
|
}
|
|
462
482
|
}
|
|
463
483
|
async stopVideoRecording() {
|
|
464
|
-
await Promise.all(this._crPages().map(crPage => crPage._mainFrameSession._stopVideoRecording()));
|
|
484
|
+
await Promise.all(this._crPages().map((crPage) => crPage._mainFrameSession._stopVideoRecording()));
|
|
465
485
|
}
|
|
466
486
|
onClosePersistent() {
|
|
467
|
-
// When persistent context is closed, we do not necessary get Target.detachedFromTarget
|
|
468
|
-
// for all the background pages.
|
|
469
487
|
for (const [targetId, backgroundPage] of this._browser._backgroundPages.entries()) {
|
|
470
488
|
if (backgroundPage._browserContext === this && backgroundPage._page.initializedOrUndefined()) {
|
|
471
489
|
backgroundPage.didClose();
|
|
@@ -474,44 +492,44 @@ class CRBrowserContext extends _browserContext.BrowserContext {
|
|
|
474
492
|
}
|
|
475
493
|
}
|
|
476
494
|
async clearCache() {
|
|
477
|
-
for (const page of this._crPages())
|
|
495
|
+
for (const page of this._crPages())
|
|
496
|
+
await page._networkManager.clearCache();
|
|
478
497
|
}
|
|
479
498
|
async cancelDownload(guid) {
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
// cancellation (finished, cancelled, etc.) or the guid is invalid at all.
|
|
483
|
-
await this._browser._session.send('Browser.cancelDownload', {
|
|
484
|
-
guid: guid,
|
|
499
|
+
await this._browser._session.send("Browser.cancelDownload", {
|
|
500
|
+
guid,
|
|
485
501
|
browserContextId: this._browserContextId
|
|
486
502
|
});
|
|
487
503
|
}
|
|
488
504
|
backgroundPages() {
|
|
489
505
|
const result = [];
|
|
490
506
|
for (const backgroundPage of this._browser._backgroundPages.values()) {
|
|
491
|
-
if (backgroundPage._browserContext === this && backgroundPage._page.initializedOrUndefined())
|
|
507
|
+
if (backgroundPage._browserContext === this && backgroundPage._page.initializedOrUndefined())
|
|
508
|
+
result.push(backgroundPage._page);
|
|
492
509
|
}
|
|
493
510
|
return result;
|
|
494
511
|
}
|
|
495
512
|
serviceWorkers() {
|
|
496
|
-
return Array.from(this._browser._serviceWorkers.values()).filter(serviceWorker => serviceWorker.
|
|
513
|
+
return Array.from(this._browser._serviceWorkers.values()).filter((serviceWorker) => serviceWorker.browserContext === this);
|
|
497
514
|
}
|
|
498
515
|
async newCDPSession(page) {
|
|
499
516
|
let targetId = null;
|
|
500
|
-
if (page instanceof
|
|
501
|
-
targetId = page.
|
|
502
|
-
} else if (page instanceof
|
|
503
|
-
const session = page._page.
|
|
504
|
-
if (!session)
|
|
517
|
+
if (page instanceof import_page.Page) {
|
|
518
|
+
targetId = page.delegate._targetId;
|
|
519
|
+
} else if (page instanceof import_frames.Frame) {
|
|
520
|
+
const session = page._page.delegate._sessions.get(page._id);
|
|
521
|
+
if (!session)
|
|
522
|
+
throw new Error(`This frame does not have a separate CDP session, it is a part of the parent frame's session`);
|
|
505
523
|
targetId = session._targetId;
|
|
506
524
|
} else {
|
|
507
|
-
throw new Error(
|
|
525
|
+
throw new Error("page: expected Page or Frame");
|
|
508
526
|
}
|
|
509
527
|
const rootSession = await this._browser._clientRootSession();
|
|
510
528
|
return rootSession.attachToTarget(targetId);
|
|
511
529
|
}
|
|
512
530
|
}
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
};
|
|
531
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
532
|
+
0 && (module.exports = {
|
|
533
|
+
CRBrowser,
|
|
534
|
+
CRBrowserContext
|
|
535
|
+
});
|