patchright-core 1.52.5 → 1.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ThirdPartyNotices.txt +65 -123
- package/bin/reinstall_chrome_beta_mac.sh +1 -1
- package/bin/reinstall_chrome_stable_mac.sh +1 -1
- package/bin/reinstall_msedge_beta_mac.sh +1 -1
- package/bin/reinstall_msedge_dev_mac.sh +1 -1
- package/bin/reinstall_msedge_stable_mac.sh +1 -1
- package/browsers.json +14 -14
- package/index.js +1 -1
- package/lib/androidServerImpl.js +4 -2
- package/lib/browserServerImpl.js +47 -12
- package/lib/cli/program.js +116 -50
- package/lib/cli/programWithTestStub.js +1 -1
- package/lib/client/android.js +30 -34
- package/lib/client/browser.js +54 -17
- package/lib/client/browserContext.js +67 -71
- package/lib/client/browserType.js +25 -34
- package/lib/client/channelOwner.js +20 -24
- package/lib/client/connection.js +6 -10
- package/lib/client/electron.js +8 -3
- package/lib/client/elementHandle.js +18 -21
- package/lib/client/fetch.js +5 -3
- package/lib/client/frame.js +54 -32
- package/lib/client/input.js +3 -1
- package/lib/client/jsHandle.js +4 -0
- package/lib/client/localUtils.js +0 -1
- package/lib/client/locator.js +30 -26
- package/lib/client/network.js +5 -12
- package/lib/client/page.js +32 -32
- package/lib/client/playwright.js +6 -16
- package/lib/client/selectors.js +18 -38
- package/lib/client/timeoutSettings.js +12 -8
- package/lib/client/tracing.js +24 -20
- package/lib/client/waiter.js +2 -2
- package/lib/client/webSocket.js +4 -22
- package/lib/generated/bindingsControllerSource.js +28 -0
- package/lib/generated/clockSource.js +1 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/pollingRecorderSource.js +1 -1
- package/lib/generated/storageScriptSource.js +28 -0
- package/lib/generated/utilityScriptSource.js +1 -1
- package/lib/generated/webSocketMockSource.js +12 -50
- package/lib/inProcessFactory.js +9 -6
- package/lib/outofprocess.js +0 -2
- package/lib/protocol/validator.js +421 -345
- package/lib/protocol/validatorPrimitives.js +18 -4
- package/lib/remote/playwrightConnection.js +29 -166
- package/lib/remote/playwrightServer.js +233 -35
- package/lib/server/android/android.js +97 -83
- package/lib/server/android/backendAdb.js +0 -2
- package/lib/server/bidi/bidiBrowser.js +139 -73
- package/lib/server/bidi/bidiChromium.js +23 -22
- package/lib/server/bidi/bidiExecutionContext.js +2 -1
- package/lib/server/bidi/bidiFirefox.js +17 -14
- package/lib/server/bidi/bidiInput.js +22 -22
- package/lib/server/bidi/bidiNetworkManager.js +8 -11
- package/lib/server/bidi/bidiPage.js +42 -86
- package/lib/server/bidi/third_party/bidiProtocol.js +5 -133
- package/lib/server/bidi/third_party/bidiProtocolCore.js +179 -0
- package/lib/server/{dispatchers/selectorsDispatcher.js → bidi/third_party/bidiProtocolPermissions.js} +20 -18
- package/lib/server/browser.js +30 -21
- package/lib/server/browserContext.js +203 -165
- package/lib/server/browserType.js +109 -107
- package/lib/server/chromium/chromium.js +84 -69
- package/lib/server/chromium/chromiumSwitches.js +13 -20
- package/lib/server/chromium/crBrowser.js +74 -40
- package/lib/server/chromium/crConnection.js +8 -9
- package/lib/server/chromium/crCoverage.js +11 -8
- package/lib/server/chromium/crDragDrop.js +25 -20
- package/lib/server/chromium/crExecutionContext.js +2 -1
- package/lib/server/chromium/crInput.js +32 -29
- package/lib/server/chromium/crNetworkManager.js +43 -31
- package/lib/server/chromium/crPage.js +98 -72
- package/lib/server/chromium/crServiceWorker.js +13 -18
- package/lib/server/chromium/videoRecorder.js +10 -18
- package/lib/server/clock.js +51 -39
- package/lib/server/codegen/csharp.js +10 -5
- package/lib/server/codegen/java.js +1 -1
- package/lib/server/codegen/javascript.js +1 -1
- package/lib/server/codegen/jsonl.js +2 -1
- package/lib/server/codegen/language.js +22 -1
- package/lib/server/codegen/languages.js +4 -4
- package/lib/server/codegen/python.js +1 -1
- package/lib/server/cookieStore.js +3 -1
- package/lib/server/debugController.js +105 -71
- package/lib/server/debugger.js +6 -23
- package/lib/server/deviceDescriptorsSource.json +237 -127
- package/lib/server/dialog.js +50 -6
- package/lib/server/dispatchers/androidDispatcher.js +77 -62
- package/lib/server/dispatchers/artifactDispatcher.js +18 -18
- package/lib/server/dispatchers/browserContextDispatcher.js +141 -91
- package/lib/server/dispatchers/browserDispatcher.js +55 -88
- package/lib/server/dispatchers/browserTypeDispatcher.js +18 -9
- package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -4
- package/lib/server/dispatchers/debugControllerDispatcher.js +12 -21
- package/lib/server/dispatchers/dialogDispatcher.js +4 -4
- package/lib/server/dispatchers/dispatcher.js +78 -53
- package/lib/server/dispatchers/electronDispatcher.js +19 -20
- package/lib/server/dispatchers/elementHandlerDispatcher.js +83 -93
- package/lib/server/dispatchers/frameDispatcher.js +98 -101
- package/lib/server/dispatchers/jsHandleDispatcher.js +21 -16
- package/lib/server/dispatchers/jsonPipeDispatcher.js +4 -4
- package/lib/server/dispatchers/localUtilsDispatcher.js +53 -59
- package/lib/server/dispatchers/networkDispatchers.js +41 -35
- package/lib/server/dispatchers/pageDispatcher.js +156 -107
- package/lib/server/dispatchers/playwrightDispatcher.js +37 -25
- package/lib/server/dispatchers/streamDispatcher.js +15 -8
- package/lib/server/dispatchers/tracingDispatcher.js +22 -13
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +46 -35
- package/lib/server/dispatchers/writableStreamDispatcher.js +16 -10
- package/lib/server/dom.js +198 -266
- package/lib/server/download.js +3 -3
- package/lib/server/electron/electron.js +96 -103
- package/lib/server/electron/loader.js +1 -1
- package/lib/server/fetch.js +22 -41
- package/lib/server/fileUploadUtils.js +1 -1
- package/lib/server/firefox/ffBrowser.js +79 -55
- package/lib/server/firefox/ffExecutionContext.js +2 -1
- package/lib/server/firefox/ffInput.js +23 -23
- package/lib/server/firefox/ffNetworkManager.js +8 -6
- package/lib/server/firefox/ffPage.js +39 -36
- package/lib/server/firefox/firefox.js +9 -10
- package/lib/server/frameSelectors.js +63 -20
- package/lib/server/frames.js +495 -555
- package/lib/server/har/harRecorder.js +1 -1
- package/lib/server/har/harTracer.js +4 -2
- package/lib/server/helper.js +3 -7
- package/lib/server/index.js +0 -3
- package/lib/server/input.js +47 -54
- package/lib/server/instrumentation.js +8 -14
- package/lib/server/javascript.js +8 -16
- package/lib/server/launchApp.js +48 -30
- package/lib/server/localUtils.js +45 -38
- package/lib/server/network.js +44 -10
- package/lib/server/page.js +232 -177
- package/lib/server/pageBinding.js +6 -7
- package/lib/server/playwright.js +4 -14
- package/lib/server/progress.js +57 -49
- package/lib/server/recorder/recorderApp.js +298 -95
- package/lib/server/recorder/recorderRunner.js +23 -24
- package/lib/server/recorder/recorderSignalProcessor.js +83 -0
- package/lib/server/recorder/recorderUtils.js +67 -10
- package/lib/server/recorder.js +284 -146
- package/lib/server/registry/index.js +83 -48
- package/lib/server/registry/nativeDeps.js +175 -0
- package/lib/server/registry/oopDownloadBrowserMain.js +1 -1
- package/lib/server/screenshotter.js +84 -83
- package/lib/server/selectors.js +12 -12
- package/lib/server/socksClientCertificatesInterceptor.js +198 -136
- package/lib/server/trace/recorder/snapshotter.js +12 -19
- package/lib/server/trace/recorder/tracing.js +36 -27
- package/lib/server/trace/viewer/traceViewer.js +11 -20
- package/lib/server/transport.js +20 -22
- package/lib/server/utils/comparators.js +2 -2
- package/lib/server/utils/debug.js +3 -8
- package/lib/server/utils/debugLogger.js +8 -0
- package/lib/server/utils/hostPlatform.js +3 -1
- package/lib/server/utils/network.js +35 -25
- package/lib/server/utils/nodePlatform.js +1 -1
- package/lib/server/utils/processLauncher.js +4 -1
- package/lib/server/utils/wsServer.js +11 -17
- package/lib/server/webkit/webkit.js +5 -2
- package/lib/server/webkit/wkBrowser.js +51 -28
- package/lib/server/webkit/wkExecutionContext.js +2 -1
- package/lib/server/webkit/wkInput.js +25 -25
- package/lib/server/webkit/wkInterceptableRequest.js +1 -1
- package/lib/server/webkit/wkPage.js +80 -59
- package/lib/server/webkit/wkProvisionalPage.js +1 -1
- package/lib/server/webkit/wkWorkers.js +7 -7
- package/lib/utils/isomorphic/ariaSnapshot.js +13 -7
- package/lib/utils/isomorphic/cssParser.js +1 -2
- package/lib/utils/isomorphic/locatorGenerators.js +18 -0
- package/lib/utils/isomorphic/manualPromise.js +1 -2
- package/lib/utils/isomorphic/mimeType.js +1 -2
- package/lib/utils/isomorphic/multimap.js +1 -2
- package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +248 -0
- package/lib/utils/isomorphic/protocolFormatter.js +78 -0
- package/lib/utils/isomorphic/protocolMetainfo.js +318 -0
- package/lib/utils/isomorphic/selectorParser.js +3 -4
- package/lib/utils/isomorphic/stringUtils.js +3 -24
- package/lib/utils/isomorphic/time.js +9 -4
- package/lib/utils/isomorphic/timeoutRunner.js +3 -4
- package/lib/utils/isomorphic/traceUtils.js +2 -3
- package/lib/utils/isomorphic/urlMatch.js +21 -7
- package/lib/utils/isomorphic/utilityScriptSerializers.js +208 -205
- package/lib/utils.js +8 -2
- package/lib/utilsBundleImpl/index.js +160 -150
- package/lib/vite/htmlReport/index.html +17 -17
- package/lib/vite/recorder/assets/{codeMirrorModule-CXVeovup.js → codeMirrorModule-DzQ0k89p.js} +1 -1
- package/lib/vite/recorder/assets/{index-eHBmevrY.css → index-CI4HQ-Zb.css} +1 -1
- package/lib/vite/recorder/assets/index-D7C7daHH.js +184 -0
- package/lib/vite/recorder/index.html +3 -3
- package/lib/vite/traceViewer/assets/{codeMirrorModule-_GLjJL-7.js → codeMirrorModule-Di48jgWx.js} +1 -1
- package/lib/vite/traceViewer/assets/defaultSettingsView-szBn8781.js +256 -0
- package/lib/vite/traceViewer/defaultSettingsView.DVJHpiGt.css +1 -0
- package/lib/vite/traceViewer/index.BFsek2M6.css +1 -0
- package/lib/vite/traceViewer/index.DQvXoPLL.js +2 -0
- package/lib/vite/traceViewer/index.html +6 -6
- package/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/lib/vite/traceViewer/uiMode.dBV3oN9h.js +5 -0
- package/lib/vite/traceViewer/uiMode.html +4 -4
- package/lib/zipBundleImpl.js +4 -4
- package/package.json +1 -1
- package/types/protocol.d.ts +712 -107
- package/types/types.d.ts +128 -17
- package/lib/generated/consoleApiSource.js +0 -28
- package/lib/protocol/debug.js +0 -211
- package/lib/server/recorder/contextRecorder.js +0 -286
- package/lib/server/recorder/recorderCollection.js +0 -116
- package/lib/server/recorder/recorderFrontend.js +0 -16
- package/lib/server/storageScript.js +0 -154
- package/lib/server/timeoutSettings.js +0 -89
- package/lib/utils/isomorphic/builtins.js +0 -86
- package/lib/vite/recorder/assets/index-BsWQsSGl.js +0 -184
- package/lib/vite/traceViewer/assets/defaultSettingsView-DtCQiGHe.js +0 -265
- package/lib/vite/traceViewer/defaultSettingsView.QdHITyLI.css +0 -1
- package/lib/vite/traceViewer/index.CFOW-Ezb.css +0 -1
- package/lib/vite/traceViewer/index.cFZzK9RN.js +0 -2
- package/lib/vite/traceViewer/uiMode.XVPIqBeS.js +0 -5
|
@@ -42,7 +42,6 @@ var import_utils = require("../../../utils");
|
|
|
42
42
|
var import_utils2 = require("../../../utils");
|
|
43
43
|
var import_httpServer = require("../../utils/httpServer");
|
|
44
44
|
var import_utilsBundle = require("../../../utilsBundle");
|
|
45
|
-
var import_instrumentation = require("../../instrumentation");
|
|
46
45
|
var import_launchApp = require("../../launchApp");
|
|
47
46
|
var import_launchApp2 = require("../../launchApp");
|
|
48
47
|
var import_playwright = require("../../playwright");
|
|
@@ -125,14 +124,6 @@ async function installRootRedirect(server, traceUrls, options) {
|
|
|
125
124
|
server.routePath("/", (_, response) => {
|
|
126
125
|
response.statusCode = 302;
|
|
127
126
|
response.setHeader("Location", urlPath);
|
|
128
|
-
if (process.env.EXPERIMENTAL_OPENAI_API_KEY)
|
|
129
|
-
response.appendHeader("Set-Cookie", `openai_api_key=${process.env.EXPERIMENTAL_OPENAI_API_KEY}`);
|
|
130
|
-
if (process.env.OPENAI_BASE_URL)
|
|
131
|
-
response.appendHeader("Set-Cookie", `openai_base_url=${process.env.OPENAI_BASE_URL}`);
|
|
132
|
-
if (process.env.EXPERIMENTAL_ANTHROPIC_API_KEY)
|
|
133
|
-
response.appendHeader("Set-Cookie", `anthropic_api_key=${process.env.EXPERIMENTAL_ANTHROPIC_API_KEY}`);
|
|
134
|
-
if (process.env.ANTHROPIC_BASE_URL)
|
|
135
|
-
response.appendHeader("Set-Cookie", `anthropic_base_url=${process.env.ANTHROPIC_BASE_URL}`);
|
|
136
127
|
response.end();
|
|
137
128
|
return true;
|
|
138
129
|
});
|
|
@@ -156,28 +147,28 @@ async function openTraceViewerApp(url, browserName, options) {
|
|
|
156
147
|
const traceViewerPlaywright = (0, import_playwright.createPlaywright)({ sdkLanguage: "javascript", isInternalPlaywright: true });
|
|
157
148
|
const traceViewerBrowser = (0, import_utils2.isUnderTest)() ? "chromium" : browserName;
|
|
158
149
|
const { context, page } = await (0, import_launchApp2.launchApp)(traceViewerPlaywright[traceViewerBrowser], {
|
|
159
|
-
// TODO: store language in the trace.
|
|
160
150
|
sdkLanguage: traceViewerPlaywright.options.sdkLanguage,
|
|
161
151
|
windowSize: { width: 1280, height: 800 },
|
|
162
152
|
persistentContextOptions: {
|
|
163
153
|
...options?.persistentContextOptions,
|
|
164
|
-
|
|
154
|
+
cdpPort: (0, import_utils2.isUnderTest)() ? 0 : void 0,
|
|
165
155
|
headless: !!options?.headless,
|
|
166
156
|
colorScheme: (0, import_utils2.isUnderTest)() ? "light" : void 0
|
|
167
157
|
}
|
|
168
158
|
});
|
|
169
|
-
const controller = new import_progress.ProgressController(
|
|
159
|
+
const controller = new import_progress.ProgressController();
|
|
170
160
|
await controller.run(async (progress) => {
|
|
171
161
|
await context._browser._defaultContext._loadDefaultContextAsIs(progress);
|
|
162
|
+
if (process.env.PWTEST_PRINT_WS_ENDPOINT) {
|
|
163
|
+
process.stderr.write("DevTools listening on: " + context._browser.options.wsEndpoint + "\n");
|
|
164
|
+
}
|
|
165
|
+
if (!(0, import_utils2.isUnderTest)())
|
|
166
|
+
await (0, import_launchApp.syncLocalStorageWithSettings)(page, "traceviewer");
|
|
167
|
+
if ((0, import_utils2.isUnderTest)())
|
|
168
|
+
page.on("close", () => context.close({ reason: "Trace viewer closed" }).catch(() => {
|
|
169
|
+
}));
|
|
170
|
+
await page.mainFrame().goto(progress, url);
|
|
172
171
|
});
|
|
173
|
-
if (process.env.PWTEST_PRINT_WS_ENDPOINT)
|
|
174
|
-
process.stderr.write("DevTools listening on: " + context._browser.options.wsEndpoint + "\n");
|
|
175
|
-
if (!(0, import_utils2.isUnderTest)())
|
|
176
|
-
await (0, import_launchApp.syncLocalStorageWithSettings)(page, "traceviewer");
|
|
177
|
-
if ((0, import_utils2.isUnderTest)())
|
|
178
|
-
page.on("close", () => context.close({ reason: "Trace viewer closed" }).catch(() => {
|
|
179
|
-
}));
|
|
180
|
-
await page.mainFrame().goto((0, import_instrumentation.serverSideCallMetadata)(), url);
|
|
181
172
|
return page;
|
|
182
173
|
}
|
|
183
174
|
async function openTraceInBrowser(url) {
|
package/lib/server/transport.js
CHANGED
|
@@ -43,8 +43,6 @@ class WebSocketTransport {
|
|
|
43
43
|
this._ws = new import_utilsBundle.ws(url, [], {
|
|
44
44
|
maxPayload: 256 * 1024 * 1024,
|
|
45
45
|
// 256Mb,
|
|
46
|
-
// Prevent internal http client error when passing negative timeout.
|
|
47
|
-
handshakeTimeout: Math.max(progress?.timeUntilDeadline() ?? 3e4, 1),
|
|
48
46
|
headers: options.headers,
|
|
49
47
|
followRedirects: options.followRedirects,
|
|
50
48
|
agent: /^(https|wss):\/\//.test(url) ? import_happyEyeballs.httpsHappyEyeballsAgent : import_happyEyeballs.httpHappyEyeballsAgent,
|
|
@@ -99,15 +97,10 @@ class WebSocketTransport {
|
|
|
99
97
|
const logUrl = stripQueryParams(url);
|
|
100
98
|
progress?.log(`<ws connecting> ${logUrl}`);
|
|
101
99
|
const transport = new WebSocketTransport(progress, url, logUrl, { ...options, followRedirects: !!options.followRedirects && hadRedirects });
|
|
102
|
-
|
|
103
|
-
progress?.cleanupWhenAborted(async () => {
|
|
104
|
-
if (!success)
|
|
105
|
-
await transport.closeAndWait().catch((e) => null);
|
|
106
|
-
});
|
|
107
|
-
const result = await new Promise((fulfill, reject) => {
|
|
100
|
+
const resultPromise = new Promise((fulfill, reject) => {
|
|
108
101
|
transport._ws.on("open", async () => {
|
|
109
102
|
progress?.log(`<ws connected> ${logUrl}`);
|
|
110
|
-
fulfill({
|
|
103
|
+
fulfill({});
|
|
111
104
|
});
|
|
112
105
|
transport._ws.on("error", (event) => {
|
|
113
106
|
progress?.log(`<ws connect error> ${logUrl} ${event.message}`);
|
|
@@ -136,20 +129,25 @@ ${Buffer.concat(chunks)}` : errorPrefix;
|
|
|
136
129
|
});
|
|
137
130
|
});
|
|
138
131
|
});
|
|
139
|
-
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
132
|
+
try {
|
|
133
|
+
const result = progress ? await progress.race(resultPromise) : await resultPromise;
|
|
134
|
+
if (result.redirect) {
|
|
135
|
+
const newHeaders = Object.fromEntries(Object.entries(options.headers || {}).filter(([name]) => {
|
|
136
|
+
return !name.includes("access-key") && name.toLowerCase() !== "authorization";
|
|
137
|
+
}));
|
|
138
|
+
return WebSocketTransport._connect(
|
|
139
|
+
progress,
|
|
140
|
+
result.redirect.headers.location,
|
|
141
|
+
{ ...options, headers: newHeaders },
|
|
142
|
+
true
|
|
143
|
+
/* hadRedirects */
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
return transport;
|
|
147
|
+
} catch (error) {
|
|
148
|
+
await transport.closeAndWait();
|
|
149
|
+
throw error;
|
|
150
150
|
}
|
|
151
|
-
success = true;
|
|
152
|
-
return transport;
|
|
153
151
|
}
|
|
154
152
|
send(message) {
|
|
155
153
|
this._ws.send(JSON.stringify(message));
|
|
@@ -121,9 +121,9 @@ function compareText(actual, expectedBuffer) {
|
|
|
121
121
|
const lines = import_utilsBundle2.diff.createPatch("file", expected, actual, void 0, void 0, { context: 5 }).split("\n");
|
|
122
122
|
const coloredLines = lines.slice(4).map((line) => {
|
|
123
123
|
if (line.startsWith("-"))
|
|
124
|
-
return import_utilsBundle2.colors.red(line);
|
|
125
|
-
if (line.startsWith("+"))
|
|
126
124
|
return import_utilsBundle2.colors.green(line);
|
|
125
|
+
if (line.startsWith("+"))
|
|
126
|
+
return import_utilsBundle2.colors.red(line);
|
|
127
127
|
if (line.startsWith("@@"))
|
|
128
128
|
return import_utilsBundle2.colors.dim(line);
|
|
129
129
|
return line;
|
|
@@ -19,8 +19,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
var debug_exports = {};
|
|
20
20
|
__export(debug_exports, {
|
|
21
21
|
debugMode: () => debugMode,
|
|
22
|
-
isUnderTest: () => isUnderTest
|
|
23
|
-
setUnderTest: () => setUnderTest
|
|
22
|
+
isUnderTest: () => isUnderTest
|
|
24
23
|
});
|
|
25
24
|
module.exports = __toCommonJS(debug_exports);
|
|
26
25
|
var import_env = require("./env");
|
|
@@ -32,16 +31,12 @@ function debugMode() {
|
|
|
32
31
|
return "";
|
|
33
32
|
return _debugMode ? "inspector" : "";
|
|
34
33
|
}
|
|
35
|
-
|
|
36
|
-
function setUnderTest() {
|
|
37
|
-
_isUnderTest = true;
|
|
38
|
-
}
|
|
34
|
+
const _isUnderTest = (0, import_env.getAsBooleanFromENV)("PWTEST_UNDER_TEST");
|
|
39
35
|
function isUnderTest() {
|
|
40
36
|
return _isUnderTest;
|
|
41
37
|
}
|
|
42
38
|
// Annotate the CommonJS export names for ESM import in node:
|
|
43
39
|
0 && (module.exports = {
|
|
44
40
|
debugMode,
|
|
45
|
-
isUnderTest
|
|
46
|
-
setUnderTest
|
|
41
|
+
isUnderTest
|
|
47
42
|
});
|
|
@@ -95,17 +95,25 @@ const kLogCount = 150;
|
|
|
95
95
|
class RecentLogsCollector {
|
|
96
96
|
constructor() {
|
|
97
97
|
this._logs = [];
|
|
98
|
+
this._listeners = [];
|
|
98
99
|
}
|
|
99
100
|
log(message) {
|
|
100
101
|
this._logs.push(message);
|
|
101
102
|
if (this._logs.length === kLogCount * 2)
|
|
102
103
|
this._logs.splice(0, kLogCount);
|
|
104
|
+
for (const listener of this._listeners)
|
|
105
|
+
listener(message);
|
|
103
106
|
}
|
|
104
107
|
recentLogs() {
|
|
105
108
|
if (this._logs.length > kLogCount)
|
|
106
109
|
return this._logs.slice(-kLogCount);
|
|
107
110
|
return this._logs;
|
|
108
111
|
}
|
|
112
|
+
onMessage(listener) {
|
|
113
|
+
for (const message of this._logs)
|
|
114
|
+
listener(message);
|
|
115
|
+
this._listeners.push(listener);
|
|
116
|
+
}
|
|
109
117
|
}
|
|
110
118
|
// Annotate the CommonJS export names for ESM import in node:
|
|
111
119
|
0 && (module.exports = {
|
|
@@ -92,8 +92,10 @@ function calculatePlatform() {
|
|
|
92
92
|
return { hostPlatform: "debian11" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 };
|
|
93
93
|
if (distroInfo?.version === "12")
|
|
94
94
|
return { hostPlatform: "debian12" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 };
|
|
95
|
+
if (distroInfo?.version === "13")
|
|
96
|
+
return { hostPlatform: "debian13" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 };
|
|
95
97
|
if (distroInfo?.version === "")
|
|
96
|
-
return { hostPlatform: "
|
|
98
|
+
return { hostPlatform: "debian13" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 };
|
|
97
99
|
}
|
|
98
100
|
return { hostPlatform: "ubuntu20.04" + archSuffix, isOfficiallySupportedPlatform: false };
|
|
99
101
|
}
|
|
@@ -44,6 +44,7 @@ var import_https = __toESM(require("https"));
|
|
|
44
44
|
var import_url = __toESM(require("url"));
|
|
45
45
|
var import_utilsBundle = require("../../utilsBundle");
|
|
46
46
|
var import_happyEyeballs = require("./happyEyeballs");
|
|
47
|
+
var import_manualPromise = require("../../utils/isomorphic/manualPromise");
|
|
47
48
|
const NET_DEFAULT_TIMEOUT = 3e4;
|
|
48
49
|
function httpRequest(params, onResponse, onError) {
|
|
49
50
|
const parsedUrl = import_url.default.parse(params.url);
|
|
@@ -55,7 +56,6 @@ function httpRequest(params, onResponse, onError) {
|
|
|
55
56
|
};
|
|
56
57
|
if (params.rejectUnauthorized !== void 0)
|
|
57
58
|
options.rejectUnauthorized = params.rejectUnauthorized;
|
|
58
|
-
const timeout = params.timeout ?? NET_DEFAULT_TIMEOUT;
|
|
59
59
|
const proxyURL = (0, import_utilsBundle.getProxyForUrl)(params.url);
|
|
60
60
|
if (proxyURL) {
|
|
61
61
|
const parsedProxyURL = import_url.default.parse(proxyURL);
|
|
@@ -73,44 +73,54 @@ function httpRequest(params, onResponse, onError) {
|
|
|
73
73
|
options.rejectUnauthorized = false;
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
|
+
let cancelRequest;
|
|
76
77
|
const requestCallback = (res) => {
|
|
77
78
|
const statusCode = res.statusCode || 0;
|
|
78
79
|
if (statusCode >= 300 && statusCode < 400 && res.headers.location) {
|
|
79
80
|
request.destroy();
|
|
80
|
-
httpRequest({ ...params, url: new URL(res.headers.location, params.url).toString() }, onResponse, onError);
|
|
81
|
+
cancelRequest = httpRequest({ ...params, url: new URL(res.headers.location, params.url).toString() }, onResponse, onError).cancel;
|
|
81
82
|
} else {
|
|
82
83
|
onResponse(res);
|
|
83
84
|
}
|
|
84
85
|
};
|
|
85
86
|
const request = options.protocol === "https:" ? import_https.default.request(options, requestCallback) : import_http.default.request(options, requestCallback);
|
|
86
87
|
request.on("error", onError);
|
|
87
|
-
if (
|
|
88
|
-
|
|
89
|
-
onError(new Error(`Request to ${params.url} timed out after ${
|
|
88
|
+
if (params.socketTimeout !== void 0) {
|
|
89
|
+
request.setTimeout(params.socketTimeout, () => {
|
|
90
|
+
onError(new Error(`Request to ${params.url} timed out after ${params.socketTimeout}ms`));
|
|
90
91
|
request.abort();
|
|
91
|
-
};
|
|
92
|
-
if (timeout <= 0) {
|
|
93
|
-
rejectOnTimeout();
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
request.setTimeout(timeout, rejectOnTimeout);
|
|
92
|
+
});
|
|
97
93
|
}
|
|
94
|
+
cancelRequest = (e) => {
|
|
95
|
+
try {
|
|
96
|
+
request.destroy(e);
|
|
97
|
+
} catch {
|
|
98
|
+
}
|
|
99
|
+
};
|
|
98
100
|
request.end(params.data);
|
|
101
|
+
return { cancel: (e) => cancelRequest(e) };
|
|
99
102
|
}
|
|
100
|
-
function fetchData(params, onError) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
103
|
+
async function fetchData(progress, params, onError) {
|
|
104
|
+
const promise = new import_manualPromise.ManualPromise();
|
|
105
|
+
const { cancel } = httpRequest(params, async (response) => {
|
|
106
|
+
if (response.statusCode !== 200) {
|
|
107
|
+
const error = onError ? await onError(params, response) : new Error(`fetch failed: server returned code ${response.statusCode}. URL: ${params.url}`);
|
|
108
|
+
promise.reject(error);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
let body = "";
|
|
112
|
+
response.on("data", (chunk) => body += chunk);
|
|
113
|
+
response.on("error", (error) => promise.reject(error));
|
|
114
|
+
response.on("end", () => promise.resolve(body));
|
|
115
|
+
}, (error) => promise.reject(error));
|
|
116
|
+
if (!progress)
|
|
117
|
+
return promise;
|
|
118
|
+
try {
|
|
119
|
+
return await progress.race(promise);
|
|
120
|
+
} catch (error) {
|
|
121
|
+
cancel(error);
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
114
124
|
}
|
|
115
125
|
function shouldBypassProxy(url2, bypass) {
|
|
116
126
|
if (!bypass)
|
|
@@ -84,7 +84,7 @@ const nodePlatform = {
|
|
|
84
84
|
fs: () => import_fs.default,
|
|
85
85
|
env: process.env,
|
|
86
86
|
inspectCustom: util.inspect.custom,
|
|
87
|
-
isDebugMode: () =>
|
|
87
|
+
isDebugMode: () => (0, import_debug.debugMode)() === "inspector",
|
|
88
88
|
isJSDebuggerAttached: () => !!require("inspector").url(),
|
|
89
89
|
isLogEnabled(name) {
|
|
90
90
|
return import_debugLogger.debugLogger.isEnabled(name);
|
|
@@ -132,7 +132,10 @@ async function launchProcess(options) {
|
|
|
132
132
|
spawnedProcess.once("error", (error) => {
|
|
133
133
|
failed(new Error("Failed to launch: " + error));
|
|
134
134
|
});
|
|
135
|
-
return
|
|
135
|
+
return failedPromise.then(async (error) => {
|
|
136
|
+
await cleanup();
|
|
137
|
+
throw error;
|
|
138
|
+
});
|
|
136
139
|
}
|
|
137
140
|
options.log(`<launched> pid=${spawnedProcess.pid}`);
|
|
138
141
|
const stdout = readline.createInterface({ input: spawnedProcess.stdout });
|
|
@@ -43,16 +43,7 @@ class WSServer {
|
|
|
43
43
|
}
|
|
44
44
|
async listen(port = 0, hostname, path) {
|
|
45
45
|
import_debugLogger.debugLogger.log("server", `Server started at ${/* @__PURE__ */ new Date()}`);
|
|
46
|
-
const server = (0, import_network.createHttpServer)(
|
|
47
|
-
if (request.method === "GET" && request.url === "/json") {
|
|
48
|
-
response.setHeader("Content-Type", "application/json");
|
|
49
|
-
response.end(JSON.stringify({
|
|
50
|
-
wsEndpointPath: path
|
|
51
|
-
}));
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
response.end("Running");
|
|
55
|
-
});
|
|
46
|
+
const server = (0, import_network.createHttpServer)(this._delegate.onRequest);
|
|
56
47
|
server.on("error", (error) => import_debugLogger.debugLogger.log("server", String(error)));
|
|
57
48
|
this.server = server;
|
|
58
49
|
const wsEndpoint = await new Promise((resolve, reject) => {
|
|
@@ -71,8 +62,7 @@ class WSServer {
|
|
|
71
62
|
noServer: true,
|
|
72
63
|
perMessageDeflate
|
|
73
64
|
});
|
|
74
|
-
|
|
75
|
-
this._wsServer.on("headers", (headers) => this._delegate.onHeaders(headers));
|
|
65
|
+
this._wsServer.on("headers", (headers) => this._delegate.onHeaders(headers));
|
|
76
66
|
server.on("upgrade", (request, socket, head) => {
|
|
77
67
|
const pathname = new URL("http://localhost" + request.url).pathname;
|
|
78
68
|
if (pathname !== path) {
|
|
@@ -82,21 +72,26 @@ class WSServer {
|
|
|
82
72
|
socket.destroy();
|
|
83
73
|
return;
|
|
84
74
|
}
|
|
85
|
-
const upgradeResult = this._delegate.onUpgrade
|
|
75
|
+
const upgradeResult = this._delegate.onUpgrade(request, socket);
|
|
86
76
|
if (upgradeResult) {
|
|
87
77
|
socket.write(upgradeResult.error);
|
|
88
78
|
socket.destroy();
|
|
89
79
|
return;
|
|
90
80
|
}
|
|
91
|
-
this._wsServer
|
|
81
|
+
this._wsServer.handleUpgrade(request, socket, head, (ws) => this._wsServer.emit("connection", ws, request));
|
|
92
82
|
});
|
|
93
83
|
this._wsServer.on("connection", (ws, request) => {
|
|
94
84
|
import_debugLogger.debugLogger.log("server", "Connected client ws.extension=" + ws.extensions);
|
|
95
85
|
const url = new URL("http://localhost" + (request.url || ""));
|
|
96
86
|
const id = String(++lastConnectionId);
|
|
97
87
|
import_debugLogger.debugLogger.log("server", `[${id}] serving connection: ${request.url}`);
|
|
98
|
-
|
|
99
|
-
|
|
88
|
+
try {
|
|
89
|
+
const connection = this._delegate.onConnection(request, url, ws, id);
|
|
90
|
+
ws[kConnectionSymbol] = connection;
|
|
91
|
+
} catch (error) {
|
|
92
|
+
import_debugLogger.debugLogger.log("server", `[${id}] connection error: ${error}`);
|
|
93
|
+
ws.close(1011, String(error));
|
|
94
|
+
}
|
|
100
95
|
});
|
|
101
96
|
return wsEndpoint;
|
|
102
97
|
}
|
|
@@ -122,7 +117,6 @@ class WSServer {
|
|
|
122
117
|
this._wsServer = void 0;
|
|
123
118
|
this.server = void 0;
|
|
124
119
|
import_debugLogger.debugLogger.log("server", "closed server");
|
|
125
|
-
await this._delegate.onClose?.();
|
|
126
120
|
}
|
|
127
121
|
}
|
|
128
122
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -43,8 +43,11 @@ class WebKit extends import_browserType.BrowserType {
|
|
|
43
43
|
connectToTransport(transport, options) {
|
|
44
44
|
return import_wkBrowser.WKBrowser.connect(this.attribution.playwright, transport, options);
|
|
45
45
|
}
|
|
46
|
-
amendEnvironment(env, userDataDir,
|
|
47
|
-
return {
|
|
46
|
+
amendEnvironment(env, userDataDir, isPersistent) {
|
|
47
|
+
return {
|
|
48
|
+
...env,
|
|
49
|
+
CURL_COOKIE_JAR_PATH: process.platform === "win32" && isPersistent ? import_path.default.join(userDataDir, "cookiejar.db") : void 0
|
|
50
|
+
};
|
|
48
51
|
}
|
|
49
52
|
doRewriteStartupLog(error) {
|
|
50
53
|
if (!error.logs)
|
|
@@ -39,8 +39,8 @@ var network = __toESM(require("../network"));
|
|
|
39
39
|
var import_wkConnection = require("./wkConnection");
|
|
40
40
|
var import_wkPage = require("./wkPage");
|
|
41
41
|
var import_errors = require("../errors");
|
|
42
|
-
const
|
|
43
|
-
const
|
|
42
|
+
const BROWSER_VERSION = "26.0";
|
|
43
|
+
const DEFAULT_USER_AGENT = `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/${BROWSER_VERSION} Safari/605.1.15`;
|
|
44
44
|
class WKBrowser extends import_browser.Browser {
|
|
45
45
|
constructor(parent, transport, options) {
|
|
46
46
|
super(parent, options);
|
|
@@ -110,7 +110,7 @@ class WKBrowser extends import_browser.Browser {
|
|
|
110
110
|
const page = this._wkPages.get(payload.pageProxyId);
|
|
111
111
|
if (!page)
|
|
112
112
|
return;
|
|
113
|
-
page._page.
|
|
113
|
+
page._page.frameManager.frameAbortedNavigation(payload.frameId, "Download is starting");
|
|
114
114
|
let originPage = page._page.initializedOrUndefined();
|
|
115
115
|
if (!originPage) {
|
|
116
116
|
page._firstNonInitialNavigationCommittedReject(new Error("Starting new page download"));
|
|
@@ -152,8 +152,8 @@ class WKBrowser extends import_browser.Browser {
|
|
|
152
152
|
const wkPage = this._wkPages.get(pageProxyId);
|
|
153
153
|
if (!wkPage)
|
|
154
154
|
return;
|
|
155
|
-
wkPage.didClose();
|
|
156
155
|
this._wkPages.delete(pageProxyId);
|
|
156
|
+
wkPage.didClose();
|
|
157
157
|
}
|
|
158
158
|
_onPageProxyMessageReceived(event) {
|
|
159
159
|
const wkPage = this._wkPages.get(event.pageProxyId);
|
|
@@ -199,7 +199,7 @@ class WKBrowserContext extends import_browserContext.BrowserContext {
|
|
|
199
199
|
if (this._options.geolocation)
|
|
200
200
|
promises.push(this.setGeolocation(this._options.geolocation));
|
|
201
201
|
if (this._options.offline)
|
|
202
|
-
promises.push(this.
|
|
202
|
+
promises.push(this.doUpdateOffline());
|
|
203
203
|
if (this._options.httpCredentials)
|
|
204
204
|
promises.push(this.setHTTPCredentials(this._options.httpCredentials));
|
|
205
205
|
await Promise.all(promises);
|
|
@@ -211,35 +211,52 @@ class WKBrowserContext extends import_browserContext.BrowserContext {
|
|
|
211
211
|
return this._wkPages().map((wkPage) => wkPage._page);
|
|
212
212
|
}
|
|
213
213
|
async doCreateNewPage() {
|
|
214
|
-
(0, import_browserContext.assertBrowserContextIsNotOwned)(this);
|
|
215
214
|
const { pageProxyId } = await this._browser._browserSession.send("Playwright.createPage", { browserContextId: this._browserContextId });
|
|
216
215
|
return this._browser._wkPages.get(pageProxyId)._page;
|
|
217
216
|
}
|
|
218
217
|
async doGetCookies(urls) {
|
|
219
218
|
const { cookies } = await this._browser._browserSession.send("Playwright.getAllCookies", { browserContextId: this._browserContextId });
|
|
220
219
|
return network.filterCookies(cookies.map((c) => {
|
|
221
|
-
const
|
|
222
|
-
copy
|
|
223
|
-
|
|
220
|
+
const { name, value, domain, path, expires, httpOnly, secure, sameSite } = c;
|
|
221
|
+
const copy = {
|
|
222
|
+
name,
|
|
223
|
+
value,
|
|
224
|
+
domain,
|
|
225
|
+
path,
|
|
226
|
+
expires: expires === -1 ? -1 : expires / 1e3,
|
|
227
|
+
httpOnly,
|
|
228
|
+
secure,
|
|
229
|
+
sameSite
|
|
230
|
+
};
|
|
224
231
|
return copy;
|
|
225
232
|
}), urls);
|
|
226
233
|
}
|
|
227
234
|
async addCookies(cookies) {
|
|
228
|
-
const cc = network.rewriteCookies(cookies).map((c) =>
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
235
|
+
const cc = network.rewriteCookies(cookies).map((c) => {
|
|
236
|
+
const { name, value, domain, path, expires, httpOnly, secure, sameSite } = c;
|
|
237
|
+
const copy = {
|
|
238
|
+
name,
|
|
239
|
+
value,
|
|
240
|
+
domain,
|
|
241
|
+
path,
|
|
242
|
+
expires: expires && expires !== -1 ? expires * 1e3 : expires,
|
|
243
|
+
httpOnly,
|
|
244
|
+
secure,
|
|
245
|
+
sameSite,
|
|
246
|
+
session: expires === -1 || expires === void 0
|
|
247
|
+
};
|
|
248
|
+
return copy;
|
|
249
|
+
});
|
|
233
250
|
await this._browser._browserSession.send("Playwright.setCookies", { cookies: cc, browserContextId: this._browserContextId });
|
|
234
251
|
}
|
|
235
252
|
async doClearCookies() {
|
|
236
253
|
await this._browser._browserSession.send("Playwright.deleteAllCookies", { browserContextId: this._browserContextId });
|
|
237
254
|
}
|
|
238
255
|
async doGrantPermissions(origin, permissions) {
|
|
239
|
-
await Promise.all(this.pages().map((page) => page.
|
|
256
|
+
await Promise.all(this.pages().map((page) => page.delegate._grantPermissions(origin, permissions)));
|
|
240
257
|
}
|
|
241
258
|
async doClearPermissions() {
|
|
242
|
-
await Promise.all(this.pages().map((page) => page.
|
|
259
|
+
await Promise.all(this.pages().map((page) => page.delegate._clearPermissions()));
|
|
243
260
|
}
|
|
244
261
|
async setGeolocation(geolocation) {
|
|
245
262
|
(0, import_browserContext.verifyGeolocation)(geolocation);
|
|
@@ -247,37 +264,43 @@ class WKBrowserContext extends import_browserContext.BrowserContext {
|
|
|
247
264
|
const payload = geolocation ? { ...geolocation, timestamp: Date.now() } : void 0;
|
|
248
265
|
await this._browser._browserSession.send("Playwright.setGeolocationOverride", { browserContextId: this._browserContextId, geolocation: payload });
|
|
249
266
|
}
|
|
250
|
-
async
|
|
251
|
-
this._options.extraHTTPHeaders = headers;
|
|
267
|
+
async doUpdateExtraHTTPHeaders() {
|
|
252
268
|
for (const page of this.pages())
|
|
253
|
-
await page.
|
|
269
|
+
await page.delegate.updateExtraHTTPHeaders();
|
|
254
270
|
}
|
|
255
271
|
async setUserAgent(userAgent) {
|
|
256
272
|
this._options.userAgent = userAgent;
|
|
257
273
|
for (const page of this.pages())
|
|
258
|
-
await page.
|
|
274
|
+
await page.delegate.updateUserAgent();
|
|
259
275
|
}
|
|
260
|
-
async
|
|
261
|
-
this._options.offline = offline;
|
|
276
|
+
async doUpdateOffline() {
|
|
262
277
|
for (const page of this.pages())
|
|
263
|
-
await page.
|
|
278
|
+
await page.delegate.updateOffline();
|
|
264
279
|
}
|
|
265
280
|
async doSetHTTPCredentials(httpCredentials) {
|
|
266
281
|
this._options.httpCredentials = httpCredentials;
|
|
267
282
|
for (const page of this.pages())
|
|
268
|
-
await page.
|
|
283
|
+
await page.delegate.updateHttpCredentials();
|
|
269
284
|
}
|
|
270
285
|
async doAddInitScript(initScript) {
|
|
271
286
|
for (const page of this.pages())
|
|
272
|
-
await page.
|
|
287
|
+
await page.delegate._updateBootstrapScript();
|
|
273
288
|
}
|
|
274
|
-
async
|
|
289
|
+
async doRemoveInitScripts(initScripts) {
|
|
275
290
|
for (const page of this.pages())
|
|
276
|
-
await page.
|
|
291
|
+
await page.delegate._updateBootstrapScript();
|
|
277
292
|
}
|
|
278
293
|
async doUpdateRequestInterception() {
|
|
279
294
|
for (const page of this.pages())
|
|
280
|
-
await page.
|
|
295
|
+
await page.delegate.updateRequestInterception();
|
|
296
|
+
}
|
|
297
|
+
async doUpdateDefaultViewport() {
|
|
298
|
+
}
|
|
299
|
+
async doUpdateDefaultEmulatedMedia() {
|
|
300
|
+
}
|
|
301
|
+
async doExposePlaywrightBinding() {
|
|
302
|
+
for (const page of this.pages())
|
|
303
|
+
await page.delegate.exposePlaywrightBinding();
|
|
281
304
|
}
|
|
282
305
|
onClosePersistent() {
|
|
283
306
|
}
|
|
@@ -36,6 +36,7 @@ var js = __toESM(require("../javascript"));
|
|
|
36
36
|
var dom = __toESM(require("../dom"));
|
|
37
37
|
var import_protocolError = require("../protocolError");
|
|
38
38
|
var import_assert = require("../../utils/isomorphic/assert");
|
|
39
|
+
var import_utilityScriptSerializers = require("../../utils/isomorphic/utilityScriptSerializers");
|
|
39
40
|
class WKExecutionContext {
|
|
40
41
|
constructor(session, contextId) {
|
|
41
42
|
this._session = session;
|
|
@@ -86,7 +87,7 @@ class WKExecutionContext {
|
|
|
86
87
|
if (response.wasThrown)
|
|
87
88
|
throw new js.JavaScriptErrorInEvaluate(response.result.description);
|
|
88
89
|
if (returnByValue)
|
|
89
|
-
return
|
|
90
|
+
return (0, import_utilityScriptSerializers.parseEvaluationResultValue)(response.result.value);
|
|
90
91
|
return createHandle(utilityScript._context, response.result);
|
|
91
92
|
} catch (error) {
|
|
92
93
|
throw rewriteError(error);
|