patchright-core 1.51.2 → 1.52.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/browsers.json +15 -13
- package/lib/androidServerImpl.js +42 -48
- package/lib/browserServerImpl.js +54 -67
- package/lib/cli/driver.js +71 -69
- package/lib/cli/program.js +312 -328
- package/lib/cli/programWithTestStub.js +51 -45
- package/lib/client/accessibility.js +31 -32
- package/lib/client/android.js +141 -228
- package/lib/client/api.js +135 -283
- package/lib/client/artifact.js +39 -36
- package/lib/client/browser.js +57 -61
- package/lib/client/browserContext.js +297 -326
- package/lib/client/browserType.js +92 -106
- package/lib/client/cdpSession.js +29 -31
- package/lib/client/channelOwner.js +82 -95
- package/lib/client/clientHelper.js +46 -38
- package/lib/client/clientInstrumentation.js +40 -37
- package/lib/client/clientStackTrace.js +41 -37
- package/lib/client/clock.js +36 -36
- package/lib/client/connection.js +190 -212
- package/lib/client/consoleMessage.js +31 -28
- package/lib/client/coverage.js +25 -22
- package/lib/client/dialog.js +30 -31
- package/lib/client/download.js +25 -25
- package/lib/client/electron.js +73 -75
- package/lib/client/elementHandle.js +111 -147
- package/lib/client/errors.js +53 -53
- package/lib/client/eventEmitter.js +124 -121
- package/lib/client/events.js +72 -68
- package/lib/client/fetch.js +135 -158
- package/lib/client/fileChooser.js +25 -24
- package/lib/client/fileUtils.js +31 -28
- package/lib/client/frame.js +187 -306
- package/lib/client/harRouter.js +42 -52
- package/lib/client/input.js +40 -69
- package/lib/client/jsHandle.js +54 -69
- package/lib/client/jsonPipe.js +27 -23
- package/lib/client/localUtils.js +29 -28
- package/lib/client/locator.js +161 -245
- package/lib/client/network.js +277 -295
- package/lib/client/page.js +270 -318
- package/lib/client/platform.js +46 -43
- package/lib/client/playwright.js +51 -66
- package/lib/client/selectors.js +48 -46
- package/lib/client/stream.js +29 -25
- package/lib/client/timeoutSettings.js +49 -39
- package/lib/client/tracing.js +48 -84
- package/lib/client/types.js +26 -22
- package/lib/client/video.js +35 -27
- package/lib/client/waiter.js +69 -88
- package/lib/client/webError.js +25 -23
- package/lib/client/webSocket.js +61 -56
- package/lib/client/worker.js +48 -58
- package/lib/client/writableStream.js +27 -23
- package/lib/generated/clockSource.js +26 -5
- package/lib/generated/consoleApiSource.js +26 -5
- package/lib/generated/injectedScriptSource.js +26 -5
- package/lib/generated/pollingRecorderSource.js +26 -5
- package/lib/generated/utilityScriptSource.js +26 -5
- package/lib/generated/webSocketMockSource.js +375 -4
- package/lib/inProcessFactory.js +53 -53
- package/lib/inprocess.js +2 -19
- package/lib/outofprocess.js +53 -46
- package/lib/protocol/debug.js +209 -25
- package/lib/protocol/serializers.js +153 -134
- package/lib/protocol/validator.js +2714 -2714
- package/lib/protocol/validatorPrimitives.js +114 -73
- package/lib/remote/playwrightConnection.js +140 -157
- package/lib/remote/playwrightServer.js +99 -84
- package/lib/server/accessibility.js +44 -37
- package/lib/server/android/android.js +216 -209
- package/lib/server/android/backendAdb.js +89 -82
- package/lib/server/artifact.js +78 -55
- package/lib/server/bidi/bidiBrowser.js +221 -155
- package/lib/server/bidi/bidiChromium.js +106 -79
- package/lib/server/bidi/bidiConnection.js +66 -83
- package/lib/server/bidi/bidiExecutionContext.js +128 -113
- package/lib/server/bidi/bidiFirefox.js +76 -69
- package/lib/server/bidi/bidiInput.js +86 -97
- package/lib/server/bidi/bidiNetworkManager.js +137 -154
- package/lib/server/bidi/bidiOverCdp.js +57 -58
- package/lib/server/bidi/bidiPage.js +247 -219
- package/lib/server/bidi/bidiPdf.js +52 -86
- package/lib/server/bidi/third_party/bidiCommands.d.js +22 -0
- package/lib/server/bidi/third_party/bidiDeserializer.js +55 -50
- package/lib/server/bidi/third_party/bidiKeyboard.js +236 -220
- package/lib/server/bidi/third_party/bidiProtocol.js +144 -131
- package/lib/server/bidi/third_party/bidiSerializer.js +67 -63
- package/lib/server/bidi/third_party/firefoxPrefs.js +141 -119
- package/lib/server/browser.js +76 -84
- package/lib/server/browserContext.js +321 -346
- package/lib/server/browserType.js +169 -182
- package/lib/server/callLog.js +47 -44
- package/lib/server/chromium/chromium.js +212 -190
- package/lib/server/chromium/chromiumSwitches.js +86 -64
- package/lib/server/chromium/crAccessibility.js +157 -131
- package/lib/server/chromium/crBrowser.js +253 -273
- package/lib/server/chromium/crConnection.js +91 -116
- package/lib/server/chromium/crCoverage.js +113 -127
- package/lib/server/chromium/crDevTools.js +59 -51
- package/lib/server/chromium/crDragDrop.js +62 -79
- package/lib/server/chromium/crExecutionContext.js +88 -83
- package/lib/server/chromium/crInput.js +97 -95
- package/lib/server/chromium/crNetworkManager.js +288 -403
- package/lib/server/chromium/crPage.js +522 -608
- package/lib/server/chromium/crPdf.js +54 -86
- package/lib/server/chromium/crProtocolHelper.js +92 -80
- package/lib/server/chromium/crServiceWorker.js +82 -67
- package/lib/server/chromium/defaultFontFamilies.js +152 -135
- package/lib/server/chromium/protocol.d.js +16 -0
- package/lib/server/chromium/videoRecorder.js +65 -99
- package/lib/server/clock.js +62 -50
- package/lib/server/codegen/csharp.js +185 -160
- package/lib/server/codegen/java.js +155 -128
- package/lib/server/codegen/javascript.js +163 -148
- package/lib/server/codegen/jsonl.js +32 -28
- package/lib/server/codegen/language.js +75 -52
- package/lib/server/codegen/languages.js +65 -27
- package/lib/server/codegen/python.js +140 -125
- package/lib/server/codegen/types.js +15 -4
- package/lib/server/console.js +28 -32
- package/lib/server/cookieStore.js +105 -86
- package/lib/server/debugController.js +97 -124
- package/lib/server/debugger.js +82 -78
- package/lib/server/deviceDescriptors.js +37 -24
- package/lib/server/deviceDescriptorsSource.json +50 -50
- package/lib/server/dialog.js +36 -35
- package/lib/server/dispatchers/androidDispatcher.js +196 -107
- package/lib/server/dispatchers/artifactDispatcher.js +62 -62
- package/lib/server/dispatchers/browserContextDispatcher.js +176 -205
- package/lib/server/dispatchers/browserDispatcher.js +78 -97
- package/lib/server/dispatchers/browserTypeDispatcher.js +35 -35
- package/lib/server/dispatchers/cdpSessionDispatcher.js +32 -36
- package/lib/server/dispatchers/debugControllerDispatcher.js +48 -66
- package/lib/server/dispatchers/dialogDispatcher.js +30 -27
- package/lib/server/dispatchers/dispatcher.js +169 -220
- package/lib/server/dispatchers/electronDispatcher.js +54 -57
- package/lib/server/dispatchers/elementHandlerDispatcher.js +77 -119
- package/lib/server/dispatchers/frameDispatcher.js +99 -163
- package/lib/server/dispatchers/jsHandleDispatcher.js +49 -66
- package/lib/server/dispatchers/jsonPipeDispatcher.js +35 -36
- package/lib/server/dispatchers/localUtilsDispatcher.js +95 -80
- package/lib/server/dispatchers/networkDispatchers.js +90 -107
- package/lib/server/dispatchers/pageDispatcher.js +128 -169
- package/lib/server/dispatchers/playwrightDispatcher.js +69 -76
- package/lib/server/dispatchers/selectorsDispatcher.js +28 -24
- package/lib/server/dispatchers/streamDispatcher.js +42 -45
- package/lib/server/dispatchers/tracingDispatcher.js +36 -41
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +96 -131
- package/lib/server/dispatchers/writableStreamDispatcher.js +54 -38
- package/lib/server/dom.js +413 -443
- package/lib/server/download.js +45 -35
- package/lib/server/electron/electron.js +156 -176
- package/lib/server/electron/loader.js +8 -36
- package/lib/server/errors.js +47 -46
- package/lib/server/fetch.js +289 -323
- package/lib/server/fileChooser.js +25 -24
- package/lib/server/fileUploadUtils.js +65 -59
- package/lib/server/firefox/ffAccessibility.js +153 -131
- package/lib/server/firefox/ffBrowser.js +213 -277
- package/lib/server/firefox/ffConnection.js +63 -84
- package/lib/server/firefox/ffExecutionContext.js +91 -73
- package/lib/server/firefox/ffInput.js +67 -69
- package/lib/server/firefox/ffNetworkManager.js +131 -110
- package/lib/server/firefox/ffPage.js +236 -273
- package/lib/server/firefox/firefox.js +76 -67
- package/lib/server/firefox/protocol.d.js +16 -0
- package/lib/server/formData.js +107 -35
- package/lib/server/frameSelectors.js +77 -111
- package/lib/server/frames.js +741 -891
- package/lib/server/har/harRecorder.js +85 -77
- package/lib/server/har/harTracer.js +287 -222
- package/lib/server/harBackend.js +80 -80
- package/lib/server/helper.js +56 -59
- package/lib/server/index.js +59 -99
- package/lib/server/input.js +134 -163
- package/lib/server/instrumentation.js +49 -44
- package/lib/server/javascript.js +143 -134
- package/lib/server/launchApp.js +92 -73
- package/lib/server/localUtils.js +130 -122
- package/lib/server/macEditingCommands.js +141 -137
- package/lib/server/network.js +262 -296
- package/lib/server/page.js +329 -426
- package/lib/server/pageBinding.js +88 -0
- package/lib/server/pipeTransport.js +49 -45
- package/lib/server/playwright.js +60 -67
- package/lib/server/progress.js +56 -51
- package/lib/server/protocolError.js +34 -31
- package/lib/server/recorder/chat.js +70 -86
- package/lib/server/recorder/contextRecorder.js +134 -138
- package/lib/server/recorder/recorderApp.js +127 -136
- package/lib/server/recorder/recorderCollection.js +56 -44
- package/lib/server/recorder/recorderFrontend.js +15 -4
- package/lib/server/recorder/recorderRunner.js +79 -103
- package/lib/server/recorder/recorderUtils.js +56 -45
- package/lib/server/recorder/throttledFile.js +42 -30
- package/lib/server/recorder.js +177 -186
- package/lib/server/registry/browserFetcher.js +106 -101
- package/lib/server/registry/dependencies.js +245 -196
- package/lib/server/registry/index.js +904 -792
- package/lib/server/registry/nativeDeps.js +1073 -464
- package/lib/server/registry/oopDownloadBrowserMain.js +57 -75
- package/lib/server/screenshotter.js +166 -182
- package/lib/server/selectors.js +85 -46
- package/lib/server/socksClientCertificatesInterceptor.js +166 -185
- package/lib/server/socksInterceptor.js +62 -70
- package/lib/server/storageScript.js +94 -100
- package/lib/server/timeoutSettings.js +58 -43
- package/lib/server/trace/recorder/snapshotter.js +70 -89
- package/lib/server/trace/recorder/snapshotterInjected.js +238 -217
- package/lib/server/trace/recorder/tracing.js +321 -333
- package/lib/server/trace/test/inMemorySnapshotter.js +46 -52
- package/lib/server/trace/viewer/traceViewer.js +168 -146
- package/lib/server/transport.js +124 -133
- package/lib/server/types.js +26 -22
- package/lib/server/usKeyboardLayout.js +135 -545
- package/lib/server/utils/ascii.js +39 -26
- package/lib/server/utils/comparators.js +105 -103
- package/lib/server/utils/crypto.js +157 -112
- package/lib/server/utils/debug.js +37 -28
- package/lib/server/utils/debugLogger.js +69 -48
- package/lib/server/utils/env.js +52 -37
- package/lib/server/utils/eventsHelper.js +29 -28
- package/lib/server/utils/expectUtils.js +31 -26
- package/lib/server/utils/fileUtils.js +123 -136
- package/lib/server/utils/happyEyeballs.js +138 -123
- package/lib/server/utils/hostPlatform.js +84 -120
- package/lib/server/utils/httpServer.js +106 -121
- package/lib/server/utils/image_tools/colorUtils.js +42 -51
- package/lib/server/utils/image_tools/compare.js +44 -43
- package/lib/server/utils/image_tools/imageChannel.js +38 -30
- package/lib/server/utils/image_tools/stats.js +40 -40
- package/lib/server/utils/linuxUtils.js +50 -37
- package/lib/server/utils/network.js +143 -86
- package/lib/server/utils/nodePlatform.js +87 -79
- package/lib/server/utils/pipeTransport.js +44 -42
- package/lib/server/utils/processLauncher.js +111 -121
- package/lib/server/utils/profiler.js +52 -39
- package/lib/server/utils/socksProxy.js +280 -339
- package/lib/server/utils/spawnAsync.js +37 -41
- package/lib/server/utils/task.js +31 -38
- package/lib/server/utils/userAgent.js +73 -66
- package/lib/server/utils/wsServer.js +73 -69
- package/lib/server/utils/zipFile.js +36 -37
- package/lib/server/utils/zones.js +37 -34
- package/lib/server/webkit/protocol.d.js +16 -0
- package/lib/server/webkit/webkit.js +76 -63
- package/lib/server/webkit/wkAccessibility.js +161 -118
- package/lib/server/webkit/wkBrowser.js +159 -176
- package/lib/server/webkit/wkConnection.js +59 -83
- package/lib/server/webkit/wkExecutionContext.js +84 -70
- package/lib/server/webkit/wkInput.js +82 -80
- package/lib/server/webkit/wkInterceptableRequest.js +102 -95
- package/lib/server/webkit/wkPage.js +525 -619
- package/lib/server/webkit/wkProvisionalPage.js +45 -56
- package/lib/server/webkit/wkWorkers.js +77 -77
- package/lib/utils/isomorphic/ariaSnapshot.js +144 -152
- package/lib/utils/isomorphic/assert.js +28 -22
- package/lib/utils/isomorphic/builtins.js +90 -0
- package/lib/utils/isomorphic/colors.js +66 -59
- package/lib/utils/isomorphic/cssParser.js +121 -125
- package/lib/utils/isomorphic/cssTokenizer.js +436 -364
- package/lib/utils/isomorphic/headers.js +38 -37
- package/lib/utils/isomorphic/locatorGenerators.js +340 -357
- package/lib/utils/isomorphic/locatorParser.js +96 -105
- package/lib/utils/isomorphic/locatorUtils.js +63 -44
- package/lib/utils/isomorphic/manualPromise.js +47 -39
- package/lib/utils/isomorphic/mimeType.js +448 -25
- package/lib/utils/isomorphic/multimap.js +35 -27
- package/lib/utils/isomorphic/rtti.js +35 -33
- package/lib/utils/isomorphic/selectorParser.js +183 -193
- package/lib/utils/isomorphic/semaphore.js +27 -24
- package/lib/utils/isomorphic/stackTrace.js +87 -98
- package/lib/utils/isomorphic/stringUtils.js +113 -106
- package/lib/utils/isomorphic/time.js +41 -22
- package/lib/utils/isomorphic/timeoutRunner.js +55 -54
- package/lib/utils/isomorphic/traceUtils.js +38 -41
- package/lib/utils/isomorphic/types.js +15 -4
- package/lib/utils/isomorphic/urlMatch.js +112 -67
- package/lib/utils/isomorphic/utilityScriptSerializers.js +248 -0
- package/lib/utils.js +97 -443
- package/lib/utilsBundle.js +101 -52
- package/lib/vite/htmlReport/index.html +21 -15
- package/lib/vite/recorder/assets/{codeMirrorModule-B9YMkrwa.js → codeMirrorModule-DVQi6prl.js} +1 -1
- package/lib/vite/recorder/assets/index-97EUAAbk.js +184 -0
- package/lib/vite/recorder/index.html +1 -1
- package/lib/vite/traceViewer/assets/{codeMirrorModule-DpJ-EmBQ.js → codeMirrorModule-dvXVzLxY.js} +1 -1
- package/lib/vite/traceViewer/assets/defaultSettingsView-BjymbO6M.js +265 -0
- package/lib/vite/traceViewer/{defaultSettingsView.5fN5lw10.css → defaultSettingsView.QdHITyLI.css} +1 -1
- package/lib/vite/traceViewer/index.ChIUCJnj.js +2 -0
- package/lib/vite/traceViewer/index.html +3 -3
- package/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/lib/vite/traceViewer/uiMode.jUCiCtdp.js +5 -0
- package/lib/zipBundle.js +32 -23
- package/package.json +1 -1
- package/types/protocol.d.ts +436 -17
- package/types/types.d.ts +35 -16
- package/lib/server/isomorphic/utilityScriptSerializers.js +0 -229
- package/lib/vite/recorder/assets/index-ELPgmkwA.js +0 -184
- package/lib/vite/traceViewer/assets/defaultSettingsView-DTenqiGw.js +0 -259
- package/lib/vite/traceViewer/index.CUq7VgrV.js +0 -2
- package/lib/vite/traceViewer/uiMode.CHJSAD7F.js +0 -5
|
@@ -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,64 @@ 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
|
+
);
|
|
73
88
|
}
|
|
74
89
|
}
|
|
75
90
|
_shouldIncludeEntryWithUrl(urlString) {
|
|
76
|
-
return !this._options.urlFilter || (0,
|
|
91
|
+
return !this._options.urlFilter || (0, import_utils2.urlMatches)(this._baseURL, urlString, this._options.urlFilter);
|
|
77
92
|
}
|
|
78
93
|
_entryForRequest(request) {
|
|
79
94
|
return request[this._entrySymbol];
|
|
80
95
|
}
|
|
81
96
|
_createPageEntryIfNeeded(page) {
|
|
82
|
-
if (!page)
|
|
83
|
-
|
|
84
|
-
if (this.
|
|
97
|
+
if (!page)
|
|
98
|
+
return;
|
|
99
|
+
if (this._options.omitPages)
|
|
100
|
+
return;
|
|
101
|
+
if (this._page && page !== this._page)
|
|
102
|
+
return;
|
|
85
103
|
let pageEntry = this._pageEntries.get(page);
|
|
86
104
|
if (!pageEntry) {
|
|
87
|
-
const date = new Date();
|
|
105
|
+
const date = /* @__PURE__ */ new Date();
|
|
88
106
|
pageEntry = {
|
|
89
107
|
startedDateTime: date.toISOString(),
|
|
90
108
|
id: page.guid,
|
|
91
|
-
title:
|
|
109
|
+
title: "",
|
|
92
110
|
pageTimings: this._options.omitTiming ? {} : {
|
|
93
111
|
onContentLoad: -1,
|
|
94
112
|
onLoad: -1
|
|
95
113
|
}
|
|
96
114
|
};
|
|
97
115
|
pageEntry[startedDateSymbol] = date;
|
|
98
|
-
page.mainFrame().on(
|
|
99
|
-
if (event ===
|
|
100
|
-
|
|
116
|
+
page.mainFrame().on(import_frames.Frame.Events.AddLifecycle, (event) => {
|
|
117
|
+
if (event === "load")
|
|
118
|
+
this._onLoad(page, pageEntry);
|
|
119
|
+
if (event === "domcontentloaded")
|
|
120
|
+
this._onDOMContentLoaded(page, pageEntry);
|
|
101
121
|
});
|
|
102
122
|
this._pageEntries.set(page, pageEntry);
|
|
103
123
|
}
|
|
@@ -109,13 +129,12 @@ class HarTracer {
|
|
|
109
129
|
title: document.title,
|
|
110
130
|
domContentLoaded: performance.timing.domContentLoadedEventStart
|
|
111
131
|
};
|
|
112
|
-
}), {
|
|
113
|
-
isFunction: true,
|
|
114
|
-
world: 'utility'
|
|
115
|
-
}).then(result => {
|
|
132
|
+
}), { isFunction: true, world: "utility" }).then((result) => {
|
|
116
133
|
pageEntry.title = result.title;
|
|
117
|
-
if (!this._options.omitTiming)
|
|
118
|
-
|
|
134
|
+
if (!this._options.omitTiming)
|
|
135
|
+
pageEntry.pageTimings.onContentLoad = result.domContentLoaded;
|
|
136
|
+
}).catch(() => {
|
|
137
|
+
});
|
|
119
138
|
this._addBarrier(page, promise);
|
|
120
139
|
}
|
|
121
140
|
_onLoad(page, pageEntry) {
|
|
@@ -124,45 +143,46 @@ class HarTracer {
|
|
|
124
143
|
title: document.title,
|
|
125
144
|
loaded: performance.timing.loadEventStart
|
|
126
145
|
};
|
|
127
|
-
}), {
|
|
128
|
-
isFunction: true,
|
|
129
|
-
world: 'utility'
|
|
130
|
-
}).then(result => {
|
|
146
|
+
}), { isFunction: true, world: "utility" }).then((result) => {
|
|
131
147
|
pageEntry.title = result.title;
|
|
132
|
-
if (!this._options.omitTiming)
|
|
133
|
-
|
|
148
|
+
if (!this._options.omitTiming)
|
|
149
|
+
pageEntry.pageTimings.onLoad = result.loaded;
|
|
150
|
+
}).catch(() => {
|
|
151
|
+
});
|
|
134
152
|
this._addBarrier(page, promise);
|
|
135
153
|
}
|
|
136
154
|
_addBarrier(target, promise) {
|
|
137
|
-
if (!target)
|
|
138
|
-
|
|
155
|
+
if (!target)
|
|
156
|
+
return null;
|
|
157
|
+
if (!this._options.waitForContentOnStop)
|
|
158
|
+
return;
|
|
139
159
|
const race = target.openScope.safeRace(promise);
|
|
140
160
|
this._barrierPromises.add(race);
|
|
141
161
|
race.then(() => this._barrierPromises.delete(race));
|
|
142
162
|
}
|
|
143
163
|
_onAPIRequest(event) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
const harEntry = createHarEntry(event.method, event.url,
|
|
164
|
+
if (!this._shouldIncludeEntryWithUrl(event.url.toString()))
|
|
165
|
+
return;
|
|
166
|
+
const harEntry = createHarEntry(event.method, event.url, void 0, this._options);
|
|
147
167
|
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;
|
|
168
|
+
if (!this._options.omitCookies)
|
|
169
|
+
harEntry.request.cookies = event.cookies;
|
|
170
|
+
harEntry.request.headers = Object.entries(event.headers).map(([name, value]) => ({ name, value }));
|
|
171
|
+
harEntry.request.postData = this._postDataForBuffer(event.postData || null, event.headers["content-type"], this._options.content);
|
|
172
|
+
if (!this._options.omitSizes)
|
|
173
|
+
harEntry.request.bodySize = event.postData?.length || 0;
|
|
155
174
|
event[this._entrySymbol] = harEntry;
|
|
156
|
-
if (this._started)
|
|
175
|
+
if (this._started)
|
|
176
|
+
this._delegate.onEntryStarted(harEntry);
|
|
157
177
|
}
|
|
158
178
|
_onAPIRequestFinished(event) {
|
|
159
|
-
var _event$body$length, _event$body;
|
|
160
179
|
const harEntry = this._entryForRequest(event.requestEvent);
|
|
161
|
-
if (!harEntry)
|
|
180
|
+
if (!harEntry)
|
|
181
|
+
return;
|
|
162
182
|
harEntry.response.status = event.statusCode;
|
|
163
183
|
harEntry.response.statusText = event.statusMessage;
|
|
164
184
|
harEntry.response.httpVersion = event.httpVersion;
|
|
165
|
-
harEntry.response.redirectURL = event.headers.location ||
|
|
185
|
+
harEntry.response.redirectURL = event.headers.location || "";
|
|
166
186
|
if (!this._options.omitServerIP) {
|
|
167
187
|
harEntry.serverIPAddress = event.serverIPAddress;
|
|
168
188
|
harEntry._serverPort = event.serverPort;
|
|
@@ -171,178 +191,199 @@ class HarTracer {
|
|
|
171
191
|
harEntry.timings = event.timings;
|
|
172
192
|
this._computeHarEntryTotalTime(harEntry);
|
|
173
193
|
}
|
|
174
|
-
if (!this._options.omitSecurityDetails)
|
|
194
|
+
if (!this._options.omitSecurityDetails)
|
|
195
|
+
harEntry._securityDetails = event.securityDetails;
|
|
175
196
|
for (let i = 0; i < event.rawHeaders.length; i += 2) {
|
|
176
197
|
harEntry.response.headers.push({
|
|
177
198
|
name: event.rawHeaders[i],
|
|
178
199
|
value: event.rawHeaders[i + 1]
|
|
179
200
|
});
|
|
180
201
|
}
|
|
181
|
-
harEntry.response.cookies = this._options.omitCookies ? [] : event.cookies.map(c => {
|
|
202
|
+
harEntry.response.cookies = this._options.omitCookies ? [] : event.cookies.map((c) => {
|
|
182
203
|
return {
|
|
183
204
|
...c,
|
|
184
|
-
expires: c.expires === -1 ?
|
|
205
|
+
expires: c.expires === -1 ? void 0 : safeDateToISOString(c.expires)
|
|
185
206
|
};
|
|
186
207
|
});
|
|
187
208
|
const content = harEntry.response.content;
|
|
188
|
-
const contentType = event.headers[
|
|
189
|
-
if (contentType)
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
if (this.
|
|
209
|
+
const contentType = event.headers["content-type"];
|
|
210
|
+
if (contentType)
|
|
211
|
+
content.mimeType = contentType;
|
|
212
|
+
this._storeResponseContent(event.body, content, "other");
|
|
213
|
+
if (!this._options.omitSizes)
|
|
214
|
+
harEntry.response.bodySize = event.body?.length ?? 0;
|
|
215
|
+
if (this._started)
|
|
216
|
+
this._delegate.onEntryFinished(harEntry);
|
|
193
217
|
}
|
|
194
218
|
_onRequest(request) {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
const page =
|
|
198
|
-
if (this._page && page !== this._page)
|
|
219
|
+
if (!this._shouldIncludeEntryWithUrl(request.url()))
|
|
220
|
+
return;
|
|
221
|
+
const page = request.frame()?._page;
|
|
222
|
+
if (this._page && page !== this._page)
|
|
223
|
+
return;
|
|
199
224
|
const url = network.parseURL(request.url());
|
|
200
|
-
if (!url)
|
|
225
|
+
if (!url)
|
|
226
|
+
return;
|
|
201
227
|
const pageEntry = this._createPageEntryIfNeeded(page);
|
|
202
|
-
const harEntry = createHarEntry(request.method(), url,
|
|
203
|
-
if (pageEntry)
|
|
228
|
+
const harEntry = createHarEntry(request.method(), url, request.frame()?.guid, this._options);
|
|
229
|
+
if (pageEntry)
|
|
230
|
+
harEntry.pageref = pageEntry.id;
|
|
204
231
|
this._recordRequestHeadersAndCookies(harEntry, request.headers());
|
|
205
232
|
harEntry.request.postData = this._postDataForRequest(request, this._options.content);
|
|
206
|
-
if (!this._options.omitSizes)
|
|
233
|
+
if (!this._options.omitSizes)
|
|
234
|
+
harEntry.request.bodySize = request.bodySize();
|
|
207
235
|
if (request.redirectedFrom()) {
|
|
208
236
|
const fromEntry = this._entryForRequest(request.redirectedFrom());
|
|
209
|
-
if (fromEntry)
|
|
237
|
+
if (fromEntry)
|
|
238
|
+
fromEntry.response.redirectURL = request.url();
|
|
210
239
|
}
|
|
211
240
|
request[this._entrySymbol] = harEntry;
|
|
212
|
-
(0,
|
|
241
|
+
(0, import_utils.assert)(this._started);
|
|
213
242
|
this._delegate.onEntryStarted(harEntry);
|
|
214
243
|
}
|
|
215
244
|
_recordRequestHeadersAndCookies(harEntry, headers) {
|
|
216
245
|
if (!this._options.omitCookies) {
|
|
217
246
|
harEntry.request.cookies = [];
|
|
218
|
-
for (const header of headers.filter(
|
|
247
|
+
for (const header of headers.filter((header2) => header2.name.toLowerCase() === "cookie"))
|
|
248
|
+
harEntry.request.cookies.push(...header.value.split(";").map(parseCookie));
|
|
219
249
|
}
|
|
220
250
|
harEntry.request.headers = headers;
|
|
221
251
|
}
|
|
222
252
|
_recordRequestOverrides(harEntry, request) {
|
|
223
|
-
if (!request._hasOverrides() || !this._options.recordRequestOverrides)
|
|
253
|
+
if (!request._hasOverrides() || !this._options.recordRequestOverrides)
|
|
254
|
+
return;
|
|
224
255
|
harEntry.request.method = request.method();
|
|
225
256
|
harEntry.request.url = request.url();
|
|
226
257
|
harEntry.request.postData = this._postDataForRequest(request, this._options.content);
|
|
227
258
|
this._recordRequestHeadersAndCookies(harEntry, request.headers());
|
|
228
259
|
}
|
|
229
260
|
async _onRequestFinished(request, response) {
|
|
230
|
-
|
|
231
|
-
|
|
261
|
+
if (!response)
|
|
262
|
+
return;
|
|
232
263
|
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.
|
|
264
|
+
if (!harEntry)
|
|
265
|
+
return;
|
|
266
|
+
const page = request.frame()?._page;
|
|
238
267
|
if (!this._options.omitServerIP) {
|
|
239
|
-
this._addBarrier(page || request.serviceWorker(), response.serverAddr().then(server => {
|
|
240
|
-
if (server
|
|
241
|
-
|
|
268
|
+
this._addBarrier(page || request.serviceWorker(), response.serverAddr().then((server) => {
|
|
269
|
+
if (server?.ipAddress)
|
|
270
|
+
harEntry.serverIPAddress = server.ipAddress;
|
|
271
|
+
if (server?.port)
|
|
272
|
+
harEntry._serverPort = server.port;
|
|
242
273
|
}));
|
|
243
274
|
}
|
|
244
275
|
if (!this._options.omitSecurityDetails) {
|
|
245
|
-
this._addBarrier(page || request.serviceWorker(), response.securityDetails().then(details => {
|
|
246
|
-
if (details)
|
|
276
|
+
this._addBarrier(page || request.serviceWorker(), response.securityDetails().then((details) => {
|
|
277
|
+
if (details)
|
|
278
|
+
harEntry._securityDetails = details;
|
|
247
279
|
}));
|
|
248
280
|
}
|
|
249
281
|
const httpVersion = response.httpVersion();
|
|
250
282
|
harEntry.request.httpVersion = httpVersion;
|
|
251
283
|
harEntry.response.httpVersion = httpVersion;
|
|
252
|
-
const compressionCalculationBarrier = this._options.omitSizes ?
|
|
284
|
+
const compressionCalculationBarrier = this._options.omitSizes ? void 0 : {
|
|
253
285
|
_encodedBodySize: -1,
|
|
254
286
|
_decodedBodySize: -1,
|
|
255
|
-
barrier: new
|
|
256
|
-
_check: function
|
|
287
|
+
barrier: new import_manualPromise.ManualPromise(),
|
|
288
|
+
_check: function() {
|
|
257
289
|
if (this._encodedBodySize !== -1 && this._decodedBodySize !== -1) {
|
|
258
290
|
harEntry.response.content.compression = Math.max(0, this._decodedBodySize - this._encodedBodySize);
|
|
259
291
|
this.barrier.resolve();
|
|
260
292
|
}
|
|
261
293
|
},
|
|
262
|
-
setEncodedBodySize: function
|
|
294
|
+
setEncodedBodySize: function(encodedBodySize) {
|
|
263
295
|
this._encodedBodySize = encodedBodySize;
|
|
264
296
|
this._check();
|
|
265
297
|
},
|
|
266
|
-
setDecodedBodySize: function
|
|
298
|
+
setDecodedBodySize: function(decodedBodySize) {
|
|
267
299
|
this._decodedBodySize = decodedBodySize;
|
|
268
300
|
this._check();
|
|
269
301
|
}
|
|
270
302
|
};
|
|
271
|
-
if (compressionCalculationBarrier)
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
303
|
+
if (compressionCalculationBarrier)
|
|
304
|
+
this._addBarrier(page || request.serviceWorker(), compressionCalculationBarrier.barrier);
|
|
305
|
+
const promise = response.body().then((buffer) => {
|
|
306
|
+
if (this._options.omitScripts && request.resourceType() === "script") {
|
|
307
|
+
compressionCalculationBarrier?.setDecodedBodySize(0);
|
|
275
308
|
return;
|
|
276
309
|
}
|
|
277
310
|
const content = harEntry.response.content;
|
|
278
|
-
compressionCalculationBarrier
|
|
311
|
+
compressionCalculationBarrier?.setDecodedBodySize(buffer.length);
|
|
279
312
|
this._storeResponseContent(buffer, content, request.resourceType());
|
|
280
313
|
}).catch(() => {
|
|
281
|
-
compressionCalculationBarrier
|
|
314
|
+
compressionCalculationBarrier?.setDecodedBodySize(0);
|
|
282
315
|
}).then(() => {
|
|
283
|
-
if (this._started)
|
|
316
|
+
if (this._started)
|
|
317
|
+
this._delegate.onEntryFinished(harEntry);
|
|
284
318
|
});
|
|
285
319
|
this._addBarrier(page || request.serviceWorker(), promise);
|
|
286
|
-
|
|
287
|
-
// Response end timing is only available after the response event was received.
|
|
288
320
|
const timing = response.timing();
|
|
289
|
-
harEntry.timings.receive = response.request()._responseEndTiming !== -1 ?
|
|
321
|
+
harEntry.timings.receive = response.request()._responseEndTiming !== -1 ? import_helper.helper.millisToRoundishMillis(response.request()._responseEndTiming - timing.responseStart) : -1;
|
|
290
322
|
this._computeHarEntryTotalTime(harEntry);
|
|
291
323
|
if (!this._options.omitSizes) {
|
|
292
|
-
this._addBarrier(page || request.serviceWorker(), response.sizes().then(sizes => {
|
|
324
|
+
this._addBarrier(page || request.serviceWorker(), response.sizes().then((sizes) => {
|
|
293
325
|
harEntry.response.bodySize = sizes.responseBodySize;
|
|
294
326
|
harEntry.response.headersSize = sizes.responseHeadersSize;
|
|
295
327
|
harEntry.response._transferSize = sizes.transferSize;
|
|
296
328
|
harEntry.request.headersSize = sizes.requestHeadersSize;
|
|
297
|
-
compressionCalculationBarrier
|
|
329
|
+
compressionCalculationBarrier?.setEncodedBodySize(sizes.responseBodySize);
|
|
298
330
|
}));
|
|
299
331
|
}
|
|
300
332
|
}
|
|
301
333
|
async _onRequestFailed(request) {
|
|
302
334
|
const harEntry = this._entryForRequest(request);
|
|
303
|
-
if (!harEntry)
|
|
304
|
-
|
|
335
|
+
if (!harEntry)
|
|
336
|
+
return;
|
|
337
|
+
if (request._failureText !== null)
|
|
338
|
+
harEntry.response._failureText = request._failureText;
|
|
305
339
|
this._recordRequestOverrides(harEntry, request);
|
|
306
|
-
if (this._started)
|
|
340
|
+
if (this._started)
|
|
341
|
+
this._delegate.onEntryFinished(harEntry);
|
|
307
342
|
}
|
|
308
343
|
_onRequestAborted(request) {
|
|
309
344
|
const harEntry = this._entryForRequest(request);
|
|
310
|
-
if (harEntry)
|
|
345
|
+
if (harEntry)
|
|
346
|
+
harEntry._wasAborted = true;
|
|
311
347
|
}
|
|
312
348
|
_onRequestFulfilled(request) {
|
|
313
349
|
const harEntry = this._entryForRequest(request);
|
|
314
|
-
if (harEntry)
|
|
350
|
+
if (harEntry)
|
|
351
|
+
harEntry._wasFulfilled = true;
|
|
315
352
|
}
|
|
316
353
|
_onRequestContinued(request) {
|
|
317
354
|
const harEntry = this._entryForRequest(request);
|
|
318
|
-
if (harEntry)
|
|
355
|
+
if (harEntry)
|
|
356
|
+
harEntry._wasContinued = true;
|
|
319
357
|
}
|
|
320
358
|
_storeResponseContent(buffer, content, resourceType) {
|
|
321
359
|
if (!buffer) {
|
|
322
360
|
content.size = 0;
|
|
323
361
|
return;
|
|
324
362
|
}
|
|
325
|
-
if (!this._options.omitSizes)
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
if ((0, _utils.isTextualMimeType)(content.mimeType) && resourceType !== 'font') {
|
|
363
|
+
if (!this._options.omitSizes)
|
|
364
|
+
content.size = buffer.length;
|
|
365
|
+
if (this._options.content === "embed") {
|
|
366
|
+
if ((0, import_utils2.isTextualMimeType)(content.mimeType) && resourceType !== "font") {
|
|
330
367
|
content.text = buffer.toString();
|
|
331
368
|
} else {
|
|
332
|
-
content.text = buffer.toString(
|
|
333
|
-
content.encoding =
|
|
369
|
+
content.text = buffer.toString("base64");
|
|
370
|
+
content.encoding = "base64";
|
|
334
371
|
}
|
|
335
|
-
} else if (this._options.content ===
|
|
336
|
-
const sha1 = (0,
|
|
337
|
-
if (this._options.includeTraceInfo)
|
|
338
|
-
|
|
372
|
+
} else if (this._options.content === "attach") {
|
|
373
|
+
const sha1 = (0, import_utils.calculateSha1)(buffer) + "." + (import_utilsBundle.mime.getExtension(content.mimeType) || "dat");
|
|
374
|
+
if (this._options.includeTraceInfo)
|
|
375
|
+
content._sha1 = sha1;
|
|
376
|
+
else
|
|
377
|
+
content._file = sha1;
|
|
378
|
+
if (this._started)
|
|
379
|
+
this._delegate.onContentBlob(sha1, buffer);
|
|
339
380
|
}
|
|
340
381
|
}
|
|
341
382
|
_onResponse(response) {
|
|
342
|
-
var _response$frame;
|
|
343
383
|
const harEntry = this._entryForRequest(response.request());
|
|
344
|
-
if (!harEntry)
|
|
345
|
-
|
|
384
|
+
if (!harEntry)
|
|
385
|
+
return;
|
|
386
|
+
const page = response.frame()?._page;
|
|
346
387
|
const pageEntry = this._createPageEntryIfNeeded(page);
|
|
347
388
|
const request = response.request();
|
|
348
389
|
harEntry.response = {
|
|
@@ -354,21 +395,22 @@ class HarTracer {
|
|
|
354
395
|
headers: [],
|
|
355
396
|
content: {
|
|
356
397
|
size: -1,
|
|
357
|
-
mimeType:
|
|
398
|
+
mimeType: "x-unknown"
|
|
358
399
|
},
|
|
359
400
|
headersSize: -1,
|
|
360
401
|
bodySize: -1,
|
|
361
|
-
redirectURL:
|
|
362
|
-
_transferSize: this._options.omitSizes ?
|
|
402
|
+
redirectURL: "",
|
|
403
|
+
_transferSize: this._options.omitSizes ? void 0 : -1
|
|
363
404
|
};
|
|
364
405
|
if (!this._options.omitTiming) {
|
|
365
406
|
const startDateTime = pageEntry ? pageEntry[startedDateSymbol].valueOf() : 0;
|
|
366
407
|
const timing = response.timing();
|
|
367
|
-
if (pageEntry && startDateTime > timing.startTime)
|
|
368
|
-
|
|
369
|
-
const
|
|
370
|
-
const
|
|
371
|
-
const
|
|
408
|
+
if (pageEntry && startDateTime > timing.startTime)
|
|
409
|
+
pageEntry.startedDateTime = new Date(timing.startTime).toISOString();
|
|
410
|
+
const dns = timing.domainLookupEnd !== -1 ? import_helper.helper.millisToRoundishMillis(timing.domainLookupEnd - timing.domainLookupStart) : -1;
|
|
411
|
+
const connect = timing.connectEnd !== -1 ? import_helper.helper.millisToRoundishMillis(timing.connectEnd - timing.connectStart) : -1;
|
|
412
|
+
const ssl = timing.connectEnd !== -1 ? import_helper.helper.millisToRoundishMillis(timing.connectEnd - timing.secureConnectionStart) : -1;
|
|
413
|
+
const wait = timing.responseStart !== -1 ? import_helper.helper.millisToRoundishMillis(timing.responseStart - timing.requestStart) : -1;
|
|
372
414
|
const receive = -1;
|
|
373
415
|
harEntry.timings = {
|
|
374
416
|
dns,
|
|
@@ -381,53 +423,64 @@ class HarTracer {
|
|
|
381
423
|
this._computeHarEntryTotalTime(harEntry);
|
|
382
424
|
}
|
|
383
425
|
this._recordRequestOverrides(harEntry, request);
|
|
384
|
-
this._addBarrier(page || request.serviceWorker(), request.rawRequestHeaders().then(headers => {
|
|
426
|
+
this._addBarrier(page || request.serviceWorker(), request.rawRequestHeaders().then((headers) => {
|
|
385
427
|
this._recordRequestHeadersAndCookies(harEntry, headers);
|
|
386
428
|
}));
|
|
387
|
-
// Record available headers including redirect location in case the tracing is stopped before
|
|
388
|
-
// response extra info is received (in Chromium).
|
|
389
429
|
this._recordResponseHeaders(harEntry, response.headers());
|
|
390
|
-
this._addBarrier(page || request.serviceWorker(), response.rawResponseHeaders().then(headers => {
|
|
430
|
+
this._addBarrier(page || request.serviceWorker(), response.rawResponseHeaders().then((headers) => {
|
|
391
431
|
this._recordResponseHeaders(harEntry, headers);
|
|
392
432
|
}));
|
|
393
433
|
}
|
|
394
434
|
_recordResponseHeaders(harEntry, headers) {
|
|
395
435
|
if (!this._options.omitCookies) {
|
|
396
|
-
harEntry.response.cookies = headers.filter(header => header.name.toLowerCase() ===
|
|
436
|
+
harEntry.response.cookies = headers.filter((header) => header.name.toLowerCase() === "set-cookie").map((header) => parseCookie(header.value));
|
|
397
437
|
}
|
|
398
438
|
harEntry.response.headers = headers;
|
|
399
|
-
const contentType = headers.find(header => header.name.toLowerCase() ===
|
|
400
|
-
if (contentType)
|
|
439
|
+
const contentType = headers.find((header) => header.name.toLowerCase() === "content-type");
|
|
440
|
+
if (contentType)
|
|
441
|
+
harEntry.response.content.mimeType = contentType.value;
|
|
401
442
|
}
|
|
402
443
|
_computeHarEntryTotalTime(harEntry) {
|
|
403
|
-
harEntry.time = [
|
|
444
|
+
harEntry.time = [
|
|
445
|
+
harEntry.timings.dns,
|
|
446
|
+
harEntry.timings.connect,
|
|
447
|
+
harEntry.timings.ssl,
|
|
448
|
+
harEntry.timings.wait,
|
|
449
|
+
harEntry.timings.receive
|
|
450
|
+
].reduce((pre, cur) => (cur || -1) > 0 ? cur + pre : pre, 0);
|
|
404
451
|
}
|
|
405
452
|
async flush() {
|
|
406
453
|
await Promise.all(this._barrierPromises);
|
|
407
454
|
}
|
|
408
455
|
stop() {
|
|
409
456
|
this._started = false;
|
|
410
|
-
|
|
457
|
+
import_eventsHelper.eventsHelper.removeEventListeners(this._eventListeners);
|
|
411
458
|
this._barrierPromises.clear();
|
|
412
|
-
const context = this._context instanceof
|
|
459
|
+
const context = this._context instanceof import_browserContext.BrowserContext ? this._context : void 0;
|
|
413
460
|
const log = {
|
|
414
|
-
version:
|
|
461
|
+
version: "1.2",
|
|
415
462
|
creator: {
|
|
416
|
-
name:
|
|
417
|
-
version: (0,
|
|
463
|
+
name: "Playwright",
|
|
464
|
+
version: (0, import_utils2.getPlaywrightVersion)()
|
|
418
465
|
},
|
|
419
466
|
browser: {
|
|
420
|
-
name:
|
|
421
|
-
version:
|
|
467
|
+
name: context?._browser.options.name || "",
|
|
468
|
+
version: context?._browser.version() || ""
|
|
422
469
|
},
|
|
423
|
-
pages: this._pageEntries.size ? Array.from(this._pageEntries.values()) :
|
|
470
|
+
pages: this._pageEntries.size ? Array.from(this._pageEntries.values()) : void 0,
|
|
424
471
|
entries: []
|
|
425
472
|
};
|
|
426
473
|
if (!this._options.omitTiming) {
|
|
427
474
|
for (const pageEntry of log.pages || []) {
|
|
428
475
|
const startDateTime = pageEntry[startedDateSymbol].valueOf();
|
|
429
|
-
if (typeof pageEntry.pageTimings.onContentLoad ===
|
|
430
|
-
|
|
476
|
+
if (typeof pageEntry.pageTimings.onContentLoad === "number" && pageEntry.pageTimings.onContentLoad >= 0)
|
|
477
|
+
pageEntry.pageTimings.onContentLoad -= startDateTime;
|
|
478
|
+
else
|
|
479
|
+
pageEntry.pageTimings.onContentLoad = -1;
|
|
480
|
+
if (typeof pageEntry.pageTimings.onLoad === "number" && pageEntry.pageTimings.onLoad >= 0)
|
|
481
|
+
pageEntry.pageTimings.onLoad -= startDateTime;
|
|
482
|
+
else
|
|
483
|
+
pageEntry.pageTimings.onLoad = -1;
|
|
431
484
|
}
|
|
432
485
|
}
|
|
433
486
|
this._pageEntries.clear();
|
|
@@ -435,68 +488,68 @@ class HarTracer {
|
|
|
435
488
|
}
|
|
436
489
|
_postDataForRequest(request, content) {
|
|
437
490
|
const postData = request.postDataBuffer();
|
|
438
|
-
if (!postData)
|
|
439
|
-
|
|
491
|
+
if (!postData)
|
|
492
|
+
return;
|
|
493
|
+
const contentType = request.headerValue("content-type");
|
|
440
494
|
return this._postDataForBuffer(postData, contentType, content);
|
|
441
495
|
}
|
|
442
496
|
_postDataForBuffer(postData, contentType, content) {
|
|
443
|
-
if (!postData)
|
|
444
|
-
|
|
497
|
+
if (!postData)
|
|
498
|
+
return;
|
|
499
|
+
contentType ??= "application/octet-stream";
|
|
445
500
|
const result = {
|
|
446
501
|
mimeType: contentType,
|
|
447
|
-
text:
|
|
502
|
+
text: "",
|
|
448
503
|
params: []
|
|
449
504
|
};
|
|
450
|
-
if (content ===
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
505
|
+
if (content === "embed" && contentType !== "application/octet-stream")
|
|
506
|
+
result.text = postData.toString();
|
|
507
|
+
if (content === "attach") {
|
|
508
|
+
const sha1 = (0, import_utils.calculateSha1)(postData) + "." + (import_utilsBundle.mime.getExtension(contentType) || "dat");
|
|
509
|
+
if (this._options.includeTraceInfo)
|
|
510
|
+
result._sha1 = sha1;
|
|
511
|
+
else
|
|
512
|
+
result._file = sha1;
|
|
454
513
|
this._delegate.onContentBlob(sha1, postData);
|
|
455
514
|
}
|
|
456
|
-
if (contentType ===
|
|
515
|
+
if (contentType === "application/x-www-form-urlencoded") {
|
|
457
516
|
const parsed = new URLSearchParams(postData.toString());
|
|
458
|
-
for (const [name, value] of parsed.entries())
|
|
459
|
-
name,
|
|
460
|
-
value
|
|
461
|
-
});
|
|
517
|
+
for (const [name, value] of parsed.entries())
|
|
518
|
+
result.params.push({ name, value });
|
|
462
519
|
}
|
|
463
520
|
return result;
|
|
464
521
|
}
|
|
465
522
|
}
|
|
466
|
-
exports.HarTracer = HarTracer;
|
|
467
523
|
function createHarEntry(method, url, frameref, options) {
|
|
468
524
|
const harEntry = {
|
|
469
|
-
_frameref: options.includeTraceInfo ? frameref :
|
|
470
|
-
_monotonicTime: options.includeTraceInfo ? (0,
|
|
471
|
-
startedDateTime: new Date().toISOString(),
|
|
525
|
+
_frameref: options.includeTraceInfo ? frameref : void 0,
|
|
526
|
+
_monotonicTime: options.includeTraceInfo ? (0, import_utils.monotonicTime)() : void 0,
|
|
527
|
+
startedDateTime: (/* @__PURE__ */ new Date()).toISOString(),
|
|
472
528
|
time: -1,
|
|
473
529
|
request: {
|
|
474
|
-
method
|
|
530
|
+
method,
|
|
475
531
|
url: url.toString(),
|
|
476
532
|
httpVersion: FALLBACK_HTTP_VERSION,
|
|
477
533
|
cookies: [],
|
|
478
534
|
headers: [],
|
|
479
|
-
queryString: [...url.searchParams].map(e => ({
|
|
480
|
-
name: e[0],
|
|
481
|
-
value: e[1]
|
|
482
|
-
})),
|
|
535
|
+
queryString: [...url.searchParams].map((e) => ({ name: e[0], value: e[1] })),
|
|
483
536
|
headersSize: -1,
|
|
484
537
|
bodySize: -1
|
|
485
538
|
},
|
|
486
539
|
response: {
|
|
487
540
|
status: -1,
|
|
488
|
-
statusText:
|
|
541
|
+
statusText: "",
|
|
489
542
|
httpVersion: FALLBACK_HTTP_VERSION,
|
|
490
543
|
cookies: [],
|
|
491
544
|
headers: [],
|
|
492
545
|
content: {
|
|
493
546
|
size: -1,
|
|
494
|
-
mimeType:
|
|
547
|
+
mimeType: "x-unknown"
|
|
495
548
|
},
|
|
496
549
|
headersSize: -1,
|
|
497
550
|
bodySize: -1,
|
|
498
|
-
redirectURL:
|
|
499
|
-
_transferSize: options.omitSizes ?
|
|
551
|
+
redirectURL: "",
|
|
552
|
+
_transferSize: options.omitSizes ? void 0 : -1
|
|
500
553
|
},
|
|
501
554
|
cache: {},
|
|
502
555
|
timings: {
|
|
@@ -509,33 +562,45 @@ function createHarEntry(method, url, frameref, options) {
|
|
|
509
562
|
}
|
|
510
563
|
function parseCookie(c) {
|
|
511
564
|
const cookie = {
|
|
512
|
-
name:
|
|
513
|
-
value:
|
|
565
|
+
name: "",
|
|
566
|
+
value: ""
|
|
514
567
|
};
|
|
515
568
|
let first = true;
|
|
516
569
|
for (const pair of c.split(/; */)) {
|
|
517
|
-
const indexOfEquals = pair.indexOf(
|
|
570
|
+
const indexOfEquals = pair.indexOf("=");
|
|
518
571
|
const name = indexOfEquals !== -1 ? pair.substr(0, indexOfEquals).trim() : pair.trim();
|
|
519
|
-
const value = indexOfEquals !== -1 ? pair.substr(indexOfEquals + 1, pair.length).trim() :
|
|
572
|
+
const value = indexOfEquals !== -1 ? pair.substr(indexOfEquals + 1, pair.length).trim() : "";
|
|
520
573
|
if (first) {
|
|
521
574
|
first = false;
|
|
522
575
|
cookie.name = name;
|
|
523
576
|
cookie.value = value;
|
|
524
577
|
continue;
|
|
525
578
|
}
|
|
526
|
-
if (name ===
|
|
527
|
-
|
|
528
|
-
if (name ===
|
|
529
|
-
|
|
530
|
-
if (name ===
|
|
531
|
-
|
|
532
|
-
if (name ===
|
|
579
|
+
if (name === "Domain")
|
|
580
|
+
cookie.domain = value;
|
|
581
|
+
if (name === "Expires")
|
|
582
|
+
cookie.expires = safeDateToISOString(value);
|
|
583
|
+
if (name === "HttpOnly")
|
|
584
|
+
cookie.httpOnly = true;
|
|
585
|
+
if (name === "Max-Age")
|
|
586
|
+
cookie.expires = safeDateToISOString(Date.now() + +value * 1e3);
|
|
587
|
+
if (name === "Path")
|
|
588
|
+
cookie.path = value;
|
|
589
|
+
if (name === "SameSite")
|
|
590
|
+
cookie.sameSite = value;
|
|
591
|
+
if (name === "Secure")
|
|
592
|
+
cookie.secure = true;
|
|
533
593
|
}
|
|
534
594
|
return cookie;
|
|
535
595
|
}
|
|
536
596
|
function safeDateToISOString(value) {
|
|
537
597
|
try {
|
|
538
598
|
return new Date(value).toISOString();
|
|
539
|
-
} catch (e) {
|
|
599
|
+
} catch (e) {
|
|
600
|
+
}
|
|
540
601
|
}
|
|
541
|
-
const startedDateSymbol = Symbol(
|
|
602
|
+
const startedDateSymbol = Symbol("startedDate");
|
|
603
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
604
|
+
0 && (module.exports = {
|
|
605
|
+
HarTracer
|
|
606
|
+
});
|