@checkly/playwright-core 1.42.17 → 1.47.11
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 +144 -109
- package/browsers.json +15 -25
- package/lib/androidServerImpl.js +1 -1
- package/lib/browserServerImpl.js +1 -1
- package/lib/cli/driver.js +1 -3
- package/lib/cli/program.js +5 -10
- package/lib/client/android.js +1 -1
- package/lib/client/api.js +7 -0
- package/lib/client/browserContext.js +37 -5
- package/lib/client/browserType.js +19 -11
- package/lib/client/channelOwner.js +19 -16
- package/lib/client/clientInstrumentation.js +17 -7
- package/lib/client/clock.js +68 -0
- package/lib/client/connection.js +9 -6
- package/lib/client/electron.js +7 -5
- package/lib/client/elementHandle.js +44 -14
- package/lib/client/eventEmitter.js +314 -0
- package/lib/client/fetch.js +81 -28
- package/lib/client/frame.js +2 -4
- package/lib/client/jsHandle.js +7 -1
- package/lib/client/locator.js +9 -0
- package/lib/client/network.js +12 -9
- package/lib/client/page.js +45 -23
- package/lib/client/playwright.js +3 -0
- package/lib/client/tracing.js +7 -4
- package/lib/common/socksProxy.js +2 -2
- package/lib/generated/clockSource.js +7 -0
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/recorderSource.js +1 -1
- package/lib/generated/utilityScriptSource.js +1 -1
- package/lib/protocol/serializers.js +12 -11
- package/lib/protocol/validator.js +137 -55
- package/lib/server/bidi/bidiBrowser.js +296 -0
- package/lib/server/bidi/bidiConnection.js +206 -0
- package/lib/server/bidi/bidiExecutionContext.js +162 -0
- package/lib/server/bidi/bidiFirefox.js +110 -0
- package/lib/server/bidi/bidiInput.js +174 -0
- package/lib/server/bidi/bidiNetworkManager.js +304 -0
- package/lib/server/bidi/bidiPage.js +456 -0
- package/lib/server/bidi/third_party/bidiDeserializer.js +93 -0
- package/lib/server/bidi/third_party/bidiKeyboard.js +238 -0
- package/lib/server/bidi/third_party/bidiProtocol.js +139 -0
- package/lib/server/bidi/third_party/bidiSerializer.js +144 -0
- package/lib/server/browser.js +9 -1
- package/lib/server/browserContext.js +97 -22
- package/lib/server/browserType.js +27 -20
- package/lib/server/chromium/chromium.js +30 -15
- package/lib/server/chromium/chromiumSwitches.js +6 -3
- package/lib/server/chromium/crBrowser.js +11 -17
- package/lib/server/chromium/crConnection.js +2 -2
- package/lib/server/chromium/crDragDrop.js +28 -29
- package/lib/server/chromium/crNetworkManager.js +130 -84
- package/lib/server/chromium/crPage.js +34 -79
- package/lib/server/chromium/crProtocolHelper.js +3 -1
- package/lib/server/chromium/crServiceWorker.js +20 -23
- package/lib/server/chromium/videoRecorder.js +1 -1
- package/lib/server/clock.js +125 -0
- package/lib/server/codegen/csharp.js +299 -0
- package/lib/server/codegen/java.js +235 -0
- package/lib/server/codegen/javascript.js +223 -0
- package/lib/server/codegen/jsonl.js +47 -0
- package/lib/server/codegen/language.js +76 -0
- package/lib/server/codegen/languages.js +30 -0
- package/lib/server/codegen/python.js +265 -0
- package/lib/server/codegen/types.js +5 -0
- package/lib/server/debugController.js +3 -5
- package/lib/server/deviceDescriptors.js +9 -4
- package/lib/server/deviceDescriptorsSource.json +239 -119
- package/lib/server/dispatchers/androidDispatcher.js +1 -1
- package/lib/server/dispatchers/browserContextDispatcher.js +51 -7
- package/lib/server/dispatchers/dispatcher.js +36 -40
- package/lib/server/dispatchers/frameDispatcher.js +1 -2
- package/lib/server/dispatchers/jsHandleDispatcher.js +1 -1
- package/lib/server/dispatchers/jsonPipeDispatcher.js +4 -6
- package/lib/server/dispatchers/localUtilsDispatcher.js +19 -5
- package/lib/server/dispatchers/networkDispatchers.js +2 -2
- package/lib/server/dispatchers/pageDispatcher.js +5 -2
- package/lib/server/dispatchers/playwrightDispatcher.js +1 -0
- package/lib/server/dispatchers/writableStreamDispatcher.js +8 -5
- package/lib/server/dom.js +90 -53
- package/lib/server/electron/electron.js +21 -4
- package/lib/server/fetch.js +74 -25
- package/lib/server/fileUploadUtils.js +7 -3
- package/lib/server/firefox/ffBrowser.js +36 -25
- package/lib/server/firefox/ffConnection.js +2 -2
- package/lib/server/firefox/ffNetworkManager.js +6 -4
- package/lib/server/firefox/ffPage.js +22 -24
- package/lib/server/firefox/firefox.js +25 -6
- package/lib/server/frameSelectors.js +2 -2
- package/lib/server/frames.js +205 -159
- package/lib/server/har/harTracer.js +4 -12
- package/lib/server/helper.js +3 -3
- package/lib/server/index.js +18 -0
- package/lib/server/input.js +18 -8
- package/lib/server/instrumentation.js +0 -4
- package/lib/server/isomorphic/utilityScriptSerializers.js +19 -5
- package/lib/server/javascript.js +3 -2
- package/lib/server/launchApp.js +3 -2
- package/lib/server/network.js +14 -4
- package/lib/server/page.js +75 -46
- package/lib/server/playwright.js +5 -2
- package/lib/server/recorder/codeGenerator.js +2 -1
- package/lib/server/recorder/contextRecorder.js +316 -0
- package/lib/server/recorder/csharp.js +2 -1
- package/lib/server/recorder/java.js +2 -1
- package/lib/server/recorder/javascript.js +2 -1
- package/lib/server/recorder/jsonl.js +2 -1
- package/lib/server/recorder/language.js +2 -1
- package/lib/server/recorder/python.js +2 -1
- package/lib/server/recorder/recorderApp.js +14 -5
- package/lib/server/recorder/recorderCollection.js +127 -0
- package/lib/server/recorder/recorderRunner.js +177 -0
- package/lib/server/recorder/recorderUtils.js +23 -0
- package/lib/server/recorder/throttledFile.js +46 -0
- package/lib/server/recorder/utils.js +2 -1
- package/lib/server/recorder.js +42 -418
- package/lib/server/registry/index.js +99 -100
- package/lib/server/registry/nativeDeps.js +107 -0
- package/lib/server/screenshotter.js +6 -12
- package/lib/server/socksClientCertificatesInterceptor.js +328 -0
- package/lib/server/trace/recorder/snapshotter.js +4 -1
- package/lib/server/trace/recorder/tracing.js +27 -96
- package/lib/server/trace/viewer/traceViewer.js +54 -67
- package/lib/server/transport.js +1 -1
- package/lib/server/webkit/webkit.js +5 -5
- package/lib/server/webkit/wkBrowser.js +14 -14
- package/lib/server/webkit/wkConnection.js +3 -3
- package/lib/server/webkit/wkInterceptableRequest.js +8 -4
- package/lib/server/webkit/wkPage.js +52 -34
- package/lib/server/webkit/wkProvisionalPage.js +36 -1
- package/lib/utils/crypto.js +141 -0
- package/lib/utils/debugLogger.js +2 -0
- package/lib/utils/env.js +4 -2
- package/lib/utils/expectUtils.js +33 -0
- package/lib/utils/fileUtils.js +140 -1
- package/lib/utils/glob.js +2 -1
- package/lib/utils/happy-eyeballs.js +29 -2
- package/lib/utils/hostPlatform.js +13 -4
- package/lib/utils/httpServer.js +54 -13
- package/lib/utils/index.js +53 -31
- package/lib/utils/isomorphic/cssTokenizer.js +1 -1
- package/lib/utils/isomorphic/locatorParser.js +1 -1
- package/lib/utils/isomorphic/mimeType.js +29 -0
- package/lib/utils/isomorphic/stringUtils.js +28 -1
- package/lib/utils/isomorphic/urlMatch.js +120 -0
- package/lib/utils/mimeType.js +2 -1
- package/lib/utils/network.js +7 -35
- package/lib/utils/stackTrace.js +2 -4
- package/lib/utils/timeoutRunner.js +11 -76
- package/lib/utils/zones.js +23 -60
- package/lib/utilsBundle.js +2 -1
- package/lib/utilsBundleImpl/index.js +33 -31
- package/lib/vite/htmlReport/index.html +12 -12
- package/lib/vite/recorder/assets/codeMirrorModule-BN0yUF4I.js +24 -0
- package/lib/vite/recorder/assets/{codicon-zGuYmc9o.ttf → codicon-DCmgc-ay.ttf} +0 -0
- package/lib/vite/recorder/assets/index-B-MT5gKo.css +1 -0
- package/lib/vite/recorder/assets/index-DVt3E1Ef.js +47 -0
- package/lib/vite/recorder/index.html +2 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-5yiV-3wl.js +16831 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-B7Z3vq11.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-C6p3E9Zg.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-CcviAl53.js +16831 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-CqYUz5ms.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-DS3v0XrQ.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-Dx6AXgMV.js +16838 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-T_sdMrbM.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-V7N6ppkd.js +15585 -0
- package/lib/vite/traceViewer/assets/testServerConnection-D-tXL3sj.js +224 -0
- package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +1 -0
- package/lib/vite/traceViewer/assets/workbench-Bjkiwcr1.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-C43LWZEX.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-C5OQh9VX.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-Crj6jzdv.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-DrQjKdyE.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-Pa1v1Ojh.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-caTaZnzx.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-u2lRPMOT.js +72 -0
- package/lib/vite/traceViewer/assets/wsPort-EUvw-dwH.js +18540 -0
- package/lib/vite/traceViewer/assets/xtermModule-CZ7sDYXB.js +6529 -0
- package/lib/vite/traceViewer/assets/xtermModule-_6TC5FYT.js +6529 -0
- package/lib/vite/traceViewer/codeMirrorModule.Cy8X9Wtw.css +344 -0
- package/lib/vite/traceViewer/codeMirrorModule.svF_VrcJ.css +344 -0
- package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- package/lib/vite/traceViewer/embedded.BBZ9gQEw.js +104 -0
- package/lib/vite/traceViewer/embedded.BQq6Psnz.js +104 -0
- package/lib/vite/traceViewer/embedded.BVDVQOzc.js +2 -0
- package/lib/vite/traceViewer/embedded.Bn8Ptzv6.js +2 -0
- package/lib/vite/traceViewer/embedded.CvhnUgIi.js +2 -0
- package/lib/vite/traceViewer/embedded.D27cnKiB.js +104 -0
- package/lib/vite/traceViewer/embedded.DPqrDeET.js +2 -0
- package/lib/vite/traceViewer/embedded.DbzY7Q8w.js +2 -0
- package/lib/vite/traceViewer/embedded.DjZq4InJ.css +68 -0
- package/lib/vite/traceViewer/embedded.html +16 -0
- package/lib/vite/traceViewer/embedded.w7WN2u1R.css +1 -0
- package/lib/vite/traceViewer/index.5mge2rY_.css +124 -0
- package/lib/vite/traceViewer/index.6KJ-JQ0L.js +180 -0
- package/lib/vite/traceViewer/index.B8dgQwuN.js +2 -0
- package/lib/vite/traceViewer/index.BGj8jY3H.js +2 -0
- package/lib/vite/traceViewer/index.BSak5QT9.js +2 -0
- package/lib/vite/traceViewer/index.C0EgJ4oW.js +195 -0
- package/lib/vite/traceViewer/index.CUpI-BFe.js +195 -0
- package/lib/vite/traceViewer/{index.-g_5lMbJ.css → index.CrbWWHbf.css} +1 -1
- package/lib/vite/traceViewer/index.DkRbtWVo.js +195 -0
- package/lib/vite/traceViewer/index.QanXxRUb.css +131 -0
- package/lib/vite/traceViewer/index._cX8k4co.js +2 -0
- package/lib/vite/traceViewer/index.html +5 -4
- package/lib/vite/traceViewer/index.pMAN88y-.js +2 -0
- package/lib/vite/traceViewer/snapshot.html +1 -1
- package/lib/vite/traceViewer/sw.bundle.js +3 -4
- package/lib/vite/traceViewer/uiMode.D-tg1Oci.js +1730 -0
- package/lib/vite/traceViewer/uiMode.D3cNFP6u.css +1 -0
- package/lib/vite/traceViewer/uiMode.DKjMBMlc.js +1730 -0
- package/lib/vite/traceViewer/uiMode.DVWUEIHq.css +1424 -0
- package/lib/vite/traceViewer/uiMode.DVrL7a1K.js +10 -0
- package/lib/vite/traceViewer/uiMode.Dg9oJCQU.js +10 -0
- package/lib/vite/traceViewer/uiMode.DwZAzstF.js +10 -0
- package/lib/vite/traceViewer/uiMode.O07awP3T.js +10 -0
- package/lib/vite/traceViewer/uiMode.gGHHTsyL.js +1730 -0
- package/lib/vite/traceViewer/uiMode.html +5 -4
- package/lib/vite/traceViewer/uiMode.iq7CyYy7.js +1490 -0
- package/lib/vite/traceViewer/uiMode.jY2s-9ps.js +10 -0
- package/lib/vite/traceViewer/uiMode.xvJHbkzl.css +1324 -0
- package/lib/vite/traceViewer/workbench.B3X2QtYa.css +3702 -0
- package/lib/vite/traceViewer/workbench.DjbIuxix.css +1 -0
- package/lib/vite/traceViewer/workbench.DyTpxWVb.css +1 -0
- package/lib/vite/traceViewer/workbench.wuxQoE2z.css +3703 -0
- package/lib/vite/traceViewer/wsPort.p5jUwABW.css +3450 -0
- package/lib/vite/traceViewer/xtermModule.4oRVGWQ-.css +209 -0
- package/lib/vite/traceViewer/xtermModule.OKEVRlkP.css +209 -0
- package/package.json +2 -2
- package/types/protocol.d.ts +960 -78
- package/types/structs.d.ts +1 -1
- package/types/types.d.ts +3083 -2448
- package/lib/vite/recorder/assets/codeMirrorModule-I9ks4y7D.js +0 -24
- package/lib/vite/recorder/assets/index-ljsTwXtJ.css +0 -1
- package/lib/vite/recorder/assets/index-yg8ypzl6.js +0 -47
- package/lib/vite/traceViewer/assets/codeMirrorModule-0bpaqixv.js +0 -24
- package/lib/vite/traceViewer/assets/wsPort-_JBDEilC.js +0 -69
- package/lib/vite/traceViewer/index.u51inEcm.js +0 -2
- package/lib/vite/traceViewer/uiMode.Fb0bNA4H.js +0 -10
- package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +0 -1
- package/lib/vite/traceViewer/wsPort.zR1WIy9-.css +0 -1
- /package/lib/vite/recorder/assets/{codeMirrorModule-Hs9-1ZG4.css → codeMirrorModule-ez37Vkbh.css} +0 -0
- /package/lib/vite/traceViewer/assets/{xtermModule-Yt6xwiJ_.js → xtermModule-BeNbaIVa.js} +0 -0
- /package/lib/vite/traceViewer/{codeMirrorModule.Hs9-1ZG4.css → codeMirrorModule.ez37Vkbh.css} +0 -0
- /package/lib/vite/traceViewer/{xtermModule.0lwXJFHT.css → xtermModule.DSXBckUd.css} +0 -0
package/lib/server/frames.js
CHANGED
|
@@ -19,7 +19,6 @@ var _debugLogger = require("../utils/debugLogger");
|
|
|
19
19
|
var _instrumentation = require("./instrumentation");
|
|
20
20
|
var _protocolError = require("./protocolError");
|
|
21
21
|
var _selectorParser = require("../utils/isomorphic/selectorParser");
|
|
22
|
-
var _locatorGenerators = require("../utils/isomorphic/locatorGenerators");
|
|
23
22
|
var _frameSelectors = require("./frameSelectors");
|
|
24
23
|
var _errors = require("./errors");
|
|
25
24
|
var _fileUploadUtils = require("./fileUploadUtils");
|
|
@@ -109,13 +108,13 @@ class FrameManager {
|
|
|
109
108
|
return frame;
|
|
110
109
|
}
|
|
111
110
|
}
|
|
112
|
-
async waitForSignalsCreatedBy(progress,
|
|
113
|
-
if (
|
|
111
|
+
async waitForSignalsCreatedBy(progress, waitAfter, action) {
|
|
112
|
+
if (!waitAfter) return action();
|
|
114
113
|
const barrier = new SignalBarrier(progress);
|
|
115
114
|
this._signalBarriers.add(barrier);
|
|
116
115
|
if (progress) progress.cleanupWhenAborted(() => this._signalBarriers.delete(barrier));
|
|
117
116
|
const result = await action();
|
|
118
|
-
|
|
117
|
+
await this._page._delegate.inputActionEpilogue();
|
|
119
118
|
await barrier.waitFor();
|
|
120
119
|
this._signalBarriers.delete(barrier);
|
|
121
120
|
// Resolve in the next task, after all waitForNavigations.
|
|
@@ -238,7 +237,7 @@ class FrameManager {
|
|
|
238
237
|
request
|
|
239
238
|
});
|
|
240
239
|
if (request._isFavicon) {
|
|
241
|
-
|
|
240
|
+
route === null || route === void 0 || route.continue({
|
|
242
241
|
isFallback: true
|
|
243
242
|
}).catch(() => {});
|
|
244
243
|
return;
|
|
@@ -459,13 +458,13 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
459
458
|
return context.rawEvaluateJSON(expression);
|
|
460
459
|
});
|
|
461
460
|
}
|
|
462
|
-
nonStallingEvaluateInExistingContext(expression,
|
|
461
|
+
nonStallingEvaluateInExistingContext(expression, world) {
|
|
463
462
|
return this.raceAgainstEvaluationStallingEvents(() => {
|
|
464
463
|
var _this$_contextData$ge;
|
|
465
464
|
const context = (_this$_contextData$ge = this._contextData.get(world)) === null || _this$_contextData$ge === void 0 ? void 0 : _this$_contextData$ge.context;
|
|
466
465
|
if (!context) throw new Error('Frame does not yet have the execution context');
|
|
467
466
|
return context.evaluateExpression(expression, {
|
|
468
|
-
isFunction
|
|
467
|
+
isFunction: false
|
|
469
468
|
});
|
|
470
469
|
});
|
|
471
470
|
}
|
|
@@ -530,16 +529,19 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
530
529
|
referer = options.referer;
|
|
531
530
|
}
|
|
532
531
|
url = _helper.helper.completeUserURL(url);
|
|
533
|
-
const
|
|
534
|
-
const
|
|
532
|
+
const navigationEvents = [];
|
|
533
|
+
const collectNavigations = arg => navigationEvents.push(arg);
|
|
534
|
+
this.on(Frame.Events.InternalNavigation, collectNavigations);
|
|
535
|
+
const navigateResult = await this._page._delegate.navigateFrame(this, url, referer).finally(() => this.off(Frame.Events.InternalNavigation, collectNavigations));
|
|
535
536
|
let event;
|
|
536
537
|
if (navigateResult.newDocumentId) {
|
|
537
|
-
|
|
538
|
-
event = await _helper.helper.waitForEvent(progress, this, Frame.Events.InternalNavigation, event => {
|
|
538
|
+
const predicate = event => {
|
|
539
539
|
// We are interested either in this specific document, or any other document that
|
|
540
540
|
// did commit and replaced the expected document.
|
|
541
541
|
return event.newDocument && (event.newDocument.documentId === navigateResult.newDocumentId || !event.error);
|
|
542
|
-
}
|
|
542
|
+
};
|
|
543
|
+
const events = navigationEvents.filter(predicate);
|
|
544
|
+
if (events.length) event = events[0];else event = await _helper.helper.waitForEvent(progress, this, Frame.Events.InternalNavigation, predicate).promise;
|
|
543
545
|
if (event.newDocument.documentId !== navigateResult.newDocumentId) {
|
|
544
546
|
// This is just a sanity check. In practice, new navigation should
|
|
545
547
|
// cancel the previous one and report "request cancelled"-like error.
|
|
@@ -547,7 +549,10 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
547
549
|
}
|
|
548
550
|
if (event.error) throw event.error;
|
|
549
551
|
} else {
|
|
550
|
-
|
|
552
|
+
// Wait for same document navigation.
|
|
553
|
+
const predicate = e => !e.newDocument;
|
|
554
|
+
const events = navigationEvents.filter(predicate);
|
|
555
|
+
if (events.length) event = events[0];else event = await _helper.helper.waitForEvent(progress, this, Frame.Events.InternalNavigation, predicate).promise;
|
|
551
556
|
}
|
|
552
557
|
if (!this._firedLifecycleEvents.has(waitUntil)) await _helper.helper.waitForEvent(progress, this, Frame.Events.AddLifecycle, e => e === waitUntil).promise;
|
|
553
558
|
const request = event.newDocument ? event.newDocument.request : undefined;
|
|
@@ -618,73 +623,79 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
618
623
|
if (!['attached', 'detached', 'visible', 'hidden'].includes(state)) throw new Error(`state: expected one of (attached|detached|visible|hidden)`);
|
|
619
624
|
return controller.run(async progress => {
|
|
620
625
|
progress.log(`waiting for ${this._asLocator(selector)}${state === 'attached' ? '' : ' to be ' + state}`);
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
626
|
+
return await this.waitForSelectorInternal(progress, selector, options, scope);
|
|
627
|
+
}, this._page._timeoutSettings.timeout(options));
|
|
628
|
+
}
|
|
629
|
+
async waitForSelectorInternal(progress, selector, options, scope) {
|
|
630
|
+
const {
|
|
631
|
+
state = 'visible'
|
|
632
|
+
} = options;
|
|
633
|
+
const promise = this.retryWithProgressAndTimeouts(progress, [0, 20, 50, 100, 100, 500], async continuePolling => {
|
|
634
|
+
const resolved = await this.selectors.resolveInjectedForSelector(selector, options, scope);
|
|
635
|
+
progress.throwIfAborted();
|
|
636
|
+
if (!resolved) {
|
|
637
|
+
if (state === 'hidden' || state === 'detached') return null;
|
|
638
|
+
return continuePolling;
|
|
639
|
+
}
|
|
640
|
+
const result = await resolved.injected.evaluateHandle((injected, {
|
|
641
|
+
info,
|
|
642
|
+
root
|
|
643
|
+
}) => {
|
|
644
|
+
const elements = injected.querySelectorAll(info.parsed, root || document);
|
|
645
|
+
const element = elements[0];
|
|
646
|
+
const visible = element ? injected.utils.isElementVisible(element) : false;
|
|
647
|
+
let log = '';
|
|
648
|
+
if (elements.length > 1) {
|
|
649
|
+
if (info.strict) throw injected.strictModeViolationError(info.parsed, elements);
|
|
650
|
+
log = ` locator resolved to ${elements.length} elements. Proceeding with the first one: ${injected.previewNode(elements[0])}`;
|
|
651
|
+
} else if (element) {
|
|
652
|
+
log = ` locator resolved to ${visible ? 'visible' : 'hidden'} ${injected.previewNode(element)}`;
|
|
627
653
|
}
|
|
628
|
-
|
|
629
|
-
info,
|
|
630
|
-
root
|
|
631
|
-
}) => {
|
|
632
|
-
const elements = injected.querySelectorAll(info.parsed, root || document);
|
|
633
|
-
const element = elements[0];
|
|
634
|
-
const visible = element ? injected.isVisible(element) : false;
|
|
635
|
-
let log = '';
|
|
636
|
-
if (elements.length > 1) {
|
|
637
|
-
if (info.strict) throw injected.strictModeViolationError(info.parsed, elements);
|
|
638
|
-
log = ` locator resolved to ${elements.length} elements. Proceeding with the first one: ${injected.previewNode(elements[0])}`;
|
|
639
|
-
} else if (element) {
|
|
640
|
-
log = ` locator resolved to ${visible ? 'visible' : 'hidden'} ${injected.previewNode(element)}`;
|
|
641
|
-
}
|
|
642
|
-
return {
|
|
643
|
-
log,
|
|
644
|
-
element,
|
|
645
|
-
visible,
|
|
646
|
-
attached: !!element
|
|
647
|
-
};
|
|
648
|
-
}, {
|
|
649
|
-
info: resolved.info,
|
|
650
|
-
root: resolved.frame === this ? scope : undefined
|
|
651
|
-
});
|
|
652
|
-
const {
|
|
654
|
+
return {
|
|
653
655
|
log,
|
|
656
|
+
element,
|
|
654
657
|
visible,
|
|
655
|
-
attached
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
}));
|
|
661
|
-
if (log) progress.log(log);
|
|
662
|
-
const success = {
|
|
663
|
-
attached,
|
|
664
|
-
detached: !attached,
|
|
665
|
-
visible,
|
|
666
|
-
hidden: !visible
|
|
667
|
-
}[state];
|
|
668
|
-
if (!success) {
|
|
669
|
-
result.dispose();
|
|
670
|
-
return continuePolling;
|
|
671
|
-
}
|
|
672
|
-
if (options.omitReturnValue) {
|
|
673
|
-
result.dispose();
|
|
674
|
-
return null;
|
|
675
|
-
}
|
|
676
|
-
const element = state === 'attached' || state === 'visible' ? await result.evaluateHandle(r => r.element) : null;
|
|
677
|
-
result.dispose();
|
|
678
|
-
if (!element) return null;
|
|
679
|
-
if (options.__testHookBeforeAdoptNode) await options.__testHookBeforeAdoptNode();
|
|
680
|
-
try {
|
|
681
|
-
return await element._adoptTo(await resolved.frame._mainContext());
|
|
682
|
-
} catch (e) {
|
|
683
|
-
return continuePolling;
|
|
684
|
-
}
|
|
658
|
+
attached: !!element
|
|
659
|
+
};
|
|
660
|
+
}, {
|
|
661
|
+
info: resolved.info,
|
|
662
|
+
root: resolved.frame === this ? scope : undefined
|
|
685
663
|
});
|
|
686
|
-
|
|
687
|
-
|
|
664
|
+
const {
|
|
665
|
+
log,
|
|
666
|
+
visible,
|
|
667
|
+
attached
|
|
668
|
+
} = await result.evaluate(r => ({
|
|
669
|
+
log: r.log,
|
|
670
|
+
visible: r.visible,
|
|
671
|
+
attached: r.attached
|
|
672
|
+
}));
|
|
673
|
+
if (log) progress.log(log);
|
|
674
|
+
const success = {
|
|
675
|
+
attached,
|
|
676
|
+
detached: !attached,
|
|
677
|
+
visible,
|
|
678
|
+
hidden: !visible
|
|
679
|
+
}[state];
|
|
680
|
+
if (!success) {
|
|
681
|
+
result.dispose();
|
|
682
|
+
return continuePolling;
|
|
683
|
+
}
|
|
684
|
+
if (options.omitReturnValue) {
|
|
685
|
+
result.dispose();
|
|
686
|
+
return null;
|
|
687
|
+
}
|
|
688
|
+
const element = state === 'attached' || state === 'visible' ? await result.evaluateHandle(r => r.element) : null;
|
|
689
|
+
result.dispose();
|
|
690
|
+
if (!element) return null;
|
|
691
|
+
if (options.__testHookBeforeAdoptNode) await options.__testHookBeforeAdoptNode();
|
|
692
|
+
try {
|
|
693
|
+
return await element._adoptTo(await resolved.frame._mainContext());
|
|
694
|
+
} catch (e) {
|
|
695
|
+
return continuePolling;
|
|
696
|
+
}
|
|
697
|
+
});
|
|
698
|
+
return scope ? scope._context._raceAgainstContextDestroyed(promise) : promise;
|
|
688
699
|
}
|
|
689
700
|
async dispatchEvent(metadata, selector, type, eventInit = {}, options = {}, scope) {
|
|
690
701
|
await this._callOnElementOnceMatches(metadata, selector, (injectedScript, element, data) => {
|
|
@@ -753,10 +764,11 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
753
764
|
const controller = new _progress.ProgressController(metadata, this);
|
|
754
765
|
return controller.run(async progress => {
|
|
755
766
|
await this.raceNavigationAction(progress, options, async () => {
|
|
767
|
+
var _this$_page$_delegate, _this$_page$_delegate2;
|
|
756
768
|
const waitUntil = options.waitUntil === undefined ? 'load' : options.waitUntil;
|
|
757
769
|
progress.log(`setting frame content, waiting until "${waitUntil}"`);
|
|
758
770
|
const tag = `--playwright--set--content--${this._id}--${++this._setContentCounter}--`;
|
|
759
|
-
const context = await this._utilityContext();
|
|
771
|
+
const context = (_this$_page$_delegate = (_this$_page$_delegate2 = this._page._delegate).useMainWorldForSetContent) !== null && _this$_page$_delegate !== void 0 && _this$_page$_delegate.call(_this$_page$_delegate2) ? await this._mainContext() : await this._utilityContext();
|
|
760
772
|
const lifecyclePromise = new Promise((resolve, reject) => {
|
|
761
773
|
this._page._frameManager._consoleMessageTags.set(tag, () => {
|
|
762
774
|
// Clear lifecycle right after document.open() - see 'tag' below.
|
|
@@ -787,6 +799,11 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
787
799
|
url() {
|
|
788
800
|
return this._url;
|
|
789
801
|
}
|
|
802
|
+
origin() {
|
|
803
|
+
var _network$parsedURL;
|
|
804
|
+
if (!this._url.startsWith('http')) return;
|
|
805
|
+
return (_network$parsedURL = network.parsedURL(this._url)) === null || _network$parsedURL === void 0 ? void 0 : _network$parsedURL.origin;
|
|
806
|
+
}
|
|
790
807
|
parentFrame() {
|
|
791
808
|
return this._parentFrame;
|
|
792
809
|
}
|
|
@@ -812,7 +829,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
812
829
|
})).asElement();
|
|
813
830
|
// Another round trip to the browser to ensure that we receive CSP error messages
|
|
814
831
|
// (if any) logged asynchronously in a separate task on the content main thread.
|
|
815
|
-
if (this._page._delegate.
|
|
832
|
+
if (this._page._delegate.cspErrorsAsynchronousForInlineScripts) await context.evaluate(() => true);
|
|
816
833
|
return result;
|
|
817
834
|
});
|
|
818
835
|
async function addScriptUrl(params) {
|
|
@@ -994,7 +1011,10 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
994
1011
|
async click(metadata, selector, options) {
|
|
995
1012
|
const controller = new _progress.ProgressController(metadata, this);
|
|
996
1013
|
return controller.run(async progress => {
|
|
997
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performLocatorHandlersCheckpoint */, handle => handle._click(progress,
|
|
1014
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performLocatorHandlersCheckpoint */, handle => handle._click(progress, {
|
|
1015
|
+
...options,
|
|
1016
|
+
waitAfter: !options.noWaitAfter
|
|
1017
|
+
})));
|
|
998
1018
|
}, this._page._timeoutSettings.timeout(options));
|
|
999
1019
|
}
|
|
1000
1020
|
async dblclick(metadata, selector, options = {}) {
|
|
@@ -1012,6 +1032,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1012
1032
|
await this._page.mouse.down();
|
|
1013
1033
|
}, {
|
|
1014
1034
|
...options,
|
|
1035
|
+
waitAfter: 'disabled',
|
|
1015
1036
|
position: options.sourcePosition,
|
|
1016
1037
|
timeout: progress.timeUntilDeadline()
|
|
1017
1038
|
});
|
|
@@ -1023,6 +1044,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1023
1044
|
await this._page.mouse.up();
|
|
1024
1045
|
}, {
|
|
1025
1046
|
...options,
|
|
1047
|
+
waitAfter: 'disabled',
|
|
1026
1048
|
position: options.targetPosition,
|
|
1027
1049
|
timeout: progress.timeUntilDeadline()
|
|
1028
1050
|
});
|
|
@@ -1164,7 +1186,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1164
1186
|
const inputFileItems = await (0, _fileUploadUtils.prepareFilesForUpload)(this, params);
|
|
1165
1187
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1166
1188
|
return controller.run(async progress => {
|
|
1167
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, params.strict, true /* performLocatorHandlersCheckpoint */, handle => handle._setInputFiles(progress, inputFileItems
|
|
1189
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, params.strict, true /* performLocatorHandlersCheckpoint */, handle => handle._setInputFiles(progress, inputFileItems)));
|
|
1168
1190
|
}, this._page._timeoutSettings.timeout(params));
|
|
1169
1191
|
}
|
|
1170
1192
|
async type(metadata, selector, text, options = {}) {
|
|
@@ -1209,93 +1231,64 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1209
1231
|
return result;
|
|
1210
1232
|
}
|
|
1211
1233
|
async _expectImpl(metadata, selector, options) {
|
|
1212
|
-
let timeout = this._page._timeoutSettings.timeout(options);
|
|
1213
|
-
const start = timeout > 0 ? (0, _utils.monotonicTime)() : 0;
|
|
1214
1234
|
const lastIntermediateResult = {
|
|
1215
1235
|
isSet: false
|
|
1216
1236
|
};
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
if (timeout < 0) return {
|
|
1224
|
-
matches: options.isNot,
|
|
1225
|
-
log: metadata.log,
|
|
1226
|
-
timedOut: true,
|
|
1227
|
-
received: lastIntermediateResult.received
|
|
1228
|
-
};
|
|
1229
|
-
return await this._expectInternal(metadata, selector, options, false, timeout, lastIntermediateResult);
|
|
1230
|
-
}
|
|
1231
|
-
async _expectInternal(metadata, selector, options, oneShot, timeout, lastIntermediateResult) {
|
|
1232
|
-
const controller = new _progress.ProgressController(metadata, this);
|
|
1233
|
-
return controller.run(async progress => {
|
|
1234
|
-
if (oneShot) {
|
|
1237
|
+
try {
|
|
1238
|
+
let timeout = this._page._timeoutSettings.timeout(options);
|
|
1239
|
+
const start = timeout > 0 ? (0, _utils.monotonicTime)() : 0;
|
|
1240
|
+
|
|
1241
|
+
// Step 1: perform locator handlers checkpoint with a specified timeout.
|
|
1242
|
+
await new _progress.ProgressController(metadata, this).run(async progress => {
|
|
1235
1243
|
progress.log(`${metadata.apiName}${timeout ? ` with timeout ${timeout}ms` : ''}`);
|
|
1236
1244
|
progress.log(`waiting for ${this._asLocator(selector)}`);
|
|
1237
|
-
}
|
|
1238
|
-
return await this.retryWithProgressAndTimeouts(progress, [100, 250, 500, 1000], async continuePolling => {
|
|
1239
|
-
var _info$world;
|
|
1240
1245
|
await this._page.performLocatorHandlersCheckpoint(progress);
|
|
1241
|
-
|
|
1242
|
-
|
|
1246
|
+
}, timeout);
|
|
1247
|
+
|
|
1248
|
+
// Step 2: perform one-shot expect check without a timeout.
|
|
1249
|
+
// Supports the case of `expect(locator).toBeVisible({ timeout: 1 })`
|
|
1250
|
+
// that should succeed when the locator is already visible.
|
|
1251
|
+
try {
|
|
1252
|
+
const resultOneShot = await new _progress.ProgressController(metadata, this).run(async progress => {
|
|
1253
|
+
return await this._expectInternal(progress, selector, options, lastIntermediateResult);
|
|
1243
1254
|
});
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1255
|
+
if (resultOneShot.matches !== options.isNot) return resultOneShot;
|
|
1256
|
+
} catch (e) {
|
|
1257
|
+
if (js.isJavaScriptErrorInEvaluate(e) || (0, _selectorParser.isInvalidSelectorError)(e)) throw e;
|
|
1258
|
+
// Ignore any other errors from one-shot, we'll handle them during retries.
|
|
1259
|
+
}
|
|
1260
|
+
if (timeout > 0) {
|
|
1261
|
+
const elapsed = (0, _utils.monotonicTime)() - start;
|
|
1262
|
+
timeout -= elapsed;
|
|
1263
|
+
}
|
|
1264
|
+
if (timeout < 0) return {
|
|
1265
|
+
matches: options.isNot,
|
|
1266
|
+
log: metadata.log,
|
|
1267
|
+
timedOut: true,
|
|
1268
|
+
received: lastIntermediateResult.received
|
|
1269
|
+
};
|
|
1270
|
+
|
|
1271
|
+
// Step 3: auto-retry expect with increasing timeouts. Bounded by the total remaining time.
|
|
1272
|
+
return await new _progress.ProgressController(metadata, this).run(async progress => {
|
|
1273
|
+
return await this.retryWithProgressAndTimeouts(progress, [100, 250, 500, 1000], async continuePolling => {
|
|
1274
|
+
await this._page.performLocatorHandlersCheckpoint(progress);
|
|
1275
|
+
const {
|
|
1276
|
+
matches,
|
|
1277
|
+
received
|
|
1278
|
+
} = await this._expectInternal(progress, selector, options, lastIntermediateResult);
|
|
1279
|
+
if (matches === options.isNot) {
|
|
1280
|
+
// Keep waiting in these cases:
|
|
1281
|
+
// expect(locator).conditionThatDoesNotMatch
|
|
1282
|
+
// expect(locator).not.conditionThatDoesMatch
|
|
1283
|
+
return continuePolling;
|
|
1284
|
+
}
|
|
1271
1285
|
return {
|
|
1272
|
-
|
|
1273
|
-
|
|
1286
|
+
matches,
|
|
1287
|
+
received
|
|
1274
1288
|
};
|
|
1275
|
-
}, {
|
|
1276
|
-
info,
|
|
1277
|
-
options,
|
|
1278
|
-
callId: metadata.id
|
|
1279
1289
|
});
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
if (matches === options.isNot && !missingRecevied) {
|
|
1283
|
-
lastIntermediateResult.received = received;
|
|
1284
|
-
lastIntermediateResult.isSet = true;
|
|
1285
|
-
if (!Array.isArray(received)) progress.log(` unexpected value "${renderUnexpectedValue(options.expression, received)}"`);
|
|
1286
|
-
}
|
|
1287
|
-
if (!oneShot && matches === options.isNot) {
|
|
1288
|
-
// Keep waiting in these cases:
|
|
1289
|
-
// expect(locator).conditionThatDoesNotMatch
|
|
1290
|
-
// expect(locator).not.conditionThatDoesMatch
|
|
1291
|
-
return continuePolling;
|
|
1292
|
-
}
|
|
1293
|
-
return {
|
|
1294
|
-
matches,
|
|
1295
|
-
received
|
|
1296
|
-
};
|
|
1297
|
-
});
|
|
1298
|
-
}, oneShot ? 0 : timeout).catch(e => {
|
|
1290
|
+
}, timeout);
|
|
1291
|
+
} catch (e) {
|
|
1299
1292
|
// Q: Why not throw upon isSessionClosedError(e) as in other places?
|
|
1300
1293
|
// A: We want user to receive a friendly message containing the last intermediate result.
|
|
1301
1294
|
if (js.isJavaScriptErrorInEvaluate(e) || (0, _selectorParser.isInvalidSelectorError)(e)) throw e;
|
|
@@ -1306,7 +1299,60 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1306
1299
|
if (lastIntermediateResult.isSet) result.received = lastIntermediateResult.received;
|
|
1307
1300
|
if (e instanceof _errors.TimeoutError) result.timedOut = true;
|
|
1308
1301
|
return result;
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
async _expectInternal(progress, selector, options, lastIntermediateResult) {
|
|
1305
|
+
var _info$world;
|
|
1306
|
+
const selectorInFrame = await this.selectors.resolveFrameForSelector(selector, {
|
|
1307
|
+
strict: true
|
|
1309
1308
|
});
|
|
1309
|
+
progress.throwIfAborted();
|
|
1310
|
+
const {
|
|
1311
|
+
frame,
|
|
1312
|
+
info
|
|
1313
|
+
} = selectorInFrame || {
|
|
1314
|
+
frame: this,
|
|
1315
|
+
info: undefined
|
|
1316
|
+
};
|
|
1317
|
+
const world = options.expression === 'to.have.property' ? 'main' : (_info$world = info === null || info === void 0 ? void 0 : info.world) !== null && _info$world !== void 0 ? _info$world : 'utility';
|
|
1318
|
+
const context = await frame._context(world);
|
|
1319
|
+
const injected = await context.injectedScript();
|
|
1320
|
+
progress.throwIfAborted();
|
|
1321
|
+
const {
|
|
1322
|
+
log,
|
|
1323
|
+
matches,
|
|
1324
|
+
received,
|
|
1325
|
+
missingReceived
|
|
1326
|
+
} = await injected.evaluate(async (injected, {
|
|
1327
|
+
info,
|
|
1328
|
+
options,
|
|
1329
|
+
callId
|
|
1330
|
+
}) => {
|
|
1331
|
+
const elements = info ? injected.querySelectorAll(info.parsed, document) : [];
|
|
1332
|
+
const isArray = options.expression === 'to.have.count' || options.expression.endsWith('.array');
|
|
1333
|
+
let log = '';
|
|
1334
|
+
if (isArray) log = ` locator resolved to ${elements.length} element${elements.length === 1 ? '' : 's'}`;else if (elements.length > 1) throw injected.strictModeViolationError(info.parsed, elements);else if (elements.length) log = ` locator resolved to ${injected.previewNode(elements[0])}`;
|
|
1335
|
+
if (callId) injected.markTargetElements(new Set(elements), callId);
|
|
1336
|
+
return {
|
|
1337
|
+
log,
|
|
1338
|
+
...(await injected.expect(elements[0], options, elements))
|
|
1339
|
+
};
|
|
1340
|
+
}, {
|
|
1341
|
+
info,
|
|
1342
|
+
options,
|
|
1343
|
+
callId: progress.metadata.id
|
|
1344
|
+
});
|
|
1345
|
+
if (log) progress.log(log);
|
|
1346
|
+
// Note: missingReceived avoids `unexpected value "undefined"` when element was not found.
|
|
1347
|
+
if (matches === options.isNot) {
|
|
1348
|
+
lastIntermediateResult.received = missingReceived ? '<element(s) not found>' : received;
|
|
1349
|
+
lastIntermediateResult.isSet = true;
|
|
1350
|
+
if (!missingReceived && !Array.isArray(received)) progress.log(` unexpected value "${renderUnexpectedValue(options.expression, received)}"`);
|
|
1351
|
+
}
|
|
1352
|
+
return {
|
|
1353
|
+
matches,
|
|
1354
|
+
received
|
|
1355
|
+
};
|
|
1310
1356
|
}
|
|
1311
1357
|
async _waitForFunctionExpression(metadata, expression, isFunction, arg, options, world = 'main') {
|
|
1312
1358
|
const controller = new _progress.ProgressController(metadata, this);
|
|
@@ -1352,7 +1398,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1352
1398
|
fulfill(success);
|
|
1353
1399
|
return;
|
|
1354
1400
|
}
|
|
1355
|
-
if (typeof polling !== 'number')
|
|
1401
|
+
if (typeof polling !== 'number') injected.builtinRequestAnimationFrame(next);else injected.builtinSetTimeout(next, polling);
|
|
1356
1402
|
} catch (e) {
|
|
1357
1403
|
reject(e);
|
|
1358
1404
|
}
|
|
@@ -1546,7 +1592,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1546
1592
|
}).catch(() => {});
|
|
1547
1593
|
}
|
|
1548
1594
|
_asLocator(selector) {
|
|
1549
|
-
return (0,
|
|
1595
|
+
return (0, _utils.asLocator)(this._page.attribution.playwright.options.sdkLanguage, selector);
|
|
1550
1596
|
}
|
|
1551
1597
|
}
|
|
1552
1598
|
exports.Frame = Frame;
|
|
@@ -12,10 +12,7 @@ var _utils = require("../../utils");
|
|
|
12
12
|
var _eventsHelper = require("../../utils/eventsHelper");
|
|
13
13
|
var _utilsBundle = require("../../utilsBundle");
|
|
14
14
|
var _manualPromise = require("../../utils/manualPromise");
|
|
15
|
-
var _userAgent = require("../../utils/userAgent");
|
|
16
|
-
var _network2 = require("../../utils/network");
|
|
17
15
|
var _frames = require("../frames");
|
|
18
|
-
var _mimeType = require("../../utils/mimeType");
|
|
19
16
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
20
17
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
21
18
|
/**
|
|
@@ -76,7 +73,7 @@ class HarTracer {
|
|
|
76
73
|
}
|
|
77
74
|
}
|
|
78
75
|
_shouldIncludeEntryWithUrl(urlString) {
|
|
79
|
-
return !this._options.urlFilter || (0,
|
|
76
|
+
return !this._options.urlFilter || (0, _utils.urlMatches)(this._baseURL, urlString, this._options.urlFilter);
|
|
80
77
|
}
|
|
81
78
|
_entryForRequest(request) {
|
|
82
79
|
return request[this._entrySymbol];
|
|
@@ -276,7 +273,7 @@ class HarTracer {
|
|
|
276
273
|
});
|
|
277
274
|
this._addBarrier(page || request.serviceWorker(), promise);
|
|
278
275
|
|
|
279
|
-
//
|
|
276
|
+
// Response end timing is only available after the response event was received.
|
|
280
277
|
const timing = response.timing();
|
|
281
278
|
harEntry.timings.receive = response.request()._responseEndTiming !== -1 ? _helper.helper.millisToRoundishMillis(response.request()._responseEndTiming - timing.responseStart) : -1;
|
|
282
279
|
this._computeHarEntryTotalTime(harEntry);
|
|
@@ -318,7 +315,7 @@ class HarTracer {
|
|
|
318
315
|
if (this._options.content === 'embed') {
|
|
319
316
|
// Sometimes, we can receive a font/media file with textual mime type. Browser
|
|
320
317
|
// still interprets them correctly, but the 'content-type' header is obviously wrong.
|
|
321
|
-
if ((0,
|
|
318
|
+
if ((0, _utils.isTextualMimeType)(content.mimeType) && resourceType !== 'font') {
|
|
322
319
|
content.text = buffer.toString();
|
|
323
320
|
} else {
|
|
324
321
|
content.text = buffer.toString('base64');
|
|
@@ -337,11 +334,6 @@ class HarTracer {
|
|
|
337
334
|
const page = (_response$frame = response.frame()) === null || _response$frame === void 0 ? void 0 : _response$frame._page;
|
|
338
335
|
const pageEntry = this._createPageEntryIfNeeded(page);
|
|
339
336
|
const request = response.request();
|
|
340
|
-
|
|
341
|
-
// Prefer "response received" time over "request sent" time
|
|
342
|
-
// for the purpose of matching requests that were used in a particular snapshot.
|
|
343
|
-
// Note that both snapshot time and request time are taken here in the Node process.
|
|
344
|
-
if (this._options.includeTraceInfo) harEntry._monotonicTime = (0, _utils.monotonicTime)();
|
|
345
337
|
harEntry.response = {
|
|
346
338
|
status: response.status(),
|
|
347
339
|
statusText: response.statusText(),
|
|
@@ -411,7 +403,7 @@ class HarTracer {
|
|
|
411
403
|
version: '1.2',
|
|
412
404
|
creator: {
|
|
413
405
|
name: 'Playwright',
|
|
414
|
-
version: (0,
|
|
406
|
+
version: (0, _utils.getPlaywrightVersion)()
|
|
415
407
|
},
|
|
416
408
|
browser: {
|
|
417
409
|
name: (context === null || context === void 0 ? void 0 : context._browser.options.name) || '',
|
package/lib/server/helper.js
CHANGED
|
@@ -95,9 +95,9 @@ class Helper {
|
|
|
95
95
|
}
|
|
96
96
|
};
|
|
97
97
|
}
|
|
98
|
-
static formatBrowserLogs(logs) {
|
|
99
|
-
if (!logs.length) return '';
|
|
100
|
-
return '\n' + logs.join('\n');
|
|
98
|
+
static formatBrowserLogs(logs, disconnectReason) {
|
|
99
|
+
if (!disconnectReason && !logs.length) return '';
|
|
100
|
+
return '\n' + (disconnectReason ? disconnectReason + '\n' : '') + logs.join('\n');
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
const helper = exports.helper = Helper;
|
package/lib/server/index.js
CHANGED
|
@@ -51,6 +51,12 @@ Object.defineProperty(exports, "installDefaultBrowsersForNpmInstall", {
|
|
|
51
51
|
return _registry.installDefaultBrowsersForNpmInstall;
|
|
52
52
|
}
|
|
53
53
|
});
|
|
54
|
+
Object.defineProperty(exports, "installRootRedirect", {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
get: function () {
|
|
57
|
+
return _traceViewer.installRootRedirect;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
54
60
|
Object.defineProperty(exports, "openTraceInBrowser", {
|
|
55
61
|
enumerable: true,
|
|
56
62
|
get: function () {
|
|
@@ -75,12 +81,24 @@ Object.defineProperty(exports, "registryDirectory", {
|
|
|
75
81
|
return _registry.registryDirectory;
|
|
76
82
|
}
|
|
77
83
|
});
|
|
84
|
+
Object.defineProperty(exports, "runTraceViewerApp", {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
get: function () {
|
|
87
|
+
return _traceViewer.runTraceViewerApp;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
78
90
|
Object.defineProperty(exports, "serverSideCallMetadata", {
|
|
79
91
|
enumerable: true,
|
|
80
92
|
get: function () {
|
|
81
93
|
return _instrumentation.serverSideCallMetadata;
|
|
82
94
|
}
|
|
83
95
|
});
|
|
96
|
+
Object.defineProperty(exports, "startTraceViewerServer", {
|
|
97
|
+
enumerable: true,
|
|
98
|
+
get: function () {
|
|
99
|
+
return _traceViewer.startTraceViewerServer;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
84
102
|
Object.defineProperty(exports, "writeDockerVersion", {
|
|
85
103
|
enumerable: true,
|
|
86
104
|
get: function () {
|