@checkly/playwright-core 1.51.17-beta.2 → 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 -35
- 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-B9YMkrwa.js +0 -24
- package/lib/vite/recorder/assets/codeMirrorModule-C3UTv-Ge.css +0 -1
- package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
- package/lib/vite/recorder/assets/index-ELPgmkwA.js +0 -184
- package/lib/vite/recorder/assets/index-eHBmevrY.css +0 -1
- package/lib/vite/recorder/index.html +0 -29
- package/lib/vite/recorder/playwright-logo.svg +0 -9
- package/lib/vite/traceViewer/assets/codeMirrorModule-gU1OOCQO.js +0 -24
- package/lib/vite/traceViewer/assets/defaultSettingsView-B5n_FjMx.js +0 -1
- package/lib/vite/traceViewer/assets/inspectorTab-6Tru8Mn_.js +0 -235
- package/lib/vite/traceViewer/assets/workbench-B_Nj4NA2.js +0 -25
- package/lib/vite/traceViewer/assets/xtermModule-BoAIEibi.js +0 -9
- package/lib/vite/traceViewer/codeMirrorModule.C3UTv-Ge.css +0 -1
- package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- package/lib/vite/traceViewer/defaultSettingsView.CO3FR0CX.css +0 -1
- package/lib/vite/traceViewer/embedded.DpNPH6mk.js +0 -2
- package/lib/vite/traceViewer/embedded.html +0 -18
- package/lib/vite/traceViewer/embedded.mLhjB5IF.css +0 -1
- package/lib/vite/traceViewer/index.CFOW-Ezb.css +0 -1
- package/lib/vite/traceViewer/index.CuE3SYGw.js +0 -2
- package/lib/vite/traceViewer/index.html +0 -47
- package/lib/vite/traceViewer/inspectorTab.CXDulcFG.css +0 -1
- package/lib/vite/traceViewer/playwright-logo.svg +0 -9
- package/lib/vite/traceViewer/recorder.BD-uZJs7.js +0 -2
- package/lib/vite/traceViewer/recorder.html +0 -17
- package/lib/vite/traceViewer/recorder.tn0RQdqM.css +0 -0
- package/lib/vite/traceViewer/snapshot.html +0 -21
- package/lib/vite/traceViewer/sw.bundle.js +0 -3
- package/lib/vite/traceViewer/uiMode.BatfzHMG.css +0 -1
- package/lib/vite/traceViewer/uiMode.DHrNgddz.js +0 -5
- package/lib/vite/traceViewer/uiMode.html +0 -21
- package/lib/vite/traceViewer/workbench.B9vIAzH9.css +0 -1
- package/lib/vite/traceViewer/xtermModule.Beg8tuEN.css +0 -32
|
@@ -1,122 +1,122 @@
|
|
|
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 wkPage_exports = {};
|
|
30
|
+
__export(wkPage_exports, {
|
|
31
|
+
WKPage: () => WKPage
|
|
5
32
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
var dialog =
|
|
17
|
-
var dom =
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
var network =
|
|
21
|
-
var
|
|
22
|
-
var
|
|
23
|
-
var
|
|
24
|
-
var
|
|
25
|
-
var
|
|
26
|
-
var
|
|
27
|
-
var
|
|
28
|
-
var
|
|
29
|
-
var
|
|
30
|
-
|
|
31
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
32
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
33
|
-
/**
|
|
34
|
-
* Copyright 2017 Google Inc. All rights reserved.
|
|
35
|
-
* Modifications copyright (c) Microsoft Corporation.
|
|
36
|
-
*
|
|
37
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
38
|
-
* you may not use this file except in compliance with the License.
|
|
39
|
-
* You may obtain a copy of the License at
|
|
40
|
-
*
|
|
41
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
42
|
-
*
|
|
43
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
44
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
45
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
46
|
-
* See the License for the specific language governing permissions and
|
|
47
|
-
* limitations under the License.
|
|
48
|
-
*/
|
|
49
|
-
|
|
50
|
-
const UTILITY_WORLD_NAME = '__playwright_utility_world__';
|
|
33
|
+
module.exports = __toCommonJS(wkPage_exports);
|
|
34
|
+
var import_path = __toESM(require("path"));
|
|
35
|
+
var import_utils = require("../../utils");
|
|
36
|
+
var import_headers = require("../../utils/isomorphic/headers");
|
|
37
|
+
var import_crypto = require("../utils/crypto");
|
|
38
|
+
var import_eventsHelper = require("../utils/eventsHelper");
|
|
39
|
+
var import_hostPlatform = require("../utils/hostPlatform");
|
|
40
|
+
var import_stackTrace = require("../../utils/isomorphic/stackTrace");
|
|
41
|
+
var import_utilsBundle = require("../../utilsBundle");
|
|
42
|
+
var import_browserContext = require("../browserContext");
|
|
43
|
+
var dialog = __toESM(require("../dialog"));
|
|
44
|
+
var dom = __toESM(require("../dom"));
|
|
45
|
+
var import_errors = require("../errors");
|
|
46
|
+
var import_helper = require("../helper");
|
|
47
|
+
var network = __toESM(require("../network"));
|
|
48
|
+
var import_page = require("../page");
|
|
49
|
+
var import_wkAccessibility = require("./wkAccessibility");
|
|
50
|
+
var import_wkConnection = require("./wkConnection");
|
|
51
|
+
var import_wkExecutionContext = require("./wkExecutionContext");
|
|
52
|
+
var import_wkInput = require("./wkInput");
|
|
53
|
+
var import_wkInterceptableRequest = require("./wkInterceptableRequest");
|
|
54
|
+
var import_wkProvisionalPage = require("./wkProvisionalPage");
|
|
55
|
+
var import_wkWorkers = require("./wkWorkers");
|
|
56
|
+
var import_debugLogger = require("../utils/debugLogger");
|
|
57
|
+
const UTILITY_WORLD_NAME = "__playwright_utility_world__";
|
|
51
58
|
class WKPage {
|
|
52
59
|
constructor(browserContext, pageProxySession, opener) {
|
|
53
|
-
this.rawMouse = void 0;
|
|
54
|
-
this.rawKeyboard = void 0;
|
|
55
|
-
this.rawTouchscreen = void 0;
|
|
56
|
-
this._session = void 0;
|
|
57
60
|
this._provisionalPage = null;
|
|
58
|
-
this.
|
|
59
|
-
this.
|
|
60
|
-
this._opener = void 0;
|
|
61
|
-
this._requestIdToRequest = new Map();
|
|
62
|
-
this._requestIdToRequestWillBeSentEvent = new Map();
|
|
63
|
-
this._workers = void 0;
|
|
64
|
-
this._contextIdToContext = void 0;
|
|
61
|
+
this._requestIdToRequest = /* @__PURE__ */ new Map();
|
|
62
|
+
this._requestIdToRequestWillBeSentEvent = /* @__PURE__ */ new Map();
|
|
65
63
|
this._sessionListeners = [];
|
|
66
|
-
this.
|
|
67
|
-
|
|
68
|
-
this.
|
|
69
|
-
|
|
70
|
-
this._firstNonInitialNavigationCommittedReject = e => {};
|
|
64
|
+
this._firstNonInitialNavigationCommittedFulfill = () => {
|
|
65
|
+
};
|
|
66
|
+
this._firstNonInitialNavigationCommittedReject = (e) => {
|
|
67
|
+
};
|
|
71
68
|
this._lastConsoleMessage = null;
|
|
72
|
-
this._requestIdToResponseReceivedPayloadEvent = new Map();
|
|
73
|
-
// Holds window features for the next popup being opened via window.open,
|
|
74
|
-
// until the popup page proxy arrives.
|
|
75
|
-
this._nextWindowOpenPopupFeatures = void 0;
|
|
69
|
+
this._requestIdToResponseReceivedPayloadEvent = /* @__PURE__ */ new Map();
|
|
76
70
|
this._recordingVideoFile = null;
|
|
77
71
|
this._screencastGeneration = 0;
|
|
78
72
|
this._pageProxySession = pageProxySession;
|
|
79
73
|
this._opener = opener;
|
|
80
|
-
this.rawKeyboard = new
|
|
81
|
-
this.rawMouse = new
|
|
82
|
-
this.rawTouchscreen = new
|
|
83
|
-
this._contextIdToContext = new Map();
|
|
84
|
-
this._page = new
|
|
74
|
+
this.rawKeyboard = new import_wkInput.RawKeyboardImpl(pageProxySession);
|
|
75
|
+
this.rawMouse = new import_wkInput.RawMouseImpl(pageProxySession);
|
|
76
|
+
this.rawTouchscreen = new import_wkInput.RawTouchscreenImpl(pageProxySession);
|
|
77
|
+
this._contextIdToContext = /* @__PURE__ */ new Map();
|
|
78
|
+
this._page = new import_page.Page(this, browserContext);
|
|
85
79
|
this.rawMouse.setPage(this._page);
|
|
86
|
-
this._workers = new
|
|
87
|
-
this._session =
|
|
80
|
+
this._workers = new import_wkWorkers.WKWorkers(this._page);
|
|
81
|
+
this._session = void 0;
|
|
88
82
|
this._browserContext = browserContext;
|
|
89
|
-
this._page.on(
|
|
90
|
-
this._eventListeners = [
|
|
83
|
+
this._page.on(import_page.Page.Events.FrameDetached, (frame) => this._removeContextsForFrame(frame, false));
|
|
84
|
+
this._eventListeners = [
|
|
85
|
+
import_eventsHelper.eventsHelper.addEventListener(this._pageProxySession, "Target.targetCreated", this._onTargetCreated.bind(this)),
|
|
86
|
+
import_eventsHelper.eventsHelper.addEventListener(this._pageProxySession, "Target.targetDestroyed", this._onTargetDestroyed.bind(this)),
|
|
87
|
+
import_eventsHelper.eventsHelper.addEventListener(this._pageProxySession, "Target.dispatchMessageFromTarget", this._onDispatchMessageFromTarget.bind(this)),
|
|
88
|
+
import_eventsHelper.eventsHelper.addEventListener(this._pageProxySession, "Target.didCommitProvisionalTarget", this._onDidCommitProvisionalTarget.bind(this)),
|
|
89
|
+
import_eventsHelper.eventsHelper.addEventListener(this._pageProxySession, "Screencast.screencastFrame", this._onScreencastFrame.bind(this))
|
|
90
|
+
];
|
|
91
91
|
this._firstNonInitialNavigationCommittedPromise = new Promise((f, r) => {
|
|
92
92
|
this._firstNonInitialNavigationCommittedFulfill = f;
|
|
93
93
|
this._firstNonInitialNavigationCommittedReject = r;
|
|
94
94
|
});
|
|
95
95
|
if (opener && !browserContext._options.noDefaultViewport && opener._nextWindowOpenPopupFeatures) {
|
|
96
|
-
const viewportSize =
|
|
97
|
-
opener._nextWindowOpenPopupFeatures =
|
|
98
|
-
if (viewportSize)
|
|
99
|
-
viewport: viewportSize,
|
|
100
|
-
screen: viewportSize
|
|
101
|
-
};
|
|
96
|
+
const viewportSize = import_helper.helper.getViewportSizeFromWindowFeatures(opener._nextWindowOpenPopupFeatures);
|
|
97
|
+
opener._nextWindowOpenPopupFeatures = void 0;
|
|
98
|
+
if (viewportSize)
|
|
99
|
+
this._page.setEmulatedSizeFromWindowOpen({ viewport: viewportSize, screen: viewportSize });
|
|
102
100
|
}
|
|
103
101
|
}
|
|
104
102
|
async _initializePageProxySession() {
|
|
105
|
-
if (this._page.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
103
|
+
if (this._page.browserContext.isSettingStorageState())
|
|
104
|
+
return;
|
|
105
|
+
const promises = [
|
|
106
|
+
this._pageProxySession.send("Dialog.enable"),
|
|
107
|
+
this._pageProxySession.send("Emulation.setActiveAndFocused", { active: true })
|
|
108
|
+
];
|
|
109
109
|
const contextOptions = this._browserContext._options;
|
|
110
|
-
if (contextOptions.javaScriptEnabled === false)
|
|
111
|
-
enabled: false
|
|
112
|
-
}));
|
|
110
|
+
if (contextOptions.javaScriptEnabled === false)
|
|
111
|
+
promises.push(this._pageProxySession.send("Emulation.setJavaScriptEnabled", { enabled: false }));
|
|
113
112
|
promises.push(this._updateViewport());
|
|
114
113
|
promises.push(this.updateHttpCredentials());
|
|
115
114
|
if (this._browserContext._permissions.size) {
|
|
116
|
-
for (const [key, value] of this._browserContext._permissions)
|
|
115
|
+
for (const [key, value] of this._browserContext._permissions)
|
|
116
|
+
promises.push(this._grantPermissions(key, value));
|
|
117
117
|
}
|
|
118
118
|
if (this._browserContext._options.recordVideo) {
|
|
119
|
-
const outputFile =
|
|
119
|
+
const outputFile = import_path.default.join(this._browserContext._options.recordVideo.dir, (0, import_crypto.createGuid)() + ".webm");
|
|
120
120
|
promises.push(this._browserContext._ensureVideosPath().then(() => {
|
|
121
121
|
return this._startVideo({
|
|
122
122
|
// validateBrowserContextOptions ensures correct video size.
|
|
@@ -128,134 +128,101 @@ class WKPage {
|
|
|
128
128
|
await Promise.all(promises);
|
|
129
129
|
}
|
|
130
130
|
_setSession(session) {
|
|
131
|
-
|
|
131
|
+
import_eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);
|
|
132
132
|
this._session = session;
|
|
133
133
|
this.rawKeyboard.setSession(session);
|
|
134
134
|
this.rawMouse.setSession(session);
|
|
135
135
|
this._addSessionListeners();
|
|
136
136
|
this._workers.setSession(session);
|
|
137
137
|
}
|
|
138
|
-
|
|
139
138
|
// This method is called for provisional targets as well. The session passed as the parameter
|
|
140
139
|
// may be different from the current session and may be destroyed without becoming current.
|
|
141
140
|
async _initializeSession(session, provisional, resourceTreeHandler) {
|
|
142
|
-
await this._initializeSessionMayThrow(session, resourceTreeHandler).catch(e => {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (
|
|
146
|
-
|
|
147
|
-
// since we will reinitialize again.
|
|
148
|
-
if (this._session === session) throw e;
|
|
141
|
+
await this._initializeSessionMayThrow(session, resourceTreeHandler).catch((e) => {
|
|
142
|
+
if (provisional && session.isDisposed())
|
|
143
|
+
return;
|
|
144
|
+
if (this._session === session)
|
|
145
|
+
throw e;
|
|
149
146
|
});
|
|
150
147
|
}
|
|
151
148
|
async _initializeSessionMayThrow(session, resourceTreeHandler) {
|
|
152
149
|
const [, frameTree] = await Promise.all([
|
|
153
|
-
|
|
154
|
-
|
|
150
|
+
// Page agent must be enabled before Runtime.
|
|
151
|
+
session.send("Page.enable"),
|
|
152
|
+
session.send("Page.getResourceTree")
|
|
153
|
+
]);
|
|
155
154
|
resourceTreeHandler(frameTree);
|
|
156
155
|
const promises = [
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
name:
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
156
|
+
// Resource tree should be received before first execution context.
|
|
157
|
+
session.send("Runtime.enable"),
|
|
158
|
+
session.send("Page.createUserWorld", { name: UTILITY_WORLD_NAME }).catch((_) => {
|
|
159
|
+
}),
|
|
160
|
+
// Worlds are per-process
|
|
161
|
+
session.send("Console.enable"),
|
|
162
|
+
session.send("Network.enable"),
|
|
163
|
+
this._workers.initializeSession(session)
|
|
164
|
+
];
|
|
165
|
+
if (this._page.browserContext.needsPlaywrightBinding())
|
|
166
|
+
promises.push(session.send("Runtime.addBinding", { name: import_page.PageBinding.kBindingName }));
|
|
165
167
|
if (this._page.needsRequestInterception()) {
|
|
166
|
-
promises.push(session.send(
|
|
167
|
-
|
|
168
|
-
}));
|
|
169
|
-
promises.push(session.send('Network.setResourceCachingDisabled', {
|
|
170
|
-
disabled: true
|
|
171
|
-
}));
|
|
172
|
-
promises.push(session.send('Network.addInterception', {
|
|
173
|
-
url: '.*',
|
|
174
|
-
stage: 'request',
|
|
175
|
-
isRegex: true
|
|
176
|
-
}));
|
|
168
|
+
promises.push(session.send("Network.setInterceptionEnabled", { enabled: true }));
|
|
169
|
+
promises.push(session.send("Network.setResourceCachingDisabled", { disabled: true }));
|
|
170
|
+
promises.push(session.send("Network.addInterception", { url: ".*", stage: "request", isRegex: true }));
|
|
177
171
|
}
|
|
178
|
-
if (this._page.
|
|
172
|
+
if (this._page.browserContext.isSettingStorageState()) {
|
|
179
173
|
await Promise.all(promises);
|
|
180
174
|
return;
|
|
181
175
|
}
|
|
182
176
|
const contextOptions = this._browserContext._options;
|
|
183
|
-
if (contextOptions.userAgent)
|
|
177
|
+
if (contextOptions.userAgent)
|
|
178
|
+
promises.push(this.updateUserAgent());
|
|
184
179
|
const emulatedMedia = this._page.emulatedMedia();
|
|
185
|
-
if (emulatedMedia.media || emulatedMedia.colorScheme || emulatedMedia.reducedMotion || emulatedMedia.forcedColors || emulatedMedia.contrast)
|
|
180
|
+
if (emulatedMedia.media || emulatedMedia.colorScheme || emulatedMedia.reducedMotion || emulatedMedia.forcedColors || emulatedMedia.contrast)
|
|
181
|
+
promises.push(WKPage._setEmulateMedia(session, emulatedMedia.media, emulatedMedia.colorScheme, emulatedMedia.reducedMotion, emulatedMedia.forcedColors, emulatedMedia.contrast));
|
|
186
182
|
const bootstrapScript = this._calculateBootstrapScript();
|
|
187
|
-
if (bootstrapScript.length)
|
|
188
|
-
source: bootstrapScript
|
|
189
|
-
|
|
190
|
-
this._page.frames().map(frame => frame.evaluateExpression(bootstrapScript).catch(e => {}));
|
|
191
|
-
if (contextOptions.bypassCSP) promises.push(session.send('Page.setBypassCSP', {
|
|
192
|
-
enabled: true
|
|
183
|
+
if (bootstrapScript.length)
|
|
184
|
+
promises.push(session.send("Page.setBootstrapScript", { source: bootstrapScript }));
|
|
185
|
+
this._page.frames().map((frame) => frame.evaluateExpression(bootstrapScript).catch((e) => {
|
|
193
186
|
}));
|
|
187
|
+
if (contextOptions.bypassCSP)
|
|
188
|
+
promises.push(session.send("Page.setBypassCSP", { enabled: true }));
|
|
194
189
|
const emulatedSize = this._page.emulatedSize();
|
|
195
190
|
if (emulatedSize) {
|
|
196
|
-
promises.push(session.send(
|
|
191
|
+
promises.push(session.send("Page.setScreenSizeOverride", {
|
|
197
192
|
width: emulatedSize.screen.width,
|
|
198
193
|
height: emulatedSize.screen.height
|
|
199
194
|
}));
|
|
200
195
|
}
|
|
201
196
|
promises.push(this.updateEmulateMedia());
|
|
202
|
-
promises.push(session.send(
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}));
|
|
197
|
+
promises.push(session.send("Network.setExtraHTTPHeaders", { headers: (0, import_headers.headersArrayToObject)(
|
|
198
|
+
this._calculateExtraHTTPHeaders(),
|
|
199
|
+
false
|
|
200
|
+
/* lowerCase */
|
|
201
|
+
) }));
|
|
202
|
+
if (contextOptions.offline)
|
|
203
|
+
promises.push(session.send("Network.setEmulateOfflineState", { offline: true }));
|
|
204
|
+
promises.push(session.send("Page.setTouchEmulationEnabled", { enabled: !!contextOptions.hasTouch }));
|
|
211
205
|
if (contextOptions.timezoneId) {
|
|
212
|
-
promises.push(session.send(
|
|
213
|
-
timeZone: contextOptions.timezoneId
|
|
214
|
-
}).catch(e => {
|
|
206
|
+
promises.push(session.send("Page.setTimeZone", { timeZone: contextOptions.timezoneId }).catch((e) => {
|
|
215
207
|
throw new Error(`Invalid timezone ID: ${contextOptions.timezoneId}`);
|
|
216
208
|
}));
|
|
217
209
|
}
|
|
218
|
-
if (this._page.fileChooserIntercepted())
|
|
219
|
-
enabled: true
|
|
220
|
-
}));
|
|
221
|
-
promises.push(session.send(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
}));
|
|
225
|
-
promises.push(session.send(
|
|
226
|
-
|
|
227
|
-
value: !contextOptions.isMobile
|
|
228
|
-
}));
|
|
229
|
-
promises.push(session.send('Page.overrideSetting', {
|
|
230
|
-
setting: 'NotificationsEnabled',
|
|
231
|
-
value: !contextOptions.isMobile
|
|
232
|
-
}));
|
|
233
|
-
promises.push(session.send('Page.overrideSetting', {
|
|
234
|
-
setting: 'PointerLockEnabled',
|
|
235
|
-
value: !contextOptions.isMobile
|
|
236
|
-
}));
|
|
237
|
-
promises.push(session.send('Page.overrideSetting', {
|
|
238
|
-
setting: 'InputTypeMonthEnabled',
|
|
239
|
-
value: contextOptions.isMobile
|
|
240
|
-
}));
|
|
241
|
-
promises.push(session.send('Page.overrideSetting', {
|
|
242
|
-
setting: 'InputTypeWeekEnabled',
|
|
243
|
-
value: contextOptions.isMobile
|
|
244
|
-
}));
|
|
245
|
-
promises.push(session.send('Page.overrideSetting', {
|
|
246
|
-
setting: 'FixedBackgroundsPaintRelativeToDocument',
|
|
247
|
-
value: contextOptions.isMobile
|
|
248
|
-
}));
|
|
210
|
+
if (this._page.fileChooserIntercepted())
|
|
211
|
+
promises.push(session.send("Page.setInterceptFileChooserDialog", { enabled: true }));
|
|
212
|
+
promises.push(session.send("Page.overrideSetting", { setting: "DeviceOrientationEventEnabled", value: contextOptions.isMobile }));
|
|
213
|
+
promises.push(session.send("Page.overrideSetting", { setting: "FullScreenEnabled", value: !contextOptions.isMobile }));
|
|
214
|
+
promises.push(session.send("Page.overrideSetting", { setting: "NotificationsEnabled", value: !contextOptions.isMobile }));
|
|
215
|
+
promises.push(session.send("Page.overrideSetting", { setting: "PointerLockEnabled", value: !contextOptions.isMobile }));
|
|
216
|
+
promises.push(session.send("Page.overrideSetting", { setting: "InputTypeMonthEnabled", value: contextOptions.isMobile }));
|
|
217
|
+
promises.push(session.send("Page.overrideSetting", { setting: "InputTypeWeekEnabled", value: contextOptions.isMobile }));
|
|
218
|
+
promises.push(session.send("Page.overrideSetting", { setting: "FixedBackgroundsPaintRelativeToDocument", value: contextOptions.isMobile }));
|
|
249
219
|
await Promise.all(promises);
|
|
250
220
|
}
|
|
251
221
|
_onDidCommitProvisionalTarget(event) {
|
|
252
|
-
const {
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
(0, _utils.assert)(this._provisionalPage);
|
|
257
|
-
(0, _utils.assert)(this._provisionalPage._session.sessionId === newTargetId, 'Unknown new target: ' + newTargetId);
|
|
258
|
-
(0, _utils.assert)(this._session.sessionId === oldTargetId, 'Unknown old target: ' + oldTargetId);
|
|
222
|
+
const { oldTargetId, newTargetId } = event;
|
|
223
|
+
(0, import_utils.assert)(this._provisionalPage);
|
|
224
|
+
(0, import_utils.assert)(this._provisionalPage._session.sessionId === newTargetId, "Unknown new target: " + newTargetId);
|
|
225
|
+
(0, import_utils.assert)(this._session.sessionId === oldTargetId, "Unknown old target: " + oldTargetId);
|
|
259
226
|
const newSession = this._provisionalPage._session;
|
|
260
227
|
this._provisionalPage.commit();
|
|
261
228
|
this._provisionalPage.dispose();
|
|
@@ -263,10 +230,7 @@ class WKPage {
|
|
|
263
230
|
this._setSession(newSession);
|
|
264
231
|
}
|
|
265
232
|
_onTargetDestroyed(event) {
|
|
266
|
-
const {
|
|
267
|
-
targetId,
|
|
268
|
-
crashed
|
|
269
|
-
} = event;
|
|
233
|
+
const { targetId, crashed } = event;
|
|
270
234
|
if (this._provisionalPage && this._provisionalPage._session.sessionId === targetId) {
|
|
271
235
|
this._maybeCancelCoopNavigationRequest(this._provisionalPage);
|
|
272
236
|
this._provisionalPage._session.dispose();
|
|
@@ -274,7 +238,7 @@ class WKPage {
|
|
|
274
238
|
this._provisionalPage = null;
|
|
275
239
|
} else if (this._session.sessionId === targetId) {
|
|
276
240
|
this._session.dispose();
|
|
277
|
-
|
|
241
|
+
import_eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);
|
|
278
242
|
if (crashed) {
|
|
279
243
|
this._session.markAsCrashed();
|
|
280
244
|
this._page._didCrash();
|
|
@@ -283,15 +247,16 @@ class WKPage {
|
|
|
283
247
|
}
|
|
284
248
|
didClose() {
|
|
285
249
|
this._pageProxySession.dispose();
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
if (this._session)
|
|
250
|
+
import_eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);
|
|
251
|
+
import_eventsHelper.eventsHelper.removeEventListeners(this._eventListeners);
|
|
252
|
+
if (this._session)
|
|
253
|
+
this._session.dispose();
|
|
289
254
|
if (this._provisionalPage) {
|
|
290
255
|
this._provisionalPage._session.dispose();
|
|
291
256
|
this._provisionalPage.dispose();
|
|
292
257
|
this._provisionalPage = null;
|
|
293
258
|
}
|
|
294
|
-
this._firstNonInitialNavigationCommittedReject(new
|
|
259
|
+
this._firstNonInitialNavigationCommittedReject(new import_errors.TargetClosedError());
|
|
295
260
|
this._page._didClose();
|
|
296
261
|
}
|
|
297
262
|
dispatchMessageToSession(message) {
|
|
@@ -299,220 +264,229 @@ class WKPage {
|
|
|
299
264
|
}
|
|
300
265
|
handleProvisionalLoadFailed(event) {
|
|
301
266
|
if (!this._page.initializedOrUndefined()) {
|
|
302
|
-
this._firstNonInitialNavigationCommittedReject(new Error(
|
|
267
|
+
this._firstNonInitialNavigationCommittedReject(new Error("Initial load failed"));
|
|
303
268
|
return;
|
|
304
269
|
}
|
|
305
|
-
if (!this._provisionalPage)
|
|
270
|
+
if (!this._provisionalPage)
|
|
271
|
+
return;
|
|
306
272
|
let errorText = event.error;
|
|
307
|
-
if (errorText.includes(
|
|
308
|
-
|
|
273
|
+
if (errorText.includes("cancelled"))
|
|
274
|
+
errorText += "; maybe frame was detached?";
|
|
275
|
+
this._page.frameManager.frameAbortedNavigation(this._page.mainFrame()._id, errorText, event.loaderId);
|
|
309
276
|
}
|
|
310
277
|
handleWindowOpen(event) {
|
|
311
278
|
this._nextWindowOpenPopupFeatures = event.windowFeatures;
|
|
312
279
|
}
|
|
313
280
|
async _onTargetCreated(event) {
|
|
314
|
-
const {
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
const session = new _wkConnection.WKSession(this._pageProxySession.connection, targetInfo.targetId, message => {
|
|
318
|
-
this._pageProxySession.send('Target.sendMessageToTarget', {
|
|
281
|
+
const { targetInfo } = event;
|
|
282
|
+
const session = new import_wkConnection.WKSession(this._pageProxySession.connection, targetInfo.targetId, (message) => {
|
|
283
|
+
this._pageProxySession.send("Target.sendMessageToTarget", {
|
|
319
284
|
message: JSON.stringify(message),
|
|
320
285
|
targetId: targetInfo.targetId
|
|
321
|
-
}).catch(e => {
|
|
322
|
-
session.dispatchMessage({
|
|
323
|
-
id: message.id,
|
|
324
|
-
error: {
|
|
325
|
-
message: e.message
|
|
326
|
-
}
|
|
327
|
-
});
|
|
286
|
+
}).catch((e) => {
|
|
287
|
+
session.dispatchMessage({ id: message.id, error: { message: e.message } });
|
|
328
288
|
});
|
|
329
289
|
});
|
|
330
|
-
(0,
|
|
290
|
+
(0, import_utils.assert)(targetInfo.type === "page", "Only page targets are expected in WebKit, received: " + targetInfo.type);
|
|
331
291
|
if (!targetInfo.isProvisional) {
|
|
332
|
-
|
|
333
|
-
(0, _utils.assert)(!this._page.initializedOrUndefined());
|
|
292
|
+
(0, import_utils.assert)(!this._page.initializedOrUndefined());
|
|
334
293
|
let pageOrError;
|
|
335
294
|
try {
|
|
336
295
|
this._setSession(session);
|
|
337
|
-
await Promise.all([
|
|
338
|
-
|
|
339
|
-
|
|
296
|
+
await Promise.all([
|
|
297
|
+
this._initializePageProxySession(),
|
|
298
|
+
this._initializeSession(session, false, ({ frameTree }) => this._handleFrameTree(frameTree))
|
|
299
|
+
]);
|
|
340
300
|
pageOrError = this._page;
|
|
341
301
|
} catch (e) {
|
|
342
302
|
pageOrError = e;
|
|
343
303
|
}
|
|
344
|
-
if (targetInfo.isPaused)
|
|
345
|
-
targetId: targetInfo.targetId
|
|
346
|
-
|
|
347
|
-
if (pageOrError instanceof _page.Page && this._page.mainFrame().url() === '') {
|
|
304
|
+
if (targetInfo.isPaused)
|
|
305
|
+
this._pageProxySession.sendMayFail("Target.resume", { targetId: targetInfo.targetId });
|
|
306
|
+
if (pageOrError instanceof import_page.Page && this._page.mainFrame().url() === "") {
|
|
348
307
|
try {
|
|
349
|
-
// Initial empty page has an empty url. We should wait until the first real url has been loaded,
|
|
350
|
-
// even if that url is about:blank. This is especially important for popups, where we need the
|
|
351
|
-
// actual url before interacting with it.
|
|
352
308
|
await this._firstNonInitialNavigationCommittedPromise;
|
|
353
309
|
} catch (e) {
|
|
354
310
|
pageOrError = e;
|
|
355
311
|
}
|
|
356
312
|
} else {
|
|
357
|
-
|
|
358
|
-
|
|
313
|
+
this._firstNonInitialNavigationCommittedPromise.catch(() => {
|
|
314
|
+
});
|
|
359
315
|
}
|
|
360
|
-
this._page.reportAsNew(
|
|
316
|
+
this._page.reportAsNew(this._opener?._page, pageOrError instanceof import_page.Page ? void 0 : pageOrError);
|
|
361
317
|
} else {
|
|
362
|
-
(0,
|
|
363
|
-
(0,
|
|
364
|
-
this._provisionalPage = new
|
|
318
|
+
(0, import_utils.assert)(targetInfo.isProvisional);
|
|
319
|
+
(0, import_utils.assert)(!this._provisionalPage);
|
|
320
|
+
this._provisionalPage = new import_wkProvisionalPage.WKProvisionalPage(session, this);
|
|
365
321
|
if (targetInfo.isPaused) {
|
|
366
322
|
this._provisionalPage.initializationPromise.then(() => {
|
|
367
|
-
this._pageProxySession.sendMayFail(
|
|
368
|
-
targetId: targetInfo.targetId
|
|
369
|
-
});
|
|
323
|
+
this._pageProxySession.sendMayFail("Target.resume", { targetId: targetInfo.targetId });
|
|
370
324
|
});
|
|
371
325
|
}
|
|
372
326
|
}
|
|
373
327
|
}
|
|
374
328
|
_onDispatchMessageFromTarget(event) {
|
|
375
|
-
const {
|
|
376
|
-
|
|
377
|
-
message
|
|
378
|
-
|
|
379
|
-
|
|
329
|
+
const { targetId, message } = event;
|
|
330
|
+
if (this._provisionalPage && this._provisionalPage._session.sessionId === targetId)
|
|
331
|
+
this._provisionalPage._session.dispatchMessage(JSON.parse(message));
|
|
332
|
+
else if (this._session.sessionId === targetId)
|
|
333
|
+
this._session.dispatchMessage(JSON.parse(message));
|
|
334
|
+
else
|
|
335
|
+
throw new Error("Unknown target: " + targetId);
|
|
380
336
|
}
|
|
381
337
|
_addSessionListeners() {
|
|
382
|
-
this._sessionListeners = [
|
|
338
|
+
this._sessionListeners = [
|
|
339
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Page.frameNavigated", (event) => this._onFrameNavigated(event.frame, false)),
|
|
340
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Page.navigatedWithinDocument", (event) => this._onFrameNavigatedWithinDocument(event.frameId, event.url)),
|
|
341
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Page.frameAttached", (event) => this._onFrameAttached(event.frameId, event.parentFrameId)),
|
|
342
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Page.frameDetached", (event) => this._onFrameDetached(event.frameId)),
|
|
343
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Page.willCheckNavigationPolicy", (event) => this._onWillCheckNavigationPolicy(event.frameId)),
|
|
344
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Page.didCheckNavigationPolicy", (event) => this._onDidCheckNavigationPolicy(event.frameId, event.cancel)),
|
|
345
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Page.frameScheduledNavigation", (event) => this._onFrameScheduledNavigation(event.frameId, event.delay, event.targetIsCurrentFrame)),
|
|
346
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Page.loadEventFired", (event) => this._page.frameManager.frameLifecycleEvent(event.frameId, "load")),
|
|
347
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Page.domContentEventFired", (event) => this._page.frameManager.frameLifecycleEvent(event.frameId, "domcontentloaded")),
|
|
348
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Runtime.executionContextCreated", (event) => this._onExecutionContextCreated(event.context)),
|
|
349
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Runtime.bindingCalled", (event) => this._onBindingCalled(event.contextId, event.argument)),
|
|
350
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Console.messageAdded", (event) => this._onConsoleMessage(event)),
|
|
351
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Console.messageRepeatCountUpdated", (event) => this._onConsoleRepeatCountUpdated(event)),
|
|
352
|
+
import_eventsHelper.eventsHelper.addEventListener(this._pageProxySession, "Dialog.javascriptDialogOpening", (event) => this._onDialog(event)),
|
|
353
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Page.fileChooserOpened", (event) => this._onFileChooserOpened(event)),
|
|
354
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Network.requestWillBeSent", (e) => this._onRequestWillBeSent(this._session, e)),
|
|
355
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Network.requestIntercepted", (e) => this._onRequestIntercepted(this._session, e)),
|
|
356
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Network.responseReceived", (e) => this._onResponseReceived(this._session, e)),
|
|
357
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Network.loadingFinished", (e) => this._onLoadingFinished(e)),
|
|
358
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Network.loadingFailed", (e) => this._onLoadingFailed(this._session, e)),
|
|
359
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Network.webSocketCreated", (e) => this._page.frameManager.onWebSocketCreated(e.requestId, e.url)),
|
|
360
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Network.webSocketWillSendHandshakeRequest", (e) => this._page.frameManager.onWebSocketRequest(e.requestId)),
|
|
361
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Network.webSocketHandshakeResponseReceived", (e) => this._page.frameManager.onWebSocketResponse(e.requestId, e.response.status, e.response.statusText)),
|
|
362
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Network.webSocketFrameSent", (e) => e.response.payloadData && this._page.frameManager.onWebSocketFrameSent(e.requestId, e.response.opcode, e.response.payloadData)),
|
|
363
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Network.webSocketFrameReceived", (e) => e.response.payloadData && this._page.frameManager.webSocketFrameReceived(e.requestId, e.response.opcode, e.response.payloadData)),
|
|
364
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Network.webSocketClosed", (e) => this._page.frameManager.webSocketClosed(e.requestId)),
|
|
365
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Network.webSocketFrameError", (e) => this._page.frameManager.webSocketError(e.requestId, e.errorMessage))
|
|
366
|
+
];
|
|
383
367
|
}
|
|
384
368
|
async _updateState(method, params) {
|
|
385
|
-
await this._forAllSessions(session => session.send(method, params).then());
|
|
369
|
+
await this._forAllSessions((session) => session.send(method, params).then());
|
|
386
370
|
}
|
|
387
371
|
async _forAllSessions(callback) {
|
|
388
|
-
const sessions = [
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
if (this._provisionalPage)
|
|
392
|
-
|
|
372
|
+
const sessions = [
|
|
373
|
+
this._session
|
|
374
|
+
];
|
|
375
|
+
if (this._provisionalPage)
|
|
376
|
+
sessions.push(this._provisionalPage._session);
|
|
377
|
+
await Promise.all(sessions.map((session) => callback(session).catch((e) => {
|
|
378
|
+
})));
|
|
393
379
|
}
|
|
394
380
|
_onWillCheckNavigationPolicy(frameId) {
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
// - end up canceled, e.g. ctrl+click opening link in new tab, having no effect
|
|
399
|
-
// on this page
|
|
400
|
-
// - start new provisional load which we will miss in our signal trackers but
|
|
401
|
-
// we certainly won't hang waiting for it to finish and there is high chance
|
|
402
|
-
// that the current provisional page will commit navigation canceling the new
|
|
403
|
-
// one.
|
|
404
|
-
if (this._provisionalPage) return;
|
|
405
|
-
this._page._frameManager.frameRequestedNavigation(frameId);
|
|
381
|
+
if (this._provisionalPage)
|
|
382
|
+
return;
|
|
383
|
+
this._page.frameManager.frameRequestedNavigation(frameId);
|
|
406
384
|
}
|
|
407
385
|
_onDidCheckNavigationPolicy(frameId, cancel) {
|
|
408
|
-
if (!cancel)
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
this._page.
|
|
386
|
+
if (!cancel)
|
|
387
|
+
return;
|
|
388
|
+
if (this._provisionalPage)
|
|
389
|
+
return;
|
|
390
|
+
this._page.frameManager.frameAbortedNavigation(frameId, "Navigation canceled by policy check");
|
|
413
391
|
}
|
|
414
392
|
_onFrameScheduledNavigation(frameId, delay, targetIsCurrentFrame) {
|
|
415
|
-
if (targetIsCurrentFrame)
|
|
393
|
+
if (targetIsCurrentFrame)
|
|
394
|
+
this._page.frameManager.frameRequestedNavigation(frameId);
|
|
416
395
|
}
|
|
417
396
|
_handleFrameTree(frameTree) {
|
|
418
397
|
this._onFrameAttached(frameTree.frame.id, frameTree.frame.parentId || null);
|
|
419
398
|
this._onFrameNavigated(frameTree.frame, true);
|
|
420
|
-
this._page.
|
|
421
|
-
this._page.
|
|
422
|
-
if (!frameTree.childFrames)
|
|
423
|
-
|
|
399
|
+
this._page.frameManager.frameLifecycleEvent(frameTree.frame.id, "domcontentloaded");
|
|
400
|
+
this._page.frameManager.frameLifecycleEvent(frameTree.frame.id, "load");
|
|
401
|
+
if (!frameTree.childFrames)
|
|
402
|
+
return;
|
|
403
|
+
for (const child of frameTree.childFrames)
|
|
404
|
+
this._handleFrameTree(child);
|
|
424
405
|
}
|
|
425
406
|
_onFrameAttached(frameId, parentFrameId) {
|
|
426
|
-
return this._page.
|
|
407
|
+
return this._page.frameManager.frameAttached(frameId, parentFrameId);
|
|
427
408
|
}
|
|
428
409
|
_onFrameNavigated(framePayload, initial) {
|
|
429
|
-
const frame = this._page.
|
|
430
|
-
(0,
|
|
410
|
+
const frame = this._page.frameManager.frame(framePayload.id);
|
|
411
|
+
(0, import_utils.assert)(frame);
|
|
431
412
|
this._removeContextsForFrame(frame, true);
|
|
432
|
-
if (!framePayload.parentId)
|
|
433
|
-
|
|
434
|
-
|
|
413
|
+
if (!framePayload.parentId)
|
|
414
|
+
this._workers.clear();
|
|
415
|
+
this._page.frameManager.frameCommittedNewDocumentNavigation(framePayload.id, framePayload.url, framePayload.name || "", framePayload.loaderId, initial);
|
|
416
|
+
if (!initial)
|
|
417
|
+
this._firstNonInitialNavigationCommittedFulfill();
|
|
435
418
|
}
|
|
436
419
|
_onFrameNavigatedWithinDocument(frameId, url) {
|
|
437
|
-
this._page.
|
|
420
|
+
this._page.frameManager.frameCommittedSameDocumentNavigation(frameId, url);
|
|
438
421
|
}
|
|
439
422
|
_onFrameDetached(frameId) {
|
|
440
|
-
this._page.
|
|
423
|
+
this._page.frameManager.frameDetached(frameId);
|
|
441
424
|
}
|
|
442
425
|
_removeContextsForFrame(frame, notifyFrame) {
|
|
443
426
|
for (const [contextId, context] of this._contextIdToContext) {
|
|
444
427
|
if (context.frame === frame) {
|
|
445
428
|
this._contextIdToContext.delete(contextId);
|
|
446
|
-
if (notifyFrame)
|
|
429
|
+
if (notifyFrame)
|
|
430
|
+
frame._contextDestroyed(context);
|
|
447
431
|
}
|
|
448
432
|
}
|
|
449
433
|
}
|
|
450
434
|
_onExecutionContextCreated(contextPayload) {
|
|
451
|
-
if (this._contextIdToContext.has(contextPayload.id))
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
435
|
+
if (this._contextIdToContext.has(contextPayload.id))
|
|
436
|
+
return;
|
|
437
|
+
const frame = this._page.frameManager.frame(contextPayload.frameId);
|
|
438
|
+
if (!frame)
|
|
439
|
+
return;
|
|
440
|
+
const delegate = new import_wkExecutionContext.WKExecutionContext(this._session, contextPayload.id);
|
|
441
|
+
let worldName = null;
|
|
442
|
+
if (contextPayload.type === "normal")
|
|
443
|
+
worldName = "main";
|
|
444
|
+
else if (contextPayload.type === "user" && contextPayload.name === UTILITY_WORLD_NAME)
|
|
445
|
+
worldName = "utility";
|
|
457
446
|
const context = new dom.FrameExecutionContext(delegate, frame, worldName);
|
|
458
|
-
if (worldName)
|
|
447
|
+
if (worldName)
|
|
448
|
+
frame._contextCreated(worldName, context);
|
|
459
449
|
this._contextIdToContext.set(contextPayload.id, context);
|
|
460
450
|
}
|
|
461
451
|
async _onBindingCalled(contextId, argument) {
|
|
462
452
|
const pageOrError = await this._page.waitForInitializedOrError();
|
|
463
453
|
if (!(pageOrError instanceof Error)) {
|
|
464
454
|
const context = this._contextIdToContext.get(contextId);
|
|
465
|
-
if (context)
|
|
455
|
+
if (context)
|
|
456
|
+
await this._page.onBindingCalled(argument, context);
|
|
466
457
|
}
|
|
467
458
|
}
|
|
468
459
|
async navigateFrame(frame, url, referrer) {
|
|
469
|
-
if (this._pageProxySession.isDisposed())
|
|
460
|
+
if (this._pageProxySession.isDisposed())
|
|
461
|
+
throw new import_errors.TargetClosedError();
|
|
470
462
|
const pageProxyId = this._pageProxySession.sessionId;
|
|
471
|
-
const result = await this._pageProxySession.connection.browserSession.send(
|
|
472
|
-
|
|
473
|
-
pageProxyId,
|
|
474
|
-
frameId: frame._id,
|
|
475
|
-
referrer
|
|
476
|
-
});
|
|
477
|
-
return {
|
|
478
|
-
newDocumentId: result.loaderId
|
|
479
|
-
};
|
|
463
|
+
const result = await this._pageProxySession.connection.browserSession.send("Playwright.navigate", { url, pageProxyId, frameId: frame._id, referrer });
|
|
464
|
+
return { newDocumentId: result.loaderId };
|
|
480
465
|
}
|
|
481
466
|
_onConsoleMessage(event) {
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
type,
|
|
486
|
-
level,
|
|
487
|
-
text,
|
|
488
|
-
parameters,
|
|
489
|
-
url,
|
|
490
|
-
line: lineNumber,
|
|
491
|
-
column: columnNumber,
|
|
492
|
-
source
|
|
493
|
-
} = event.message;
|
|
494
|
-
if (level === 'error' && source === 'javascript') {
|
|
495
|
-
const {
|
|
496
|
-
name,
|
|
497
|
-
message
|
|
498
|
-
} = (0, _stackTrace.splitErrorMessage)(text);
|
|
467
|
+
const { type, level, text, parameters, url, line: lineNumber, column: columnNumber, source } = event.message;
|
|
468
|
+
if (level === "error" && source === "javascript") {
|
|
469
|
+
const { name, message } = (0, import_stackTrace.splitErrorMessage)(text);
|
|
499
470
|
let stack;
|
|
500
471
|
if (event.message.stackTrace) {
|
|
501
|
-
stack = text +
|
|
502
|
-
return ` at ${callFrame.functionName ||
|
|
503
|
-
}).join(
|
|
472
|
+
stack = text + "\n" + event.message.stackTrace.callFrames.map((callFrame) => {
|
|
473
|
+
return ` at ${callFrame.functionName || "unknown"} (${callFrame.url}:${callFrame.lineNumber}:${callFrame.columnNumber})`;
|
|
474
|
+
}).join("\n");
|
|
504
475
|
} else {
|
|
505
|
-
stack =
|
|
476
|
+
stack = "";
|
|
506
477
|
}
|
|
507
478
|
this._lastConsoleMessage = null;
|
|
508
479
|
const error = new Error(message);
|
|
509
480
|
error.stack = stack;
|
|
510
481
|
error.name = name;
|
|
511
|
-
this._page.emitOnContextOnceInitialized(
|
|
482
|
+
this._page.emitOnContextOnceInitialized(import_browserContext.BrowserContext.Events.PageError, error, this._page);
|
|
512
483
|
return;
|
|
513
484
|
}
|
|
514
|
-
let derivedType = type ||
|
|
515
|
-
if (type ===
|
|
485
|
+
let derivedType = type || "";
|
|
486
|
+
if (type === "log")
|
|
487
|
+
derivedType = level;
|
|
488
|
+
else if (type === "timing")
|
|
489
|
+
derivedType = "timeEnd";
|
|
516
490
|
const handles = [];
|
|
517
491
|
for (const p of parameters || []) {
|
|
518
492
|
let context;
|
|
@@ -520,11 +494,11 @@ class WKPage {
|
|
|
520
494
|
const objectId = JSON.parse(p.objectId);
|
|
521
495
|
context = this._contextIdToContext.get(objectId.injectedScriptId);
|
|
522
496
|
} else {
|
|
523
|
-
|
|
524
|
-
context = [...this._contextIdToContext.values()].find(c => c.frame === this._page.mainFrame());
|
|
497
|
+
context = [...this._contextIdToContext.values()].find((c) => c.frame === this._page.mainFrame());
|
|
525
498
|
}
|
|
526
|
-
if (!context)
|
|
527
|
-
|
|
499
|
+
if (!context)
|
|
500
|
+
return;
|
|
501
|
+
handles.push((0, import_wkExecutionContext.createHandle)(context, p));
|
|
528
502
|
}
|
|
529
503
|
this._lastConsoleMessage = {
|
|
530
504
|
derivedType,
|
|
@@ -532,14 +506,12 @@ class WKPage {
|
|
|
532
506
|
handles,
|
|
533
507
|
count: 0,
|
|
534
508
|
location: {
|
|
535
|
-
url: url ||
|
|
509
|
+
url: url || "",
|
|
536
510
|
lineNumber: (lineNumber || 1) - 1,
|
|
537
511
|
columnNumber: (columnNumber || 1) - 1
|
|
538
512
|
}
|
|
539
513
|
};
|
|
540
|
-
this._onConsoleRepeatCountUpdated({
|
|
541
|
-
count: 1
|
|
542
|
-
});
|
|
514
|
+
this._onConsoleRepeatCountUpdated({ count: 1 });
|
|
543
515
|
}
|
|
544
516
|
_onConsoleRepeatCountUpdated(event) {
|
|
545
517
|
if (this._lastConsoleMessage) {
|
|
@@ -550,109 +522,105 @@ class WKPage {
|
|
|
550
522
|
count,
|
|
551
523
|
location
|
|
552
524
|
} = this._lastConsoleMessage;
|
|
553
|
-
for (let i = count; i < event.count; ++i)
|
|
525
|
+
for (let i = count; i < event.count; ++i)
|
|
526
|
+
this._page.addConsoleMessage(derivedType, handles, location, handles.length ? void 0 : text);
|
|
554
527
|
this._lastConsoleMessage.count = event.count;
|
|
555
528
|
}
|
|
556
529
|
}
|
|
557
530
|
_onDialog(event) {
|
|
558
|
-
this._page.
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
531
|
+
this._page.browserContext.dialogManager.dialogDidOpen(new dialog.Dialog(
|
|
532
|
+
this._page,
|
|
533
|
+
event.type,
|
|
534
|
+
event.message,
|
|
535
|
+
async (accept, promptText) => {
|
|
536
|
+
if (event.type === "beforeunload" && !accept)
|
|
537
|
+
this._page.frameManager.frameAbortedNavigation(this._page.mainFrame()._id, "navigation cancelled by beforeunload dialog");
|
|
538
|
+
await this._pageProxySession.send("Dialog.handleJavaScriptDialog", { accept, promptText });
|
|
539
|
+
},
|
|
540
|
+
event.defaultPrompt
|
|
541
|
+
));
|
|
566
542
|
}
|
|
567
543
|
async _onFileChooserOpened(event) {
|
|
568
544
|
let handle;
|
|
569
545
|
try {
|
|
570
|
-
const context = await this._page.
|
|
571
|
-
handle = (0,
|
|
546
|
+
const context = await this._page.frameManager.frame(event.frameId)._mainContext();
|
|
547
|
+
handle = (0, import_wkExecutionContext.createHandle)(context, event.element).asElement();
|
|
572
548
|
} catch (e) {
|
|
573
|
-
// During async processing, frame/context may go away. We should not throw.
|
|
574
549
|
return;
|
|
575
550
|
}
|
|
576
551
|
await this._page._onFileChooserOpened(handle);
|
|
577
552
|
}
|
|
578
553
|
static async _setEmulateMedia(session, mediaType, colorScheme, reducedMotion, forcedColors, contrast) {
|
|
579
554
|
const promises = [];
|
|
580
|
-
promises.push(session.send(
|
|
581
|
-
|
|
582
|
-
}));
|
|
583
|
-
let appearance = undefined;
|
|
555
|
+
promises.push(session.send("Page.setEmulatedMedia", { media: mediaType === "no-override" ? "" : mediaType }));
|
|
556
|
+
let appearance = void 0;
|
|
584
557
|
switch (colorScheme) {
|
|
585
|
-
case
|
|
586
|
-
appearance =
|
|
558
|
+
case "light":
|
|
559
|
+
appearance = "Light";
|
|
587
560
|
break;
|
|
588
|
-
case
|
|
589
|
-
appearance =
|
|
561
|
+
case "dark":
|
|
562
|
+
appearance = "Dark";
|
|
590
563
|
break;
|
|
591
|
-
case
|
|
592
|
-
appearance =
|
|
564
|
+
case "no-override":
|
|
565
|
+
appearance = void 0;
|
|
593
566
|
break;
|
|
594
567
|
}
|
|
595
|
-
promises.push(session.send(
|
|
596
|
-
|
|
597
|
-
value: appearance
|
|
598
|
-
}));
|
|
599
|
-
let reducedMotionWk = undefined;
|
|
568
|
+
promises.push(session.send("Page.overrideUserPreference", { name: "PrefersColorScheme", value: appearance }));
|
|
569
|
+
let reducedMotionWk = void 0;
|
|
600
570
|
switch (reducedMotion) {
|
|
601
|
-
case
|
|
602
|
-
reducedMotionWk =
|
|
571
|
+
case "reduce":
|
|
572
|
+
reducedMotionWk = "Reduce";
|
|
603
573
|
break;
|
|
604
|
-
case
|
|
605
|
-
reducedMotionWk =
|
|
574
|
+
case "no-preference":
|
|
575
|
+
reducedMotionWk = "NoPreference";
|
|
606
576
|
break;
|
|
607
|
-
case
|
|
608
|
-
reducedMotionWk =
|
|
577
|
+
case "no-override":
|
|
578
|
+
reducedMotionWk = void 0;
|
|
609
579
|
break;
|
|
610
580
|
}
|
|
611
|
-
promises.push(session.send(
|
|
612
|
-
|
|
613
|
-
value: reducedMotionWk
|
|
614
|
-
}));
|
|
615
|
-
let forcedColorsWk = undefined;
|
|
581
|
+
promises.push(session.send("Page.overrideUserPreference", { name: "PrefersReducedMotion", value: reducedMotionWk }));
|
|
582
|
+
let forcedColorsWk = void 0;
|
|
616
583
|
switch (forcedColors) {
|
|
617
|
-
case
|
|
618
|
-
forcedColorsWk =
|
|
584
|
+
case "active":
|
|
585
|
+
forcedColorsWk = "Active";
|
|
619
586
|
break;
|
|
620
|
-
case
|
|
621
|
-
forcedColorsWk =
|
|
587
|
+
case "none":
|
|
588
|
+
forcedColorsWk = "None";
|
|
622
589
|
break;
|
|
623
|
-
case
|
|
624
|
-
forcedColorsWk =
|
|
590
|
+
case "no-override":
|
|
591
|
+
forcedColorsWk = void 0;
|
|
625
592
|
break;
|
|
626
593
|
}
|
|
627
|
-
promises.push(session.send(
|
|
628
|
-
|
|
629
|
-
}));
|
|
630
|
-
let contrastWk = undefined;
|
|
594
|
+
promises.push(session.send("Page.setForcedColors", { forcedColors: forcedColorsWk }));
|
|
595
|
+
let contrastWk = void 0;
|
|
631
596
|
switch (contrast) {
|
|
632
|
-
case
|
|
633
|
-
contrastWk =
|
|
597
|
+
case "more":
|
|
598
|
+
contrastWk = "More";
|
|
634
599
|
break;
|
|
635
|
-
case
|
|
636
|
-
contrastWk =
|
|
600
|
+
case "no-preference":
|
|
601
|
+
contrastWk = "NoPreference";
|
|
637
602
|
break;
|
|
638
|
-
case
|
|
639
|
-
contrastWk =
|
|
603
|
+
case "no-override":
|
|
604
|
+
contrastWk = void 0;
|
|
640
605
|
break;
|
|
641
606
|
}
|
|
642
|
-
promises.push(session.send(
|
|
643
|
-
name: 'PrefersContrast',
|
|
644
|
-
value: contrastWk
|
|
645
|
-
}));
|
|
607
|
+
promises.push(session.send("Page.overrideUserPreference", { name: "PrefersContrast", value: contrastWk }));
|
|
646
608
|
await Promise.all(promises);
|
|
647
609
|
}
|
|
648
610
|
async updateExtraHTTPHeaders() {
|
|
649
|
-
await this._updateState(
|
|
650
|
-
|
|
651
|
-
|
|
611
|
+
await this._updateState("Network.setExtraHTTPHeaders", { headers: (0, import_headers.headersArrayToObject)(
|
|
612
|
+
this._calculateExtraHTTPHeaders(),
|
|
613
|
+
false
|
|
614
|
+
/* lowerCase */
|
|
615
|
+
) });
|
|
652
616
|
}
|
|
653
617
|
_calculateExtraHTTPHeaders() {
|
|
654
618
|
const locale = this._browserContext._options.locale;
|
|
655
|
-
const headers = network.mergeHeaders([
|
|
619
|
+
const headers = network.mergeHeaders([
|
|
620
|
+
this._browserContext._options.extraHTTPHeaders,
|
|
621
|
+
this._page.extraHTTPHeaders(),
|
|
622
|
+
locale ? network.singleHeader("Accept-Language", locale) : void 0
|
|
623
|
+
]);
|
|
656
624
|
return headers;
|
|
657
625
|
}
|
|
658
626
|
async updateEmulateMedia() {
|
|
@@ -661,144 +629,145 @@ class WKPage {
|
|
|
661
629
|
const reducedMotion = emulatedMedia.reducedMotion;
|
|
662
630
|
const forcedColors = emulatedMedia.forcedColors;
|
|
663
631
|
const contrast = emulatedMedia.contrast;
|
|
664
|
-
await this._forAllSessions(session => WKPage._setEmulateMedia(session, emulatedMedia.media, colorScheme, reducedMotion, forcedColors, contrast));
|
|
632
|
+
await this._forAllSessions((session) => WKPage._setEmulateMedia(session, emulatedMedia.media, colorScheme, reducedMotion, forcedColors, contrast));
|
|
665
633
|
}
|
|
666
634
|
async updateEmulatedViewportSize() {
|
|
667
|
-
this._browserContext._validateEmulatedViewport(this._page.
|
|
635
|
+
this._browserContext._validateEmulatedViewport(this._page.emulatedSize()?.viewport);
|
|
668
636
|
await this._updateViewport();
|
|
669
637
|
}
|
|
670
638
|
async updateUserAgent() {
|
|
671
639
|
const contextOptions = this._browserContext._options;
|
|
672
|
-
this._updateState(
|
|
673
|
-
value: contextOptions.userAgent
|
|
674
|
-
});
|
|
640
|
+
this._updateState("Page.overrideUserAgent", { value: contextOptions.userAgent });
|
|
675
641
|
}
|
|
676
642
|
async bringToFront() {
|
|
677
|
-
this._pageProxySession.send(
|
|
643
|
+
this._pageProxySession.send("Target.activate", {
|
|
678
644
|
targetId: this._session.sessionId
|
|
679
645
|
});
|
|
680
646
|
}
|
|
681
647
|
async _updateViewport() {
|
|
682
648
|
const options = this._browserContext._options;
|
|
683
|
-
const
|
|
684
|
-
if (
|
|
685
|
-
|
|
686
|
-
const
|
|
687
|
-
const
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
649
|
+
const emulatedSize = this._page.emulatedSize();
|
|
650
|
+
if (!emulatedSize)
|
|
651
|
+
return;
|
|
652
|
+
const viewportSize = emulatedSize.viewport;
|
|
653
|
+
const screenSize = emulatedSize.screen;
|
|
654
|
+
const promises = [
|
|
655
|
+
this._pageProxySession.send("Emulation.setDeviceMetricsOverride", {
|
|
656
|
+
width: viewportSize.width,
|
|
657
|
+
height: viewportSize.height,
|
|
658
|
+
fixedLayout: !!options.isMobile,
|
|
659
|
+
deviceScaleFactor: options.deviceScaleFactor || 1
|
|
660
|
+
}),
|
|
661
|
+
this._session.send("Page.setScreenSizeOverride", {
|
|
662
|
+
width: screenSize.width,
|
|
663
|
+
height: screenSize.height
|
|
664
|
+
})
|
|
665
|
+
];
|
|
696
666
|
if (options.isMobile) {
|
|
697
667
|
const angle = viewportSize.width > viewportSize.height ? 90 : 0;
|
|
698
|
-
promises.push(this._pageProxySession.send(
|
|
699
|
-
angle
|
|
700
|
-
}));
|
|
668
|
+
promises.push(this._pageProxySession.send("Emulation.setOrientationOverride", { angle }));
|
|
701
669
|
}
|
|
702
670
|
await Promise.all(promises);
|
|
703
671
|
}
|
|
704
672
|
async updateRequestInterception() {
|
|
705
673
|
const enabled = this._page.needsRequestInterception();
|
|
706
|
-
await Promise.all([
|
|
707
|
-
enabled
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
url: '.*',
|
|
712
|
-
stage: 'request',
|
|
713
|
-
isRegex: true
|
|
714
|
-
})]);
|
|
674
|
+
await Promise.all([
|
|
675
|
+
this._updateState("Network.setInterceptionEnabled", { enabled }),
|
|
676
|
+
this._updateState("Network.setResourceCachingDisabled", { disabled: enabled }),
|
|
677
|
+
this._updateState("Network.addInterception", { url: ".*", stage: "request", isRegex: true })
|
|
678
|
+
]);
|
|
715
679
|
}
|
|
716
680
|
async updateOffline() {
|
|
717
|
-
await this._updateState(
|
|
718
|
-
offline: !!this._browserContext._options.offline
|
|
719
|
-
});
|
|
681
|
+
await this._updateState("Network.setEmulateOfflineState", { offline: !!this._browserContext._options.offline });
|
|
720
682
|
}
|
|
721
683
|
async updateHttpCredentials() {
|
|
722
|
-
const credentials = this._browserContext._options.httpCredentials || {
|
|
723
|
-
|
|
724
|
-
password: '',
|
|
725
|
-
origin: ''
|
|
726
|
-
};
|
|
727
|
-
await this._pageProxySession.send('Emulation.setAuthCredentials', {
|
|
728
|
-
username: credentials.username,
|
|
729
|
-
password: credentials.password,
|
|
730
|
-
origin: credentials.origin
|
|
731
|
-
});
|
|
684
|
+
const credentials = this._browserContext._options.httpCredentials || { username: "", password: "", origin: "" };
|
|
685
|
+
await this._pageProxySession.send("Emulation.setAuthCredentials", { username: credentials.username, password: credentials.password, origin: credentials.origin });
|
|
732
686
|
}
|
|
733
687
|
async updateFileChooserInterception() {
|
|
734
688
|
const enabled = this._page.fileChooserIntercepted();
|
|
735
|
-
await this._session.send(
|
|
736
|
-
|
|
737
|
-
}).catch(() => {}); // target can be closed.
|
|
689
|
+
await this._session.send("Page.setInterceptFileChooserDialog", { enabled }).catch(() => {
|
|
690
|
+
});
|
|
738
691
|
}
|
|
739
692
|
async reload() {
|
|
740
|
-
await this._session.send(
|
|
693
|
+
await this._session.send("Page.reload");
|
|
741
694
|
}
|
|
742
695
|
goBack() {
|
|
743
|
-
return this._session.send(
|
|
744
|
-
if (error instanceof Error && error.message.includes(`Protocol error (Page.goBack): Failed to go`))
|
|
696
|
+
return this._session.send("Page.goBack").then(() => true).catch((error) => {
|
|
697
|
+
if (error instanceof Error && error.message.includes(`Protocol error (Page.goBack): Failed to go`))
|
|
698
|
+
return false;
|
|
745
699
|
throw error;
|
|
746
700
|
});
|
|
747
701
|
}
|
|
748
702
|
goForward() {
|
|
749
|
-
return this._session.send(
|
|
750
|
-
if (error instanceof Error && error.message.includes(`Protocol error (Page.goForward): Failed to go`))
|
|
703
|
+
return this._session.send("Page.goForward").then(() => true).catch((error) => {
|
|
704
|
+
if (error instanceof Error && error.message.includes(`Protocol error (Page.goForward): Failed to go`))
|
|
705
|
+
return false;
|
|
751
706
|
throw error;
|
|
752
707
|
});
|
|
753
708
|
}
|
|
754
709
|
async requestGC() {
|
|
755
|
-
await this._session.send(
|
|
710
|
+
await this._session.send("Heap.gc");
|
|
756
711
|
}
|
|
757
712
|
async addInitScript(initScript) {
|
|
758
713
|
await this._updateBootstrapScript();
|
|
759
714
|
}
|
|
760
|
-
async
|
|
715
|
+
async removeInitScripts(initScripts) {
|
|
761
716
|
await this._updateBootstrapScript();
|
|
762
717
|
}
|
|
718
|
+
async exposePlaywrightBinding() {
|
|
719
|
+
await this._updateState("Runtime.addBinding", { name: import_page.PageBinding.kBindingName });
|
|
720
|
+
}
|
|
763
721
|
_calculateBootstrapScript() {
|
|
764
722
|
const scripts = [];
|
|
765
|
-
if (!this._page.
|
|
766
|
-
scripts.push(
|
|
767
|
-
scripts.push(
|
|
768
|
-
scripts.push(
|
|
723
|
+
if (!this._page.browserContext._options.isMobile) {
|
|
724
|
+
scripts.push("delete window.orientation");
|
|
725
|
+
scripts.push("delete window.ondevicemotion");
|
|
726
|
+
scripts.push("delete window.ondeviceorientation");
|
|
769
727
|
}
|
|
770
728
|
scripts.push('if (!window.safari) window.safari = { pushNotification: { toString() { return "[object SafariRemoteNotification]"; } } };');
|
|
771
|
-
scripts.push(
|
|
772
|
-
scripts.push(
|
|
773
|
-
|
|
729
|
+
scripts.push("if (!window.GestureEvent) window.GestureEvent = function GestureEvent() {};");
|
|
730
|
+
scripts.push(this._publicKeyCredentialScript());
|
|
731
|
+
scripts.push(...this._page.allInitScripts().map((script) => script.source));
|
|
732
|
+
return scripts.join(";\n");
|
|
733
|
+
}
|
|
734
|
+
_publicKeyCredentialScript() {
|
|
735
|
+
function polyfill() {
|
|
736
|
+
window.PublicKeyCredential ??= {
|
|
737
|
+
async getClientCapabilities() {
|
|
738
|
+
return {};
|
|
739
|
+
},
|
|
740
|
+
async isConditionalMediationAvailable() {
|
|
741
|
+
return false;
|
|
742
|
+
},
|
|
743
|
+
async isUserVerifyingPlatformAuthenticatorAvailable() {
|
|
744
|
+
return false;
|
|
745
|
+
}
|
|
746
|
+
};
|
|
747
|
+
}
|
|
748
|
+
return `(${polyfill.toString()})();`;
|
|
774
749
|
}
|
|
775
750
|
async _updateBootstrapScript() {
|
|
776
|
-
await this._updateState(
|
|
777
|
-
source: this._calculateBootstrapScript()
|
|
778
|
-
});
|
|
751
|
+
await this._updateState("Page.setBootstrapScript", { source: this._calculateBootstrapScript() });
|
|
779
752
|
}
|
|
780
753
|
async closePage(runBeforeUnload) {
|
|
781
754
|
await this._stopVideo();
|
|
782
|
-
await this._pageProxySession.sendMayFail(
|
|
755
|
+
await this._pageProxySession.sendMayFail("Target.close", {
|
|
783
756
|
targetId: this._session.sessionId,
|
|
784
757
|
runBeforeUnload
|
|
785
758
|
});
|
|
786
759
|
}
|
|
787
760
|
async setBackgroundColor(color) {
|
|
788
|
-
await this._session.send(
|
|
789
|
-
color
|
|
790
|
-
});
|
|
761
|
+
await this._session.send("Page.setDefaultBackgroundColorOverride", { color });
|
|
791
762
|
}
|
|
792
763
|
_toolbarHeight() {
|
|
793
|
-
|
|
794
|
-
|
|
764
|
+
if (this._page.browserContext._browser?.options.headful)
|
|
765
|
+
return import_hostPlatform.hostPlatform === "mac10.15" ? 55 : 59;
|
|
795
766
|
return 0;
|
|
796
767
|
}
|
|
797
768
|
async _startVideo(options) {
|
|
798
|
-
(0,
|
|
799
|
-
const {
|
|
800
|
-
screencastId
|
|
801
|
-
} = await this._pageProxySession.send('Screencast.startVideo', {
|
|
769
|
+
(0, import_utils.assert)(!this._recordingVideoFile);
|
|
770
|
+
const { screencastId } = await this._pageProxySession.send("Screencast.startVideo", {
|
|
802
771
|
file: options.outputFile,
|
|
803
772
|
width: options.width,
|
|
804
773
|
height: options.height,
|
|
@@ -808,49 +777,51 @@ class WKPage {
|
|
|
808
777
|
this._browserContext._browser._videoStarted(this._browserContext, screencastId, options.outputFile, this._page.waitForInitializedOrError());
|
|
809
778
|
}
|
|
810
779
|
async _stopVideo() {
|
|
811
|
-
if (!this._recordingVideoFile)
|
|
812
|
-
|
|
780
|
+
if (!this._recordingVideoFile)
|
|
781
|
+
return;
|
|
782
|
+
await this._pageProxySession.sendMayFail("Screencast.stopVideo");
|
|
813
783
|
this._recordingVideoFile = null;
|
|
814
784
|
}
|
|
815
785
|
validateScreenshotDimension(side, omitDeviceScaleFactor) {
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
if (
|
|
819
|
-
|
|
820
|
-
if (side > 32767)
|
|
786
|
+
if (process.platform === "darwin")
|
|
787
|
+
return;
|
|
788
|
+
if (!omitDeviceScaleFactor && this._page.browserContext._options.deviceScaleFactor)
|
|
789
|
+
side = Math.ceil(side * this._page.browserContext._options.deviceScaleFactor);
|
|
790
|
+
if (side > 32767)
|
|
791
|
+
throw new Error("Cannot take screenshot larger than 32767 pixels on any dimension");
|
|
821
792
|
}
|
|
822
793
|
async takeScreenshot(progress, format, documentRect, viewportRect, quality, fitsViewport, scale) {
|
|
823
794
|
const rect = documentRect || viewportRect;
|
|
824
|
-
const omitDeviceScaleFactor = scale ===
|
|
795
|
+
const omitDeviceScaleFactor = scale === "css";
|
|
825
796
|
this.validateScreenshotDimension(rect.width, omitDeviceScaleFactor);
|
|
826
797
|
this.validateScreenshotDimension(rect.height, omitDeviceScaleFactor);
|
|
827
|
-
const result = await this._session.send(
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
const prefix = 'data:image/png;base64,';
|
|
833
|
-
let buffer = Buffer.from(result.dataURL.substr(prefix.length), 'base64');
|
|
834
|
-
if (format === 'jpeg') buffer = _utilsBundle.jpegjs.encode(_utilsBundle.PNG.sync.read(buffer), quality).data;
|
|
798
|
+
const result = await progress.race(this._session.send("Page.snapshotRect", { ...rect, coordinateSystem: documentRect ? "Page" : "Viewport", omitDeviceScaleFactor }));
|
|
799
|
+
const prefix = "data:image/png;base64,";
|
|
800
|
+
let buffer = Buffer.from(result.dataURL.substr(prefix.length), "base64");
|
|
801
|
+
if (format === "jpeg")
|
|
802
|
+
buffer = import_utilsBundle.jpegjs.encode(import_utilsBundle.PNG.sync.read(buffer), quality).data;
|
|
835
803
|
return buffer;
|
|
836
804
|
}
|
|
837
805
|
async getContentFrame(handle) {
|
|
838
|
-
const nodeInfo = await this._session.send(
|
|
806
|
+
const nodeInfo = await this._session.send("DOM.describeNode", {
|
|
839
807
|
objectId: handle._objectId
|
|
840
808
|
});
|
|
841
|
-
if (!nodeInfo.contentFrameId)
|
|
842
|
-
|
|
809
|
+
if (!nodeInfo.contentFrameId)
|
|
810
|
+
return null;
|
|
811
|
+
return this._page.frameManager.frame(nodeInfo.contentFrameId);
|
|
843
812
|
}
|
|
844
813
|
async getOwnerFrame(handle) {
|
|
845
|
-
if (!handle._objectId)
|
|
846
|
-
|
|
814
|
+
if (!handle._objectId)
|
|
815
|
+
return null;
|
|
816
|
+
const nodeInfo = await this._session.send("DOM.describeNode", {
|
|
847
817
|
objectId: handle._objectId
|
|
848
818
|
});
|
|
849
819
|
return nodeInfo.ownerFrameId || null;
|
|
850
820
|
}
|
|
851
821
|
async getBoundingBox(handle) {
|
|
852
822
|
const quads = await this.getContentQuads(handle);
|
|
853
|
-
if (!quads || !quads.length)
|
|
823
|
+
if (!quads || !quads.length)
|
|
824
|
+
return null;
|
|
854
825
|
let minX = Infinity;
|
|
855
826
|
let maxX = -Infinity;
|
|
856
827
|
let minY = Infinity;
|
|
@@ -863,141 +834,101 @@ class WKPage {
|
|
|
863
834
|
maxY = Math.max(maxY, point.y);
|
|
864
835
|
}
|
|
865
836
|
}
|
|
866
|
-
return {
|
|
867
|
-
x: minX,
|
|
868
|
-
y: minY,
|
|
869
|
-
width: maxX - minX,
|
|
870
|
-
height: maxY - minY
|
|
871
|
-
};
|
|
837
|
+
return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
|
|
872
838
|
}
|
|
873
839
|
async scrollRectIntoViewIfNeeded(handle, rect) {
|
|
874
|
-
return await this._session.send(
|
|
840
|
+
return await this._session.send("DOM.scrollIntoViewIfNeeded", {
|
|
875
841
|
objectId: handle._objectId,
|
|
876
842
|
rect
|
|
877
|
-
}).then(() =>
|
|
878
|
-
if (e instanceof Error && e.message.includes(
|
|
879
|
-
|
|
843
|
+
}).then(() => "done").catch((e) => {
|
|
844
|
+
if (e instanceof Error && e.message.includes("Node does not have a layout object"))
|
|
845
|
+
return "error:notvisible";
|
|
846
|
+
if (e instanceof Error && e.message.includes("Node is detached from document"))
|
|
847
|
+
return "error:notconnected";
|
|
880
848
|
throw e;
|
|
881
849
|
});
|
|
882
850
|
}
|
|
883
851
|
async setScreencastOptions(options) {
|
|
884
852
|
if (options) {
|
|
885
|
-
const so = {
|
|
886
|
-
|
|
887
|
-
toolbarHeight: this._toolbarHeight()
|
|
888
|
-
};
|
|
889
|
-
const {
|
|
890
|
-
generation
|
|
891
|
-
} = await this._pageProxySession.send('Screencast.startScreencast', so);
|
|
853
|
+
const so = { ...options, toolbarHeight: this._toolbarHeight() };
|
|
854
|
+
const { generation } = await this._pageProxySession.send("Screencast.startScreencast", so);
|
|
892
855
|
this._screencastGeneration = generation;
|
|
893
856
|
} else {
|
|
894
|
-
await this._pageProxySession.send(
|
|
857
|
+
await this._pageProxySession.send("Screencast.stopScreencast");
|
|
895
858
|
}
|
|
896
859
|
}
|
|
897
860
|
_onScreencastFrame(event) {
|
|
898
861
|
const generation = this._screencastGeneration;
|
|
899
862
|
this._page.throttleScreencastFrameAck(() => {
|
|
900
|
-
this._pageProxySession.send(
|
|
901
|
-
generation
|
|
902
|
-
}).catch(e => _debugLogger.debugLogger.log('error', e));
|
|
863
|
+
this._pageProxySession.send("Screencast.screencastFrameAck", { generation }).catch((e) => import_debugLogger.debugLogger.log("error", e));
|
|
903
864
|
});
|
|
904
|
-
const buffer = Buffer.from(event.data,
|
|
905
|
-
this._page.emit(
|
|
865
|
+
const buffer = Buffer.from(event.data, "base64");
|
|
866
|
+
this._page.emit(import_page.Page.Events.ScreencastFrame, {
|
|
906
867
|
buffer,
|
|
907
868
|
width: event.deviceWidth,
|
|
908
869
|
height: event.deviceHeight
|
|
909
870
|
});
|
|
910
871
|
}
|
|
911
872
|
rafCountForStablePosition() {
|
|
912
|
-
return process.platform ===
|
|
873
|
+
return process.platform === "win32" ? 5 : 1;
|
|
913
874
|
}
|
|
914
875
|
async getContentQuads(handle) {
|
|
915
|
-
const result = await this._session.sendMayFail(
|
|
876
|
+
const result = await this._session.sendMayFail("DOM.getContentQuads", {
|
|
916
877
|
objectId: handle._objectId
|
|
917
878
|
});
|
|
918
|
-
if (!result)
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
y: quad[1]
|
|
922
|
-
|
|
923
|
-
x: quad[
|
|
924
|
-
y: quad[
|
|
925
|
-
|
|
926
|
-
x: quad[4],
|
|
927
|
-
y: quad[5]
|
|
928
|
-
}, {
|
|
929
|
-
x: quad[6],
|
|
930
|
-
y: quad[7]
|
|
931
|
-
}]);
|
|
879
|
+
if (!result)
|
|
880
|
+
return null;
|
|
881
|
+
return result.quads.map((quad) => [
|
|
882
|
+
{ x: quad[0], y: quad[1] },
|
|
883
|
+
{ x: quad[2], y: quad[3] },
|
|
884
|
+
{ x: quad[4], y: quad[5] },
|
|
885
|
+
{ x: quad[6], y: quad[7] }
|
|
886
|
+
]);
|
|
932
887
|
}
|
|
933
888
|
async setInputFilePaths(handle, paths) {
|
|
934
889
|
const pageProxyId = this._pageProxySession.sessionId;
|
|
935
890
|
const objectId = handle._objectId;
|
|
936
|
-
await Promise.all([
|
|
937
|
-
pageProxyId,
|
|
938
|
-
paths
|
|
939
|
-
|
|
940
|
-
objectId,
|
|
941
|
-
paths
|
|
942
|
-
})]);
|
|
891
|
+
await Promise.all([
|
|
892
|
+
this._pageProxySession.connection.browserSession.send("Playwright.grantFileReadAccess", { pageProxyId, paths }),
|
|
893
|
+
this._session.send("DOM.setInputFiles", { objectId, paths })
|
|
894
|
+
]);
|
|
943
895
|
}
|
|
944
896
|
async adoptElementHandle(handle, to) {
|
|
945
|
-
const result = await this._session.sendMayFail(
|
|
897
|
+
const result = await this._session.sendMayFail("DOM.resolveNode", {
|
|
946
898
|
objectId: handle._objectId,
|
|
947
899
|
executionContextId: to.delegate._contextId
|
|
948
900
|
});
|
|
949
|
-
if (!result || result.object.subtype ===
|
|
950
|
-
|
|
901
|
+
if (!result || result.object.subtype === "null")
|
|
902
|
+
throw new Error(dom.kUnableToAdoptErrorMessage);
|
|
903
|
+
return (0, import_wkExecutionContext.createHandle)(to, result.object);
|
|
951
904
|
}
|
|
952
905
|
async getAccessibilityTree(needle) {
|
|
953
|
-
return (0,
|
|
906
|
+
return (0, import_wkAccessibility.getAccessibilityTree)(this._session, needle);
|
|
907
|
+
}
|
|
908
|
+
async inputActionEpilogue() {
|
|
909
|
+
}
|
|
910
|
+
async resetForReuse(progress) {
|
|
954
911
|
}
|
|
955
|
-
async inputActionEpilogue() {}
|
|
956
|
-
async resetForReuse() {}
|
|
957
912
|
async getFrameElement(frame) {
|
|
958
913
|
const parent = frame.parentFrame();
|
|
959
|
-
if (!parent)
|
|
914
|
+
if (!parent)
|
|
915
|
+
throw new Error("Frame has been detached.");
|
|
960
916
|
const context = await parent._mainContext();
|
|
961
|
-
const result = await this._session.send(
|
|
917
|
+
const result = await this._session.send("DOM.resolveNode", {
|
|
962
918
|
frameId: frame._id,
|
|
963
919
|
executionContextId: context.delegate._contextId
|
|
964
920
|
});
|
|
965
|
-
if (!result || result.object.subtype ===
|
|
966
|
-
|
|
921
|
+
if (!result || result.object.subtype === "null")
|
|
922
|
+
throw new Error("Frame has been detached.");
|
|
923
|
+
return (0, import_wkExecutionContext.createHandle)(context, result.object);
|
|
967
924
|
}
|
|
968
925
|
_maybeCancelCoopNavigationRequest(provisionalPage) {
|
|
969
926
|
const navigationRequest = provisionalPage.coopNavigationRequest();
|
|
970
927
|
for (const [requestId, request] of this._requestIdToRequest) {
|
|
971
928
|
if (request.request === navigationRequest) {
|
|
972
|
-
// Make sure the request completes if the provisional navigation is canceled.
|
|
973
929
|
this._onLoadingFailed(provisionalPage._session, {
|
|
974
|
-
requestId
|
|
975
|
-
errorText:
|
|
976
|
-
timestamp: request._timestamp,
|
|
977
|
-
canceled: true
|
|
978
|
-
});
|
|
979
|
-
return;
|
|
980
|
-
}
|
|
981
|
-
}
|
|
982
|
-
}
|
|
983
|
-
_adoptRequestFromNewProcess(navigationRequest, newSession, newRequestId) {
|
|
984
|
-
for (const [requestId, request] of this._requestIdToRequest) {
|
|
985
|
-
if (request.request === navigationRequest) {
|
|
986
|
-
this._requestIdToRequest.delete(requestId);
|
|
987
|
-
request.adoptRequestFromNewProcess(newSession, newRequestId);
|
|
988
|
-
this._requestIdToRequest.set(newRequestId, request);
|
|
989
|
-
return;
|
|
990
|
-
}
|
|
991
|
-
}
|
|
992
|
-
}
|
|
993
|
-
_maybeCancelCoopNavigationRequest(provisionalPage) {
|
|
994
|
-
const navigationRequest = provisionalPage.coopNavigationRequest();
|
|
995
|
-
for (const [requestId, request] of this._requestIdToRequest) {
|
|
996
|
-
if (request.request === navigationRequest) {
|
|
997
|
-
// Make sure the request completes if the provisional navigation is canceled.
|
|
998
|
-
this._onLoadingFailed(provisionalPage._session, {
|
|
999
|
-
requestId: requestId,
|
|
1000
|
-
errorText: 'Provisiolal navigation canceled.',
|
|
930
|
+
requestId,
|
|
931
|
+
errorText: "Provisiolal navigation canceled.",
|
|
1001
932
|
timestamp: request._timestamp,
|
|
1002
933
|
canceled: true
|
|
1003
934
|
});
|
|
@@ -1016,39 +947,37 @@ class WKPage {
|
|
|
1016
947
|
}
|
|
1017
948
|
}
|
|
1018
949
|
_onRequestWillBeSent(session, event) {
|
|
1019
|
-
if (event.request.url.startsWith(
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
950
|
+
if (event.request.url.startsWith("data:"))
|
|
951
|
+
return;
|
|
952
|
+
if (event.request.url.startsWith("about:"))
|
|
953
|
+
return;
|
|
954
|
+
if (this._page.needsRequestInterception() && !event.redirectResponse)
|
|
955
|
+
this._requestIdToRequestWillBeSentEvent.set(event.requestId, event);
|
|
956
|
+
else
|
|
957
|
+
this._onRequest(session, event, false);
|
|
1023
958
|
}
|
|
1024
959
|
_onRequest(session, event, intercepted) {
|
|
1025
960
|
let redirectedFrom = null;
|
|
1026
961
|
if (event.redirectResponse) {
|
|
1027
|
-
const
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
redirectedFrom = request;
|
|
962
|
+
const request2 = this._requestIdToRequest.get(event.requestId);
|
|
963
|
+
if (request2) {
|
|
964
|
+
this._handleRequestRedirect(request2, event.requestId, event.redirectResponse, event.timestamp);
|
|
965
|
+
redirectedFrom = request2;
|
|
1032
966
|
}
|
|
1033
967
|
}
|
|
1034
|
-
const frame = redirectedFrom ? redirectedFrom.request.frame() : this._page.
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
const isNavigationRequest = event.type === 'Document';
|
|
1041
|
-
const documentId = isNavigationRequest ? event.loaderId : undefined;
|
|
1042
|
-
const request = new _wkInterceptableRequest.WKInterceptableRequest(session, frame, event, redirectedFrom, documentId);
|
|
968
|
+
const frame = redirectedFrom ? redirectedFrom.request.frame() : this._page.frameManager.frame(event.frameId);
|
|
969
|
+
if (!frame)
|
|
970
|
+
return;
|
|
971
|
+
const isNavigationRequest = event.type === "Document";
|
|
972
|
+
const documentId = isNavigationRequest ? event.loaderId : void 0;
|
|
973
|
+
const request = new import_wkInterceptableRequest.WKInterceptableRequest(session, frame, event, redirectedFrom, documentId);
|
|
1043
974
|
let route;
|
|
1044
975
|
if (intercepted) {
|
|
1045
|
-
route = new
|
|
1046
|
-
// There is no point in waiting for the raw headers in Network.responseReceived when intercepting.
|
|
1047
|
-
// Use provisional headers as raw headers, so that client can call allHeaders() from the route handler.
|
|
976
|
+
route = new import_wkInterceptableRequest.WKRouteImpl(session, event.requestId);
|
|
1048
977
|
request.request.setRawRequestHeaders(null);
|
|
1049
978
|
}
|
|
1050
979
|
this._requestIdToRequest.set(event.requestId, request);
|
|
1051
|
-
this._page.
|
|
980
|
+
this._page.frameManager.requestStarted(request.request, route);
|
|
1052
981
|
}
|
|
1053
982
|
_handleRequestRedirect(request, requestId, responsePayload, timestamp) {
|
|
1054
983
|
const response = request.createResponse(responsePayload);
|
|
@@ -1056,19 +985,15 @@ class WKPage {
|
|
|
1056
985
|
response._serverAddrFinished();
|
|
1057
986
|
response.setResponseHeadersSize(null);
|
|
1058
987
|
response.setEncodedBodySize(null);
|
|
1059
|
-
response._requestFinished(responsePayload.timing ?
|
|
988
|
+
response._requestFinished(responsePayload.timing ? import_helper.helper.secondsToRoundishMillis(timestamp - request._timestamp) : -1);
|
|
1060
989
|
this._requestIdToRequest.delete(requestId);
|
|
1061
|
-
this._page.
|
|
1062
|
-
this._page.
|
|
990
|
+
this._page.frameManager.requestReceivedResponse(response);
|
|
991
|
+
this._page.frameManager.reportRequestFinished(request.request, response);
|
|
1063
992
|
}
|
|
1064
993
|
_onRequestIntercepted(session, event) {
|
|
1065
994
|
const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId);
|
|
1066
995
|
if (!requestWillBeSentEvent) {
|
|
1067
|
-
|
|
1068
|
-
// Just continue.
|
|
1069
|
-
session.sendMayFail('Network.interceptWithRequest', {
|
|
1070
|
-
requestId: event.requestId
|
|
1071
|
-
});
|
|
996
|
+
session.sendMayFail("Network.interceptWithRequest", { requestId: event.requestId });
|
|
1072
997
|
return;
|
|
1073
998
|
}
|
|
1074
999
|
this._requestIdToRequestWillBeSentEvent.delete(event.requestId);
|
|
@@ -1078,156 +1003,132 @@ class WKPage {
|
|
|
1078
1003
|
const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId);
|
|
1079
1004
|
if (requestWillBeSentEvent) {
|
|
1080
1005
|
this._requestIdToRequestWillBeSentEvent.delete(event.requestId);
|
|
1081
|
-
// We received a response, so the request won't be intercepted (e.g. it was handled by a
|
|
1082
|
-
// service worker and we don't intercept service workers).
|
|
1083
1006
|
this._onRequest(session, requestWillBeSentEvent, false);
|
|
1084
1007
|
}
|
|
1085
1008
|
const request = this._requestIdToRequest.get(event.requestId);
|
|
1086
|
-
|
|
1087
|
-
|
|
1009
|
+
if (!request)
|
|
1010
|
+
return;
|
|
1088
1011
|
this._requestIdToResponseReceivedPayloadEvent.set(event.requestId, event);
|
|
1089
1012
|
const response = request.createResponse(event.response);
|
|
1090
|
-
this._page.
|
|
1013
|
+
this._page.frameManager.requestReceivedResponse(response);
|
|
1091
1014
|
if (response.status() === 204 && request.request.isNavigationRequest()) {
|
|
1092
1015
|
this._onLoadingFailed(session, {
|
|
1093
1016
|
requestId: event.requestId,
|
|
1094
|
-
errorText:
|
|
1017
|
+
errorText: "Aborted: 204 No Content",
|
|
1095
1018
|
timestamp: event.timestamp
|
|
1096
1019
|
});
|
|
1097
1020
|
}
|
|
1098
1021
|
}
|
|
1099
1022
|
_onLoadingFinished(event) {
|
|
1100
1023
|
const request = this._requestIdToRequest.get(event.requestId);
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
if (!request) return;
|
|
1104
|
-
|
|
1105
|
-
// Under certain conditions we never get the Network.responseReceived
|
|
1106
|
-
// event from protocol. @see https://crbug.com/883475
|
|
1024
|
+
if (!request)
|
|
1025
|
+
return;
|
|
1107
1026
|
const response = request.request._existingResponse();
|
|
1108
1027
|
if (response) {
|
|
1109
|
-
var _event$metrics, _event$metrics2, _responseReceivedPayl, _responseReceivedPayl2, _responseReceivedPayl3, _event$metrics3, _event$metrics$respon, _event$metrics4, _event$metrics$respon2, _event$metrics5;
|
|
1110
1028
|
const responseReceivedPayload = this._requestIdToResponseReceivedPayloadEvent.get(event.requestId);
|
|
1111
|
-
response._serverAddrFinished(parseRemoteAddress(event
|
|
1029
|
+
response._serverAddrFinished(parseRemoteAddress(event?.metrics?.remoteAddress));
|
|
1112
1030
|
response._securityDetailsFinished({
|
|
1113
|
-
protocol: isLoadedSecurely(response.url(), response.timing()) ?
|
|
1114
|
-
subjectName: responseReceivedPayload
|
|
1115
|
-
validFrom: responseReceivedPayload
|
|
1116
|
-
validTo: responseReceivedPayload
|
|
1031
|
+
protocol: isLoadedSecurely(response.url(), response.timing()) ? event.metrics?.securityConnection?.protocol : void 0,
|
|
1032
|
+
subjectName: responseReceivedPayload?.response.security?.certificate?.subject,
|
|
1033
|
+
validFrom: responseReceivedPayload?.response.security?.certificate?.validFrom,
|
|
1034
|
+
validTo: responseReceivedPayload?.response.security?.certificate?.validUntil
|
|
1117
1035
|
});
|
|
1118
|
-
if (
|
|
1119
|
-
|
|
1120
|
-
response.
|
|
1121
|
-
response.
|
|
1036
|
+
if (event.metrics?.protocol)
|
|
1037
|
+
response._setHttpVersion(event.metrics.protocol);
|
|
1038
|
+
response.setEncodedBodySize(event.metrics?.responseBodyBytesReceived ?? null);
|
|
1039
|
+
response.setResponseHeadersSize(event.metrics?.responseHeaderBytesReceived ?? null);
|
|
1040
|
+
response._requestFinished(import_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
|
|
1122
1041
|
} else {
|
|
1123
|
-
// Use provisional headers if we didn't have the response with raw headers.
|
|
1124
1042
|
request.request.setRawRequestHeaders(null);
|
|
1125
1043
|
}
|
|
1126
1044
|
this._requestIdToResponseReceivedPayloadEvent.delete(event.requestId);
|
|
1127
1045
|
this._requestIdToRequest.delete(event.requestId);
|
|
1128
|
-
this._page.
|
|
1046
|
+
this._page.frameManager.reportRequestFinished(request.request, response);
|
|
1129
1047
|
}
|
|
1130
1048
|
_onLoadingFailed(session, event) {
|
|
1131
1049
|
const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId);
|
|
1132
1050
|
if (requestWillBeSentEvent) {
|
|
1133
1051
|
this._requestIdToRequestWillBeSentEvent.delete(event.requestId);
|
|
1134
|
-
// If loading failed, the request won't be intercepted (e.g. it was handled by a
|
|
1135
|
-
// service worker and we don't intercept service workers).
|
|
1136
1052
|
this._onRequest(session, requestWillBeSentEvent, false);
|
|
1137
1053
|
}
|
|
1138
1054
|
const request = this._requestIdToRequest.get(event.requestId);
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
if (!request) return;
|
|
1055
|
+
if (!request)
|
|
1056
|
+
return;
|
|
1142
1057
|
const response = request.request._existingResponse();
|
|
1143
1058
|
if (response) {
|
|
1144
1059
|
response._serverAddrFinished();
|
|
1145
1060
|
response._securityDetailsFinished();
|
|
1146
1061
|
response.setResponseHeadersSize(null);
|
|
1147
1062
|
response.setEncodedBodySize(null);
|
|
1148
|
-
response._requestFinished(
|
|
1063
|
+
response._requestFinished(import_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
|
|
1149
1064
|
} else {
|
|
1150
|
-
// Use provisional headers if we didn't have the response with raw headers.
|
|
1151
1065
|
request.request.setRawRequestHeaders(null);
|
|
1152
1066
|
}
|
|
1153
1067
|
this._requestIdToRequest.delete(event.requestId);
|
|
1154
1068
|
request.request._setFailureText(event.errorText);
|
|
1155
|
-
this._page.
|
|
1069
|
+
this._page.frameManager.requestFailed(request.request, event.errorText.includes("cancelled"));
|
|
1156
1070
|
}
|
|
1157
1071
|
async _grantPermissions(origin, permissions) {
|
|
1158
|
-
const webPermissionToProtocol = new Map([
|
|
1159
|
-
|
|
1072
|
+
const webPermissionToProtocol = /* @__PURE__ */ new Map([
|
|
1073
|
+
["geolocation", "geolocation"],
|
|
1074
|
+
["notifications", "notifications"],
|
|
1075
|
+
["clipboard-read", "clipboard-read"]
|
|
1076
|
+
]);
|
|
1077
|
+
const filtered = permissions.map((permission) => {
|
|
1160
1078
|
const protocolPermission = webPermissionToProtocol.get(permission);
|
|
1161
|
-
if (!protocolPermission)
|
|
1079
|
+
if (!protocolPermission)
|
|
1080
|
+
throw new Error("Unknown permission: " + permission);
|
|
1162
1081
|
return protocolPermission;
|
|
1163
1082
|
});
|
|
1164
|
-
await this._pageProxySession.send(
|
|
1165
|
-
origin,
|
|
1166
|
-
permissions: filtered
|
|
1167
|
-
});
|
|
1083
|
+
await this._pageProxySession.send("Emulation.grantPermissions", { origin, permissions: filtered });
|
|
1168
1084
|
}
|
|
1169
1085
|
async _clearPermissions() {
|
|
1170
|
-
await this._pageProxySession.send(
|
|
1086
|
+
await this._pageProxySession.send("Emulation.resetPermissions", {});
|
|
1171
1087
|
}
|
|
1172
1088
|
shouldToggleStyleSheetToSyncAnimations() {
|
|
1173
1089
|
return true;
|
|
1174
1090
|
}
|
|
1175
1091
|
}
|
|
1176
|
-
|
|
1177
|
-
/**
|
|
1178
|
-
* WebKit Remote Addresses look like:
|
|
1179
|
-
*
|
|
1180
|
-
* macOS:
|
|
1181
|
-
* ::1.8911
|
|
1182
|
-
* 2606:2800:220:1:248:1893:25c8:1946.443
|
|
1183
|
-
* 127.0.0.1:8000
|
|
1184
|
-
*
|
|
1185
|
-
* ubuntu:
|
|
1186
|
-
* ::1:8907
|
|
1187
|
-
* 127.0.0.1:8000
|
|
1188
|
-
*
|
|
1189
|
-
* NB: They look IPv4 and IPv6's with ports but use an alternative notation.
|
|
1190
|
-
*/
|
|
1191
|
-
exports.WKPage = WKPage;
|
|
1192
1092
|
function parseRemoteAddress(value) {
|
|
1193
|
-
if (!value)
|
|
1093
|
+
if (!value)
|
|
1094
|
+
return;
|
|
1194
1095
|
try {
|
|
1195
|
-
const colon = value.lastIndexOf(
|
|
1196
|
-
const dot = value.lastIndexOf(
|
|
1096
|
+
const colon = value.lastIndexOf(":");
|
|
1097
|
+
const dot = value.lastIndexOf(".");
|
|
1197
1098
|
if (dot < 0) {
|
|
1198
|
-
// IPv6ish:port
|
|
1199
1099
|
return {
|
|
1200
1100
|
ipAddress: `[${value.slice(0, colon)}]`,
|
|
1201
1101
|
port: +value.slice(colon + 1)
|
|
1202
1102
|
};
|
|
1203
1103
|
}
|
|
1204
1104
|
if (colon > dot) {
|
|
1205
|
-
|
|
1206
|
-
const [address, port] = value.split(':');
|
|
1105
|
+
const [address, port] = value.split(":");
|
|
1207
1106
|
return {
|
|
1208
1107
|
ipAddress: address,
|
|
1209
1108
|
port: +port
|
|
1210
1109
|
};
|
|
1211
1110
|
} else {
|
|
1212
|
-
|
|
1213
|
-
const [address, port] = value.split('.');
|
|
1111
|
+
const [address, port] = value.split(".");
|
|
1214
1112
|
return {
|
|
1215
1113
|
ipAddress: `[${address}]`,
|
|
1216
1114
|
port: +port
|
|
1217
1115
|
};
|
|
1218
1116
|
}
|
|
1219
|
-
} catch (_) {
|
|
1117
|
+
} catch (_) {
|
|
1118
|
+
}
|
|
1220
1119
|
}
|
|
1221
|
-
|
|
1222
|
-
/**
|
|
1223
|
-
* Adapted from Source/WebInspectorUI/UserInterface/Models/Resource.js in
|
|
1224
|
-
* WebKit codebase.
|
|
1225
|
-
*/
|
|
1226
1120
|
function isLoadedSecurely(url, timing) {
|
|
1227
1121
|
try {
|
|
1228
1122
|
const u = new URL(url);
|
|
1229
|
-
if (u.protocol !==
|
|
1230
|
-
|
|
1123
|
+
if (u.protocol !== "https:" && u.protocol !== "wss:" && u.protocol !== "sftp:")
|
|
1124
|
+
return false;
|
|
1125
|
+
if (timing.secureConnectionStart === -1 && timing.connectStart !== -1)
|
|
1126
|
+
return false;
|
|
1231
1127
|
return true;
|
|
1232
|
-
} catch (_) {
|
|
1233
|
-
}
|
|
1128
|
+
} catch (_) {
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
1132
|
+
0 && (module.exports = {
|
|
1133
|
+
WKPage
|
|
1134
|
+
});
|