@checkly/playwright-core 1.47.12 → 1.48.10-alpha
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 +14 -10
- package/lib/cli/program.js +22 -12
- package/lib/client/api.js +6 -0
- package/lib/client/browserContext.js +20 -2
- package/lib/client/channelOwner.js +5 -2
- package/lib/client/connection.js +3 -0
- package/lib/client/fetch.js +16 -3
- package/lib/client/jsHandle.js +0 -8
- package/lib/client/localUtils.js +1 -0
- package/lib/client/network.js +175 -17
- package/lib/client/page.js +21 -0
- package/lib/client/playwright.js +6 -3
- package/lib/client/tracing.js +16 -20
- package/lib/generated/consoleApiSource.js +1 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/pollingRecorderSource.js +7 -0
- package/lib/generated/webSocketMockSource.js +7 -0
- package/lib/protocol/validator.js +79 -14
- package/lib/server/bidi/bidiBrowser.js +23 -8
- package/lib/server/bidi/bidiChromium.js +124 -0
- package/lib/server/bidi/bidiConnection.js +1 -1
- package/lib/server/bidi/bidiExecutionContext.js +0 -3
- package/lib/server/bidi/bidiFirefox.js +15 -21
- package/lib/server/bidi/bidiInput.js +16 -32
- package/lib/server/bidi/bidiNetworkManager.js +39 -5
- package/lib/server/bidi/bidiOverCdp.js +103 -0
- package/lib/server/bidi/bidiPage.js +98 -25
- package/lib/server/bidi/bidiPdf.js +140 -0
- package/lib/server/bidi/third_party/firefoxPrefs.js +221 -0
- package/lib/server/browser.js +13 -2
- package/lib/server/browserContext.js +6 -23
- package/lib/server/browserType.js +39 -11
- package/lib/server/chromium/chromium.js +3 -15
- package/lib/server/chromium/chromiumSwitches.js +3 -1
- package/lib/server/chromium/crBrowser.js +4 -3
- package/lib/server/chromium/crExecutionContext.js +0 -7
- package/lib/server/chromium/crPage.js +5 -2
- package/lib/server/chromium/videoRecorder.js +1 -1
- package/lib/server/codegen/csharp.js +2 -2
- package/lib/server/codegen/java.js +1 -1
- package/lib/server/codegen/javascript.js +1 -1
- package/lib/server/codegen/language.js +14 -2
- package/lib/server/codegen/python.js +2 -2
- package/lib/server/cookieStore.js +73 -0
- package/lib/server/debugController.js +2 -2
- package/lib/server/deviceDescriptorsSource.json +51 -51
- package/lib/server/dialog.js +1 -0
- package/lib/server/dispatchers/browserContextDispatcher.js +19 -2
- package/lib/server/dispatchers/jsHandleDispatcher.js +0 -5
- package/lib/server/dispatchers/pageDispatcher.js +9 -0
- package/lib/server/dispatchers/playwrightDispatcher.js +2 -1
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +189 -0
- package/lib/server/download.js +9 -2
- package/lib/server/fetch.js +96 -99
- package/lib/server/firefox/ffBrowser.js +6 -4
- package/lib/server/firefox/ffExecutionContext.js +0 -3
- package/lib/server/firefox/ffPage.js +3 -0
- package/lib/server/firefox/firefox.js +2 -13
- package/lib/server/frameSelectors.js +1 -1
- package/lib/server/frames.js +3 -2
- package/lib/server/har/harTracer.js +11 -0
- package/lib/server/input.js +0 -1
- package/lib/server/javascript.js +0 -7
- package/lib/server/page.js +5 -1
- package/lib/server/playwright.js +5 -2
- package/lib/server/recorder/contextRecorder.js +33 -50
- package/lib/server/recorder/recorderActions.js +2 -1
- package/lib/server/recorder/recorderApp.js +15 -9
- package/lib/server/recorder/recorderCollection.js +68 -79
- package/lib/server/recorder/recorderFrontend.js +5 -0
- package/lib/server/recorder/recorderInTraceViewer.js +144 -0
- package/lib/server/recorder/recorderRunner.js +75 -97
- package/lib/server/recorder/recorderUtils.js +47 -6
- package/lib/server/recorder.js +28 -25
- package/lib/server/registry/index.js +85 -4
- package/lib/server/socksClientCertificatesInterceptor.js +15 -3
- package/lib/server/trace/recorder/snapshotter.js +1 -0
- package/lib/server/trace/recorder/snapshotterInjected.js +2 -2
- package/lib/server/trace/recorder/tracing.js +58 -2
- package/lib/server/trace/test/inMemorySnapshotter.js +1 -1
- package/lib/server/trace/viewer/traceViewer.js +2 -5
- package/lib/server/webkit/webkit.js +1 -1
- package/lib/server/webkit/wkBrowser.js +6 -5
- package/lib/server/webkit/wkExecutionContext.js +0 -3
- package/lib/server/webkit/wkPage.js +4 -1
- package/lib/utils/happy-eyeballs.js +13 -0
- package/lib/utils/hostPlatform.js +2 -2
- package/lib/utils/httpServer.js +1 -0
- package/lib/utils/isomorphic/locatorGenerators.js +9 -18
- package/lib/utils/isomorphic/locatorParser.js +2 -2
- package/lib/utils/isomorphic/recorderUtils.js +195 -0
- package/lib/vite/htmlReport/index.html +12 -12
- package/lib/vite/recorder/assets/codeMirrorModule-CND2fZ5Q.js +24 -0
- package/lib/vite/recorder/assets/{index-NC7rIA63.css → index-BW-aOBcL.css} +1 -1
- package/lib/vite/recorder/assets/{index-A2TWT47O.js → index-CEc83sSS.js} +10 -15
- 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-BdBhzV6t.js +16443 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-BqcXH1AO.js +16838 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-C6p3E9Zg.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-Ca-1BNel.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-CcviAl53.js +16831 -0
- package/lib/vite/{recorder/assets/codeMirrorModule-vr7pfcwZ.js → traceViewer/assets/codeMirrorModule-CqYUz5ms.js} +1 -1
- 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-EhKN7Okm.js +16449 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-MzSmL4X2.js +24 -0
- package/lib/vite/traceViewer/assets/{codeMirrorModule-cCPLLRBo.js → codeMirrorModule-T_sdMrbM.js} +1 -1
- package/lib/vite/traceViewer/assets/codeMirrorModule-U6XMqGkV.js +16437 -0
- package/lib/vite/traceViewer/assets/inspectorTab-BABZNwlH.js +17351 -0
- package/lib/vite/traceViewer/assets/inspectorTab-BPzVEZSf.js +17351 -0
- package/lib/vite/traceViewer/assets/inspectorTab-Bbgq0hgt.js +64 -0
- package/lib/vite/traceViewer/assets/inspectorTab-DhBbZz8I.js +64 -0
- package/lib/vite/traceViewer/assets/inspectorTab-DpvLVMq5.js +17351 -0
- package/lib/vite/traceViewer/assets/testServerConnection-D-tXL3sj.js +224 -0
- package/lib/vite/traceViewer/assets/workbench-B13nfocr.js +9 -0
- package/lib/vite/traceViewer/assets/workbench-BcgGQnKb.js +1473 -0
- package/lib/vite/traceViewer/assets/{wsPort-MnTGOuCA.js → workbench-Bjkiwcr1.js} +1505 -926
- package/lib/vite/traceViewer/assets/workbench-BwodYCgl.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-ByyWxoT8.js +1473 -0
- package/lib/vite/traceViewer/assets/{workbench-z8ylMSQK.js → workbench-C43LWZEX.js} +7 -7
- 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-DhqI6jeL.js +1473 -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-gtYcQBNA.js +9 -0
- package/lib/vite/traceViewer/assets/workbench-u2lRPMOT.js +72 -0
- package/lib/vite/traceViewer/assets/xtermModule-CZ7sDYXB.js +6529 -0
- package/lib/vite/traceViewer/assets/xtermModule-DZP0glxx.js +5982 -0
- package/lib/vite/traceViewer/codeMirrorModule.Cy8X9Wtw.css +344 -0
- package/lib/vite/traceViewer/embedded.27BGR_eD.js +105 -0
- package/lib/vite/traceViewer/embedded.BBZ9gQEw.js +104 -0
- package/lib/vite/traceViewer/embedded.BQq6Psnz.js +104 -0
- package/lib/vite/traceViewer/{embedded.TOXRJZ9A.js → embedded.BVDVQOzc.js} +1 -1
- package/lib/vite/traceViewer/embedded.Bn8Ptzv6.js +2 -0
- package/lib/vite/traceViewer/embedded.CorI3dFX.js +104 -0
- package/lib/vite/traceViewer/embedded.CvhnUgIi.js +2 -0
- package/lib/vite/traceViewer/embedded.D27cnKiB.js +104 -0
- package/lib/vite/traceViewer/embedded.D4lqGydT.js +2 -0
- package/lib/vite/traceViewer/embedded.DPqrDeET.js +2 -0
- package/lib/vite/traceViewer/embedded.DTjd2aiy.js +105 -0
- package/lib/vite/traceViewer/embedded.DbzY7Q8w.js +2 -0
- package/lib/vite/traceViewer/embedded.DjZq4InJ.css +68 -0
- package/lib/vite/traceViewer/embedded.SsjKHrxC.js +105 -0
- package/lib/vite/traceViewer/embedded.f-PLGsBT.js +2 -0
- package/lib/vite/traceViewer/embedded.html +6 -4
- package/lib/vite/traceViewer/index.B7aiTMfZ.js +2 -0
- package/lib/vite/traceViewer/{index.e7qpO0B0.js → index.B8dgQwuN.js} +1 -1
- package/lib/vite/traceViewer/index.BGj8jY3H.js +2 -0
- package/lib/vite/traceViewer/index.BSak5QT9.js +2 -0
- package/lib/vite/traceViewer/index.BrT2kfuc.js +2 -0
- package/lib/vite/traceViewer/{index.RT4iItO_.js → index.C0EgJ4oW.js} +36 -21
- package/lib/vite/traceViewer/index.CUpI-BFe.js +195 -0
- package/lib/vite/traceViewer/index.DkRbtWVo.js +195 -0
- package/lib/vite/traceViewer/index.DsjmhbB6.js +195 -0
- package/lib/vite/traceViewer/index.Dz3icWJV.js +196 -0
- package/lib/vite/traceViewer/index.PqcsvBxQ.js +196 -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 +7 -5
- package/lib/vite/traceViewer/index.pMAN88y-.js +2 -0
- package/lib/vite/traceViewer/index.yxAwzeWG.js +196 -0
- package/lib/vite/traceViewer/inspectorTab.DGJWXOSd.css +3145 -0
- package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +1 -0
- package/lib/vite/traceViewer/recorder.7Wl6HrQl.js +550 -0
- package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
- package/lib/vite/traceViewer/recorder.BufKu9Hp.js +550 -0
- package/lib/vite/traceViewer/recorder.Ch-WHviK.js +2 -0
- package/lib/vite/traceViewer/recorder.DBDpiNOK.css +15 -0
- package/lib/vite/traceViewer/recorder.POd-toIn.js +2 -0
- package/lib/vite/traceViewer/recorder.am-MV-DQ.js +550 -0
- package/lib/vite/traceViewer/recorder.html +17 -0
- package/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/lib/vite/traceViewer/uiMode.BEZVCe5O.js +5 -0
- package/lib/vite/traceViewer/uiMode.BZoFj6zV.js +1723 -0
- package/lib/vite/traceViewer/uiMode.C4nbcio6.js +1730 -0
- package/lib/vite/traceViewer/uiMode.CAYqod-m.css +1 -0
- package/lib/vite/traceViewer/uiMode.D-tg1Oci.js +1730 -0
- package/lib/vite/traceViewer/uiMode.DKjMBMlc.js +1730 -0
- package/lib/vite/traceViewer/uiMode.DRmgrHSk.css +1462 -0
- package/lib/vite/traceViewer/uiMode.DVWUEIHq.css +1424 -0
- package/lib/vite/traceViewer/{uiMode.MTXOs_2V.js → uiMode.DVrL7a1K.js} +5 -5
- package/lib/vite/traceViewer/uiMode.DdtUZZVS.js +5 -0
- package/lib/vite/traceViewer/uiMode.Dg9oJCQU.js +10 -0
- package/lib/vite/traceViewer/uiMode.Dlo9s_YX.js +1723 -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 +7 -5
- package/lib/vite/traceViewer/uiMode.jY2s-9ps.js +10 -0
- package/lib/vite/traceViewer/uiMode.wsGnVMQK.js +1723 -0
- package/lib/vite/traceViewer/workbench.B3X2QtYa.css +3702 -0
- package/lib/vite/traceViewer/workbench.BQNDbcQ0.css +550 -0
- package/lib/vite/traceViewer/{workbench.NokwQoMV.css → workbench.DjbIuxix.css} +1 -1
- package/lib/vite/traceViewer/workbench.DlsCx8k5.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/xtermModule.4oRVGWQ-.css +209 -0
- package/package.json +1 -1
- package/types/protocol.d.ts +610 -173
- package/types/types.d.ts +2037 -949
- package/lib/vite/traceViewer/assets/codeMirrorModule-0bpaqixv.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-clyjx5sb.js +0 -15578
- package/lib/vite/traceViewer/assets/codeMirrorModule-wLpsbIhd.js +0 -24
- package/lib/vite/traceViewer/assets/wsPort-_JBDEilC.js +0 -69
- package/lib/vite/traceViewer/assets/wsPort-f2dAQL4I.js +0 -69
- package/lib/vite/traceViewer/index.-_8-eHEE.js +0 -2
- package/lib/vite/traceViewer/index.-g_5lMbJ.css +0 -1
- package/lib/vite/traceViewer/index.u51inEcm.js +0 -2
- package/lib/vite/traceViewer/uiMode.9CwNsWc6.js +0 -10
- package/lib/vite/traceViewer/uiMode.Fb0bNA4H.js +0 -10
- package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +0 -1
- package/lib/vite/traceViewer/uiMode.yLNTmFO4.js +0 -1490
- 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/recorder/assets/{codicon-wpoHPmsu.ttf → codicon-DCmgc-ay.ttf} +0 -0
- /package/lib/vite/traceViewer/assets/{testServerConnection-_1gRQKgk.js → testServerConnection-DeE2kSzz.js} +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/{codicon.wpoHPmsu.ttf → codicon.DCmgc-ay.ttf} +0 -0
- /package/lib/vite/traceViewer/{embedded.MO1jdrtU.css → embedded.w7WN2u1R.css} +0 -0
- /package/lib/vite/traceViewer/{index.q21lh23x.css → index.CrbWWHbf.css} +0 -0
- /package/lib/vite/traceViewer/{uiMode.93DRT-rm.css → uiMode.D3cNFP6u.css} +0 -0
- /package/lib/vite/traceViewer/{xtermModule.0lwXJFHT.css → xtermModule.DSXBckUd.css} +0 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createProfile = createProfile;
|
|
7
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
/**
|
|
11
|
+
* @license
|
|
12
|
+
* Copyright 2023 Google Inc.
|
|
13
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/* eslint-disable curly, indent */
|
|
17
|
+
|
|
18
|
+
async function createProfile(options) {
|
|
19
|
+
if (!_fs.default.existsSync(options.path)) {
|
|
20
|
+
await _fs.default.promises.mkdir(options.path, {
|
|
21
|
+
recursive: true
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
await writePreferences({
|
|
25
|
+
preferences: {
|
|
26
|
+
...defaultProfilePreferences(options.preferences),
|
|
27
|
+
...options.preferences
|
|
28
|
+
},
|
|
29
|
+
path: options.path
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function defaultProfilePreferences(extraPrefs) {
|
|
33
|
+
const server = 'dummy.test';
|
|
34
|
+
const defaultPrefs = {
|
|
35
|
+
// Make sure Shield doesn't hit the network.
|
|
36
|
+
'app.normandy.api_url': '',
|
|
37
|
+
// Disable Firefox old build background check
|
|
38
|
+
'app.update.checkInstallTime': false,
|
|
39
|
+
// Disable automatically upgrading Firefox
|
|
40
|
+
'app.update.disabledForTesting': true,
|
|
41
|
+
// Increase the APZ content response timeout to 1 minute
|
|
42
|
+
'apz.content_response_timeout': 60000,
|
|
43
|
+
// Prevent various error message on the console
|
|
44
|
+
// jest-puppeteer asserts that no error message is emitted by the console
|
|
45
|
+
'browser.contentblocking.features.standard': '-tp,tpPrivate,cookieBehavior0,-cm,-fp',
|
|
46
|
+
// Enable the dump function: which sends messages to the system
|
|
47
|
+
// console
|
|
48
|
+
// https://bugzilla.mozilla.org/show_bug.cgi?id=1543115
|
|
49
|
+
'browser.dom.window.dump.enabled': true,
|
|
50
|
+
// Disable topstories
|
|
51
|
+
'browser.newtabpage.activity-stream.feeds.system.topstories': false,
|
|
52
|
+
// Always display a blank page
|
|
53
|
+
'browser.newtabpage.enabled': false,
|
|
54
|
+
// Background thumbnails in particular cause grief: and disabling
|
|
55
|
+
// thumbnails in general cannot hurt
|
|
56
|
+
'browser.pagethumbnails.capturing_disabled': true,
|
|
57
|
+
// Disable safebrowsing components.
|
|
58
|
+
'browser.safebrowsing.blockedURIs.enabled': false,
|
|
59
|
+
'browser.safebrowsing.downloads.enabled': false,
|
|
60
|
+
'browser.safebrowsing.malware.enabled': false,
|
|
61
|
+
'browser.safebrowsing.phishing.enabled': false,
|
|
62
|
+
// Disable updates to search engines.
|
|
63
|
+
'browser.search.update': false,
|
|
64
|
+
// Do not restore the last open set of tabs if the browser has crashed
|
|
65
|
+
'browser.sessionstore.resume_from_crash': false,
|
|
66
|
+
// Skip check for default browser on startup
|
|
67
|
+
'browser.shell.checkDefaultBrowser': false,
|
|
68
|
+
// Disable newtabpage
|
|
69
|
+
'browser.startup.homepage': 'about:blank',
|
|
70
|
+
// Do not redirect user when a milstone upgrade of Firefox is detected
|
|
71
|
+
'browser.startup.homepage_override.mstone': 'ignore',
|
|
72
|
+
// Start with a blank page about:blank
|
|
73
|
+
'browser.startup.page': 0,
|
|
74
|
+
// Do not allow background tabs to be zombified on Android: otherwise for
|
|
75
|
+
// tests that open additional tabs: the test harness tab itself might get
|
|
76
|
+
// unloaded
|
|
77
|
+
'browser.tabs.disableBackgroundZombification': false,
|
|
78
|
+
// Do not warn when closing all other open tabs
|
|
79
|
+
'browser.tabs.warnOnCloseOtherTabs': false,
|
|
80
|
+
// Do not warn when multiple tabs will be opened
|
|
81
|
+
'browser.tabs.warnOnOpen': false,
|
|
82
|
+
// Do not automatically offer translations, as tests do not expect this.
|
|
83
|
+
'browser.translations.automaticallyPopup': false,
|
|
84
|
+
// Disable the UI tour.
|
|
85
|
+
'browser.uitour.enabled': false,
|
|
86
|
+
// Turn off search suggestions in the location bar so as not to trigger
|
|
87
|
+
// network connections.
|
|
88
|
+
'browser.urlbar.suggest.searches': false,
|
|
89
|
+
// Disable first run splash page on Windows 10
|
|
90
|
+
'browser.usedOnWindows10.introURL': '',
|
|
91
|
+
// Do not warn on quitting Firefox
|
|
92
|
+
'browser.warnOnQuit': false,
|
|
93
|
+
// Defensively disable data reporting systems
|
|
94
|
+
'datareporting.healthreport.documentServerURI': `http://${server}/dummy/healthreport/`,
|
|
95
|
+
'datareporting.healthreport.logging.consoleEnabled': false,
|
|
96
|
+
'datareporting.healthreport.service.enabled': false,
|
|
97
|
+
'datareporting.healthreport.service.firstRun': false,
|
|
98
|
+
'datareporting.healthreport.uploadEnabled': false,
|
|
99
|
+
// Do not show datareporting policy notifications which can interfere with tests
|
|
100
|
+
'datareporting.policy.dataSubmissionEnabled': false,
|
|
101
|
+
'datareporting.policy.dataSubmissionPolicyBypassNotification': true,
|
|
102
|
+
// DevTools JSONViewer sometimes fails to load dependencies with its require.js.
|
|
103
|
+
// This doesn't affect Puppeteer but spams console (Bug 1424372)
|
|
104
|
+
'devtools.jsonview.enabled': false,
|
|
105
|
+
// Disable popup-blocker
|
|
106
|
+
'dom.disable_open_during_load': false,
|
|
107
|
+
// Enable the support for File object creation in the content process
|
|
108
|
+
// Required for |Page.setFileInputFiles| protocol method.
|
|
109
|
+
'dom.file.createInChild': true,
|
|
110
|
+
// Disable the ProcessHangMonitor
|
|
111
|
+
'dom.ipc.reportProcessHangs': false,
|
|
112
|
+
// Disable slow script dialogues
|
|
113
|
+
'dom.max_chrome_script_run_time': 0,
|
|
114
|
+
'dom.max_script_run_time': 0,
|
|
115
|
+
// Only load extensions from the application and user profile
|
|
116
|
+
// AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_APPLICATION
|
|
117
|
+
'extensions.autoDisableScopes': 0,
|
|
118
|
+
'extensions.enabledScopes': 5,
|
|
119
|
+
// Disable metadata caching for installed add-ons by default
|
|
120
|
+
'extensions.getAddons.cache.enabled': false,
|
|
121
|
+
// Disable installing any distribution extensions or add-ons.
|
|
122
|
+
'extensions.installDistroAddons': false,
|
|
123
|
+
// Disabled screenshots extension
|
|
124
|
+
'extensions.screenshots.disabled': true,
|
|
125
|
+
// Turn off extension updates so they do not bother tests
|
|
126
|
+
'extensions.update.enabled': false,
|
|
127
|
+
// Turn off extension updates so they do not bother tests
|
|
128
|
+
'extensions.update.notifyUser': false,
|
|
129
|
+
// Make sure opening about:addons will not hit the network
|
|
130
|
+
'extensions.webservice.discoverURL': `http://${server}/dummy/discoveryURL`,
|
|
131
|
+
// Allow the application to have focus even it runs in the background
|
|
132
|
+
'focusmanager.testmode': true,
|
|
133
|
+
// Disable useragent updates
|
|
134
|
+
'general.useragent.updates.enabled': false,
|
|
135
|
+
// Always use network provider for geolocation tests so we bypass the
|
|
136
|
+
// macOS dialog raised by the corelocation provider
|
|
137
|
+
'geo.provider.testing': true,
|
|
138
|
+
// Do not scan Wifi
|
|
139
|
+
'geo.wifi.scan': false,
|
|
140
|
+
// No hang monitor
|
|
141
|
+
'hangmonitor.timeout': 0,
|
|
142
|
+
// Show chrome errors and warnings in the error console
|
|
143
|
+
'javascript.options.showInConsole': true,
|
|
144
|
+
// Disable download and usage of OpenH264: and Widevine plugins
|
|
145
|
+
'media.gmp-manager.updateEnabled': false,
|
|
146
|
+
// Disable the GFX sanity window
|
|
147
|
+
'media.sanity-test.disabled': true,
|
|
148
|
+
// Disable experimental feature that is only available in Nightly
|
|
149
|
+
'network.cookie.sameSite.laxByDefault': false,
|
|
150
|
+
// Do not prompt for temporary redirects
|
|
151
|
+
'network.http.prompt-temp-redirect': false,
|
|
152
|
+
// Disable speculative connections so they are not reported as leaking
|
|
153
|
+
// when they are hanging around
|
|
154
|
+
'network.http.speculative-parallel-limit': 0,
|
|
155
|
+
// Do not automatically switch between offline and online
|
|
156
|
+
'network.manage-offline-status': false,
|
|
157
|
+
// Make sure SNTP requests do not hit the network
|
|
158
|
+
'network.sntp.pools': server,
|
|
159
|
+
// Disable Flash.
|
|
160
|
+
'plugin.state.flash': 0,
|
|
161
|
+
'privacy.trackingprotection.enabled': false,
|
|
162
|
+
// Can be removed once Firefox 89 is no longer supported
|
|
163
|
+
// https://bugzilla.mozilla.org/show_bug.cgi?id=1710839
|
|
164
|
+
'remote.enabled': true,
|
|
165
|
+
// Don't do network connections for mitm priming
|
|
166
|
+
'security.certerrors.mitm.priming.enabled': false,
|
|
167
|
+
// Local documents have access to all other local documents,
|
|
168
|
+
// including directory listings
|
|
169
|
+
'security.fileuri.strict_origin_policy': false,
|
|
170
|
+
// Do not wait for the notification button security delay
|
|
171
|
+
'security.notification_enable_delay': 0,
|
|
172
|
+
// Ensure blocklist updates do not hit the network
|
|
173
|
+
'services.settings.server': `http://${server}/dummy/blocklist/`,
|
|
174
|
+
// Do not automatically fill sign-in forms with known usernames and
|
|
175
|
+
// passwords
|
|
176
|
+
'signon.autofillForms': false,
|
|
177
|
+
// Disable password capture, so that tests that include forms are not
|
|
178
|
+
// influenced by the presence of the persistent doorhanger notification
|
|
179
|
+
'signon.rememberSignons': false,
|
|
180
|
+
// Disable first-run welcome page
|
|
181
|
+
'startup.homepage_welcome_url': 'about:blank',
|
|
182
|
+
// Disable first-run welcome page
|
|
183
|
+
'startup.homepage_welcome_url.additional': '',
|
|
184
|
+
// Disable browser animations (tabs, fullscreen, sliding alerts)
|
|
185
|
+
'toolkit.cosmeticAnimations.enabled': false,
|
|
186
|
+
// Prevent starting into safe mode after application crashes
|
|
187
|
+
'toolkit.startup.max_resumed_crashes': -1
|
|
188
|
+
};
|
|
189
|
+
return Object.assign(defaultPrefs, extraPrefs);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Populates the user.js file with custom preferences as needed to allow
|
|
194
|
+
* Firefox's CDP support to properly function. These preferences will be
|
|
195
|
+
* automatically copied over to prefs.js during startup of Firefox. To be
|
|
196
|
+
* able to restore the original values of preferences a backup of prefs.js
|
|
197
|
+
* will be created.
|
|
198
|
+
*
|
|
199
|
+
* @param prefs - List of preferences to add.
|
|
200
|
+
* @param profilePath - Firefox profile to write the preferences to.
|
|
201
|
+
*/
|
|
202
|
+
async function writePreferences(options) {
|
|
203
|
+
const prefsPath = _path.default.join(options.path, 'prefs.js');
|
|
204
|
+
const lines = Object.entries(options.preferences).map(([key, value]) => {
|
|
205
|
+
return `user_pref(${JSON.stringify(key)}, ${JSON.stringify(value)});`;
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
// Use allSettled to prevent corruption
|
|
209
|
+
const result = await Promise.allSettled([_fs.default.promises.writeFile(_path.default.join(options.path, 'user.js'), lines.join('\n')),
|
|
210
|
+
// Create a backup of the preferences file if it already exitsts.
|
|
211
|
+
_fs.default.promises.access(prefsPath, _fs.default.constants.F_OK).then(async () => {
|
|
212
|
+
await _fs.default.promises.copyFile(prefsPath, _path.default.join(options.path, 'prefs.js.playwright'));
|
|
213
|
+
},
|
|
214
|
+
// Swallow only if file does not exist
|
|
215
|
+
() => {})]);
|
|
216
|
+
for (const command of result) {
|
|
217
|
+
if (command.status === 'rejected') {
|
|
218
|
+
throw command.reason;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
package/lib/server/browser.js
CHANGED
|
@@ -9,6 +9,7 @@ var _page = require("./page");
|
|
|
9
9
|
var _download = require("./download");
|
|
10
10
|
var _instrumentation = require("./instrumentation");
|
|
11
11
|
var _artifact = require("./artifact");
|
|
12
|
+
var _socksClientCertificatesInterceptor = require("./socksClientCertificatesInterceptor");
|
|
12
13
|
/**
|
|
13
14
|
* Copyright (c) Microsoft Corporation.
|
|
14
15
|
*
|
|
@@ -41,13 +42,23 @@ class Browser extends _instrumentation.SdkObject {
|
|
|
41
42
|
this.instrumentation.onBrowserOpen(this);
|
|
42
43
|
}
|
|
43
44
|
async newContext(metadata, options) {
|
|
45
|
+
var _options$clientCertif;
|
|
44
46
|
(0, _browserContext.validateBrowserContextOptions)(options, this.options);
|
|
45
|
-
|
|
47
|
+
let clientCertificatesProxy;
|
|
48
|
+
if ((_options$clientCertif = options.clientCertificates) !== null && _options$clientCertif !== void 0 && _options$clientCertif.length) {
|
|
49
|
+
clientCertificatesProxy = new _socksClientCertificatesInterceptor.ClientCertificatesProxy(options);
|
|
50
|
+
options = {
|
|
51
|
+
...options
|
|
52
|
+
};
|
|
53
|
+
options.proxyOverride = await clientCertificatesProxy.listen();
|
|
54
|
+
options.internalIgnoreHTTPSErrors = true;
|
|
55
|
+
}
|
|
46
56
|
let context;
|
|
47
57
|
try {
|
|
48
58
|
context = await this.doCreateNewContext(options);
|
|
49
59
|
} catch (error) {
|
|
50
|
-
|
|
60
|
+
var _clientCertificatesPr;
|
|
61
|
+
await ((_clientCertificatesPr = clientCertificatesProxy) === null || _clientCertificatesPr === void 0 ? void 0 : _clientCertificatesPr.close());
|
|
51
62
|
throw error;
|
|
52
63
|
}
|
|
53
64
|
context._clientCertificatesProxy = clientCertificatesProxy;
|
|
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.BrowserContext = void 0;
|
|
7
7
|
exports.assertBrowserContextIsNotOwned = assertBrowserContextIsNotOwned;
|
|
8
|
-
exports.createClientCertificatesProxyIfNeeded = createClientCertificatesProxyIfNeeded;
|
|
9
8
|
exports.normalizeProxySettings = normalizeProxySettings;
|
|
10
9
|
exports.validateBrowserContextOptions = validateBrowserContextOptions;
|
|
11
10
|
exports.verifyClientCertificates = verifyClientCertificates;
|
|
@@ -26,7 +25,6 @@ var _recorder = require("./recorder");
|
|
|
26
25
|
var consoleApiSource = _interopRequireWildcard(require("../generated/consoleApiSource"));
|
|
27
26
|
var _fetch = require("./fetch");
|
|
28
27
|
var _clock = require("./clock");
|
|
29
|
-
var _socksClientCertificatesInterceptor = require("./socksClientCertificatesInterceptor");
|
|
30
28
|
var _recorderApp = require("./recorder/recorderApp");
|
|
31
29
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
32
30
|
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); }
|
|
@@ -104,14 +102,14 @@ class BrowserContext extends _instrumentation.SdkObject {
|
|
|
104
102
|
this._debugger = new _debugger.Debugger(this);
|
|
105
103
|
|
|
106
104
|
// When PWDEBUG=1, show inspector for each context.
|
|
107
|
-
if ((0, _utils.debugMode)() === 'inspector') await _recorder.Recorder.show(this, _recorderApp.RecorderApp.factory(this), {
|
|
105
|
+
if ((0, _utils.debugMode)() === 'inspector') await _recorder.Recorder.show('actions', this, _recorderApp.RecorderApp.factory(this), {
|
|
108
106
|
pauseOnNextStatement: true
|
|
109
107
|
});
|
|
110
108
|
|
|
111
109
|
// When paused, show inspector.
|
|
112
|
-
if (this._debugger.isPaused()) _recorder.Recorder.
|
|
110
|
+
if (this._debugger.isPaused()) _recorder.Recorder.showInspectorNoReply(this, _recorderApp.RecorderApp.factory(this));
|
|
113
111
|
this._debugger.on(_debugger.Debugger.Events.PausedStateChanged, () => {
|
|
114
|
-
if (this._debugger.isPaused()) _recorder.Recorder.
|
|
112
|
+
if (this._debugger.isPaused()) _recorder.Recorder.showInspectorNoReply(this, _recorderApp.RecorderApp.factory(this));
|
|
115
113
|
});
|
|
116
114
|
if ((0, _utils.debugMode)() === 'console') await this.extendInjectedScript(consoleApiSource.source);
|
|
117
115
|
if (this._options.serviceWorkers === 'block') await this.addInitScript(`\nif (navigator.serviceWorker) navigator.serviceWorker.register = async () => { console.warn('Service Worker registration blocked by Playwright'); };\n`);
|
|
@@ -425,8 +423,7 @@ class BrowserContext extends _instrumentation.SdkObject {
|
|
|
425
423
|
const page = await this.newPage(internalMetadata);
|
|
426
424
|
await page._setServerRequestInterceptor(handler => {
|
|
427
425
|
handler.fulfill({
|
|
428
|
-
body: '<html></html>'
|
|
429
|
-
requestUrl: handler.request().url()
|
|
426
|
+
body: '<html></html>'
|
|
430
427
|
}).catch(() => {});
|
|
431
428
|
return true;
|
|
432
429
|
});
|
|
@@ -464,8 +461,7 @@ class BrowserContext extends _instrumentation.SdkObject {
|
|
|
464
461
|
}));
|
|
465
462
|
await page._setServerRequestInterceptor(handler => {
|
|
466
463
|
handler.fulfill({
|
|
467
|
-
body: '<html></html>'
|
|
468
|
-
requestUrl: handler.request().url()
|
|
464
|
+
body: '<html></html>'
|
|
469
465
|
}).catch(() => {});
|
|
470
466
|
return true;
|
|
471
467
|
});
|
|
@@ -495,8 +491,7 @@ class BrowserContext extends _instrumentation.SdkObject {
|
|
|
495
491
|
const page = await this.newPage(internalMetadata);
|
|
496
492
|
await page._setServerRequestInterceptor(handler => {
|
|
497
493
|
handler.fulfill({
|
|
498
|
-
body: '<html></html>'
|
|
499
|
-
requestUrl: handler.request().url()
|
|
494
|
+
body: '<html></html>'
|
|
500
495
|
}).catch(() => {});
|
|
501
496
|
return true;
|
|
502
497
|
});
|
|
@@ -574,18 +569,6 @@ function assertBrowserContextIsNotOwned(context) {
|
|
|
574
569
|
if (page._ownedContext) throw new Error('Please use browser.newContext() for multi-page scripts that share the context.');
|
|
575
570
|
}
|
|
576
571
|
}
|
|
577
|
-
async function createClientCertificatesProxyIfNeeded(options, browserOptions) {
|
|
578
|
-
var _options$clientCertif, _options$proxy, _options$proxy2, _browserOptions$proxy, _browserOptions$proxy2;
|
|
579
|
-
if (!((_options$clientCertif = options.clientCertificates) !== null && _options$clientCertif !== void 0 && _options$clientCertif.length)) return;
|
|
580
|
-
if ((_options$proxy = options.proxy) !== null && _options$proxy !== void 0 && _options$proxy.server && ((_options$proxy2 = options.proxy) === null || _options$proxy2 === void 0 ? void 0 : _options$proxy2.server) !== 'per-context' || browserOptions !== null && browserOptions !== void 0 && (_browserOptions$proxy = browserOptions.proxy) !== null && _browserOptions$proxy !== void 0 && _browserOptions$proxy.server && (browserOptions === null || browserOptions === void 0 || (_browserOptions$proxy2 = browserOptions.proxy) === null || _browserOptions$proxy2 === void 0 ? void 0 : _browserOptions$proxy2.server) !== 'http://per-context') throw new Error('Cannot specify both proxy and clientCertificates');
|
|
581
|
-
verifyClientCertificates(options.clientCertificates);
|
|
582
|
-
const clientCertificatesProxy = new _socksClientCertificatesInterceptor.ClientCertificatesProxy(options);
|
|
583
|
-
options.proxy = {
|
|
584
|
-
server: await clientCertificatesProxy.listen()
|
|
585
|
-
};
|
|
586
|
-
options.ignoreHTTPSErrors = true;
|
|
587
|
-
return clientCertificatesProxy;
|
|
588
|
-
}
|
|
589
572
|
function validateBrowserContextOptions(options, browserOptions) {
|
|
590
573
|
if (options.noDefaultViewport && options.deviceScaleFactor !== undefined) throw new Error(`"deviceScaleFactor" option is not supported with null "viewport"`);
|
|
591
574
|
if (options.noDefaultViewport && !!options.isMobile) throw new Error(`"isMobile" option is not supported with null "viewport"`);
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.kNoXServerRunningError = exports.BrowserType = void 0;
|
|
6
|
+
exports.kNoXServerRunningError = exports.BrowserType = exports.BrowserReadyState = void 0;
|
|
7
7
|
var _fs = _interopRequireDefault(require("fs"));
|
|
8
8
|
var os = _interopRequireWildcard(require("os"));
|
|
9
9
|
var _path = _interopRequireDefault(require("path"));
|
|
@@ -20,6 +20,7 @@ var _helper = require("./helper");
|
|
|
20
20
|
var _debugLogger = require("../utils/debugLogger");
|
|
21
21
|
var _instrumentation = require("./instrumentation");
|
|
22
22
|
var _protocolError = require("./protocolError");
|
|
23
|
+
var _socksClientCertificatesInterceptor = require("./socksClientCertificatesInterceptor");
|
|
23
24
|
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); }
|
|
24
25
|
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; }
|
|
25
26
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -40,6 +41,22 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
40
41
|
*/
|
|
41
42
|
|
|
42
43
|
const kNoXServerRunningError = exports.kNoXServerRunningError = 'Looks like you launched a headed browser without having a XServer running.\n' + 'Set either \'headless: true\' or use \'xvfb-run <your-playwright-app>\' before running Playwright.\n\n<3 Playwright Team';
|
|
44
|
+
class BrowserReadyState {
|
|
45
|
+
constructor() {
|
|
46
|
+
this._wsEndpoint = new _utils.ManualPromise();
|
|
47
|
+
}
|
|
48
|
+
onBrowserExit() {
|
|
49
|
+
// Unblock launch when browser prematurely exits.
|
|
50
|
+
this._wsEndpoint.resolve(undefined);
|
|
51
|
+
}
|
|
52
|
+
async waitUntilReady() {
|
|
53
|
+
const wsEndpoint = await this._wsEndpoint;
|
|
54
|
+
return {
|
|
55
|
+
wsEndpoint
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.BrowserReadyState = BrowserReadyState;
|
|
43
60
|
class BrowserType extends _instrumentation.SdkObject {
|
|
44
61
|
constructor(parent, browserName) {
|
|
45
62
|
super(parent, 'browser-type');
|
|
@@ -69,24 +86,33 @@ class BrowserType extends _instrumentation.SdkObject {
|
|
|
69
86
|
return browser;
|
|
70
87
|
}
|
|
71
88
|
async launchPersistentContext(metadata, userDataDir, options) {
|
|
72
|
-
|
|
73
|
-
if (this._useBidi)
|
|
89
|
+
const launchOptions = this._validateLaunchOptions(options);
|
|
90
|
+
if (this._useBidi) launchOptions.useWebSocket = true;
|
|
74
91
|
const controller = new _progress.ProgressController(metadata, this);
|
|
75
|
-
const persistent = {
|
|
76
|
-
...options
|
|
77
|
-
};
|
|
78
92
|
controller.setLogName('browser');
|
|
79
93
|
const browser = await controller.run(async progress => {
|
|
94
|
+
var _options$clientCertif;
|
|
80
95
|
// Note: Any initial TLS requests will fail since we rely on the Page/Frames initialize which sets ignoreHTTPSErrors.
|
|
81
|
-
|
|
82
|
-
if (
|
|
83
|
-
|
|
84
|
-
|
|
96
|
+
let clientCertificatesProxy;
|
|
97
|
+
if ((_options$clientCertif = options.clientCertificates) !== null && _options$clientCertif !== void 0 && _options$clientCertif.length) {
|
|
98
|
+
var _clientCertificatesPr;
|
|
99
|
+
clientCertificatesProxy = new _socksClientCertificatesInterceptor.ClientCertificatesProxy(options);
|
|
100
|
+
launchOptions.proxyOverride = await ((_clientCertificatesPr = clientCertificatesProxy) === null || _clientCertificatesPr === void 0 ? void 0 : _clientCertificatesPr.listen());
|
|
101
|
+
options = {
|
|
102
|
+
...options
|
|
103
|
+
};
|
|
104
|
+
options.internalIgnoreHTTPSErrors = true;
|
|
105
|
+
}
|
|
106
|
+
progress.cleanupWhenAborted(() => {
|
|
107
|
+
var _clientCertificatesPr2;
|
|
108
|
+
return (_clientCertificatesPr2 = clientCertificatesProxy) === null || _clientCertificatesPr2 === void 0 ? void 0 : _clientCertificatesPr2.close();
|
|
109
|
+
});
|
|
110
|
+
const browser = await this._innerLaunchWithRetries(progress, launchOptions, options, _helper.helper.debugProtocolLogger(), userDataDir).catch(e => {
|
|
85
111
|
throw this._rewriteStartupLog(e);
|
|
86
112
|
});
|
|
87
113
|
browser._defaultContext._clientCertificatesProxy = clientCertificatesProxy;
|
|
88
114
|
return browser;
|
|
89
|
-
}, _timeoutSettings.TimeoutSettings.launchTimeout(
|
|
115
|
+
}, _timeoutSettings.TimeoutSettings.launchTimeout(launchOptions));
|
|
90
116
|
return browser._defaultContext;
|
|
91
117
|
}
|
|
92
118
|
async _innerLaunchWithRetries(progress, options, persistent, protocolLogger, userDataDir) {
|
|
@@ -164,6 +190,7 @@ class BrowserType extends _instrumentation.SdkObject {
|
|
|
164
190
|
userDataDir = await _fs.default.promises.mkdtemp(_path.default.join(os.tmpdir(), `playwright_${this._name}dev_profile-`));
|
|
165
191
|
tempDirectories.push(userDataDir);
|
|
166
192
|
}
|
|
193
|
+
await this.prepareUserDataDir(options, userDataDir);
|
|
167
194
|
const browserArguments = [];
|
|
168
195
|
if (ignoreAllDefaultArgs) browserArguments.push(...args);else if (ignoreDefaultArgs) browserArguments.push(...this.defaultArgs(options, isPersistent, userDataDir).filter(arg => ignoreDefaultArgs.indexOf(arg) === -1));else browserArguments.push(...this.defaultArgs(options, isPersistent, userDataDir));
|
|
169
196
|
let executable;
|
|
@@ -298,6 +325,7 @@ class BrowserType extends _instrumentation.SdkObject {
|
|
|
298
325
|
readyState(options) {
|
|
299
326
|
return undefined;
|
|
300
327
|
}
|
|
328
|
+
async prepareUserDataDir(options, userDataDir) {}
|
|
301
329
|
}
|
|
302
330
|
exports.BrowserType = BrowserType;
|
|
303
331
|
function copyTestHooks(from, to) {
|
|
@@ -256,8 +256,7 @@ class Chromium extends _browserType.BrowserType {
|
|
|
256
256
|
}
|
|
257
257
|
_innerDefaultArgs(options) {
|
|
258
258
|
const {
|
|
259
|
-
args = []
|
|
260
|
-
proxy
|
|
259
|
+
args = []
|
|
261
260
|
} = options;
|
|
262
261
|
const userDataDirArg = args.find(arg => arg.startsWith('--user-data-dir'));
|
|
263
262
|
if (userDataDirArg) throw this._createUserDataDirArgMisuseError('--user-data-dir');
|
|
@@ -276,6 +275,7 @@ class Chromium extends _browserType.BrowserType {
|
|
|
276
275
|
chromeArguments.push('--hide-scrollbars', '--mute-audio', '--blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4');
|
|
277
276
|
}
|
|
278
277
|
if (options.chromiumSandbox !== true) chromeArguments.push('--no-sandbox');
|
|
278
|
+
const proxy = options.proxyOverride || options.proxy;
|
|
279
279
|
if (proxy) {
|
|
280
280
|
const proxyURL = new URL(proxy.server);
|
|
281
281
|
const isSocks = proxyURL.protocol === 'socks5:';
|
|
@@ -302,23 +302,11 @@ class Chromium extends _browserType.BrowserType {
|
|
|
302
302
|
}
|
|
303
303
|
}
|
|
304
304
|
exports.Chromium = Chromium;
|
|
305
|
-
class ChromiumReadyState {
|
|
306
|
-
constructor() {
|
|
307
|
-
this._wsEndpoint = new _manualPromise.ManualPromise();
|
|
308
|
-
}
|
|
305
|
+
class ChromiumReadyState extends _browserType.BrowserReadyState {
|
|
309
306
|
onBrowserOutput(message) {
|
|
310
307
|
const match = message.match(/DevTools listening on (.*)/);
|
|
311
308
|
if (match) this._wsEndpoint.resolve(match[1]);
|
|
312
309
|
}
|
|
313
|
-
onBrowserExit() {
|
|
314
|
-
this._wsEndpoint.resolve(undefined);
|
|
315
|
-
}
|
|
316
|
-
async waitUntilReady() {
|
|
317
|
-
const wsEndpoint = await this._wsEndpoint;
|
|
318
|
-
return {
|
|
319
|
-
wsEndpoint
|
|
320
|
-
};
|
|
321
|
-
}
|
|
322
310
|
}
|
|
323
311
|
async function urlToWSEndpoint(progress, endpointURL, headers) {
|
|
324
312
|
if (endpointURL.startsWith('ws')) return endpointURL;
|
|
@@ -34,8 +34,10 @@ const chromiumSwitches = exports.chromiumSwitches = ['--disable-field-trial-conf
|
|
|
34
34
|
// Translate - https://github.com/microsoft/playwright/issues/16126
|
|
35
35
|
// HttpsUpgrades - https://github.com/microsoft/playwright/pull/27605
|
|
36
36
|
// PaintHolding - https://github.com/microsoft/playwright/issues/28023
|
|
37
|
+
// ThirdPartyStoragePartitioning - https://github.com/microsoft/playwright/issues/32230
|
|
38
|
+
// LensOverlay - Hides the Lens feature in the URL address bar. Its not working in unofficial builds.
|
|
37
39
|
// PlzDedicatedWorker - https://github.com/microsoft/playwright/issues/31747
|
|
38
|
-
'--disable-features=ImprovedCookieControls,LazyFrameLoading,GlobalMediaControls,DestroyProfileOnBrowserClose,MediaRouter,DialMediaRouteProvider,AcceptCHFrame,AutoExpandDetailsElement,CertificateTransparencyComponentUpdater,AvoidUnnecessaryBeforeUnloadCheckSync,Translate,HttpsUpgrades,PaintHolding,PlzDedicatedWorker', '--allow-pre-commit-input', '--disable-hang-monitor', '--disable-ipc-flooding-protection', '--disable-popup-blocking', '--disable-prompt-on-repost', '--disable-renderer-backgrounding', '--force-color-profile=srgb', '--metrics-recording-only', '--no-first-run', '--enable-automation', '--password-store=basic', '--use-mock-keychain',
|
|
40
|
+
'--disable-features=ImprovedCookieControls,LazyFrameLoading,GlobalMediaControls,DestroyProfileOnBrowserClose,MediaRouter,DialMediaRouteProvider,AcceptCHFrame,AutoExpandDetailsElement,CertificateTransparencyComponentUpdater,AvoidUnnecessaryBeforeUnloadCheckSync,Translate,HttpsUpgrades,PaintHolding,ThirdPartyStoragePartitioning,LensOverlay,PlzDedicatedWorker', '--allow-pre-commit-input', '--disable-hang-monitor', '--disable-ipc-flooding-protection', '--disable-popup-blocking', '--disable-prompt-on-repost', '--disable-renderer-backgrounding', '--force-color-profile=srgb', '--metrics-recording-only', '--no-first-run', '--enable-automation', '--password-store=basic', '--use-mock-keychain',
|
|
39
41
|
// See https://chromium-review.googlesource.com/c/chromium/src/+/2436773
|
|
40
42
|
'--no-service-autorun', '--export-tagged-pdf',
|
|
41
43
|
// https://chromium-review.googlesource.com/c/chromium/src/+/4853540
|
|
@@ -99,15 +99,16 @@ class CRBrowser extends _browser.Browser {
|
|
|
99
99
|
this._session.on('Browser.downloadProgress', this._onDownloadProgress.bind(this));
|
|
100
100
|
}
|
|
101
101
|
async doCreateNewContext(options) {
|
|
102
|
+
const proxy = options.proxyOverride || options.proxy;
|
|
102
103
|
let proxyBypassList = undefined;
|
|
103
|
-
if (
|
|
104
|
-
if (process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK) proxyBypassList =
|
|
104
|
+
if (proxy) {
|
|
105
|
+
if (process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK) proxyBypassList = proxy.bypass;else proxyBypassList = '<-loopback>' + (proxy.bypass ? `,${proxy.bypass}` : '');
|
|
105
106
|
}
|
|
106
107
|
const {
|
|
107
108
|
browserContextId
|
|
108
109
|
} = await this._session.send('Target.createBrowserContext', {
|
|
109
110
|
disposeOnDetach: true,
|
|
110
|
-
proxyServer:
|
|
111
|
+
proxyServer: proxy ? proxy.server : undefined,
|
|
111
112
|
proxyBypassList
|
|
112
113
|
});
|
|
113
114
|
const context = new CRBrowserContext(this, browserContextId, options);
|
|
@@ -110,13 +110,6 @@ class CRExecutionContext {
|
|
|
110
110
|
async releaseHandle(objectId) {
|
|
111
111
|
await (0, _crProtocolHelper.releaseObject)(this._client, objectId);
|
|
112
112
|
}
|
|
113
|
-
async objectCount(objectId) {
|
|
114
|
-
const result = await this._client.send('Runtime.queryObjects', {
|
|
115
|
-
prototypeObjectId: objectId
|
|
116
|
-
});
|
|
117
|
-
const match = result.objects.description.match(/Array\((\d+)\)/);
|
|
118
|
-
return +match[1];
|
|
119
|
-
}
|
|
120
113
|
}
|
|
121
114
|
exports.CRExecutionContext = CRExecutionContext;
|
|
122
115
|
function rewriteError(error) {
|
|
@@ -214,6 +214,9 @@ class CRPage {
|
|
|
214
214
|
goForward() {
|
|
215
215
|
return this._go(+1);
|
|
216
216
|
}
|
|
217
|
+
async requestGC() {
|
|
218
|
+
await this._mainFrameSession._client.send('HeapProfiler.collectGarbage');
|
|
219
|
+
}
|
|
217
220
|
async addInitScript(initScript, world = 'main') {
|
|
218
221
|
await this._forAllFrameSessions(frame => frame._evaluateOnNewDocument(initScript, world));
|
|
219
222
|
}
|
|
@@ -463,7 +466,7 @@ class FrameSession {
|
|
|
463
466
|
if (options.bypassCSP) promises.push(this._client.send('Page.setBypassCSP', {
|
|
464
467
|
enabled: true
|
|
465
468
|
}));
|
|
466
|
-
if (options.ignoreHTTPSErrors) promises.push(this._client.send('Security.setIgnoreCertificateErrors', {
|
|
469
|
+
if (options.ignoreHTTPSErrors || options.internalIgnoreHTTPSErrors) promises.push(this._client.send('Security.setIgnoreCertificateErrors', {
|
|
467
470
|
ignore: true
|
|
468
471
|
}));
|
|
469
472
|
if (this._isMainFrame()) promises.push(this._updateViewport());
|
|
@@ -770,7 +773,7 @@ class FrameSession {
|
|
|
770
773
|
const buffer = Buffer.from(payload.data, 'base64');
|
|
771
774
|
this._page.emit(_page.Page.Events.ScreencastFrame, {
|
|
772
775
|
buffer,
|
|
773
|
-
|
|
776
|
+
frameSwapWallTime: payload.metadata.timestamp ? payload.metadata.timestamp * 1000 : undefined,
|
|
774
777
|
width: payload.metadata.deviceWidth,
|
|
775
778
|
height: payload.metadata.deviceHeight
|
|
776
779
|
});
|
|
@@ -50,7 +50,7 @@ class VideoRecorder {
|
|
|
50
50
|
this._ffmpegPath = void 0;
|
|
51
51
|
this._progress = progress;
|
|
52
52
|
this._ffmpegPath = ffmpegPath;
|
|
53
|
-
page.on(_page.Page.Events.ScreencastFrame, frame => this.writeFrame(frame.buffer, frame.
|
|
53
|
+
page.on(_page.Page.Events.ScreencastFrame, frame => this.writeFrame(frame.buffer, frame.frameSwapWallTime / 1000));
|
|
54
54
|
}
|
|
55
55
|
async _launch(options) {
|
|
56
56
|
// How to tune the codec:
|
|
@@ -60,7 +60,7 @@ class CSharpLanguageGenerator {
|
|
|
60
60
|
if (action.url && action.url !== 'about:blank' && action.url !== 'chrome://newtab/') formatter.add(`await ${pageAlias}.GotoAsync(${quote(action.url)});`);
|
|
61
61
|
return formatter.format();
|
|
62
62
|
}
|
|
63
|
-
const locators = actionInContext.frame.framePath.map(selector => `.${this._asLocator(selector)}.ContentFrame
|
|
63
|
+
const locators = actionInContext.frame.framePath.map(selector => `.${this._asLocator(selector)}.ContentFrame`);
|
|
64
64
|
const subject = `${pageAlias}${locators.join('')}`;
|
|
65
65
|
const signals = (0, _language.toSignalMap)(action);
|
|
66
66
|
if (signals.dialog) {
|
|
@@ -96,7 +96,7 @@ class CSharpLanguageGenerator {
|
|
|
96
96
|
{
|
|
97
97
|
let method = 'Click';
|
|
98
98
|
if (action.clickCount === 2) method = 'DblClick';
|
|
99
|
-
const options = (0, _language.
|
|
99
|
+
const options = (0, _language.toClickOptionsForSourceCode)(action);
|
|
100
100
|
if (!Object.entries(options).length) return `await ${subject}.${this._asLocator(action.selector)}.${method}Async();`;
|
|
101
101
|
const optionsString = formatObject(options, ' ', 'Locator' + method + 'Options');
|
|
102
102
|
return `await ${subject}.${this._asLocator(action.selector)}.${method}Async(${optionsString});`;
|
|
@@ -87,7 +87,7 @@ class JavaLanguageGenerator {
|
|
|
87
87
|
{
|
|
88
88
|
let method = 'click';
|
|
89
89
|
if (action.clickCount === 2) method = 'dblclick';
|
|
90
|
-
const options = (0, _language.
|
|
90
|
+
const options = (0, _language.toClickOptionsForSourceCode)(action);
|
|
91
91
|
const optionsText = formatClickOptions(options);
|
|
92
92
|
return `${subject}.${this._asLocator(action.selector, inFrameLocator)}.${method}(${optionsText});`;
|
|
93
93
|
}
|
|
@@ -71,7 +71,7 @@ class JavaScriptLanguageGenerator {
|
|
|
71
71
|
{
|
|
72
72
|
let method = 'click';
|
|
73
73
|
if (action.clickCount === 2) method = 'dblclick';
|
|
74
|
-
const options = (0, _language.
|
|
74
|
+
const options = (0, _language.toClickOptionsForSourceCode)(action);
|
|
75
75
|
const optionsString = formatOptions(options, false);
|
|
76
76
|
return `await ${subject}.${this._asLocator(action.selector)}.${method}(${optionsString});`;
|
|
77
77
|
}
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.fromKeyboardModifiers = fromKeyboardModifiers;
|
|
6
7
|
exports.generateCode = generateCode;
|
|
7
8
|
exports.sanitizeDeviceOptions = sanitizeDeviceOptions;
|
|
8
|
-
exports.
|
|
9
|
+
exports.toClickOptionsForSourceCode = toClickOptionsForSourceCode;
|
|
9
10
|
exports.toKeyboardModifiers = toKeyboardModifiers;
|
|
10
11
|
exports.toSignalMap = toSignalMap;
|
|
11
12
|
/**
|
|
@@ -65,11 +66,22 @@ function toKeyboardModifiers(modifiers) {
|
|
|
65
66
|
if (modifiers & 8) result.push('Shift');
|
|
66
67
|
return result;
|
|
67
68
|
}
|
|
68
|
-
function
|
|
69
|
+
function fromKeyboardModifiers(modifiers) {
|
|
70
|
+
let result = 0;
|
|
71
|
+
if (!modifiers) return result;
|
|
72
|
+
if (modifiers.includes('Alt')) result |= 1;
|
|
73
|
+
if (modifiers.includes('Control')) result |= 2;
|
|
74
|
+
if (modifiers.includes('ControlOrMeta')) result |= 2;
|
|
75
|
+
if (modifiers.includes('Meta')) result |= 4;
|
|
76
|
+
if (modifiers.includes('Shift')) result |= 8;
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
function toClickOptionsForSourceCode(action) {
|
|
69
80
|
const modifiers = toKeyboardModifiers(action.modifiers);
|
|
70
81
|
const options = {};
|
|
71
82
|
if (action.button !== 'left') options.button = action.button;
|
|
72
83
|
if (modifiers.length) options.modifiers = modifiers;
|
|
84
|
+
// Do not render clickCount === 2 for dblclick.
|
|
73
85
|
if (action.clickCount > 2) options.clickCount = action.clickCount;
|
|
74
86
|
if (action.position) options.position = action.position;
|
|
75
87
|
return options;
|