patchright-core 1.56.1 → 1.58.2

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 (180) hide show
  1. package/ThirdPartyNotices.txt +3134 -560
  2. package/bin/install_webkit_wsl.ps1 +1 -3
  3. package/browsers.json +21 -22
  4. package/lib/cli/program.js +16 -60
  5. package/lib/client/api.js +3 -3
  6. package/lib/client/browser.js +3 -5
  7. package/lib/client/browserContext.js +62 -8
  8. package/lib/client/browserType.js +4 -3
  9. package/lib/client/connection.js +4 -0
  10. package/lib/client/consoleMessage.js +5 -1
  11. package/lib/client/electron.js +1 -1
  12. package/lib/client/elementHandle.js +3 -0
  13. package/lib/client/events.js +5 -1
  14. package/lib/client/fetch.js +3 -4
  15. package/lib/client/frame.js +10 -1
  16. package/lib/client/locator.js +12 -1
  17. package/lib/client/network.js +5 -1
  18. package/lib/client/page.js +31 -6
  19. package/lib/client/pageAgent.js +64 -0
  20. package/lib/client/platform.js +3 -0
  21. package/lib/client/playwright.js +1 -5
  22. package/lib/client/tracing.js +7 -5
  23. package/lib/client/worker.js +22 -0
  24. package/lib/generated/clockSource.js +1 -1
  25. package/lib/generated/injectedScriptSource.js +1 -1
  26. package/lib/generated/pollingRecorderSource.js +1 -1
  27. package/lib/inProcessFactory.js +0 -2
  28. package/lib/mcpBundle.js +84 -0
  29. package/lib/mcpBundleImpl/index.js +147 -0
  30. package/lib/protocol/serializers.js +5 -0
  31. package/lib/protocol/validator.js +112 -50
  32. package/lib/remote/playwrightServer.js +1 -2
  33. package/lib/server/agent/actionRunner.js +335 -0
  34. package/lib/server/agent/actions.js +128 -0
  35. package/lib/server/agent/codegen.js +111 -0
  36. package/lib/server/agent/context.js +150 -0
  37. package/lib/server/agent/expectTools.js +156 -0
  38. package/lib/server/agent/pageAgent.js +204 -0
  39. package/lib/server/agent/performTools.js +262 -0
  40. package/lib/server/agent/tool.js +109 -0
  41. package/lib/server/android/android.js +1 -1
  42. package/lib/server/artifact.js +1 -1
  43. package/lib/server/bidi/bidiBrowser.js +81 -22
  44. package/lib/server/bidi/bidiChromium.js +9 -13
  45. package/lib/server/bidi/bidiConnection.js +1 -0
  46. package/lib/server/bidi/bidiDeserializer.js +116 -0
  47. package/lib/server/bidi/bidiExecutionContext.js +75 -29
  48. package/lib/server/bidi/bidiFirefox.js +7 -9
  49. package/lib/server/bidi/bidiNetworkManager.js +1 -1
  50. package/lib/server/bidi/bidiPage.js +61 -30
  51. package/lib/server/bidi/third_party/bidiProtocolCore.js +1 -0
  52. package/lib/server/browserContext.js +43 -36
  53. package/lib/server/browserType.js +12 -4
  54. package/lib/server/chromium/chromium.js +26 -21
  55. package/lib/server/chromium/chromiumSwitches.js +12 -3
  56. package/lib/server/chromium/crBrowser.js +30 -12
  57. package/lib/server/chromium/crConnection.js +0 -5
  58. package/lib/server/chromium/crCoverage.js +13 -1
  59. package/lib/server/chromium/crDevTools.js +0 -2
  60. package/lib/server/chromium/crNetworkManager.js +107 -18
  61. package/lib/server/chromium/crPage.js +68 -124
  62. package/lib/server/chromium/crServiceWorker.js +14 -1
  63. package/lib/server/codegen/javascript.js +6 -29
  64. package/lib/server/console.js +5 -1
  65. package/lib/server/deviceDescriptorsSource.json +56 -56
  66. package/lib/server/dispatchers/browserContextDispatcher.js +26 -8
  67. package/lib/server/dispatchers/dispatcher.js +6 -13
  68. package/lib/server/dispatchers/frameDispatcher.js +1 -1
  69. package/lib/server/dispatchers/jsHandleDispatcher.js +2 -2
  70. package/lib/server/dispatchers/pageAgentDispatcher.js +96 -0
  71. package/lib/server/dispatchers/pageDispatcher.js +14 -22
  72. package/lib/server/dispatchers/playwrightDispatcher.js +0 -4
  73. package/lib/server/dom.js +12 -3
  74. package/lib/server/electron/electron.js +6 -3
  75. package/lib/server/firefox/ffBrowser.js +10 -20
  76. package/lib/server/firefox/ffConnection.js +0 -5
  77. package/lib/server/firefox/ffNetworkManager.js +2 -2
  78. package/lib/server/firefox/ffPage.js +18 -24
  79. package/lib/server/firefox/firefox.js +18 -9
  80. package/lib/server/frameSelectors.js +18 -8
  81. package/lib/server/frames.js +257 -87
  82. package/lib/server/input.js +7 -3
  83. package/lib/server/instrumentation.js +3 -0
  84. package/lib/server/javascript.js +8 -4
  85. package/lib/server/launchApp.js +2 -1
  86. package/lib/server/localUtils.js +4 -8
  87. package/lib/server/network.js +50 -12
  88. package/lib/server/page.js +112 -126
  89. package/lib/server/playwright.js +2 -4
  90. package/lib/server/progress.js +26 -6
  91. package/lib/server/recorder/recorderApp.js +80 -101
  92. package/lib/server/recorder.js +3 -2
  93. package/lib/server/registry/browserFetcher.js +6 -4
  94. package/lib/server/registry/index.js +278 -189
  95. package/lib/server/registry/oopDownloadBrowserMain.js +9 -2
  96. package/lib/server/screencast.js +190 -0
  97. package/lib/server/screenshotter.js +6 -0
  98. package/lib/server/socksClientCertificatesInterceptor.js +1 -1
  99. package/lib/server/trace/recorder/snapshotter.js +17 -8
  100. package/lib/server/trace/recorder/snapshotterInjected.js +30 -72
  101. package/lib/server/trace/recorder/tracing.js +31 -21
  102. package/lib/server/trace/viewer/traceParser.js +72 -0
  103. package/lib/server/trace/viewer/traceViewer.js +45 -40
  104. package/lib/server/utils/comparators.js +3 -25
  105. package/lib/server/utils/expectUtils.js +87 -2
  106. package/lib/server/utils/hostPlatform.js +30 -3
  107. package/lib/server/utils/httpServer.js +5 -20
  108. package/lib/server/utils/imageUtils.js +141 -0
  109. package/lib/server/utils/network.js +55 -40
  110. package/lib/server/utils/nodePlatform.js +6 -0
  111. package/lib/server/{chromium/videoRecorder.js → videoRecorder.js} +35 -24
  112. package/lib/server/webkit/webkit.js +5 -16
  113. package/lib/server/webkit/wkBrowser.js +2 -6
  114. package/lib/server/webkit/wkConnection.js +1 -6
  115. package/lib/server/webkit/wkInterceptableRequest.js +29 -1
  116. package/lib/server/webkit/wkPage.js +76 -51
  117. package/lib/server/webkit/wkWorkers.js +2 -1
  118. package/lib/utils/isomorphic/ariaSnapshot.js +63 -0
  119. package/lib/utils/isomorphic/locatorGenerators.js +24 -8
  120. package/lib/utils/isomorphic/lruCache.js +51 -0
  121. package/lib/utils/isomorphic/mimeType.js +1 -1
  122. package/lib/utils/isomorphic/protocolFormatter.js +3 -0
  123. package/lib/utils/isomorphic/protocolMetainfo.js +11 -2
  124. package/lib/utils/isomorphic/stringUtils.js +49 -0
  125. package/lib/utils/isomorphic/trace/entries.js +16 -0
  126. package/lib/utils/isomorphic/trace/snapshotRenderer.js +499 -0
  127. package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
  128. package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
  129. package/lib/utils/isomorphic/trace/traceLoader.js +131 -0
  130. package/lib/utils/isomorphic/trace/traceModel.js +365 -0
  131. package/lib/utils/isomorphic/trace/traceModernizer.js +400 -0
  132. package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
  133. package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
  134. package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
  135. package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
  136. package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
  137. package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
  138. package/lib/utils/isomorphic/urlMatch.js +19 -5
  139. package/lib/utils/isomorphic/yaml.js +84 -0
  140. package/lib/utils.js +4 -0
  141. package/lib/utilsBundle.js +1 -1
  142. package/lib/utilsBundleImpl/index.js +124 -124
  143. package/lib/vite/htmlReport/index.html +21 -21
  144. package/lib/vite/recorder/assets/codeMirrorModule-CFUTFUO7.js +32 -0
  145. package/lib/vite/recorder/assets/{codeMirrorModule-C3UTv-Ge.css → codeMirrorModule-DYBRYzYX.css} +1 -1
  146. package/lib/vite/recorder/assets/{index-Ri0uHF7I.css → index-BSjZa4pk.css} +1 -1
  147. package/lib/vite/recorder/assets/index-CVkBxsGf.js +193 -0
  148. package/lib/vite/recorder/index.html +2 -2
  149. package/lib/vite/traceViewer/assets/codeMirrorModule-BVA4h_ZY.js +32 -0
  150. package/lib/vite/traceViewer/assets/defaultSettingsView-CjfmcdOz.js +266 -0
  151. package/lib/vite/traceViewer/{codeMirrorModule.C3UTv-Ge.css → codeMirrorModule.DYBRYzYX.css} +1 -1
  152. package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +1 -0
  153. package/lib/vite/traceViewer/index.BVu7tZDe.css +1 -0
  154. package/lib/vite/traceViewer/index.BtyWtaE-.js +2 -0
  155. package/lib/vite/traceViewer/index.html +6 -6
  156. package/lib/vite/traceViewer/manifest.webmanifest +16 -0
  157. package/lib/vite/traceViewer/snapshot.html +3 -3
  158. package/lib/vite/traceViewer/sw.bundle.js +5 -3
  159. package/lib/vite/traceViewer/uiMode.fyrXARf2.js +5 -0
  160. package/lib/vite/traceViewer/uiMode.html +3 -3
  161. package/package.json +2 -1
  162. package/types/protocol.d.ts +939 -245
  163. package/types/types.d.ts +143 -153
  164. package/lib/client/accessibility.js +0 -49
  165. package/lib/server/accessibility.js +0 -69
  166. package/lib/server/bidi/third_party/bidiDeserializer.js +0 -98
  167. package/lib/server/chromium/crAccessibility.js +0 -263
  168. package/lib/server/firefox/ffAccessibility.js +0 -238
  169. package/lib/server/trace/test/inMemorySnapshotter.js +0 -87
  170. package/lib/server/webkit/wkAccessibility.js +0 -237
  171. package/lib/server/webkit/wsl/webkit-wsl-transport-client.js +0 -74
  172. package/lib/server/webkit/wsl/webkit-wsl-transport-server.js +0 -113
  173. package/lib/vite/recorder/assets/codeMirrorModule-RJCXzfmE.js +0 -24
  174. package/lib/vite/recorder/assets/index-Y-X2TGJv.js +0 -193
  175. package/lib/vite/traceViewer/assets/codeMirrorModule-rbQPefq7.js +0 -24
  176. package/lib/vite/traceViewer/assets/defaultSettingsView-CLbol9XR.js +0 -265
  177. package/lib/vite/traceViewer/defaultSettingsView.TQ8_7ybu.css +0 -1
  178. package/lib/vite/traceViewer/index.I8N9v4jT.css +0 -1
  179. package/lib/vite/traceViewer/index.zIVi6mN9.js +0 -2
  180. package/lib/vite/traceViewer/uiMode.B_CpmIpF.js +0 -5
@@ -31,10 +31,8 @@ __export(wkPage_exports, {
31
31
  WKPage: () => WKPage
32
32
  });
33
33
  module.exports = __toCommonJS(wkPage_exports);
34
- var import_path = __toESM(require("path"));
35
34
  var import_utils = require("../../utils");
36
35
  var import_headers = require("../../utils/isomorphic/headers");
37
- var import_crypto = require("../utils/crypto");
38
36
  var import_eventsHelper = require("../utils/eventsHelper");
39
37
  var import_hostPlatform = require("../utils/hostPlatform");
40
38
  var import_stackTrace = require("../../utils/isomorphic/stackTrace");
@@ -45,19 +43,20 @@ var import_errors = require("../errors");
45
43
  var import_helper = require("../helper");
46
44
  var network = __toESM(require("../network"));
47
45
  var import_page = require("../page");
48
- var import_wkAccessibility = require("./wkAccessibility");
49
46
  var import_wkConnection = require("./wkConnection");
50
47
  var import_wkExecutionContext = require("./wkExecutionContext");
51
48
  var import_wkInput = require("./wkInput");
52
49
  var import_wkInterceptableRequest = require("./wkInterceptableRequest");
53
50
  var import_wkProvisionalPage = require("./wkProvisionalPage");
54
51
  var import_wkWorkers = require("./wkWorkers");
55
- var import_debugLogger = require("../utils/debugLogger");
56
52
  var import_webkit = require("./webkit");
53
+ var import_registry = require("../registry");
57
54
  const UTILITY_WORLD_NAME = "__playwright_utility_world__";
55
+ const enableFrameSessions = !process.env.WK_DISABLE_FRAME_SESSIONS && parseInt(import_registry.registry.findExecutable("webkit").revision, 10) >= 2245;
58
56
  class WKPage {
59
57
  constructor(browserContext, pageProxySession, opener) {
60
58
  this._provisionalPage = null;
59
+ this._targetIdToFrameSession = /* @__PURE__ */ new Map();
61
60
  this._requestIdToRequest = /* @__PURE__ */ new Map();
62
61
  this._requestIdToRequestWillBeSentEvent = /* @__PURE__ */ new Map();
63
62
  this._sessionListeners = [];
@@ -67,7 +66,6 @@ class WKPage {
67
66
  };
68
67
  this._lastConsoleMessage = null;
69
68
  this._requestIdToResponseReceivedPayloadEvent = /* @__PURE__ */ new Map();
70
- this._recordingVideoFile = null;
71
69
  this._screencastGeneration = 0;
72
70
  this._pageProxySession = pageProxySession;
73
71
  this._opener = opener;
@@ -117,16 +115,7 @@ class WKPage {
117
115
  for (const [key, value] of this._browserContext._permissions)
118
116
  promises.push(this._grantPermissions(key, value));
119
117
  }
120
- if (this._browserContext._options.recordVideo) {
121
- const outputFile = import_path.default.join(this._browserContext._options.recordVideo.dir, (0, import_crypto.createGuid)() + ".webm");
122
- promises.push(this._browserContext._ensureVideosPath().then(() => {
123
- return this._startVideo({
124
- // validateBrowserContextOptions ensures correct video size.
125
- ...this._browserContext._options.recordVideo.size,
126
- outputFile
127
- });
128
- }));
129
- }
118
+ promises.push(this._initializeVideoRecording());
130
119
  await Promise.all(promises);
131
120
  }
132
121
  _setSession(session) {
@@ -160,10 +149,13 @@ class WKPage {
160
149
  session.send("Page.createUserWorld", { name: UTILITY_WORLD_NAME }).catch((_) => {
161
150
  }),
162
151
  // Worlds are per-process
163
- session.send("Console.enable"),
164
152
  session.send("Network.enable"),
165
153
  this._workers.initializeSession(session)
166
154
  ];
155
+ if (enableFrameSessions)
156
+ this._initializeFrameSessions(frameTree.frameTree, promises);
157
+ else
158
+ promises.push(session.send("Console.enable"));
167
159
  if (this._page.browserContext.needsPlaywrightBinding())
168
160
  promises.push(session.send("Runtime.addBinding", { name: import_page.PageBinding.kBindingName }));
169
161
  if (this._page.needsRequestInterception()) {
@@ -220,6 +212,13 @@ class WKPage {
220
212
  promises.push(session.send("Page.overrideSetting", { setting: "FixedBackgroundsPaintRelativeToDocument", value: contextOptions.isMobile }));
221
213
  await Promise.all(promises);
222
214
  }
215
+ _initializeFrameSessions(frame, promises) {
216
+ const session = this._targetIdToFrameSession.get(`frame-${frame.frame.id}`);
217
+ if (session)
218
+ promises.push(session.initialize());
219
+ for (const childFrame of frame.childFrames || [])
220
+ this._initializeFrameSessions(childFrame, promises);
221
+ }
223
222
  _onDidCommitProvisionalTarget(event) {
224
223
  const { oldTargetId, newTargetId } = event;
225
224
  (0, import_utils.assert)(this._provisionalPage);
@@ -245,6 +244,9 @@ class WKPage {
245
244
  this._session.markAsCrashed();
246
245
  this._page._didCrash();
247
246
  }
247
+ } else if (this._targetIdToFrameSession.has(targetId)) {
248
+ this._targetIdToFrameSession.get(targetId).dispose();
249
+ this._targetIdToFrameSession.delete(targetId);
248
250
  }
249
251
  }
250
252
  didClose() {
@@ -258,7 +260,7 @@ class WKPage {
258
260
  this._provisionalPage.dispose();
259
261
  this._provisionalPage = null;
260
262
  }
261
- this._firstNonInitialNavigationCommittedReject(new import_errors.TargetClosedError());
263
+ this._firstNonInitialNavigationCommittedReject(new import_errors.TargetClosedError(this._page.closeReason()));
262
264
  this._page._didClose();
263
265
  }
264
266
  dispatchMessageToSession(message) {
@@ -289,8 +291,15 @@ class WKPage {
289
291
  session.dispatchMessage({ id: message.id, error: { message: e.message } });
290
292
  });
291
293
  });
292
- if (targetInfo.type === "frame")
294
+ if (targetInfo.type === "frame") {
295
+ if (enableFrameSessions) {
296
+ const wkFrame = new WKFrame(this, session);
297
+ this._targetIdToFrameSession.set(targetInfo.targetId, wkFrame);
298
+ await wkFrame.initialize().catch((e) => {
299
+ });
300
+ }
293
301
  return;
302
+ }
294
303
  (0, import_utils.assert)(targetInfo.type === "page", "Only page targets are expected in WebKit, received: " + targetInfo.type);
295
304
  if (!targetInfo.isProvisional) {
296
305
  (0, import_utils.assert)(!this._page.initializedOrUndefined());
@@ -332,6 +341,8 @@ class WKPage {
332
341
  this._provisionalPage._session.dispatchMessage(JSON.parse(message));
333
342
  else if (this._session.sessionId === targetId)
334
343
  this._session.dispatchMessage(JSON.parse(message));
344
+ else if (this._targetIdToFrameSession.has(targetId))
345
+ this._targetIdToFrameSession.get(targetId)._session.dispatchMessage(JSON.parse(message));
335
346
  else
336
347
  throw new Error("Unknown target: " + targetId);
337
348
  }
@@ -454,7 +465,7 @@ class WKPage {
454
465
  }
455
466
  async navigateFrame(frame, url, referrer) {
456
467
  if (this._pageProxySession.isDisposed())
457
- throw new import_errors.TargetClosedError();
468
+ throw new import_errors.TargetClosedError(this._page.closeReason());
458
469
  const pageProxyId = this._pageProxySession.sessionId;
459
470
  const result = await this._pageProxySession.connection.browserSession.send("Playwright.navigate", { url, pageProxyId, frameId: frame._id, referrer });
460
471
  return { newDocumentId: result.loaderId };
@@ -519,7 +530,7 @@ class WKPage {
519
530
  location
520
531
  } = this._lastConsoleMessage;
521
532
  for (let i = count; i < event.count; ++i)
522
- this._page.addConsoleMessage(derivedType, handles, location, handles.length ? void 0 : text);
533
+ this._page.addConsoleMessage(null, derivedType, handles, location, handles.length ? void 0 : text);
523
534
  this._lastConsoleMessage.count = event.count;
524
535
  }
525
536
  }
@@ -749,7 +760,6 @@ class WKPage {
749
760
  await this._updateState("Page.setBootstrapScript", { source: this._calculateBootstrapScript() });
750
761
  }
751
762
  async closePage(runBeforeUnload) {
752
- await this._stopVideo();
753
763
  await this._pageProxySession.sendMayFail("Target.close", {
754
764
  targetId: this._session.sessionId,
755
765
  runBeforeUnload
@@ -763,22 +773,11 @@ class WKPage {
763
773
  return import_hostPlatform.hostPlatform === "mac10.15" ? 55 : 59;
764
774
  return 0;
765
775
  }
766
- async _startVideo(options) {
767
- (0, import_utils.assert)(!this._recordingVideoFile);
768
- const { screencastId } = await this._pageProxySession.send("Screencast.startVideo", {
769
- file: this._browserContext._browser.options.channel === "webkit-wsl" ? await (0, import_webkit.translatePathToWSL)(options.outputFile) : options.outputFile,
770
- width: options.width,
771
- height: options.height,
772
- toolbarHeight: this._toolbarHeight()
773
- });
774
- this._recordingVideoFile = options.outputFile;
775
- this._browserContext._browser._videoStarted(this._browserContext, screencastId, options.outputFile, this._page.waitForInitializedOrError());
776
- }
777
- async _stopVideo() {
778
- if (!this._recordingVideoFile)
779
- return;
780
- await this._pageProxySession.sendMayFail("Screencast.stopVideo");
781
- this._recordingVideoFile = null;
776
+ async _initializeVideoRecording() {
777
+ const screencast = this._page.screencast;
778
+ const videoOptions = screencast.launchVideoRecorder();
779
+ if (videoOptions)
780
+ await screencast.startVideoRecording(videoOptions);
782
781
  }
783
782
  validateScreenshotDimension(side, omitDeviceScaleFactor) {
784
783
  if (process.platform === "darwin")
@@ -846,23 +845,27 @@ class WKPage {
846
845
  throw e;
847
846
  });
848
847
  }
849
- async setScreencastOptions(options) {
850
- if (options) {
851
- const so = { ...options, toolbarHeight: this._toolbarHeight() };
852
- const { generation } = await this._pageProxySession.send("Screencast.startScreencast", so);
853
- this._screencastGeneration = generation;
854
- } else {
855
- await this._pageProxySession.send("Screencast.stopScreencast");
856
- }
848
+ async startScreencast(options) {
849
+ const { generation } = await this._pageProxySession.send("Screencast.startScreencast", {
850
+ quality: options.quality,
851
+ width: options.width,
852
+ height: options.height,
853
+ toolbarHeight: this._toolbarHeight()
854
+ });
855
+ this._screencastGeneration = generation;
856
+ }
857
+ async stopScreencast() {
858
+ await this._pageProxySession.sendMayFail("Screencast.stopScreencast");
857
859
  }
858
860
  _onScreencastFrame(event) {
859
861
  const generation = this._screencastGeneration;
860
- this._page.throttleScreencastFrameAck(() => {
861
- this._pageProxySession.send("Screencast.screencastFrameAck", { generation }).catch((e) => import_debugLogger.debugLogger.log("error", e));
862
+ this._page.screencast.throttleFrameAck(() => {
863
+ this._pageProxySession.sendMayFail("Screencast.screencastFrameAck", { generation });
862
864
  });
863
865
  const buffer = Buffer.from(event.data, "base64");
864
866
  this._page.emit(import_page.Page.Events.ScreencastFrame, {
865
867
  buffer,
868
+ frameSwapWallTime: event.timestamp ? event.timestamp * 1e3 : Date.now(),
866
869
  width: event.deviceWidth,
867
870
  height: event.deviceHeight
868
871
  });
@@ -887,7 +890,7 @@ class WKPage {
887
890
  const pageProxyId = this._pageProxySession.sessionId;
888
891
  const objectId = handle._objectId;
889
892
  if (this._browserContext._browser?.options.channel === "webkit-wsl")
890
- paths = await Promise.all(paths.map((path2) => (0, import_webkit.translatePathToWSL)(path2)));
893
+ paths = await Promise.all(paths.map((path) => (0, import_webkit.translatePathToWSL)(path)));
891
894
  await Promise.all([
892
895
  this._pageProxySession.connection.browserSession.send("Playwright.grantFileReadAccess", { pageProxyId, paths }),
893
896
  this._session.send("DOM.setInputFiles", { objectId, paths })
@@ -902,9 +905,6 @@ class WKPage {
902
905
  throw new Error(dom.kUnableToAdoptErrorMessage);
903
906
  return (0, import_wkExecutionContext.createHandle)(to, result.object);
904
907
  }
905
- async getAccessibilityTree(needle) {
906
- return (0, import_wkAccessibility.getAccessibilityTree)(this._session, needle);
907
- }
908
908
  async inputActionEpilogue() {
909
909
  }
910
910
  async resetForReuse(progress) {
@@ -1089,6 +1089,31 @@ class WKPage {
1089
1089
  return true;
1090
1090
  }
1091
1091
  }
1092
+ class WKFrame {
1093
+ constructor(page, session) {
1094
+ this._sessionListeners = [];
1095
+ this._initializePromise = null;
1096
+ this._page = page;
1097
+ this._session = session;
1098
+ }
1099
+ async initialize() {
1100
+ if (this._initializePromise)
1101
+ return this._initializePromise;
1102
+ this._initializePromise = this._initializeImpl();
1103
+ return this._initializePromise;
1104
+ }
1105
+ async _initializeImpl() {
1106
+ this._sessionListeners = [
1107
+ import_eventsHelper.eventsHelper.addEventListener(this._session, "Console.messageAdded", (event) => this._page._onConsoleMessage(event)),
1108
+ import_eventsHelper.eventsHelper.addEventListener(this._session, "Console.messageRepeatCountUpdated", (event) => this._page._onConsoleRepeatCountUpdated(event))
1109
+ ];
1110
+ await this._session.send("Console.enable");
1111
+ }
1112
+ dispose() {
1113
+ import_eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);
1114
+ this._session.dispose();
1115
+ }
1116
+ }
1092
1117
  function parseRemoteAddress(value) {
1093
1118
  if (!value)
1094
1119
  return;
@@ -47,6 +47,7 @@ class WKWorkers {
47
47
  });
48
48
  this._workerSessions.set(event.workerId, workerSession);
49
49
  worker.createExecutionContext(new import_wkExecutionContext.WKExecutionContext(workerSession, void 0));
50
+ worker.workerScriptLoaded();
50
51
  this._page.addWorker(event.workerId, worker);
51
52
  workerSession.on("Console.messageAdded", (event2) => this._onConsoleMessage(worker, event2));
52
53
  Promise.all([
@@ -95,7 +96,7 @@ class WKWorkers {
95
96
  lineNumber: (lineNumber || 1) - 1,
96
97
  columnNumber: (columnNumber || 1) - 1
97
98
  };
98
- this._page.addConsoleMessage(derivedType, handles, location, handles.length ? void 0 : text);
99
+ this._page.addConsoleMessage(worker, derivedType, handles, location, handles.length ? void 0 : text);
99
100
  }
100
101
  }
101
102
  // Annotate the CommonJS export names for ESM import in node:
@@ -20,11 +20,29 @@ var ariaSnapshot_exports = {};
20
20
  __export(ariaSnapshot_exports, {
21
21
  KeyParser: () => KeyParser,
22
22
  ParserError: () => ParserError,
23
+ ariaNodesEqual: () => ariaNodesEqual,
24
+ findNewNode: () => findNewNode,
25
+ hasPointerCursor: () => hasPointerCursor,
23
26
  parseAriaSnapshot: () => parseAriaSnapshot,
24
27
  parseAriaSnapshotUnsafe: () => parseAriaSnapshotUnsafe,
25
28
  textValue: () => textValue
26
29
  });
27
30
  module.exports = __toCommonJS(ariaSnapshot_exports);
31
+ function ariaNodesEqual(a, b) {
32
+ if (a.role !== b.role || a.name !== b.name)
33
+ return false;
34
+ if (!ariaPropsEqual(a, b) || hasPointerCursor(a) !== hasPointerCursor(b))
35
+ return false;
36
+ const aKeys = Object.keys(a.props);
37
+ const bKeys = Object.keys(b.props);
38
+ return aKeys.length === bKeys.length && aKeys.every((k) => a.props[k] === b.props[k]);
39
+ }
40
+ function hasPointerCursor(ariaNode) {
41
+ return ariaNode.box.cursor === "pointer";
42
+ }
43
+ function ariaPropsEqual(a, b) {
44
+ return a.active === b.active && a.checked === b.checked && a.disabled === b.disabled && a.expanded === b.expanded && a.selected === b.selected && a.level === b.level && a.pressed === b.pressed;
45
+ }
28
46
  function parseAriaSnapshotUnsafe(yaml, text, options = {}) {
29
47
  const result = parseAriaSnapshot(yaml, text, options);
30
48
  if (result.errors.length)
@@ -382,10 +400,55 @@ class ParserError extends Error {
382
400
  this.pos = pos;
383
401
  }
384
402
  }
403
+ function findNewNode(from, to) {
404
+ function fillMap(root, map, position) {
405
+ let size = 1;
406
+ let childPosition = position + size;
407
+ for (const child of root.children || []) {
408
+ if (typeof child === "string") {
409
+ size++;
410
+ childPosition++;
411
+ } else {
412
+ size += fillMap(child, map, childPosition);
413
+ childPosition += size;
414
+ }
415
+ }
416
+ if (!["none", "presentation", "fragment", "iframe", "generic"].includes(root.role) && root.name) {
417
+ let byRole = map.get(root.role);
418
+ if (!byRole) {
419
+ byRole = /* @__PURE__ */ new Map();
420
+ map.set(root.role, byRole);
421
+ }
422
+ const existing = byRole.get(root.name);
423
+ const sizeAndPosition = size * 100 - position;
424
+ if (!existing || existing.sizeAndPosition < sizeAndPosition)
425
+ byRole.set(root.name, { node: root, sizeAndPosition });
426
+ }
427
+ return size;
428
+ }
429
+ const fromMap = /* @__PURE__ */ new Map();
430
+ if (from)
431
+ fillMap(from, fromMap, 0);
432
+ const toMap = /* @__PURE__ */ new Map();
433
+ fillMap(to, toMap, 0);
434
+ const result = [];
435
+ for (const [role, byRole] of toMap) {
436
+ for (const [name, byName] of byRole) {
437
+ const inFrom = fromMap.get(role)?.get(name);
438
+ if (!inFrom)
439
+ result.push(byName);
440
+ }
441
+ }
442
+ result.sort((a, b) => b.sizeAndPosition - a.sizeAndPosition);
443
+ return result[0]?.node;
444
+ }
385
445
  // Annotate the CommonJS export names for ESM import in node:
386
446
  0 && (module.exports = {
387
447
  KeyParser,
388
448
  ParserError,
449
+ ariaNodesEqual,
450
+ findNewNode,
451
+ hasPointerCursor,
389
452
  parseAriaSnapshot,
390
453
  parseAriaSnapshotUnsafe,
391
454
  textValue
@@ -25,7 +25,8 @@ __export(locatorGenerators_exports, {
25
25
  PythonLocatorFactory: () => PythonLocatorFactory,
26
26
  asLocator: () => asLocator,
27
27
  asLocatorDescription: () => asLocatorDescription,
28
- asLocators: () => asLocators
28
+ asLocators: () => asLocators,
29
+ locatorCustomDescription: () => locatorCustomDescription
29
30
  });
30
31
  module.exports = __toCommonJS(locatorGenerators_exports);
31
32
  var import_selectorParser = require("./selectorParser");
@@ -33,17 +34,31 @@ var import_stringUtils = require("./stringUtils");
33
34
  function asLocatorDescription(lang, selector) {
34
35
  try {
35
36
  const parsed = (0, import_selectorParser.parseSelector)(selector);
36
- const lastPart = parsed.parts[parsed.parts.length - 1];
37
- if (lastPart?.name === "internal:describe") {
38
- const description = JSON.parse(lastPart.body);
39
- if (typeof description === "string")
40
- return description;
41
- }
37
+ const customDescription = parseCustomDescription(parsed);
38
+ if (customDescription)
39
+ return customDescription;
42
40
  return innerAsLocators(new generators[lang](), parsed, false, 1)[0];
43
41
  } catch (e) {
44
42
  return selector;
45
43
  }
46
44
  }
45
+ function locatorCustomDescription(selector) {
46
+ try {
47
+ const parsed = (0, import_selectorParser.parseSelector)(selector);
48
+ return parseCustomDescription(parsed);
49
+ } catch (e) {
50
+ return void 0;
51
+ }
52
+ }
53
+ function parseCustomDescription(parsed) {
54
+ const lastPart = parsed.parts[parsed.parts.length - 1];
55
+ if (lastPart?.name === "internal:describe") {
56
+ const description = JSON.parse(lastPart.body);
57
+ if (typeof description === "string")
58
+ return description;
59
+ }
60
+ return void 0;
61
+ }
47
62
  function asLocator(lang, selector, isFrameLocator = false) {
48
63
  return asLocators(lang, selector, isFrameLocator, 1)[0];
49
64
  }
@@ -669,5 +684,6 @@ function isRegExp(obj) {
669
684
  PythonLocatorFactory,
670
685
  asLocator,
671
686
  asLocatorDescription,
672
- asLocators
687
+ asLocators,
688
+ locatorCustomDescription
673
689
  });
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var lruCache_exports = {};
20
+ __export(lruCache_exports, {
21
+ LRUCache: () => LRUCache
22
+ });
23
+ module.exports = __toCommonJS(lruCache_exports);
24
+ class LRUCache {
25
+ constructor(maxSize) {
26
+ this._maxSize = maxSize;
27
+ this._map = /* @__PURE__ */ new Map();
28
+ this._size = 0;
29
+ }
30
+ getOrCompute(key, compute) {
31
+ if (this._map.has(key)) {
32
+ const result2 = this._map.get(key);
33
+ this._map.delete(key);
34
+ this._map.set(key, result2);
35
+ return result2.value;
36
+ }
37
+ const result = compute();
38
+ while (this._map.size && this._size + result.size > this._maxSize) {
39
+ const [firstKey, firstValue] = this._map.entries().next().value;
40
+ this._size -= firstValue.size;
41
+ this._map.delete(firstKey);
42
+ }
43
+ this._map.set(key, result);
44
+ this._size += result.size;
45
+ return result.value;
46
+ }
47
+ }
48
+ // Annotate the CommonJS export names for ESM import in node:
49
+ 0 && (module.exports = {
50
+ LRUCache
51
+ });
@@ -437,7 +437,7 @@ const types = /* @__PURE__ */ new Map([
437
437
  ["jpgm", "video/jpm"],
438
438
  ["mj2", "video/mj2"],
439
439
  ["mjp2", "video/mj2"],
440
- ["ts", "video/mp2t"],
440
+ ["ts", "application/typescript"],
441
441
  ["mp4", "video/mp4"],
442
442
  ["mp4v", "video/mp4"],
443
443
  ["mpg4", "video/mp4"],
@@ -25,6 +25,9 @@ __export(protocolFormatter_exports, {
25
25
  module.exports = __toCommonJS(protocolFormatter_exports);
26
26
  var import_protocolMetainfo = require("./protocolMetainfo");
27
27
  function formatProtocolParam(params, alternatives) {
28
+ return _formatProtocolParam(params, alternatives)?.replaceAll("\n", "\\n");
29
+ }
30
+ function _formatProtocolParam(params, alternatives) {
28
31
  if (!params)
29
32
  return void 0;
30
33
  for (const name of alternatives.split("|")) {
@@ -67,9 +67,11 @@ const methodMetainfo = /* @__PURE__ */ new Map([
67
67
  ["EventTarget.waitForEventInfo", { title: 'Wait for event "{info.event}"', snapshot: true }],
68
68
  ["BrowserContext.waitForEventInfo", { title: 'Wait for event "{info.event}"', snapshot: true }],
69
69
  ["Page.waitForEventInfo", { title: 'Wait for event "{info.event}"', snapshot: true }],
70
+ ["Worker.waitForEventInfo", { title: 'Wait for event "{info.event}"', snapshot: true }],
70
71
  ["WebSocket.waitForEventInfo", { title: 'Wait for event "{info.event}"', snapshot: true }],
71
72
  ["ElectronApplication.waitForEventInfo", { title: 'Wait for event "{info.event}"', snapshot: true }],
72
73
  ["AndroidDevice.waitForEventInfo", { title: 'Wait for event "{info.event}"', snapshot: true }],
74
+ ["PageAgent.waitForEventInfo", { title: 'Wait for event "{info.event}"', snapshot: true }],
73
75
  ["BrowserContext.addCookies", { title: "Add cookies", group: "configuration" }],
74
76
  ["BrowserContext.addInitScript", { title: "Add init script", group: "configuration" }],
75
77
  ["BrowserContext.clearCookies", { title: "Clear cookies", group: "configuration" }],
@@ -91,6 +93,7 @@ const methodMetainfo = /* @__PURE__ */ new Map([
91
93
  ["BrowserContext.pause", { title: "Pause" }],
92
94
  ["BrowserContext.enableRecorder", { internal: true }],
93
95
  ["BrowserContext.disableRecorder", { internal: true }],
96
+ ["BrowserContext.exposeConsoleApi", { internal: true }],
94
97
  ["BrowserContext.newCDPSession", { title: "Create CDP session", group: "configuration" }],
95
98
  ["BrowserContext.harStart", { internal: true }],
96
99
  ["BrowserContext.harExport", { internal: true }],
@@ -132,7 +135,6 @@ const methodMetainfo = /* @__PURE__ */ new Map([
132
135
  ["Page.mouseClick", { title: "Click", slowMo: true, snapshot: true, pausesBeforeAction: true }],
133
136
  ["Page.mouseWheel", { title: "Mouse wheel", slowMo: true, snapshot: true, pausesBeforeAction: true }],
134
137
  ["Page.touchscreenTap", { title: "Tap", slowMo: true, snapshot: true, pausesBeforeAction: true }],
135
- ["Page.accessibilitySnapshot", { title: "Accessibility snapshot", group: "getter" }],
136
138
  ["Page.pageErrors", { title: "Get page errors", group: "getter" }],
137
139
  ["Page.pdf", { title: "PDF" }],
138
140
  ["Page.requests", { title: "Get network requests", group: "getter" }],
@@ -143,6 +145,7 @@ const methodMetainfo = /* @__PURE__ */ new Map([
143
145
  ["Page.stopCSSCoverage", { title: "Stop CSS coverage", group: "configuration" }],
144
146
  ["Page.bringToFront", { title: "Bring to front" }],
145
147
  ["Page.updateSubscription", { internal: true }],
148
+ ["Page.agent", { internal: true }],
146
149
  ["Frame.evalOnSelector", { title: "Evaluate", snapshot: true, pausesBeforeAction: true }],
147
150
  ["Frame.evalOnSelectorAll", { title: "Evaluate", snapshot: true, pausesBeforeAction: true }],
148
151
  ["Frame.addScriptTag", { title: "Add script tag", snapshot: true, pausesBeforeAction: true }],
@@ -192,6 +195,7 @@ const methodMetainfo = /* @__PURE__ */ new Map([
192
195
  ["Frame.expect", { title: 'Expect "{expression}"', snapshot: true, pausesBeforeAction: true }],
193
196
  ["Worker.evaluateExpression", { title: "Evaluate" }],
194
197
  ["Worker.evaluateExpressionHandle", { title: "Evaluate" }],
198
+ ["Worker.updateSubscription", { internal: true }],
195
199
  ["JSHandle.dispose", { internal: true }],
196
200
  ["ElementHandle.dispose", { internal: true }],
197
201
  ["JSHandle.evaluateExpression", { title: "Evaluate", snapshot: true, pausesBeforeAction: true }],
@@ -313,7 +317,12 @@ const methodMetainfo = /* @__PURE__ */ new Map([
313
317
  ["AndroidDevice.connectToWebView", { title: "Connect to Web View" }],
314
318
  ["AndroidDevice.close", { internal: true }],
315
319
  ["JsonPipe.send", { internal: true }],
316
- ["JsonPipe.close", { internal: true }]
320
+ ["JsonPipe.close", { internal: true }],
321
+ ["PageAgent.perform", { title: 'Perform "{task}"' }],
322
+ ["PageAgent.expect", { title: 'Expect "{expectation}"' }],
323
+ ["PageAgent.extract", { title: 'Extract "{query}"' }],
324
+ ["PageAgent.dispose", { internal: true }],
325
+ ["PageAgent.usage", { title: "Get agent usage", group: "configuration" }]
317
326
  ]);
318
327
  // Annotate the CommonJS export names for ESM import in node:
319
328
  0 && (module.exports = {
@@ -18,6 +18,7 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var stringUtils_exports = {};
20
20
  __export(stringUtils_exports, {
21
+ ansiRegex: () => ansiRegex,
21
22
  cacheNormalizedWhitespaces: () => cacheNormalizedWhitespaces,
22
23
  escapeForAttributeSelector: () => escapeForAttributeSelector,
23
24
  escapeForTextSelector: () => escapeForTextSelector,
@@ -26,11 +27,15 @@ __export(stringUtils_exports, {
26
27
  escapeRegExp: () => escapeRegExp,
27
28
  escapeTemplateString: () => escapeTemplateString,
28
29
  escapeWithQuotes: () => escapeWithQuotes,
30
+ formatObject: () => formatObject,
31
+ formatObjectOrVoid: () => formatObjectOrVoid,
29
32
  isString: () => isString,
30
33
  longestCommonSubstring: () => longestCommonSubstring,
31
34
  normalizeEscapedRegexQuotes: () => normalizeEscapedRegexQuotes,
32
35
  normalizeWhiteSpace: () => normalizeWhiteSpace,
36
+ parseRegex: () => parseRegex,
33
37
  quoteCSSAttributeValue: () => quoteCSSAttributeValue,
38
+ stripAnsiEscapes: () => stripAnsiEscapes,
34
39
  toSnakeCase: () => toSnakeCase,
35
40
  toTitleCase: () => toTitleCase,
36
41
  trimString: () => trimString,
@@ -60,6 +65,31 @@ function toTitleCase(name) {
60
65
  function toSnakeCase(name) {
61
66
  return name.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/([A-Z])([A-Z][a-z])/g, "$1_$2").toLowerCase();
62
67
  }
68
+ function formatObject(value, indent = " ", mode = "multiline") {
69
+ if (typeof value === "string")
70
+ return escapeWithQuotes(value, "'");
71
+ if (Array.isArray(value))
72
+ return `[${value.map((o) => formatObject(o)).join(", ")}]`;
73
+ if (typeof value === "object") {
74
+ const keys = Object.keys(value).filter((key) => value[key] !== void 0).sort();
75
+ if (!keys.length)
76
+ return "{}";
77
+ const tokens = [];
78
+ for (const key of keys)
79
+ tokens.push(`${key}: ${formatObject(value[key])}`);
80
+ if (mode === "multiline")
81
+ return `{
82
+ ${tokens.join(`,
83
+ ${indent}`)}
84
+ }`;
85
+ return `{ ${tokens.join(", ")} }`;
86
+ }
87
+ return String(value);
88
+ }
89
+ function formatObjectOrVoid(value, indent = " ") {
90
+ const result = formatObject(value, indent);
91
+ return result === "{}" ? "" : result;
92
+ }
63
93
  function quoteCSSAttributeValue(text) {
64
94
  return `"${text.replace(/["\\]/g, (char) => "\\" + char)}"`;
65
95
  }
@@ -133,8 +163,23 @@ function longestCommonSubstring(s1, s2) {
133
163
  }
134
164
  return s1.slice(endingIndex - maxLen, endingIndex);
135
165
  }
166
+ function parseRegex(regex) {
167
+ if (regex[0] !== "/")
168
+ throw new Error(`Invalid regex, must start with '/': ${regex}`);
169
+ const lastSlash = regex.lastIndexOf("/");
170
+ if (lastSlash <= 0)
171
+ throw new Error(`Invalid regex, must end with '/' followed by optional flags: ${regex}`);
172
+ const source = regex.slice(1, lastSlash);
173
+ const flags = regex.slice(lastSlash + 1);
174
+ return new RegExp(source, flags);
175
+ }
176
+ const ansiRegex = new RegExp("([\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~])))", "g");
177
+ function stripAnsiEscapes(str) {
178
+ return str.replace(ansiRegex, "");
179
+ }
136
180
  // Annotate the CommonJS export names for ESM import in node:
137
181
  0 && (module.exports = {
182
+ ansiRegex,
138
183
  cacheNormalizedWhitespaces,
139
184
  escapeForAttributeSelector,
140
185
  escapeForTextSelector,
@@ -143,11 +188,15 @@ function longestCommonSubstring(s1, s2) {
143
188
  escapeRegExp,
144
189
  escapeTemplateString,
145
190
  escapeWithQuotes,
191
+ formatObject,
192
+ formatObjectOrVoid,
146
193
  isString,
147
194
  longestCommonSubstring,
148
195
  normalizeEscapedRegexQuotes,
149
196
  normalizeWhiteSpace,
197
+ parseRegex,
150
198
  quoteCSSAttributeValue,
199
+ stripAnsiEscapes,
151
200
  toSnakeCase,
152
201
  toTitleCase,
153
202
  trimString,
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var entries_exports = {};
16
+ module.exports = __toCommonJS(entries_exports);