patchright-core 1.52.5 → 1.55.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/ThirdPartyNotices.txt +65 -123
  2. package/bin/reinstall_chrome_beta_mac.sh +1 -1
  3. package/bin/reinstall_chrome_stable_mac.sh +1 -1
  4. package/bin/reinstall_msedge_beta_mac.sh +1 -1
  5. package/bin/reinstall_msedge_dev_mac.sh +1 -1
  6. package/bin/reinstall_msedge_stable_mac.sh +1 -1
  7. package/browsers.json +14 -14
  8. package/index.js +1 -1
  9. package/lib/androidServerImpl.js +4 -2
  10. package/lib/browserServerImpl.js +47 -12
  11. package/lib/cli/program.js +116 -50
  12. package/lib/cli/programWithTestStub.js +1 -1
  13. package/lib/client/android.js +30 -34
  14. package/lib/client/browser.js +54 -17
  15. package/lib/client/browserContext.js +67 -71
  16. package/lib/client/browserType.js +25 -34
  17. package/lib/client/channelOwner.js +20 -24
  18. package/lib/client/connection.js +6 -10
  19. package/lib/client/electron.js +8 -3
  20. package/lib/client/elementHandle.js +18 -21
  21. package/lib/client/fetch.js +5 -3
  22. package/lib/client/frame.js +54 -32
  23. package/lib/client/input.js +3 -1
  24. package/lib/client/jsHandle.js +4 -0
  25. package/lib/client/localUtils.js +0 -1
  26. package/lib/client/locator.js +30 -26
  27. package/lib/client/network.js +5 -12
  28. package/lib/client/page.js +32 -32
  29. package/lib/client/playwright.js +6 -16
  30. package/lib/client/selectors.js +18 -38
  31. package/lib/client/timeoutSettings.js +12 -8
  32. package/lib/client/tracing.js +24 -20
  33. package/lib/client/waiter.js +2 -2
  34. package/lib/client/webSocket.js +4 -22
  35. package/lib/generated/bindingsControllerSource.js +28 -0
  36. package/lib/generated/clockSource.js +1 -1
  37. package/lib/generated/injectedScriptSource.js +1 -1
  38. package/lib/generated/pollingRecorderSource.js +1 -1
  39. package/lib/generated/storageScriptSource.js +28 -0
  40. package/lib/generated/utilityScriptSource.js +1 -1
  41. package/lib/generated/webSocketMockSource.js +12 -50
  42. package/lib/inProcessFactory.js +9 -6
  43. package/lib/outofprocess.js +0 -2
  44. package/lib/protocol/validator.js +421 -345
  45. package/lib/protocol/validatorPrimitives.js +18 -4
  46. package/lib/remote/playwrightConnection.js +29 -166
  47. package/lib/remote/playwrightServer.js +233 -35
  48. package/lib/server/android/android.js +97 -83
  49. package/lib/server/android/backendAdb.js +0 -2
  50. package/lib/server/bidi/bidiBrowser.js +139 -73
  51. package/lib/server/bidi/bidiChromium.js +23 -22
  52. package/lib/server/bidi/bidiExecutionContext.js +2 -1
  53. package/lib/server/bidi/bidiFirefox.js +17 -14
  54. package/lib/server/bidi/bidiInput.js +22 -22
  55. package/lib/server/bidi/bidiNetworkManager.js +8 -11
  56. package/lib/server/bidi/bidiPage.js +42 -86
  57. package/lib/server/bidi/third_party/bidiProtocol.js +5 -133
  58. package/lib/server/bidi/third_party/bidiProtocolCore.js +179 -0
  59. package/lib/server/{dispatchers/selectorsDispatcher.js → bidi/third_party/bidiProtocolPermissions.js} +20 -18
  60. package/lib/server/browser.js +30 -21
  61. package/lib/server/browserContext.js +203 -165
  62. package/lib/server/browserType.js +109 -107
  63. package/lib/server/chromium/chromium.js +84 -69
  64. package/lib/server/chromium/chromiumSwitches.js +13 -20
  65. package/lib/server/chromium/crBrowser.js +74 -40
  66. package/lib/server/chromium/crConnection.js +8 -9
  67. package/lib/server/chromium/crCoverage.js +11 -8
  68. package/lib/server/chromium/crDragDrop.js +25 -20
  69. package/lib/server/chromium/crExecutionContext.js +2 -1
  70. package/lib/server/chromium/crInput.js +32 -29
  71. package/lib/server/chromium/crNetworkManager.js +43 -31
  72. package/lib/server/chromium/crPage.js +98 -72
  73. package/lib/server/chromium/crServiceWorker.js +13 -18
  74. package/lib/server/chromium/videoRecorder.js +10 -18
  75. package/lib/server/clock.js +51 -39
  76. package/lib/server/codegen/csharp.js +10 -5
  77. package/lib/server/codegen/java.js +1 -1
  78. package/lib/server/codegen/javascript.js +1 -1
  79. package/lib/server/codegen/jsonl.js +2 -1
  80. package/lib/server/codegen/language.js +22 -1
  81. package/lib/server/codegen/languages.js +4 -4
  82. package/lib/server/codegen/python.js +1 -1
  83. package/lib/server/cookieStore.js +3 -1
  84. package/lib/server/debugController.js +105 -71
  85. package/lib/server/debugger.js +6 -23
  86. package/lib/server/deviceDescriptorsSource.json +237 -127
  87. package/lib/server/dialog.js +50 -6
  88. package/lib/server/dispatchers/androidDispatcher.js +77 -62
  89. package/lib/server/dispatchers/artifactDispatcher.js +18 -18
  90. package/lib/server/dispatchers/browserContextDispatcher.js +141 -91
  91. package/lib/server/dispatchers/browserDispatcher.js +55 -88
  92. package/lib/server/dispatchers/browserTypeDispatcher.js +18 -9
  93. package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -4
  94. package/lib/server/dispatchers/debugControllerDispatcher.js +12 -21
  95. package/lib/server/dispatchers/dialogDispatcher.js +4 -4
  96. package/lib/server/dispatchers/dispatcher.js +78 -53
  97. package/lib/server/dispatchers/electronDispatcher.js +19 -20
  98. package/lib/server/dispatchers/elementHandlerDispatcher.js +83 -93
  99. package/lib/server/dispatchers/frameDispatcher.js +98 -101
  100. package/lib/server/dispatchers/jsHandleDispatcher.js +21 -16
  101. package/lib/server/dispatchers/jsonPipeDispatcher.js +4 -4
  102. package/lib/server/dispatchers/localUtilsDispatcher.js +53 -59
  103. package/lib/server/dispatchers/networkDispatchers.js +41 -35
  104. package/lib/server/dispatchers/pageDispatcher.js +156 -107
  105. package/lib/server/dispatchers/playwrightDispatcher.js +37 -25
  106. package/lib/server/dispatchers/streamDispatcher.js +15 -8
  107. package/lib/server/dispatchers/tracingDispatcher.js +22 -13
  108. package/lib/server/dispatchers/webSocketRouteDispatcher.js +46 -35
  109. package/lib/server/dispatchers/writableStreamDispatcher.js +16 -10
  110. package/lib/server/dom.js +198 -266
  111. package/lib/server/download.js +3 -3
  112. package/lib/server/electron/electron.js +96 -103
  113. package/lib/server/electron/loader.js +1 -1
  114. package/lib/server/fetch.js +22 -41
  115. package/lib/server/fileUploadUtils.js +1 -1
  116. package/lib/server/firefox/ffBrowser.js +79 -55
  117. package/lib/server/firefox/ffExecutionContext.js +2 -1
  118. package/lib/server/firefox/ffInput.js +23 -23
  119. package/lib/server/firefox/ffNetworkManager.js +8 -6
  120. package/lib/server/firefox/ffPage.js +39 -36
  121. package/lib/server/firefox/firefox.js +9 -10
  122. package/lib/server/frameSelectors.js +63 -20
  123. package/lib/server/frames.js +495 -555
  124. package/lib/server/har/harRecorder.js +1 -1
  125. package/lib/server/har/harTracer.js +4 -2
  126. package/lib/server/helper.js +3 -7
  127. package/lib/server/index.js +0 -3
  128. package/lib/server/input.js +47 -54
  129. package/lib/server/instrumentation.js +8 -14
  130. package/lib/server/javascript.js +8 -16
  131. package/lib/server/launchApp.js +48 -30
  132. package/lib/server/localUtils.js +45 -38
  133. package/lib/server/network.js +44 -10
  134. package/lib/server/page.js +232 -177
  135. package/lib/server/pageBinding.js +6 -7
  136. package/lib/server/playwright.js +4 -14
  137. package/lib/server/progress.js +57 -49
  138. package/lib/server/recorder/recorderApp.js +298 -95
  139. package/lib/server/recorder/recorderRunner.js +23 -24
  140. package/lib/server/recorder/recorderSignalProcessor.js +83 -0
  141. package/lib/server/recorder/recorderUtils.js +67 -10
  142. package/lib/server/recorder.js +284 -146
  143. package/lib/server/registry/index.js +83 -48
  144. package/lib/server/registry/nativeDeps.js +175 -0
  145. package/lib/server/registry/oopDownloadBrowserMain.js +1 -1
  146. package/lib/server/screenshotter.js +84 -83
  147. package/lib/server/selectors.js +12 -12
  148. package/lib/server/socksClientCertificatesInterceptor.js +198 -136
  149. package/lib/server/trace/recorder/snapshotter.js +12 -19
  150. package/lib/server/trace/recorder/tracing.js +36 -27
  151. package/lib/server/trace/viewer/traceViewer.js +11 -20
  152. package/lib/server/transport.js +20 -22
  153. package/lib/server/utils/comparators.js +2 -2
  154. package/lib/server/utils/debug.js +3 -8
  155. package/lib/server/utils/debugLogger.js +8 -0
  156. package/lib/server/utils/hostPlatform.js +3 -1
  157. package/lib/server/utils/network.js +35 -25
  158. package/lib/server/utils/nodePlatform.js +1 -1
  159. package/lib/server/utils/processLauncher.js +4 -1
  160. package/lib/server/utils/wsServer.js +11 -17
  161. package/lib/server/webkit/webkit.js +5 -2
  162. package/lib/server/webkit/wkBrowser.js +51 -28
  163. package/lib/server/webkit/wkExecutionContext.js +2 -1
  164. package/lib/server/webkit/wkInput.js +25 -25
  165. package/lib/server/webkit/wkInterceptableRequest.js +1 -1
  166. package/lib/server/webkit/wkPage.js +80 -59
  167. package/lib/server/webkit/wkProvisionalPage.js +1 -1
  168. package/lib/server/webkit/wkWorkers.js +7 -7
  169. package/lib/utils/isomorphic/ariaSnapshot.js +13 -7
  170. package/lib/utils/isomorphic/cssParser.js +1 -2
  171. package/lib/utils/isomorphic/locatorGenerators.js +18 -0
  172. package/lib/utils/isomorphic/manualPromise.js +1 -2
  173. package/lib/utils/isomorphic/mimeType.js +1 -2
  174. package/lib/utils/isomorphic/multimap.js +1 -2
  175. package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +248 -0
  176. package/lib/utils/isomorphic/protocolFormatter.js +78 -0
  177. package/lib/utils/isomorphic/protocolMetainfo.js +318 -0
  178. package/lib/utils/isomorphic/selectorParser.js +3 -4
  179. package/lib/utils/isomorphic/stringUtils.js +3 -24
  180. package/lib/utils/isomorphic/time.js +9 -4
  181. package/lib/utils/isomorphic/timeoutRunner.js +3 -4
  182. package/lib/utils/isomorphic/traceUtils.js +2 -3
  183. package/lib/utils/isomorphic/urlMatch.js +21 -7
  184. package/lib/utils/isomorphic/utilityScriptSerializers.js +208 -205
  185. package/lib/utils.js +8 -2
  186. package/lib/utilsBundleImpl/index.js +160 -150
  187. package/lib/vite/htmlReport/index.html +17 -17
  188. package/lib/vite/recorder/assets/{codeMirrorModule-CXVeovup.js → codeMirrorModule-DzQ0k89p.js} +1 -1
  189. package/lib/vite/recorder/assets/{index-eHBmevrY.css → index-CI4HQ-Zb.css} +1 -1
  190. package/lib/vite/recorder/assets/index-D7C7daHH.js +184 -0
  191. package/lib/vite/recorder/index.html +3 -3
  192. package/lib/vite/traceViewer/assets/{codeMirrorModule-_GLjJL-7.js → codeMirrorModule-Di48jgWx.js} +1 -1
  193. package/lib/vite/traceViewer/assets/defaultSettingsView-szBn8781.js +256 -0
  194. package/lib/vite/traceViewer/defaultSettingsView.DVJHpiGt.css +1 -0
  195. package/lib/vite/traceViewer/index.BFsek2M6.css +1 -0
  196. package/lib/vite/traceViewer/index.DQvXoPLL.js +2 -0
  197. package/lib/vite/traceViewer/index.html +6 -6
  198. package/lib/vite/traceViewer/sw.bundle.js +3 -3
  199. package/lib/vite/traceViewer/uiMode.dBV3oN9h.js +5 -0
  200. package/lib/vite/traceViewer/uiMode.html +4 -4
  201. package/lib/zipBundleImpl.js +4 -4
  202. package/package.json +1 -1
  203. package/types/protocol.d.ts +712 -107
  204. package/types/types.d.ts +128 -17
  205. package/lib/generated/consoleApiSource.js +0 -28
  206. package/lib/protocol/debug.js +0 -211
  207. package/lib/server/recorder/contextRecorder.js +0 -286
  208. package/lib/server/recorder/recorderCollection.js +0 -116
  209. package/lib/server/recorder/recorderFrontend.js +0 -16
  210. package/lib/server/storageScript.js +0 -154
  211. package/lib/server/timeoutSettings.js +0 -89
  212. package/lib/utils/isomorphic/builtins.js +0 -86
  213. package/lib/vite/recorder/assets/index-BsWQsSGl.js +0 -184
  214. package/lib/vite/traceViewer/assets/defaultSettingsView-DtCQiGHe.js +0 -265
  215. package/lib/vite/traceViewer/defaultSettingsView.QdHITyLI.css +0 -1
  216. package/lib/vite/traceViewer/index.CFOW-Ezb.css +0 -1
  217. package/lib/vite/traceViewer/index.cFZzK9RN.js +0 -2
  218. 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
- useWebSocket: (0, import_utils2.isUnderTest)(),
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((0, import_instrumentation.serverSideCallMetadata)(), context._browser);
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) {
@@ -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
- let success = false;
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({ transport });
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
- if (result.redirect) {
140
- const newHeaders = Object.fromEntries(Object.entries(options.headers || {}).filter(([name]) => {
141
- return !name.includes("access-key") && name.toLowerCase() !== "authorization";
142
- }));
143
- return WebSocketTransport._connect(
144
- progress,
145
- result.redirect.headers.location,
146
- { ...options, headers: newHeaders },
147
- true
148
- /* hadRedirects */
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
- let _isUnderTest = !!process.env.PWTEST_UNDER_TEST;
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: "debian12" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 };
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 (timeout !== void 0) {
88
- const rejectOnTimeout = () => {
89
- onError(new Error(`Request to ${params.url} timed out after ${timeout}ms`));
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
- return new Promise((resolve, reject) => {
102
- httpRequest(params, async (response) => {
103
- if (response.statusCode !== 200) {
104
- const error = onError ? await onError(params, response) : new Error(`fetch failed: server returned code ${response.statusCode}. URL: ${params.url}`);
105
- reject(error);
106
- return;
107
- }
108
- let body = "";
109
- response.on("data", (chunk) => body += chunk);
110
- response.on("error", (error) => reject(error));
111
- response.on("end", () => resolve(body));
112
- }, reject);
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: () => !!(0, import_debug.debugMode)(),
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 cleanup().then(() => failedPromise).then((e) => Promise.reject(e));
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)((request, response) => {
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
- if (this._delegate.onHeaders)
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?.(request, socket);
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?.handleUpgrade(request, socket, head, (ws) => this._wsServer?.emit("connection", ws, request));
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
- const connection = this._delegate.onConnection(request, url, ws, id);
99
- ws[kConnectionSymbol] = connection;
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, executable, browserArguments) {
47
- return { ...env, CURL_COOKIE_JAR_PATH: import_path.default.join(userDataDir, "cookiejar.db") };
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 DEFAULT_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.4 Safari/605.1.15";
43
- const BROWSER_VERSION = "18.4";
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._frameManager.frameAbortedNavigation(payload.frameId, "Download is starting");
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.setOffline(this._options.offline));
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 copy = { ...c };
222
- copy.expires = c.expires === -1 ? -1 : c.expires / 1e3;
223
- delete copy.session;
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
- ...c,
230
- session: c.expires === -1 || c.expires === void 0,
231
- expires: c.expires && c.expires !== -1 ? c.expires * 1e3 : c.expires
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._delegate._grantPermissions(origin, permissions)));
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._delegate._clearPermissions()));
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 setExtraHTTPHeaders(headers) {
251
- this._options.extraHTTPHeaders = headers;
267
+ async doUpdateExtraHTTPHeaders() {
252
268
  for (const page of this.pages())
253
- await page._delegate.updateExtraHTTPHeaders();
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._delegate.updateUserAgent();
274
+ await page.delegate.updateUserAgent();
259
275
  }
260
- async setOffline(offline) {
261
- this._options.offline = offline;
276
+ async doUpdateOffline() {
262
277
  for (const page of this.pages())
263
- await page._delegate.updateOffline();
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._delegate.updateHttpCredentials();
283
+ await page.delegate.updateHttpCredentials();
269
284
  }
270
285
  async doAddInitScript(initScript) {
271
286
  for (const page of this.pages())
272
- await page._delegate._updateBootstrapScript();
287
+ await page.delegate._updateBootstrapScript();
273
288
  }
274
- async doRemoveNonInternalInitScripts() {
289
+ async doRemoveInitScripts(initScripts) {
275
290
  for (const page of this.pages())
276
- await page._delegate._updateBootstrapScript();
291
+ await page.delegate._updateBootstrapScript();
277
292
  }
278
293
  async doUpdateRequestInterception() {
279
294
  for (const page of this.pages())
280
- await page._delegate.updateRequestInterception();
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 js.parseEvaluationResultValue(response.result.value);
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);