@checkly/playwright-core 1.51.17-beta.2 → 1.54.2-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +89 -112
- 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,49 +1,53 @@
|
|
|
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 harTracer_exports = {};
|
|
30
|
+
__export(harTracer_exports, {
|
|
31
|
+
HarTracer: () => HarTracer
|
|
5
32
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Copyright (c) Microsoft Corporation.
|
|
20
|
-
*
|
|
21
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
22
|
-
* you may not use this file except in compliance with the License.
|
|
23
|
-
* You may obtain a copy of the License at
|
|
24
|
-
*
|
|
25
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
26
|
-
*
|
|
27
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
28
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
29
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
30
|
-
* See the License for the specific language governing permissions and
|
|
31
|
-
* limitations under the License.
|
|
32
|
-
*/
|
|
33
|
-
|
|
34
|
-
const FALLBACK_HTTP_VERSION = 'HTTP/1.1';
|
|
33
|
+
module.exports = __toCommonJS(harTracer_exports);
|
|
34
|
+
var import_utils = require("../../utils");
|
|
35
|
+
var import_utils2 = require("../../utils");
|
|
36
|
+
var import_eventsHelper = require("../utils/eventsHelper");
|
|
37
|
+
var import_manualPromise = require("../../utils/isomorphic/manualPromise");
|
|
38
|
+
var import_utilsBundle = require("../../utilsBundle");
|
|
39
|
+
var import_browserContext = require("../browserContext");
|
|
40
|
+
var import_fetch = require("../fetch");
|
|
41
|
+
var import_frames = require("../frames");
|
|
42
|
+
var import_helper = require("../helper");
|
|
43
|
+
var network = __toESM(require("../network"));
|
|
44
|
+
const FALLBACK_HTTP_VERSION = "HTTP/1.1";
|
|
35
45
|
class HarTracer {
|
|
36
46
|
constructor(context, page, delegate, options) {
|
|
37
|
-
this.
|
|
38
|
-
this.
|
|
39
|
-
this._delegate = void 0;
|
|
40
|
-
this._options = void 0;
|
|
41
|
-
this._pageEntries = new Map();
|
|
47
|
+
this._barrierPromises = /* @__PURE__ */ new Set();
|
|
48
|
+
this._pageEntries = /* @__PURE__ */ new Map();
|
|
42
49
|
this._eventListeners = [];
|
|
43
50
|
this._started = false;
|
|
44
|
-
this._entrySymbol = void 0;
|
|
45
|
-
this._baseURL = void 0;
|
|
46
|
-
this._page = void 0;
|
|
47
51
|
this._context = context;
|
|
48
52
|
this._page = page;
|
|
49
53
|
this._delegate = delegate;
|
|
@@ -56,48 +60,66 @@ class HarTracer {
|
|
|
56
60
|
options.omitSizes = true;
|
|
57
61
|
options.omitPages = true;
|
|
58
62
|
}
|
|
59
|
-
this._entrySymbol = Symbol(
|
|
60
|
-
this._baseURL = context instanceof
|
|
63
|
+
this._entrySymbol = Symbol("requestHarEntry");
|
|
64
|
+
this._baseURL = context instanceof import_fetch.APIRequestContext ? context._defaultOptions().baseURL : context._options.baseURL;
|
|
61
65
|
}
|
|
62
66
|
start(options) {
|
|
63
|
-
if (this._started)
|
|
67
|
+
if (this._started)
|
|
68
|
+
return;
|
|
64
69
|
this._options.omitScripts = options.omitScripts;
|
|
65
70
|
this._started = true;
|
|
66
|
-
const apiRequest = this._context instanceof
|
|
67
|
-
this._eventListeners = [
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
const apiRequest = this._context instanceof import_fetch.APIRequestContext ? this._context : this._context.fetchRequest;
|
|
72
|
+
this._eventListeners = [
|
|
73
|
+
import_eventsHelper.eventsHelper.addEventListener(apiRequest, import_fetch.APIRequestContext.Events.Request, (event) => this._onAPIRequest(event)),
|
|
74
|
+
import_eventsHelper.eventsHelper.addEventListener(apiRequest, import_fetch.APIRequestContext.Events.RequestFinished, (event) => this._onAPIRequestFinished(event))
|
|
75
|
+
];
|
|
76
|
+
if (this._context instanceof import_browserContext.BrowserContext) {
|
|
77
|
+
this._eventListeners.push(
|
|
78
|
+
import_eventsHelper.eventsHelper.addEventListener(this._context, import_browserContext.BrowserContext.Events.Page, (page) => this._createPageEntryIfNeeded(page)),
|
|
79
|
+
import_eventsHelper.eventsHelper.addEventListener(this._context, import_browserContext.BrowserContext.Events.Request, (request) => this._onRequest(request)),
|
|
80
|
+
import_eventsHelper.eventsHelper.addEventListener(this._context, import_browserContext.BrowserContext.Events.RequestFinished, ({ request, response }) => this._onRequestFinished(request, response).catch(() => {
|
|
81
|
+
})),
|
|
82
|
+
import_eventsHelper.eventsHelper.addEventListener(this._context, import_browserContext.BrowserContext.Events.RequestFailed, (request) => this._onRequestFailed(request)),
|
|
83
|
+
import_eventsHelper.eventsHelper.addEventListener(this._context, import_browserContext.BrowserContext.Events.Response, (response) => this._onResponse(response)),
|
|
84
|
+
import_eventsHelper.eventsHelper.addEventListener(this._context, import_browserContext.BrowserContext.Events.RequestAborted, (request) => this._onRequestAborted(request)),
|
|
85
|
+
import_eventsHelper.eventsHelper.addEventListener(this._context, import_browserContext.BrowserContext.Events.RequestFulfilled, (request) => this._onRequestFulfilled(request)),
|
|
86
|
+
import_eventsHelper.eventsHelper.addEventListener(this._context, import_browserContext.BrowserContext.Events.RequestContinued, (request) => this._onRequestContinued(request))
|
|
87
|
+
);
|
|
88
|
+
for (const page of this._context.pages())
|
|
89
|
+
this._createPageEntryIfNeeded(page);
|
|
73
90
|
}
|
|
74
91
|
}
|
|
75
92
|
_shouldIncludeEntryWithUrl(urlString) {
|
|
76
|
-
return !this._options.urlFilter || (0,
|
|
93
|
+
return !this._options.urlFilter || (0, import_utils2.urlMatches)(this._baseURL, urlString, this._options.urlFilter);
|
|
77
94
|
}
|
|
78
95
|
_entryForRequest(request) {
|
|
79
96
|
return request[this._entrySymbol];
|
|
80
97
|
}
|
|
81
98
|
_createPageEntryIfNeeded(page) {
|
|
82
|
-
if (!page)
|
|
83
|
-
|
|
84
|
-
if (this.
|
|
99
|
+
if (!page)
|
|
100
|
+
return;
|
|
101
|
+
if (this._options.omitPages)
|
|
102
|
+
return;
|
|
103
|
+
if (this._page && page !== this._page)
|
|
104
|
+
return;
|
|
85
105
|
let pageEntry = this._pageEntries.get(page);
|
|
86
106
|
if (!pageEntry) {
|
|
87
|
-
const date = new Date();
|
|
107
|
+
const date = /* @__PURE__ */ new Date();
|
|
88
108
|
pageEntry = {
|
|
89
109
|
startedDateTime: date.toISOString(),
|
|
90
110
|
id: page.guid,
|
|
91
|
-
title:
|
|
111
|
+
title: "",
|
|
92
112
|
pageTimings: this._options.omitTiming ? {} : {
|
|
93
113
|
onContentLoad: -1,
|
|
94
114
|
onLoad: -1
|
|
95
115
|
}
|
|
96
116
|
};
|
|
97
117
|
pageEntry[startedDateSymbol] = date;
|
|
98
|
-
page.mainFrame().on(
|
|
99
|
-
if (event ===
|
|
100
|
-
|
|
118
|
+
page.mainFrame().on(import_frames.Frame.Events.AddLifecycle, (event) => {
|
|
119
|
+
if (event === "load")
|
|
120
|
+
this._onLoad(page, pageEntry);
|
|
121
|
+
if (event === "domcontentloaded")
|
|
122
|
+
this._onDOMContentLoaded(page, pageEntry);
|
|
101
123
|
});
|
|
102
124
|
this._pageEntries.set(page, pageEntry);
|
|
103
125
|
}
|
|
@@ -109,13 +131,12 @@ class HarTracer {
|
|
|
109
131
|
title: document.title,
|
|
110
132
|
domContentLoaded: performance.timing.domContentLoadedEventStart
|
|
111
133
|
};
|
|
112
|
-
}), {
|
|
113
|
-
isFunction: true,
|
|
114
|
-
world: 'utility'
|
|
115
|
-
}).then(result => {
|
|
134
|
+
}), { isFunction: true, world: "utility" }).then((result) => {
|
|
116
135
|
pageEntry.title = result.title;
|
|
117
|
-
if (!this._options.omitTiming)
|
|
118
|
-
|
|
136
|
+
if (!this._options.omitTiming)
|
|
137
|
+
pageEntry.pageTimings.onContentLoad = result.domContentLoaded;
|
|
138
|
+
}).catch(() => {
|
|
139
|
+
});
|
|
119
140
|
this._addBarrier(page, promise);
|
|
120
141
|
}
|
|
121
142
|
_onLoad(page, pageEntry) {
|
|
@@ -124,45 +145,46 @@ class HarTracer {
|
|
|
124
145
|
title: document.title,
|
|
125
146
|
loaded: performance.timing.loadEventStart
|
|
126
147
|
};
|
|
127
|
-
}), {
|
|
128
|
-
isFunction: true,
|
|
129
|
-
world: 'utility'
|
|
130
|
-
}).then(result => {
|
|
148
|
+
}), { isFunction: true, world: "utility" }).then((result) => {
|
|
131
149
|
pageEntry.title = result.title;
|
|
132
|
-
if (!this._options.omitTiming)
|
|
133
|
-
|
|
150
|
+
if (!this._options.omitTiming)
|
|
151
|
+
pageEntry.pageTimings.onLoad = result.loaded;
|
|
152
|
+
}).catch(() => {
|
|
153
|
+
});
|
|
134
154
|
this._addBarrier(page, promise);
|
|
135
155
|
}
|
|
136
156
|
_addBarrier(target, promise) {
|
|
137
|
-
if (!target)
|
|
138
|
-
|
|
157
|
+
if (!target)
|
|
158
|
+
return null;
|
|
159
|
+
if (!this._options.waitForContentOnStop)
|
|
160
|
+
return;
|
|
139
161
|
const race = target.openScope.safeRace(promise);
|
|
140
162
|
this._barrierPromises.add(race);
|
|
141
163
|
race.then(() => this._barrierPromises.delete(race));
|
|
142
164
|
}
|
|
143
165
|
_onAPIRequest(event) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
const harEntry = createHarEntry(event.method, event.url,
|
|
166
|
+
if (!this._shouldIncludeEntryWithUrl(event.url.toString()))
|
|
167
|
+
return;
|
|
168
|
+
const harEntry = createHarEntry(event.method, event.url, void 0, this._options);
|
|
147
169
|
harEntry._apiRequest = true;
|
|
148
|
-
if (!this._options.omitCookies)
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
if (!this._options.omitSizes) harEntry.request.bodySize = ((_event$postData = event.postData) === null || _event$postData === void 0 ? void 0 : _event$postData.length) || 0;
|
|
170
|
+
if (!this._options.omitCookies)
|
|
171
|
+
harEntry.request.cookies = event.cookies;
|
|
172
|
+
harEntry.request.headers = Object.entries(event.headers).map(([name, value]) => ({ name, value }));
|
|
173
|
+
harEntry.request.postData = this._postDataForBuffer(event.postData || null, event.headers["content-type"], this._options.content);
|
|
174
|
+
if (!this._options.omitSizes)
|
|
175
|
+
harEntry.request.bodySize = event.postData?.length || 0;
|
|
155
176
|
event[this._entrySymbol] = harEntry;
|
|
156
|
-
if (this._started)
|
|
177
|
+
if (this._started)
|
|
178
|
+
this._delegate.onEntryStarted(harEntry);
|
|
157
179
|
}
|
|
158
180
|
_onAPIRequestFinished(event) {
|
|
159
|
-
var _event$body$length, _event$body;
|
|
160
181
|
const harEntry = this._entryForRequest(event.requestEvent);
|
|
161
|
-
if (!harEntry)
|
|
182
|
+
if (!harEntry)
|
|
183
|
+
return;
|
|
162
184
|
harEntry.response.status = event.statusCode;
|
|
163
185
|
harEntry.response.statusText = event.statusMessage;
|
|
164
186
|
harEntry.response.httpVersion = event.httpVersion;
|
|
165
|
-
harEntry.response.redirectURL = event.headers.location ||
|
|
187
|
+
harEntry.response.redirectURL = event.headers.location || "";
|
|
166
188
|
if (!this._options.omitServerIP) {
|
|
167
189
|
harEntry.serverIPAddress = event.serverIPAddress;
|
|
168
190
|
harEntry._serverPort = event.serverPort;
|
|
@@ -171,204 +193,226 @@ class HarTracer {
|
|
|
171
193
|
harEntry.timings = event.timings;
|
|
172
194
|
this._computeHarEntryTotalTime(harEntry);
|
|
173
195
|
}
|
|
174
|
-
if (!this._options.omitSecurityDetails)
|
|
196
|
+
if (!this._options.omitSecurityDetails)
|
|
197
|
+
harEntry._securityDetails = event.securityDetails;
|
|
175
198
|
for (let i = 0; i < event.rawHeaders.length; i += 2) {
|
|
176
199
|
harEntry.response.headers.push({
|
|
177
200
|
name: event.rawHeaders[i],
|
|
178
201
|
value: event.rawHeaders[i + 1]
|
|
179
202
|
});
|
|
180
203
|
}
|
|
181
|
-
harEntry.response.cookies = this._options.omitCookies ? [] : event.cookies.map(c => {
|
|
204
|
+
harEntry.response.cookies = this._options.omitCookies ? [] : event.cookies.map((c) => {
|
|
182
205
|
return {
|
|
183
206
|
...c,
|
|
184
|
-
expires: c.expires === -1 ?
|
|
207
|
+
expires: c.expires === -1 ? void 0 : safeDateToISOString(c.expires)
|
|
185
208
|
};
|
|
186
209
|
});
|
|
187
210
|
const content = harEntry.response.content;
|
|
188
|
-
const contentType = event.headers[
|
|
189
|
-
if (contentType)
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
if (this.
|
|
211
|
+
const contentType = event.headers["content-type"];
|
|
212
|
+
if (contentType)
|
|
213
|
+
content.mimeType = contentType;
|
|
214
|
+
this._storeResponseContent(event.body, content, "other");
|
|
215
|
+
if (!this._options.omitSizes)
|
|
216
|
+
harEntry.response.bodySize = event.body?.length ?? 0;
|
|
217
|
+
if (this._started)
|
|
218
|
+
this._delegate.onEntryFinished(harEntry);
|
|
193
219
|
}
|
|
194
220
|
_onRequest(request) {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
const page =
|
|
198
|
-
if (this._page && page !== this._page)
|
|
221
|
+
if (!this._shouldIncludeEntryWithUrl(request.url()))
|
|
222
|
+
return;
|
|
223
|
+
const page = request.frame()?._page;
|
|
224
|
+
if (this._page && page !== this._page)
|
|
225
|
+
return;
|
|
199
226
|
const url = network.parseURL(request.url());
|
|
200
|
-
if (!url)
|
|
227
|
+
if (!url)
|
|
228
|
+
return;
|
|
201
229
|
const pageEntry = this._createPageEntryIfNeeded(page);
|
|
202
|
-
const harEntry = createHarEntry(request.method(), url,
|
|
203
|
-
if (pageEntry)
|
|
230
|
+
const harEntry = createHarEntry(request.method(), url, request.frame()?.guid, this._options);
|
|
231
|
+
if (pageEntry)
|
|
232
|
+
harEntry.pageref = pageEntry.id;
|
|
204
233
|
this._recordRequestHeadersAndCookies(harEntry, request.headers());
|
|
205
234
|
harEntry.request.postData = this._postDataForRequest(request, this._options.content);
|
|
206
|
-
if (!this._options.omitSizes)
|
|
235
|
+
if (!this._options.omitSizes)
|
|
236
|
+
harEntry.request.bodySize = request.bodySize();
|
|
207
237
|
if (request.redirectedFrom()) {
|
|
208
238
|
const fromEntry = this._entryForRequest(request.redirectedFrom());
|
|
209
|
-
if (fromEntry)
|
|
239
|
+
if (fromEntry)
|
|
240
|
+
fromEntry.response.redirectURL = request.url();
|
|
210
241
|
}
|
|
211
242
|
request[this._entrySymbol] = harEntry;
|
|
212
|
-
(0,
|
|
243
|
+
(0, import_utils.assert)(this._started);
|
|
213
244
|
this._delegate.onEntryStarted(harEntry);
|
|
214
245
|
}
|
|
215
246
|
_recordRequestHeadersAndCookies(harEntry, headers) {
|
|
216
247
|
if (!this._options.omitCookies) {
|
|
217
248
|
harEntry.request.cookies = [];
|
|
218
|
-
for (const header of headers.filter(
|
|
249
|
+
for (const header of headers.filter((header2) => header2.name.toLowerCase() === "cookie"))
|
|
250
|
+
harEntry.request.cookies.push(...header.value.split(";").map(parseCookie));
|
|
219
251
|
}
|
|
220
252
|
harEntry.request.headers = headers;
|
|
221
253
|
}
|
|
222
254
|
_recordRequestOverrides(harEntry, request) {
|
|
223
|
-
if (!request.
|
|
255
|
+
if (!request.overrides() || !this._options.recordRequestOverrides)
|
|
256
|
+
return;
|
|
224
257
|
harEntry.request.method = request.method();
|
|
225
258
|
harEntry.request.url = request.url();
|
|
226
259
|
harEntry.request.postData = this._postDataForRequest(request, this._options.content);
|
|
227
260
|
this._recordRequestHeadersAndCookies(harEntry, request.headers());
|
|
228
261
|
}
|
|
229
262
|
async _onRequestFinished(request, response) {
|
|
230
|
-
|
|
231
|
-
|
|
263
|
+
if (!response)
|
|
264
|
+
return;
|
|
232
265
|
const harEntry = this._entryForRequest(request);
|
|
233
|
-
if (!harEntry)
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
// In WebKit security details and server ip are reported in Network.loadingFinished, so we populate
|
|
237
|
-
// it here to not hang in case of long chunked responses, see https://github.com/microsoft/playwright/issues/21182.
|
|
266
|
+
if (!harEntry)
|
|
267
|
+
return;
|
|
268
|
+
const page = request.frame()?._page;
|
|
238
269
|
if (!this._options.omitServerIP) {
|
|
239
|
-
this._addBarrier(page || request.serviceWorker(), response.serverAddr().then(server => {
|
|
240
|
-
if (server
|
|
241
|
-
|
|
270
|
+
this._addBarrier(page || request.serviceWorker(), response.serverAddr().then((server) => {
|
|
271
|
+
if (server?.ipAddress)
|
|
272
|
+
harEntry.serverIPAddress = server.ipAddress;
|
|
273
|
+
if (server?.port)
|
|
274
|
+
harEntry._serverPort = server.port;
|
|
242
275
|
}));
|
|
243
276
|
}
|
|
244
277
|
if (!this._options.omitSecurityDetails) {
|
|
245
|
-
this._addBarrier(page || request.serviceWorker(), response.securityDetails().then(details => {
|
|
246
|
-
if (details)
|
|
278
|
+
this._addBarrier(page || request.serviceWorker(), response.securityDetails().then((details) => {
|
|
279
|
+
if (details)
|
|
280
|
+
harEntry._securityDetails = details;
|
|
247
281
|
}));
|
|
248
282
|
}
|
|
249
283
|
const httpVersion = response.httpVersion();
|
|
250
284
|
harEntry.request.httpVersion = httpVersion;
|
|
251
285
|
harEntry.response.httpVersion = httpVersion;
|
|
252
|
-
const compressionCalculationBarrier = this._options.omitSizes ?
|
|
286
|
+
const compressionCalculationBarrier = this._options.omitSizes ? void 0 : {
|
|
253
287
|
_encodedBodySize: -1,
|
|
254
288
|
_decodedBodySize: -1,
|
|
255
|
-
barrier: new
|
|
256
|
-
_check: function
|
|
289
|
+
barrier: new import_manualPromise.ManualPromise(),
|
|
290
|
+
_check: function() {
|
|
257
291
|
if (this._encodedBodySize !== -1 && this._decodedBodySize !== -1) {
|
|
258
292
|
harEntry.response.content.compression = Math.max(0, this._decodedBodySize - this._encodedBodySize);
|
|
259
293
|
this.barrier.resolve();
|
|
260
294
|
}
|
|
261
295
|
},
|
|
262
|
-
setEncodedBodySize: function
|
|
296
|
+
setEncodedBodySize: function(encodedBodySize) {
|
|
263
297
|
this._encodedBodySize = encodedBodySize;
|
|
264
298
|
this._check();
|
|
265
299
|
},
|
|
266
|
-
setDecodedBodySize: function
|
|
300
|
+
setDecodedBodySize: function(decodedBodySize) {
|
|
267
301
|
this._decodedBodySize = decodedBodySize;
|
|
268
302
|
this._check();
|
|
269
303
|
}
|
|
270
304
|
};
|
|
271
|
-
if (compressionCalculationBarrier)
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
305
|
+
if (compressionCalculationBarrier)
|
|
306
|
+
this._addBarrier(page || request.serviceWorker(), compressionCalculationBarrier.barrier);
|
|
307
|
+
const promise = response.body().then((buffer) => {
|
|
308
|
+
if (this._options.omitScripts && request.resourceType() === "script") {
|
|
309
|
+
compressionCalculationBarrier?.setDecodedBodySize(0);
|
|
275
310
|
return;
|
|
276
311
|
}
|
|
277
312
|
const content = harEntry.response.content;
|
|
278
|
-
compressionCalculationBarrier
|
|
313
|
+
compressionCalculationBarrier?.setDecodedBodySize(buffer.length);
|
|
279
314
|
this._storeResponseContent(buffer, content, request.resourceType());
|
|
280
315
|
}).catch(() => {
|
|
281
|
-
compressionCalculationBarrier
|
|
316
|
+
compressionCalculationBarrier?.setDecodedBodySize(0);
|
|
282
317
|
}).then(() => {
|
|
283
|
-
if (this._started)
|
|
318
|
+
if (this._started)
|
|
319
|
+
this._delegate.onEntryFinished(harEntry);
|
|
284
320
|
});
|
|
285
321
|
this._addBarrier(page || request.serviceWorker(), promise);
|
|
286
|
-
|
|
287
|
-
// Response end timing is only available after the response event was received.
|
|
288
322
|
const timing = response.timing();
|
|
289
|
-
harEntry.timings.receive = response.request()._responseEndTiming !== -1 ?
|
|
323
|
+
harEntry.timings.receive = response.request()._responseEndTiming !== -1 ? import_helper.helper.millisToRoundishMillis(response.request()._responseEndTiming - timing.responseStart) : -1;
|
|
290
324
|
this._computeHarEntryTotalTime(harEntry);
|
|
291
325
|
if (!this._options.omitSizes) {
|
|
292
|
-
this._addBarrier(page || request.serviceWorker(), response.sizes().then(sizes => {
|
|
326
|
+
this._addBarrier(page || request.serviceWorker(), response.sizes().then((sizes) => {
|
|
293
327
|
harEntry.response.bodySize = sizes.responseBodySize;
|
|
294
328
|
harEntry.response.headersSize = sizes.responseHeadersSize;
|
|
295
329
|
harEntry.response._transferSize = sizes.transferSize;
|
|
296
330
|
harEntry.request.headersSize = sizes.requestHeadersSize;
|
|
297
|
-
compressionCalculationBarrier
|
|
331
|
+
compressionCalculationBarrier?.setEncodedBodySize(sizes.responseBodySize);
|
|
298
332
|
}));
|
|
299
333
|
}
|
|
300
334
|
}
|
|
301
335
|
async _onRequestFailed(request) {
|
|
302
336
|
const harEntry = this._entryForRequest(request);
|
|
303
|
-
if (!harEntry)
|
|
304
|
-
|
|
337
|
+
if (!harEntry)
|
|
338
|
+
return;
|
|
339
|
+
if (request._failureText !== null)
|
|
340
|
+
harEntry.response._failureText = request._failureText;
|
|
305
341
|
this._recordRequestOverrides(harEntry, request);
|
|
306
|
-
if (this._started)
|
|
342
|
+
if (this._started)
|
|
343
|
+
this._delegate.onEntryFinished(harEntry);
|
|
307
344
|
}
|
|
308
345
|
_onRequestAborted(request) {
|
|
309
346
|
const harEntry = this._entryForRequest(request);
|
|
310
|
-
if (harEntry)
|
|
347
|
+
if (harEntry)
|
|
348
|
+
harEntry._wasAborted = true;
|
|
311
349
|
}
|
|
312
350
|
_onRequestFulfilled(request) {
|
|
313
351
|
const harEntry = this._entryForRequest(request);
|
|
314
|
-
if (harEntry)
|
|
352
|
+
if (harEntry)
|
|
353
|
+
harEntry._wasFulfilled = true;
|
|
315
354
|
}
|
|
316
355
|
_onRequestContinued(request) {
|
|
317
356
|
const harEntry = this._entryForRequest(request);
|
|
318
|
-
if (harEntry)
|
|
357
|
+
if (harEntry)
|
|
358
|
+
harEntry._wasContinued = true;
|
|
319
359
|
}
|
|
320
360
|
_storeResponseContent(buffer, content, resourceType) {
|
|
321
361
|
if (!buffer) {
|
|
322
362
|
content.size = 0;
|
|
323
363
|
return;
|
|
324
364
|
}
|
|
325
|
-
if (!this._options.omitSizes)
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
if ((0, _utils.isTextualMimeType)(content.mimeType) && resourceType !== 'font') {
|
|
365
|
+
if (!this._options.omitSizes)
|
|
366
|
+
content.size = buffer.length;
|
|
367
|
+
if (this._options.content === "embed") {
|
|
368
|
+
if ((0, import_utils2.isTextualMimeType)(content.mimeType) && resourceType !== "font") {
|
|
330
369
|
content.text = buffer.toString();
|
|
331
370
|
} else {
|
|
332
|
-
content.text = buffer.toString(
|
|
333
|
-
content.encoding =
|
|
371
|
+
content.text = buffer.toString("base64");
|
|
372
|
+
content.encoding = "base64";
|
|
334
373
|
}
|
|
335
|
-
} else if (this._options.content ===
|
|
336
|
-
const sha1 = (0,
|
|
337
|
-
if (this._options.includeTraceInfo)
|
|
338
|
-
|
|
374
|
+
} else if (this._options.content === "attach") {
|
|
375
|
+
const sha1 = (0, import_utils.calculateSha1)(buffer) + "." + (import_utilsBundle.mime.getExtension(content.mimeType) || "dat");
|
|
376
|
+
if (this._options.includeTraceInfo)
|
|
377
|
+
content._sha1 = sha1;
|
|
378
|
+
else
|
|
379
|
+
content._file = sha1;
|
|
380
|
+
if (this._started)
|
|
381
|
+
this._delegate.onContentBlob(sha1, buffer);
|
|
339
382
|
}
|
|
340
383
|
}
|
|
341
384
|
_onResponse(response) {
|
|
342
|
-
var _response$frame;
|
|
343
385
|
const harEntry = this._entryForRequest(response.request());
|
|
344
|
-
if (!harEntry)
|
|
345
|
-
|
|
386
|
+
if (!harEntry)
|
|
387
|
+
return;
|
|
388
|
+
const page = response.frame()?._page;
|
|
346
389
|
const pageEntry = this._createPageEntryIfNeeded(page);
|
|
347
390
|
const request = response.request();
|
|
348
391
|
harEntry.response = {
|
|
349
392
|
status: response.status(),
|
|
350
393
|
statusText: response.statusText(),
|
|
351
394
|
httpVersion: response.httpVersion(),
|
|
352
|
-
// These are bad values that will be overwritten
|
|
395
|
+
// These are bad values that will be overwritten below.
|
|
353
396
|
cookies: [],
|
|
354
397
|
headers: [],
|
|
355
398
|
content: {
|
|
356
399
|
size: -1,
|
|
357
|
-
mimeType:
|
|
400
|
+
mimeType: "x-unknown"
|
|
358
401
|
},
|
|
359
402
|
headersSize: -1,
|
|
360
403
|
bodySize: -1,
|
|
361
|
-
redirectURL:
|
|
362
|
-
_transferSize: this._options.omitSizes ?
|
|
404
|
+
redirectURL: "",
|
|
405
|
+
_transferSize: this._options.omitSizes ? void 0 : -1
|
|
363
406
|
};
|
|
364
407
|
if (!this._options.omitTiming) {
|
|
365
408
|
const startDateTime = pageEntry ? pageEntry[startedDateSymbol].valueOf() : 0;
|
|
366
409
|
const timing = response.timing();
|
|
367
|
-
if (pageEntry && startDateTime > timing.startTime)
|
|
368
|
-
|
|
369
|
-
const
|
|
370
|
-
const
|
|
371
|
-
const
|
|
410
|
+
if (pageEntry && startDateTime > timing.startTime)
|
|
411
|
+
pageEntry.startedDateTime = new Date(timing.startTime).toISOString();
|
|
412
|
+
const dns = timing.domainLookupEnd !== -1 ? import_helper.helper.millisToRoundishMillis(timing.domainLookupEnd - timing.domainLookupStart) : -1;
|
|
413
|
+
const connect = timing.connectEnd !== -1 ? import_helper.helper.millisToRoundishMillis(timing.connectEnd - timing.connectStart) : -1;
|
|
414
|
+
const ssl = timing.connectEnd !== -1 ? import_helper.helper.millisToRoundishMillis(timing.connectEnd - timing.secureConnectionStart) : -1;
|
|
415
|
+
const wait = timing.responseStart !== -1 ? import_helper.helper.millisToRoundishMillis(timing.responseStart - timing.requestStart) : -1;
|
|
372
416
|
const receive = -1;
|
|
373
417
|
harEntry.timings = {
|
|
374
418
|
dns,
|
|
@@ -381,53 +425,64 @@ class HarTracer {
|
|
|
381
425
|
this._computeHarEntryTotalTime(harEntry);
|
|
382
426
|
}
|
|
383
427
|
this._recordRequestOverrides(harEntry, request);
|
|
384
|
-
this._addBarrier(page || request.serviceWorker(), request.rawRequestHeaders().then(headers => {
|
|
428
|
+
this._addBarrier(page || request.serviceWorker(), request.rawRequestHeaders().then((headers) => {
|
|
385
429
|
this._recordRequestHeadersAndCookies(harEntry, headers);
|
|
386
430
|
}));
|
|
387
|
-
// Record available headers including redirect location in case the tracing is stopped before
|
|
388
|
-
// response extra info is received (in Chromium).
|
|
389
431
|
this._recordResponseHeaders(harEntry, response.headers());
|
|
390
|
-
this._addBarrier(page || request.serviceWorker(), response.rawResponseHeaders().then(headers => {
|
|
432
|
+
this._addBarrier(page || request.serviceWorker(), response.rawResponseHeaders().then((headers) => {
|
|
391
433
|
this._recordResponseHeaders(harEntry, headers);
|
|
392
434
|
}));
|
|
393
435
|
}
|
|
394
436
|
_recordResponseHeaders(harEntry, headers) {
|
|
395
437
|
if (!this._options.omitCookies) {
|
|
396
|
-
harEntry.response.cookies = headers.filter(header => header.name.toLowerCase() ===
|
|
438
|
+
harEntry.response.cookies = headers.filter((header) => header.name.toLowerCase() === "set-cookie").map((header) => parseCookie(header.value));
|
|
397
439
|
}
|
|
398
440
|
harEntry.response.headers = headers;
|
|
399
|
-
const contentType = headers.find(header => header.name.toLowerCase() ===
|
|
400
|
-
if (contentType)
|
|
441
|
+
const contentType = headers.find((header) => header.name.toLowerCase() === "content-type");
|
|
442
|
+
if (contentType)
|
|
443
|
+
harEntry.response.content.mimeType = contentType.value;
|
|
401
444
|
}
|
|
402
445
|
_computeHarEntryTotalTime(harEntry) {
|
|
403
|
-
harEntry.time = [
|
|
446
|
+
harEntry.time = [
|
|
447
|
+
harEntry.timings.dns,
|
|
448
|
+
harEntry.timings.connect,
|
|
449
|
+
harEntry.timings.ssl,
|
|
450
|
+
harEntry.timings.wait,
|
|
451
|
+
harEntry.timings.receive
|
|
452
|
+
].reduce((pre, cur) => (cur || -1) > 0 ? cur + pre : pre, 0);
|
|
404
453
|
}
|
|
405
454
|
async flush() {
|
|
406
455
|
await Promise.all(this._barrierPromises);
|
|
407
456
|
}
|
|
408
457
|
stop() {
|
|
409
458
|
this._started = false;
|
|
410
|
-
|
|
459
|
+
import_eventsHelper.eventsHelper.removeEventListeners(this._eventListeners);
|
|
411
460
|
this._barrierPromises.clear();
|
|
412
|
-
const context = this._context instanceof
|
|
461
|
+
const context = this._context instanceof import_browserContext.BrowserContext ? this._context : void 0;
|
|
413
462
|
const log = {
|
|
414
|
-
version:
|
|
463
|
+
version: "1.2",
|
|
415
464
|
creator: {
|
|
416
|
-
name:
|
|
417
|
-
version: (0,
|
|
465
|
+
name: "Playwright",
|
|
466
|
+
version: (0, import_utils2.getPlaywrightVersion)()
|
|
418
467
|
},
|
|
419
468
|
browser: {
|
|
420
|
-
name:
|
|
421
|
-
version:
|
|
469
|
+
name: context?._browser.options.name || "",
|
|
470
|
+
version: context?._browser.version() || ""
|
|
422
471
|
},
|
|
423
|
-
pages: this._pageEntries.size ? Array.from(this._pageEntries.values()) :
|
|
472
|
+
pages: this._pageEntries.size ? Array.from(this._pageEntries.values()) : void 0,
|
|
424
473
|
entries: []
|
|
425
474
|
};
|
|
426
475
|
if (!this._options.omitTiming) {
|
|
427
476
|
for (const pageEntry of log.pages || []) {
|
|
428
477
|
const startDateTime = pageEntry[startedDateSymbol].valueOf();
|
|
429
|
-
if (typeof pageEntry.pageTimings.onContentLoad ===
|
|
430
|
-
|
|
478
|
+
if (typeof pageEntry.pageTimings.onContentLoad === "number" && pageEntry.pageTimings.onContentLoad >= 0)
|
|
479
|
+
pageEntry.pageTimings.onContentLoad -= startDateTime;
|
|
480
|
+
else
|
|
481
|
+
pageEntry.pageTimings.onContentLoad = -1;
|
|
482
|
+
if (typeof pageEntry.pageTimings.onLoad === "number" && pageEntry.pageTimings.onLoad >= 0)
|
|
483
|
+
pageEntry.pageTimings.onLoad -= startDateTime;
|
|
484
|
+
else
|
|
485
|
+
pageEntry.pageTimings.onLoad = -1;
|
|
431
486
|
}
|
|
432
487
|
}
|
|
433
488
|
this._pageEntries.clear();
|
|
@@ -435,68 +490,68 @@ class HarTracer {
|
|
|
435
490
|
}
|
|
436
491
|
_postDataForRequest(request, content) {
|
|
437
492
|
const postData = request.postDataBuffer();
|
|
438
|
-
if (!postData)
|
|
439
|
-
|
|
493
|
+
if (!postData)
|
|
494
|
+
return;
|
|
495
|
+
const contentType = request.headerValue("content-type");
|
|
440
496
|
return this._postDataForBuffer(postData, contentType, content);
|
|
441
497
|
}
|
|
442
498
|
_postDataForBuffer(postData, contentType, content) {
|
|
443
|
-
if (!postData)
|
|
444
|
-
|
|
499
|
+
if (!postData)
|
|
500
|
+
return;
|
|
501
|
+
contentType ??= "application/octet-stream";
|
|
445
502
|
const result = {
|
|
446
503
|
mimeType: contentType,
|
|
447
|
-
text:
|
|
504
|
+
text: "",
|
|
448
505
|
params: []
|
|
449
506
|
};
|
|
450
|
-
if (content ===
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
507
|
+
if (content === "embed" && contentType !== "application/octet-stream")
|
|
508
|
+
result.text = postData.toString();
|
|
509
|
+
if (content === "attach") {
|
|
510
|
+
const sha1 = (0, import_utils.calculateSha1)(postData) + "." + (import_utilsBundle.mime.getExtension(contentType) || "dat");
|
|
511
|
+
if (this._options.includeTraceInfo)
|
|
512
|
+
result._sha1 = sha1;
|
|
513
|
+
else
|
|
514
|
+
result._file = sha1;
|
|
454
515
|
this._delegate.onContentBlob(sha1, postData);
|
|
455
516
|
}
|
|
456
|
-
if (contentType ===
|
|
517
|
+
if (contentType === "application/x-www-form-urlencoded") {
|
|
457
518
|
const parsed = new URLSearchParams(postData.toString());
|
|
458
|
-
for (const [name, value] of parsed.entries())
|
|
459
|
-
name,
|
|
460
|
-
value
|
|
461
|
-
});
|
|
519
|
+
for (const [name, value] of parsed.entries())
|
|
520
|
+
result.params.push({ name, value });
|
|
462
521
|
}
|
|
463
522
|
return result;
|
|
464
523
|
}
|
|
465
524
|
}
|
|
466
|
-
exports.HarTracer = HarTracer;
|
|
467
525
|
function createHarEntry(method, url, frameref, options) {
|
|
468
526
|
const harEntry = {
|
|
469
|
-
_frameref: options.includeTraceInfo ? frameref :
|
|
470
|
-
_monotonicTime: options.includeTraceInfo ? (0,
|
|
471
|
-
startedDateTime: new Date().toISOString(),
|
|
527
|
+
_frameref: options.includeTraceInfo ? frameref : void 0,
|
|
528
|
+
_monotonicTime: options.includeTraceInfo ? (0, import_utils.monotonicTime)() : void 0,
|
|
529
|
+
startedDateTime: (/* @__PURE__ */ new Date()).toISOString(),
|
|
472
530
|
time: -1,
|
|
473
531
|
request: {
|
|
474
|
-
method
|
|
532
|
+
method,
|
|
475
533
|
url: url.toString(),
|
|
476
534
|
httpVersion: FALLBACK_HTTP_VERSION,
|
|
477
535
|
cookies: [],
|
|
478
536
|
headers: [],
|
|
479
|
-
queryString: [...url.searchParams].map(e => ({
|
|
480
|
-
name: e[0],
|
|
481
|
-
value: e[1]
|
|
482
|
-
})),
|
|
537
|
+
queryString: [...url.searchParams].map((e) => ({ name: e[0], value: e[1] })),
|
|
483
538
|
headersSize: -1,
|
|
484
539
|
bodySize: -1
|
|
485
540
|
},
|
|
486
541
|
response: {
|
|
487
542
|
status: -1,
|
|
488
|
-
statusText:
|
|
543
|
+
statusText: "",
|
|
489
544
|
httpVersion: FALLBACK_HTTP_VERSION,
|
|
490
545
|
cookies: [],
|
|
491
546
|
headers: [],
|
|
492
547
|
content: {
|
|
493
548
|
size: -1,
|
|
494
|
-
mimeType:
|
|
549
|
+
mimeType: "x-unknown"
|
|
495
550
|
},
|
|
496
551
|
headersSize: -1,
|
|
497
552
|
bodySize: -1,
|
|
498
|
-
redirectURL:
|
|
499
|
-
_transferSize: options.omitSizes ?
|
|
553
|
+
redirectURL: "",
|
|
554
|
+
_transferSize: options.omitSizes ? void 0 : -1
|
|
500
555
|
},
|
|
501
556
|
cache: {},
|
|
502
557
|
timings: {
|
|
@@ -509,33 +564,45 @@ function createHarEntry(method, url, frameref, options) {
|
|
|
509
564
|
}
|
|
510
565
|
function parseCookie(c) {
|
|
511
566
|
const cookie = {
|
|
512
|
-
name:
|
|
513
|
-
value:
|
|
567
|
+
name: "",
|
|
568
|
+
value: ""
|
|
514
569
|
};
|
|
515
570
|
let first = true;
|
|
516
571
|
for (const pair of c.split(/; */)) {
|
|
517
|
-
const indexOfEquals = pair.indexOf(
|
|
572
|
+
const indexOfEquals = pair.indexOf("=");
|
|
518
573
|
const name = indexOfEquals !== -1 ? pair.substr(0, indexOfEquals).trim() : pair.trim();
|
|
519
|
-
const value = indexOfEquals !== -1 ? pair.substr(indexOfEquals + 1, pair.length).trim() :
|
|
574
|
+
const value = indexOfEquals !== -1 ? pair.substr(indexOfEquals + 1, pair.length).trim() : "";
|
|
520
575
|
if (first) {
|
|
521
576
|
first = false;
|
|
522
577
|
cookie.name = name;
|
|
523
578
|
cookie.value = value;
|
|
524
579
|
continue;
|
|
525
580
|
}
|
|
526
|
-
if (name ===
|
|
527
|
-
|
|
528
|
-
if (name ===
|
|
529
|
-
|
|
530
|
-
if (name ===
|
|
531
|
-
|
|
532
|
-
if (name ===
|
|
581
|
+
if (name === "Domain")
|
|
582
|
+
cookie.domain = value;
|
|
583
|
+
if (name === "Expires")
|
|
584
|
+
cookie.expires = safeDateToISOString(value);
|
|
585
|
+
if (name === "HttpOnly")
|
|
586
|
+
cookie.httpOnly = true;
|
|
587
|
+
if (name === "Max-Age")
|
|
588
|
+
cookie.expires = safeDateToISOString(Date.now() + +value * 1e3);
|
|
589
|
+
if (name === "Path")
|
|
590
|
+
cookie.path = value;
|
|
591
|
+
if (name === "SameSite")
|
|
592
|
+
cookie.sameSite = value;
|
|
593
|
+
if (name === "Secure")
|
|
594
|
+
cookie.secure = true;
|
|
533
595
|
}
|
|
534
596
|
return cookie;
|
|
535
597
|
}
|
|
536
598
|
function safeDateToISOString(value) {
|
|
537
599
|
try {
|
|
538
600
|
return new Date(value).toISOString();
|
|
539
|
-
} catch (e) {
|
|
601
|
+
} catch (e) {
|
|
602
|
+
}
|
|
540
603
|
}
|
|
541
|
-
const startedDateSymbol = Symbol(
|
|
604
|
+
const startedDateSymbol = Symbol("startedDate");
|
|
605
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
606
|
+
0 && (module.exports = {
|
|
607
|
+
HarTracer
|
|
608
|
+
});
|