patchright-core 1.58.2 → 1.59.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.
Files changed (285) hide show
  1. package/ThirdPartyNotices.txt +126 -650
  2. package/browsers.json +16 -14
  3. package/lib/bootstrap.js +77 -0
  4. package/lib/cli/browserActions.js +308 -0
  5. package/lib/cli/driver.js +3 -2
  6. package/lib/cli/installActions.js +171 -0
  7. package/lib/cli/program.js +47 -411
  8. package/lib/client/android.js +4 -4
  9. package/lib/client/api.js +3 -3
  10. package/lib/client/browser.js +8 -0
  11. package/lib/client/browserContext.js +22 -61
  12. package/lib/client/browserType.js +19 -51
  13. package/lib/client/cdpSession.js +6 -2
  14. package/lib/client/channelOwner.js +1 -1
  15. package/lib/client/clientHelper.js +2 -1
  16. package/lib/client/clock.js +0 -1
  17. package/lib/client/{webSocket.js → connect.js} +57 -7
  18. package/lib/client/connection.js +8 -4
  19. package/lib/client/consoleMessage.js +3 -0
  20. package/lib/client/debugger.js +57 -0
  21. package/lib/client/dialog.js +8 -1
  22. package/lib/client/disposable.js +76 -0
  23. package/lib/client/electron.js +1 -0
  24. package/lib/client/elementHandle.js +1 -4
  25. package/lib/client/events.js +3 -3
  26. package/lib/client/fetch.js +0 -1
  27. package/lib/client/frame.js +10 -23
  28. package/lib/client/harRouter.js +13 -1
  29. package/lib/client/jsHandle.js +4 -8
  30. package/lib/client/locator.js +13 -44
  31. package/lib/client/network.js +15 -16
  32. package/lib/client/page.js +41 -75
  33. package/lib/client/platform.js +0 -3
  34. package/lib/client/screencast.js +88 -0
  35. package/lib/client/selectors.js +3 -1
  36. package/lib/client/tracing.js +11 -5
  37. package/lib/client/video.js +13 -20
  38. package/lib/client/worker.js +6 -6
  39. package/lib/generated/bindingsControllerSource.js +1 -1
  40. package/lib/generated/clockSource.js +1 -1
  41. package/lib/generated/injectedScriptSource.js +1 -1
  42. package/lib/generated/pollingRecorderSource.js +1 -1
  43. package/lib/generated/storageScriptSource.js +1 -1
  44. package/lib/generated/utilityScriptSource.js +1 -1
  45. package/lib/mcpBundle.js +0 -6
  46. package/lib/mcpBundleImpl.js +91 -0
  47. package/lib/protocol/validator.js +224 -138
  48. package/lib/protocol/validatorPrimitives.js +1 -1
  49. package/lib/remote/playwrightConnection.js +10 -8
  50. package/lib/remote/playwrightPipeServer.js +100 -0
  51. package/lib/remote/playwrightServer.js +13 -8
  52. package/lib/remote/playwrightWebSocketServer.js +73 -0
  53. package/lib/remote/serverTransport.js +96 -0
  54. package/lib/server/android/android.js +2 -2
  55. package/lib/server/bidi/bidiBrowser.js +30 -8
  56. package/lib/server/bidi/bidiChromium.js +18 -5
  57. package/lib/server/bidi/bidiNetworkManager.js +39 -11
  58. package/lib/server/bidi/bidiPage.js +31 -15
  59. package/lib/server/bidi/third_party/firefoxPrefs.js +3 -1
  60. package/lib/server/browser.js +84 -21
  61. package/lib/server/browserContext.js +110 -58
  62. package/lib/server/browserType.js +14 -12
  63. package/lib/server/chromium/chromium.js +15 -12
  64. package/lib/server/chromium/chromiumSwitches.js +14 -2
  65. package/lib/server/chromium/crBrowser.js +20 -17
  66. package/lib/server/chromium/crCoverage.js +1 -13
  67. package/lib/server/chromium/crDevTools.js +1 -0
  68. package/lib/server/chromium/crNetworkManager.js +12 -267
  69. package/lib/server/chromium/crPage.js +67 -199
  70. package/lib/server/chromium/crServiceWorker.js +7 -14
  71. package/lib/server/clock.js +33 -41
  72. package/lib/server/console.js +5 -1
  73. package/lib/server/debugController.js +12 -6
  74. package/lib/server/debugger.js +40 -47
  75. package/lib/server/deviceDescriptorsSource.json +137 -137
  76. package/lib/server/dispatchers/browserContextDispatcher.js +29 -30
  77. package/lib/server/dispatchers/browserDispatcher.js +11 -5
  78. package/lib/server/dispatchers/browserTypeDispatcher.js +7 -0
  79. package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -1
  80. package/lib/server/dispatchers/debuggerDispatcher.js +84 -0
  81. package/lib/server/dispatchers/dispatcher.js +1 -1
  82. package/lib/server/dispatchers/disposableDispatcher.js +39 -0
  83. package/lib/server/dispatchers/electronDispatcher.js +2 -1
  84. package/lib/server/dispatchers/frameDispatcher.js +6 -6
  85. package/lib/server/dispatchers/jsHandleDispatcher.js +2 -2
  86. package/lib/server/dispatchers/localUtilsDispatcher.js +37 -1
  87. package/lib/server/dispatchers/networkDispatchers.js +6 -5
  88. package/lib/server/dispatchers/pageDispatcher.js +101 -38
  89. package/lib/server/dispatchers/webSocketRouteDispatcher.js +4 -5
  90. package/lib/server/disposable.js +41 -0
  91. package/lib/server/dom.js +44 -26
  92. package/lib/server/download.js +3 -2
  93. package/lib/server/electron/electron.js +12 -7
  94. package/lib/server/firefox/ffBrowser.js +9 -19
  95. package/lib/server/firefox/ffInput.js +21 -5
  96. package/lib/server/firefox/ffNetworkManager.js +2 -2
  97. package/lib/server/firefox/ffPage.js +24 -27
  98. package/lib/server/frameSelectors.js +5 -172
  99. package/lib/server/frames.js +234 -687
  100. package/lib/server/har/harRecorder.js +2 -2
  101. package/lib/server/har/harTracer.js +5 -4
  102. package/lib/server/input.js +49 -4
  103. package/lib/server/instrumentation.js +5 -0
  104. package/lib/server/javascript.js +6 -26
  105. package/lib/server/launchApp.js +1 -3
  106. package/lib/server/localUtils.js +6 -6
  107. package/lib/server/network.js +9 -8
  108. package/lib/server/overlay.js +138 -0
  109. package/lib/server/page.js +157 -105
  110. package/lib/server/progress.js +6 -0
  111. package/lib/server/recorder/recorderApp.js +9 -8
  112. package/lib/server/recorder.js +76 -40
  113. package/lib/server/registry/index.js +55 -82
  114. package/lib/server/registry/nativeDeps.js +1 -0
  115. package/lib/server/screencast.js +90 -143
  116. package/lib/server/screenshotter.js +0 -6
  117. package/lib/server/trace/recorder/snapshotter.js +8 -17
  118. package/lib/server/trace/recorder/snapshotterInjected.js +82 -20
  119. package/lib/server/trace/recorder/tracing.js +87 -44
  120. package/lib/server/trace/viewer/traceViewer.js +3 -4
  121. package/lib/server/usKeyboardLayout.js +7 -0
  122. package/lib/server/utils/comparators.js +1 -1
  123. package/lib/server/utils/disposable.js +32 -0
  124. package/lib/server/utils/eventsHelper.js +3 -1
  125. package/lib/server/utils/fileUtils.js +16 -2
  126. package/lib/server/utils/happyEyeballs.js +15 -12
  127. package/lib/server/utils/hostPlatform.js +0 -15
  128. package/lib/server/utils/httpServer.js +5 -3
  129. package/lib/server/utils/network.js +2 -1
  130. package/lib/server/utils/nodePlatform.js +0 -6
  131. package/lib/server/utils/processLauncher.js +8 -6
  132. package/lib/server/utils/zipFile.js +2 -2
  133. package/lib/server/videoRecorder.js +82 -12
  134. package/lib/server/webkit/wkBrowser.js +1 -6
  135. package/lib/server/webkit/wkPage.js +27 -25
  136. package/lib/server/webkit/wkWorkers.js +2 -1
  137. package/lib/serverRegistry.js +156 -0
  138. package/lib/tools/backend/browserBackend.js +79 -0
  139. package/lib/tools/backend/common.js +63 -0
  140. package/lib/tools/backend/config.js +41 -0
  141. package/lib/tools/backend/console.js +66 -0
  142. package/lib/tools/backend/context.js +296 -0
  143. package/lib/tools/backend/cookies.js +152 -0
  144. package/lib/tools/backend/devtools.js +69 -0
  145. package/lib/tools/backend/dialogs.js +59 -0
  146. package/lib/tools/backend/evaluate.js +64 -0
  147. package/lib/tools/backend/files.js +60 -0
  148. package/lib/tools/backend/form.js +64 -0
  149. package/lib/tools/backend/keyboard.js +155 -0
  150. package/lib/tools/backend/logFile.js +95 -0
  151. package/lib/tools/backend/mouse.js +168 -0
  152. package/lib/tools/backend/navigate.js +106 -0
  153. package/lib/tools/backend/network.js +135 -0
  154. package/lib/tools/backend/pdf.js +48 -0
  155. package/lib/tools/backend/response.js +305 -0
  156. package/lib/tools/backend/route.js +140 -0
  157. package/lib/tools/backend/runCode.js +77 -0
  158. package/lib/tools/backend/screenshot.js +88 -0
  159. package/lib/tools/backend/sessionLog.js +74 -0
  160. package/lib/tools/backend/snapshot.js +208 -0
  161. package/lib/tools/backend/storage.js +68 -0
  162. package/lib/tools/backend/tab.js +445 -0
  163. package/lib/tools/backend/tabs.js +67 -0
  164. package/lib/tools/backend/tool.js +47 -0
  165. package/lib/tools/backend/tools.js +102 -0
  166. package/lib/tools/backend/tracing.js +78 -0
  167. package/lib/tools/backend/utils.js +83 -0
  168. package/lib/tools/backend/verify.js +151 -0
  169. package/lib/tools/backend/video.js +98 -0
  170. package/lib/tools/backend/wait.js +63 -0
  171. package/lib/tools/backend/webstorage.js +223 -0
  172. package/lib/tools/cli-client/cli.js +6 -0
  173. package/lib/tools/cli-client/help.json +399 -0
  174. package/lib/tools/cli-client/minimist.js +128 -0
  175. package/lib/tools/cli-client/program.js +350 -0
  176. package/lib/tools/cli-client/registry.js +176 -0
  177. package/lib/tools/cli-client/session.js +289 -0
  178. package/lib/tools/cli-client/skill/SKILL.md +328 -0
  179. package/lib/tools/cli-client/skill/references/element-attributes.md +23 -0
  180. package/lib/tools/cli-client/skill/references/playwright-tests.md +39 -0
  181. package/lib/tools/cli-client/skill/references/request-mocking.md +87 -0
  182. package/lib/tools/cli-client/skill/references/running-code.md +231 -0
  183. package/lib/tools/cli-client/skill/references/session-management.md +169 -0
  184. package/lib/tools/cli-client/skill/references/storage-state.md +275 -0
  185. package/lib/tools/cli-client/skill/references/test-generation.md +88 -0
  186. package/lib/tools/cli-client/skill/references/tracing.md +139 -0
  187. package/lib/tools/cli-client/skill/references/video-recording.md +143 -0
  188. package/lib/tools/cli-daemon/command.js +73 -0
  189. package/lib/tools/cli-daemon/commands.js +956 -0
  190. package/lib/tools/cli-daemon/daemon.js +157 -0
  191. package/lib/tools/cli-daemon/helpGenerator.js +177 -0
  192. package/lib/tools/cli-daemon/program.js +129 -0
  193. package/lib/tools/dashboard/appIcon.png +0 -0
  194. package/lib/tools/dashboard/dashboardApp.js +284 -0
  195. package/lib/tools/dashboard/dashboardController.js +296 -0
  196. package/lib/tools/exports.js +60 -0
  197. package/lib/tools/mcp/browserFactory.js +233 -0
  198. package/lib/tools/mcp/cdpRelay.js +352 -0
  199. package/lib/tools/mcp/cli-stub.js +7 -0
  200. package/lib/tools/mcp/config.d.js +16 -0
  201. package/lib/tools/mcp/config.js +446 -0
  202. package/lib/tools/mcp/configIni.js +189 -0
  203. package/lib/tools/mcp/extensionContextFactory.js +55 -0
  204. package/lib/tools/mcp/index.js +62 -0
  205. package/lib/tools/mcp/log.js +35 -0
  206. package/lib/tools/mcp/program.js +107 -0
  207. package/lib/tools/mcp/protocol.js +28 -0
  208. package/lib/tools/mcp/watchdog.js +44 -0
  209. package/lib/tools/trace/SKILL.md +171 -0
  210. package/lib/{server/trace/viewer/traceParser.js → tools/trace/installSkill.js} +15 -39
  211. package/lib/tools/trace/traceActions.js +142 -0
  212. package/lib/tools/trace/traceAttachments.js +69 -0
  213. package/lib/tools/trace/traceCli.js +87 -0
  214. package/lib/tools/trace/traceConsole.js +97 -0
  215. package/lib/tools/trace/traceErrors.js +55 -0
  216. package/lib/tools/trace/traceOpen.js +69 -0
  217. package/lib/tools/trace/traceParser.js +96 -0
  218. package/lib/tools/trace/traceRequests.js +182 -0
  219. package/lib/tools/trace/traceScreenshot.js +68 -0
  220. package/lib/tools/trace/traceSnapshot.js +149 -0
  221. package/lib/tools/trace/traceUtils.js +153 -0
  222. package/lib/tools/utils/connect.js +32 -0
  223. package/lib/tools/utils/mcp/http.js +152 -0
  224. package/lib/tools/utils/mcp/server.js +230 -0
  225. package/lib/tools/utils/mcp/tool.js +47 -0
  226. package/lib/tools/utils/socketConnection.js +108 -0
  227. package/lib/utils/isomorphic/formatUtils.js +64 -0
  228. package/lib/utils/isomorphic/jsonSchema.js +89 -0
  229. package/lib/utils/isomorphic/mimeType.js +7 -2
  230. package/lib/utils/isomorphic/protocolFormatter.js +2 -2
  231. package/lib/utils/isomorphic/protocolMetainfo.js +127 -106
  232. package/lib/utils/isomorphic/stringUtils.js +3 -3
  233. package/lib/utils/isomorphic/timeoutRunner.js +3 -3
  234. package/lib/utils/isomorphic/trace/snapshotRenderer.js +35 -42
  235. package/lib/utils/isomorphic/trace/traceLoader.js +15 -14
  236. package/lib/utils/isomorphic/trace/traceModel.js +3 -2
  237. package/lib/utils/isomorphic/trace/traceModernizer.js +1 -0
  238. package/lib/utils/isomorphic/urlMatch.js +54 -1
  239. package/lib/utils/isomorphic/utilityScriptSerializers.js +11 -0
  240. package/lib/utils.js +6 -2
  241. package/lib/utilsBundle.js +3 -21
  242. package/lib/utilsBundleImpl/index.js +132 -133
  243. package/lib/vite/dashboard/assets/index-BAOybkp8.js +50 -0
  244. package/lib/vite/dashboard/assets/index-CZAYOG76.css +1 -0
  245. package/lib/vite/dashboard/index.html +28 -0
  246. package/lib/vite/htmlReport/index.html +2 -70
  247. package/lib/vite/htmlReport/report.css +1 -0
  248. package/lib/vite/htmlReport/report.js +72 -0
  249. package/lib/vite/recorder/assets/{codeMirrorModule-CFUTFUO7.js → codeMirrorModule-C8KMvO9L.js} +20 -20
  250. package/lib/vite/recorder/assets/index-CqAYX1I3.js +193 -0
  251. package/lib/vite/recorder/index.html +1 -1
  252. package/lib/vite/traceViewer/assets/{codeMirrorModule-BVA4h_ZY.js → codeMirrorModule-DS0FLvoc.js} +20 -20
  253. package/lib/vite/traceViewer/assets/defaultSettingsView-GTWI-W_B.js +262 -0
  254. package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
  255. package/lib/vite/traceViewer/{index.BVu7tZDe.css → index.CzXZzn5A.css} +1 -1
  256. package/lib/vite/traceViewer/{index.BtyWtaE-.js → index.Dtstcb7U.js} +1 -1
  257. package/lib/vite/traceViewer/index.html +4 -4
  258. package/lib/vite/traceViewer/sw.bundle.js +4 -4
  259. package/lib/vite/traceViewer/uiMode.Vipi55dB.js +6 -0
  260. package/lib/vite/traceViewer/uiMode.html +3 -3
  261. package/lib/zipBundleImpl.js +2 -2
  262. package/lib/zodBundle.js +39 -0
  263. package/lib/zodBundleImpl.js +40 -0
  264. package/package.json +6 -1
  265. package/types/protocol.d.ts +947 -51
  266. package/types/types.d.ts +854 -74
  267. package/lib/client/pageAgent.js +0 -64
  268. package/lib/mcpBundleImpl/index.js +0 -147
  269. package/lib/server/agent/actionRunner.js +0 -335
  270. package/lib/server/agent/actions.js +0 -128
  271. package/lib/server/agent/codegen.js +0 -111
  272. package/lib/server/agent/context.js +0 -150
  273. package/lib/server/agent/expectTools.js +0 -156
  274. package/lib/server/agent/pageAgent.js +0 -204
  275. package/lib/server/agent/performTools.js +0 -262
  276. package/lib/server/agent/tool.js +0 -109
  277. package/lib/server/dispatchers/pageAgentDispatcher.js +0 -96
  278. package/lib/server/pageBinding.js +0 -87
  279. package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +0 -248
  280. package/lib/vite/recorder/assets/index-CVkBxsGf.js +0 -193
  281. package/lib/vite/traceViewer/assets/defaultSettingsView-CjfmcdOz.js +0 -266
  282. package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +0 -1
  283. package/lib/vite/traceViewer/uiMode.fyrXARf2.js +0 -5
  284. /package/lib/{server/utils → utils/isomorphic}/imageUtils.js +0 -0
  285. /package/lib/utils/isomorphic/{traceUtils.js → trace/traceUtils.js} +0 -0
@@ -41,6 +41,7 @@ var import_recorderUtils = require("./recorder/recorderUtils");
41
41
  var import_locatorParser = require("../utils/isomorphic/locatorParser");
42
42
  var import_selectorParser = require("../utils/isomorphic/selectorParser");
43
43
  var import_progress = require("./progress");
44
+ var import_manualPromise = require("../utils/isomorphic/manualPromise");
44
45
  var import_recorderSignalProcessor = require("./recorder/recorderSignalProcessor");
45
46
  var rawRecorderSource = __toESM(require("./../generated/pollingRecorderSource"));
46
47
  var import_utils2 = require("./../utils");
@@ -144,8 +145,11 @@ class Recorder extends import_events.default {
144
145
  }
145
146
  }
146
147
  }
148
+ let mode = this._mode;
149
+ if (this._pickLocatorPage && source.page !== this._pickLocatorPage)
150
+ mode = "none";
147
151
  const uiState = {
148
- mode: this._mode,
152
+ mode,
149
153
  actionPoint,
150
154
  actionSelector,
151
155
  ariaTemplate: this._highlightedElement.ariaTemplate,
@@ -162,7 +166,7 @@ class Recorder extends import_events.default {
162
166
  await this._context.exposeBinding(progress, "__pw_recorderSetMode", false, async ({ frame }, mode) => {
163
167
  if (frame.parentFrame())
164
168
  return;
165
- this.setMode(mode);
169
+ await this.setMode(mode);
166
170
  });
167
171
  await this._context.exposeBinding(progress, "__pw_recorderSetOverlayState", false, async ({ frame }, state) => {
168
172
  if (frame.parentFrame())
@@ -170,7 +174,7 @@ class Recorder extends import_events.default {
170
174
  this._overlayState = state;
171
175
  });
172
176
  await this._context.exposeBinding(progress, "__pw_resume", false, () => {
173
- this._debugger.resume(false);
177
+ this._debugger.resume();
174
178
  });
175
179
  this._context.on(import_browserContext.BrowserContext.Events.Page, (page) => this._onPage(page));
176
180
  for (const page of this._context.pages())
@@ -191,17 +195,16 @@ class Recorder extends import_events.default {
191
195
  false,
192
196
  (source, action) => this._recordAction(source.frame, action)
193
197
  );
194
- await this._context.extendInjectedScript(rawRecorderSource.source, { recorderMode: this._recorderMode });
198
+ await this._context.extendInjectedScript(rawRecorderSource.source, { recorderMode: this._recorderMode, hideToolbar: !!this._params.hideToolbar });
195
199
  });
196
200
  if (this._debugger.isPaused())
197
201
  this._pausedStateChanged();
198
202
  this._debugger.on(import_debugger.Debugger.Events.PausedStateChanged, () => this._pausedStateChanged());
199
203
  }
200
204
  _pausedStateChanged() {
201
- for (const { metadata, sdkObject } of this._debugger.pausedDetails()) {
202
- if (!this._currentCallsMetadata.has(metadata))
203
- this.onBeforeCall(sdkObject, metadata);
204
- }
205
+ const pausedDetails = this._debugger.pausedDetails();
206
+ if (pausedDetails && !this._currentCallsMetadata.has(pausedDetails.metadata))
207
+ this.onBeforeCall(pausedDetails.sdkObject, pausedDetails.metadata);
205
208
  this.emit(RecorderEvent.PausedStateChanged, this._debugger.isPaused());
206
209
  this._updateUserSources();
207
210
  this.updateCallLog([...this._currentCallsMetadata.keys()]);
@@ -209,7 +212,7 @@ class Recorder extends import_events.default {
209
212
  mode() {
210
213
  return this._mode;
211
214
  }
212
- setMode(mode) {
215
+ async setMode(mode) {
213
216
  if (this._mode === mode)
214
217
  return;
215
218
  this._highlightedElement = {};
@@ -217,54 +220,91 @@ class Recorder extends import_events.default {
217
220
  this.emit(RecorderEvent.ModeChanged, this._mode);
218
221
  this._setEnabled(this._isRecording());
219
222
  this._debugger.setMuted(this._isRecording());
220
- if (this._mode !== "none" && this._mode !== "standby" && this._context.pages().length === 1)
221
- this._context.pages()[0].bringToFront().catch(() => {
223
+ if (this._mode !== "none" && this._mode !== "standby") {
224
+ let pageToFocus = this._pickLocatorPage;
225
+ if (!pageToFocus && this._context.pages().length === 1)
226
+ pageToFocus = this._context.pages()[0];
227
+ pageToFocus?.bringToFront().catch(() => {
222
228
  });
223
- this._refreshOverlay();
229
+ }
230
+ await this._refreshOverlay();
231
+ }
232
+ async pickLocator(progress, page) {
233
+ if (this._mode !== "none")
234
+ await this.setMode("none");
235
+ const selectorPromise = new import_manualPromise.ManualPromise();
236
+ let recorderChangedState = false;
237
+ const onElementPicked = (elementInfo) => {
238
+ selectorPromise.resolve(elementInfo.selector);
239
+ };
240
+ const onModeChanged = () => {
241
+ if (this._mode === "inspecting")
242
+ return;
243
+ recorderChangedState = true;
244
+ selectorPromise.reject(new Error("Locator picking was cancelled"));
245
+ };
246
+ const listeners = [
247
+ import_utils2.eventsHelper.addEventListener(this, RecorderEvent.ElementPicked, onElementPicked),
248
+ import_utils2.eventsHelper.addEventListener(this, RecorderEvent.ModeChanged, onModeChanged)
249
+ ];
250
+ try {
251
+ const doPickLocator = async () => {
252
+ selectorPromise.catch(() => {
253
+ });
254
+ this._pickLocatorPage = page;
255
+ await this.setMode("inspecting");
256
+ return await selectorPromise;
257
+ };
258
+ return await progress.race(doPickLocator());
259
+ } finally {
260
+ import_utils2.eventsHelper.removeEventListeners(listeners);
261
+ this._pickLocatorPage = void 0;
262
+ if (!recorderChangedState)
263
+ await this.setMode("none");
264
+ }
224
265
  }
225
266
  url() {
226
267
  const page = this._context.pages()[0];
227
268
  return page?.mainFrame().url();
228
269
  }
229
- setHighlightedSelector(selector) {
270
+ async setHighlightedSelector(selector) {
230
271
  this._highlightedElement = { selector: (0, import_locatorParser.locatorOrSelectorAsSelector)(this._currentLanguage, selector, this._context.selectors().testIdAttributeName()) };
231
- this._refreshOverlay();
272
+ await this._refreshOverlay();
232
273
  }
233
- setHighlightedAriaTemplate(ariaTemplate) {
274
+ async setHighlightedAriaTemplate(ariaTemplate) {
234
275
  this._highlightedElement = { ariaTemplate };
235
- this._refreshOverlay();
276
+ await this._refreshOverlay();
236
277
  }
237
278
  step() {
238
- this._debugger.resume(true);
279
+ this._debugger.setPauseAt({ next: true });
280
+ this._debugger.resume();
239
281
  }
240
- setLanguage(language) {
282
+ async setLanguage(language) {
241
283
  this._currentLanguage = language;
242
- this._refreshOverlay();
284
+ await this._refreshOverlay();
243
285
  }
244
286
  resume() {
245
- this._debugger.resume(false);
287
+ this._debugger.resume();
246
288
  }
247
289
  pause() {
248
- this._debugger.pauseOnNextStatement();
290
+ this._debugger.setPauseAt({ next: true });
249
291
  }
250
292
  paused() {
251
293
  return this._debugger.isPaused();
252
294
  }
253
295
  close() {
254
- this._debugger.resume(false);
296
+ this._debugger.resume();
255
297
  }
256
- hideHighlightedSelector() {
298
+ async hideHighlightedSelector() {
257
299
  this._highlightedElement = {};
258
- this._refreshOverlay();
300
+ await this._refreshOverlay();
259
301
  }
260
302
  pausedSourceId() {
261
- for (const { metadata } of this._debugger.pausedDetails()) {
262
- if (!metadata.location)
263
- continue;
264
- const source = this._userSources.get(metadata.location.file);
265
- if (!source)
266
- continue;
267
- return source.id;
303
+ const pausedDetails = this._debugger.pausedDetails();
304
+ if (pausedDetails?.metadata.location) {
305
+ const source = this._userSources.get(pausedDetails.metadata.location.file);
306
+ if (source)
307
+ return source.id;
268
308
  }
269
309
  }
270
310
  userSources() {
@@ -290,12 +330,10 @@ class Recorder extends import_events.default {
290
330
  return "";
291
331
  }
292
332
  }
293
- _refreshOverlay() {
294
- for (const page of this._context.pages()) {
295
- for (const frame of page.frames())
296
- frame.evaluateExpression("window.__pw_refreshOverlay()").catch(() => {
297
- });
298
- }
333
+ async _refreshOverlay() {
334
+ await Promise.all(this._context.pages().map(
335
+ (page) => page.safeNonStallingEvaluateInAllFrames("window.__pw_refreshOverlay()", "main")
336
+ ));
299
337
  }
300
338
  async onBeforeCall(sdkObject, metadata) {
301
339
  if (this._omitCallTracking || this._isRecording())
@@ -338,8 +376,6 @@ class Recorder extends import_events.default {
338
376
  }
339
377
  this.emit(RecorderEvent.UserSourcesChanged, this.userSources(), this.pausedSourceId());
340
378
  }
341
- async onBeforeInputAction(sdkObject, metadata) {
342
- }
343
379
  async onCallLog(sdkObject, metadata, logName, message) {
344
380
  this.updateCallLog([metadata]);
345
381
  }
@@ -388,7 +424,7 @@ class Recorder extends import_events.default {
388
424
  this._filePrimaryURLChanged();
389
425
  });
390
426
  frame.on(import_frames.Frame.Events.InternalNavigation, (event) => {
391
- if (event.isPublic) {
427
+ if (event.isPublic && !event.error) {
392
428
  this._onFrameNavigated(frame, page);
393
429
  this._filePrimaryURLChanged();
394
430
  }
@@ -31,6 +31,8 @@ __export(registry_exports, {
31
31
  Registry: () => Registry,
32
32
  browserDirectoryToMarkerFilePath: () => browserDirectoryToMarkerFilePath,
33
33
  buildPlaywrightCLICommand: () => buildPlaywrightCLICommand,
34
+ defaultCacheDirectory: () => defaultCacheDirectory,
35
+ defaultRegistryDirectory: () => defaultRegistryDirectory,
34
36
  findChromiumChannelBestEffort: () => findChromiumChannelBestEffort,
35
37
  installBrowsersForNpmInstall: () => installBrowsersForNpmInstall,
36
38
  registry: () => registry,
@@ -467,25 +469,25 @@ const DOWNLOAD_PATHS = {
467
469
  "win64": "builds/android/%s/android.zip"
468
470
  }
469
471
  };
472
+ const defaultCacheDirectory = (() => {
473
+ if (process.platform === "linux")
474
+ return process.env.XDG_CACHE_HOME || import_path.default.join(import_os.default.homedir(), ".cache");
475
+ if (process.platform === "darwin")
476
+ return import_path.default.join(import_os.default.homedir(), "Library", "Caches");
477
+ if (process.platform === "win32")
478
+ return process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local");
479
+ throw new Error("Unsupported platform: " + process.platform);
480
+ })();
481
+ const defaultRegistryDirectory = import_path.default.join(defaultCacheDirectory, "ms-playwright");
470
482
  const registryDirectory = (() => {
471
483
  let result;
472
484
  const envDefined = (0, import_utils.getFromENV)("PLAYWRIGHT_BROWSERS_PATH");
473
- if (envDefined === "0") {
485
+ if (envDefined === "0")
474
486
  result = import_path.default.join(__dirname, "..", "..", "..", ".local-browsers");
475
- } else if (envDefined) {
487
+ else if (envDefined)
476
488
  result = envDefined;
477
- } else {
478
- let cacheDirectory;
479
- if (process.platform === "linux")
480
- cacheDirectory = process.env.XDG_CACHE_HOME || import_path.default.join(import_os.default.homedir(), ".cache");
481
- else if (process.platform === "darwin")
482
- cacheDirectory = import_path.default.join(import_os.default.homedir(), "Library", "Caches");
483
- else if (process.platform === "win32")
484
- cacheDirectory = process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local");
485
- else
486
- throw new Error("Unsupported platform: " + process.platform);
487
- result = import_path.default.join(cacheDirectory, "ms-playwright");
488
- }
489
+ else
490
+ result = defaultRegistryDirectory;
489
491
  if (!import_path.default.isAbsolute(result)) {
490
492
  result = import_path.default.resolve((0, import_utils.getFromENV)("INIT_CWD") || process.cwd(), result);
491
493
  }
@@ -524,7 +526,7 @@ function readDescriptors(browsersJSON) {
524
526
  });
525
527
  }
526
528
  const allDownloadableDirectoriesThatEverExisted = ["android", "chromium", "firefox", "webkit", "ffmpeg", "firefox-beta", "chromium-tip-of-tree", "chromium-headless-shell", "chromium-tip-of-tree-headless-shell", "winldd"];
527
- const chromiumAliases = ["bidi-chromium", "chrome-for-testing"];
529
+ const chromiumAliases = ["chrome-for-testing"];
528
530
  class Registry {
529
531
  constructor(browsersJSON) {
530
532
  const descriptors = readDescriptors(browsersJSON);
@@ -540,21 +542,37 @@ class Registry {
540
542
  const currentDockerVersion = (0, import_dependencies.readDockerVersionSync)();
541
543
  const preferredDockerVersion = currentDockerVersion ? (0, import_dependencies.dockerVersion)(currentDockerVersion.dockerImageNameTemplate) : null;
542
544
  const isOutdatedDockerImage = currentDockerVersion && preferredDockerVersion && currentDockerVersion.dockerImageName !== preferredDockerVersion.dockerImageName;
543
- const prettyMessage = isOutdatedDockerImage ? [
544
- `Looks like ${sdkLanguage === "javascript" ? "Playwright Test or " : ""}Playwright was just updated to ${preferredDockerVersion.driverVersion}.`,
545
- `Please update docker image as well.`,
546
- `- current: ${currentDockerVersion.dockerImageName}`,
547
- `- required: ${preferredDockerVersion.dockerImageName}`,
548
- ``,
549
- `<3 Playwright Team`
550
- ].join("\n") : [
551
- `Looks like ${sdkLanguage === "javascript" ? "Playwright Test or " : ""}Playwright was just installed or updated.`,
552
- `Please run the following command to download new browser${installByDefault ? "s" : ""}:`,
553
- ``,
554
- ` ${installCommand}`,
555
- ``,
556
- `<3 Playwright Team`
557
- ].join("\n");
545
+ const isFfmpeg = name === "ffmpeg";
546
+ let prettyMessage;
547
+ if (isOutdatedDockerImage) {
548
+ prettyMessage = [
549
+ `Looks like Playwright was just updated to ${preferredDockerVersion.driverVersion}.`,
550
+ `Please update docker image as well.`,
551
+ `- current: ${currentDockerVersion.dockerImageName}`,
552
+ `- required: ${preferredDockerVersion.dockerImageName}`,
553
+ ``,
554
+ `<3 Playwright Team`
555
+ ].join("\n");
556
+ } else if (isFfmpeg) {
557
+ prettyMessage = [
558
+ `Video rendering requires ffmpeg binary.`,
559
+ `Downloading it will not affect any of the system-wide settings.`,
560
+ `Please run the following command:`,
561
+ ``,
562
+ ` ${buildPlaywrightCLICommand(sdkLanguage, "install ffmpeg")}`,
563
+ ``,
564
+ `<3 Playwright Team`
565
+ ].join("\n");
566
+ } else {
567
+ prettyMessage = [
568
+ `Looks like Playwright was just installed or updated.`,
569
+ `Please run the following command to download new browser${installByDefault ? "s" : ""}:`,
570
+ ``,
571
+ ` ${installCommand}`,
572
+ ``,
573
+ `<3 Playwright Team`
574
+ ].join("\n");
575
+ }
558
576
  throw new Error(`Executable doesn't exist at ${e}
559
577
  ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
560
578
  }
@@ -708,16 +726,6 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
708
726
  "darwin": "/Applications/Firefox Nightly.app/Contents/MacOS/firefox",
709
727
  "win32": "\\Mozilla Firefox\\firefox.exe"
710
728
  }));
711
- this._executables.push(this._createBidiChromiumChannel("bidi-chrome-stable", {
712
- "linux": "/opt/google/chrome/chrome",
713
- "darwin": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
714
- "win32": `\\Google\\Chrome\\Application\\chrome.exe`
715
- }));
716
- this._executables.push(this._createBidiChromiumChannel("bidi-chrome-canary", {
717
- "linux": "/opt/google/chrome-canary/chrome",
718
- "darwin": "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
719
- "win32": `\\Google\\Chrome SxS\\Application\\chrome.exe`
720
- }));
721
729
  const firefox = descriptors.find((d) => d.name === "firefox");
722
730
  const firefoxExecutable = findExecutablePath(firefox.dir, "firefox");
723
731
  this._executables.push({
@@ -891,7 +899,7 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
891
899
  name,
892
900
  browserName: "chromium",
893
901
  directory: void 0,
894
- executablePath: (sdkLanguage) => executablePath(sdkLanguage, false),
902
+ executablePath: () => executablePath("", false),
895
903
  executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true),
896
904
  installType: install ? "install-script" : "none",
897
905
  _validateHostRequirements: () => Promise.resolve(),
@@ -929,7 +937,7 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
929
937
  name,
930
938
  browserName: "firefox",
931
939
  directory: void 0,
932
- executablePath: (sdkLanguage) => executablePath(sdkLanguage, false),
940
+ executablePath: () => executablePath("", false),
933
941
  executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true),
934
942
  installType: "none",
935
943
  _validateHostRequirements: () => Promise.resolve(),
@@ -937,43 +945,6 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
937
945
  _install: install
938
946
  };
939
947
  }
940
- _createBidiChromiumChannel(name, lookAt) {
941
- const executablePath = (sdkLanguage, shouldThrow) => {
942
- const suffix = lookAt[process.platform];
943
- if (!suffix) {
944
- if (shouldThrow)
945
- throw new Error(`Chromium distribution '${name}' is not supported on ${process.platform}`);
946
- return void 0;
947
- }
948
- const prefixes = process.platform === "win32" ? [
949
- process.env.LOCALAPPDATA,
950
- process.env.PROGRAMFILES,
951
- process.env["PROGRAMFILES(X86)"],
952
- // In some cases there is no PROGRAMFILES/(86) env var set but HOMEDRIVE is set.
953
- process.env.HOMEDRIVE + "\\Program Files",
954
- process.env.HOMEDRIVE + "\\Program Files (x86)"
955
- ].filter(Boolean) : [""];
956
- for (const prefix of prefixes) {
957
- const executablePath2 = import_path.default.join(prefix, suffix);
958
- if ((0, import_fileUtils.canAccessFile)(executablePath2))
959
- return executablePath2;
960
- }
961
- if (!shouldThrow)
962
- return void 0;
963
- const location = prefixes.length ? ` at ${import_path.default.join(prefixes[0], suffix)}` : ``;
964
- throw new Error(`Chromium distribution '${name}' is not found${location}`);
965
- };
966
- return {
967
- name,
968
- browserName: "chromium",
969
- directory: void 0,
970
- executablePath: (sdkLanguage) => executablePath(sdkLanguage, false),
971
- executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true),
972
- installType: "none",
973
- _validateHostRequirements: () => Promise.resolve(),
974
- _isHermeticInstallation: false
975
- };
976
- }
977
948
  executables() {
978
949
  return this._executables;
979
950
  }
@@ -1032,8 +1003,8 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
1032
1003
  for (const executable of executables) {
1033
1004
  if (!executable._install)
1034
1005
  throw new Error(`ERROR: Playwright does not support installing ${executable.name}`);
1035
- const { embedderName } = (0, import_userAgent.getEmbedderName)();
1036
- if (!(0, import_utils.getAsBooleanFromENV)("CI") && !executable._isHermeticInstallation && !options?.force && executable.executablePath(embedderName)) {
1006
+ if (!(0, import_utils.getAsBooleanFromENV)("CI") && !executable._isHermeticInstallation && !options?.force && executable.executablePath()) {
1007
+ const { embedderName } = (0, import_userAgent.getEmbedderName)();
1037
1008
  const command = buildPlaywrightCLICommand(embedderName, "install --force " + executable.name);
1038
1009
  process.stderr.write("\n" + (0, import_ascii.wrapInASCIIBox)([
1039
1010
  `ATTENTION: "${executable.name}" is already installed on the system!`,
@@ -1354,7 +1325,7 @@ function buildPlaywrightCLICommand(sdkLanguage, parameters) {
1354
1325
  return `pwsh bin/Debug/netX/playwright.ps1 ${parameters}`;
1355
1326
  default: {
1356
1327
  const packageManagerCommand = (0, import_utils.getPackageManagerExecCommand)();
1357
- return `${packageManagerCommand} patchright ${parameters}`;
1328
+ return `${packageManagerCommand} playwright ${parameters}`;
1358
1329
  }
1359
1330
  }
1360
1331
  }
@@ -1414,6 +1385,8 @@ const registry = new Registry(require("../../../browsers.json"));
1414
1385
  Registry,
1415
1386
  browserDirectoryToMarkerFilePath,
1416
1387
  buildPlaywrightCLICommand,
1388
+ defaultCacheDirectory,
1389
+ defaultRegistryDirectory,
1417
1390
  findChromiumChannelBestEffort,
1418
1391
  installBrowsersForNpmInstall,
1419
1392
  registry,
@@ -496,6 +496,7 @@ const deps = {
496
496
  firefox: [
497
497
  "libasound2t64",
498
498
  "libatk1.0-0t64",
499
+ "libavcodec60",
499
500
  "libcairo-gobject2",
500
501
  "libcairo2",
501
502
  "libdbus-1-3",