@smoothdeploy/playwright-core 1.57.1 → 1.58.1-beta-1770452953000

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.

Potentially problematic release.


This version of @smoothdeploy/playwright-core might be problematic. Click here for more details.

Files changed (155) hide show
  1. package/ThirdPartyNotices.txt +3223 -308
  2. package/browsers.json +21 -22
  3. package/lib/cli/program.js +4 -5
  4. package/lib/client/api.js +3 -0
  5. package/lib/client/browser.js +3 -5
  6. package/lib/client/browserContext.js +35 -0
  7. package/lib/client/browserType.js +4 -3
  8. package/lib/client/channelOwner.js +4 -3
  9. package/lib/client/clientInstrumentation.js +10 -0
  10. package/lib/client/connection.js +4 -0
  11. package/lib/client/elementHandle.js +3 -0
  12. package/lib/client/events.js +3 -0
  13. package/lib/client/fetch.js +3 -4
  14. package/lib/client/frame.js +1 -0
  15. package/lib/client/page.js +28 -1
  16. package/lib/client/pageAgent.js +64 -0
  17. package/lib/client/platform.js +3 -0
  18. package/lib/generated/injectedScriptSource.js +1 -1
  19. package/lib/generated/pollingRecorderSource.js +1 -1
  20. package/lib/mcpBundle.js +84 -0
  21. package/lib/mcpBundleImpl/index.js +147 -0
  22. package/lib/protocol/serializers.js +5 -0
  23. package/lib/protocol/validator.js +92 -3
  24. package/lib/remote/playwrightServer.js +1 -2
  25. package/lib/server/agent/actionRunner.js +335 -0
  26. package/lib/server/agent/actions.js +128 -0
  27. package/lib/server/agent/codegen.js +111 -0
  28. package/lib/server/agent/context.js +150 -0
  29. package/lib/server/agent/expectTools.js +156 -0
  30. package/lib/server/agent/pageAgent.js +204 -0
  31. package/lib/server/agent/performTools.js +262 -0
  32. package/lib/server/agent/tool.js +109 -0
  33. package/lib/server/artifact.js +1 -1
  34. package/lib/server/bidi/bidiBrowser.js +56 -12
  35. package/lib/server/bidi/bidiChromium.js +6 -11
  36. package/lib/server/bidi/bidiConnection.js +1 -0
  37. package/lib/server/bidi/bidiDeserializer.js +116 -0
  38. package/lib/server/bidi/bidiExecutionContext.js +75 -29
  39. package/lib/server/bidi/bidiFirefox.js +6 -8
  40. package/lib/server/bidi/bidiNetworkManager.js +1 -1
  41. package/lib/server/bidi/bidiPage.js +39 -28
  42. package/lib/server/bidi/third_party/bidiProtocolCore.js +1 -0
  43. package/lib/server/browserContext.js +32 -25
  44. package/lib/server/browserType.js +12 -4
  45. package/lib/server/chromium/chromium.js +14 -21
  46. package/lib/server/chromium/chromiumSwitches.js +2 -2
  47. package/lib/server/chromium/crBrowser.js +22 -12
  48. package/lib/server/chromium/crConnection.js +0 -5
  49. package/lib/server/chromium/crDevTools.js +0 -2
  50. package/lib/server/chromium/crNetworkManager.js +43 -2
  51. package/lib/server/chromium/crPage.js +19 -87
  52. package/lib/server/codegen/javascript.js +6 -29
  53. package/lib/server/deviceDescriptorsSource.json +56 -56
  54. package/lib/server/dispatchers/browserContextDispatcher.js +3 -0
  55. package/lib/server/dispatchers/dispatcher.js +6 -13
  56. package/lib/server/dispatchers/frameDispatcher.js +1 -1
  57. package/lib/server/dispatchers/pageAgentDispatcher.js +96 -0
  58. package/lib/server/dispatchers/pageDispatcher.js +4 -0
  59. package/lib/server/dom.js +12 -3
  60. package/lib/server/electron/electron.js +5 -2
  61. package/lib/server/firefox/ffBrowser.js +10 -20
  62. package/lib/server/firefox/ffConnection.js +0 -5
  63. package/lib/server/firefox/ffNetworkManager.js +2 -2
  64. package/lib/server/firefox/ffPage.js +15 -18
  65. package/lib/server/firefox/firefox.js +6 -8
  66. package/lib/server/frameSelectors.js +9 -3
  67. package/lib/server/frames.js +49 -33
  68. package/lib/server/instrumentation.js +3 -0
  69. package/lib/server/network.js +50 -12
  70. package/lib/server/page.js +33 -89
  71. package/lib/server/progress.js +26 -6
  72. package/lib/server/recorder/recorderApp.js +79 -100
  73. package/lib/server/recorder.js +55 -0
  74. package/lib/server/registry/browserFetcher.js +6 -4
  75. package/lib/server/registry/index.js +172 -149
  76. package/lib/server/registry/oopDownloadBrowserMain.js +3 -0
  77. package/lib/server/screencast.js +190 -0
  78. package/lib/server/screenshotCompositor.js +153 -0
  79. package/lib/server/trace/recorder/snapshotterInjected.js +21 -1
  80. package/lib/server/trace/recorder/tracing.js +21 -21
  81. package/lib/server/trace/viewer/traceParser.js +72 -0
  82. package/lib/server/trace/viewer/traceViewer.js +17 -13
  83. package/lib/server/utils/expectUtils.js +87 -2
  84. package/lib/server/utils/httpServer.js +4 -19
  85. package/lib/server/utils/network.js +37 -28
  86. package/lib/server/utils/nodePlatform.js +6 -0
  87. package/lib/server/videoRecorder.js +124 -0
  88. package/lib/server/webkit/webkit.js +4 -6
  89. package/lib/server/webkit/wkBrowser.js +2 -6
  90. package/lib/server/webkit/wkConnection.js +1 -6
  91. package/lib/server/webkit/wkInterceptableRequest.js +29 -1
  92. package/lib/server/webkit/wkPage.js +75 -46
  93. package/lib/utils/isomorphic/ariaSnapshot.js +60 -2
  94. package/lib/utils/isomorphic/lruCache.js +51 -0
  95. package/lib/utils/isomorphic/protocolMetainfo.js +9 -1
  96. package/lib/utils/isomorphic/stringUtils.js +49 -0
  97. package/lib/utils/isomorphic/trace/entries.js +16 -0
  98. package/lib/utils/isomorphic/trace/snapshotRenderer.js +499 -0
  99. package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
  100. package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
  101. package/lib/utils/isomorphic/trace/traceLoader.js +131 -0
  102. package/lib/utils/isomorphic/trace/traceModel.js +365 -0
  103. package/lib/utils/isomorphic/trace/traceModernizer.js +400 -0
  104. package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
  105. package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
  106. package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
  107. package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
  108. package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
  109. package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
  110. package/lib/utils/isomorphic/yaml.js +84 -0
  111. package/lib/utils.js +2 -0
  112. package/lib/utilsBundle.js +2 -5
  113. package/lib/utilsBundleImpl/index.js +165 -165
  114. package/lib/vite/htmlReport/index.html +21 -21
  115. package/lib/vite/recorder/assets/{codeMirrorModule-C3UTv-Ge.css → codeMirrorModule-DYBRYzYX.css} +1 -1
  116. package/lib/vite/recorder/assets/codeMirrorModule-DadYNm1I.js +32 -0
  117. package/lib/vite/recorder/assets/{index-Ri0uHF7I.css → index-BSjZa4pk.css} +1 -1
  118. package/lib/vite/recorder/assets/index-BhTWtUlo.js +193 -0
  119. package/lib/vite/recorder/index.html +2 -2
  120. package/lib/vite/traceViewer/assets/codeMirrorModule-8UJPCtp4.js +16884 -0
  121. package/lib/vite/{recorder/assets/codeMirrorModule-BoWUGj0J.js → traceViewer/assets/codeMirrorModule-BNr6yhVP.js} +1 -1
  122. package/lib/vite/traceViewer/assets/codeMirrorModule-Dimjuz94.js +32 -0
  123. package/lib/vite/traceViewer/assets/codeMirrorModule-DkmsYcws.js +32 -0
  124. package/lib/vite/traceViewer/assets/codeMirrorModule-DySgctgr.js +16884 -0
  125. package/lib/vite/traceViewer/assets/defaultSettingsView-B1vuWQsF.js +266 -0
  126. package/lib/vite/traceViewer/assets/defaultSettingsView-CtEsdeVH.js +266 -0
  127. package/lib/vite/traceViewer/assets/defaultSettingsView-D4fm31R-.js +34087 -0
  128. package/lib/vite/traceViewer/assets/defaultSettingsView-JtyB0yzL.js +34087 -0
  129. package/lib/vite/traceViewer/assets/defaultSettingsView-tEZf-LNj.js +266 -0
  130. package/lib/vite/traceViewer/assets/xtermModule-DDw6eROI.js +6168 -0
  131. package/lib/vite/traceViewer/codeMirrorModule.DYBRYzYX.css +1 -0
  132. package/lib/vite/traceViewer/codeMirrorModule.DuST8d_k.css +344 -0
  133. package/lib/vite/traceViewer/defaultSettingsView.5FCqBwKs.css +3986 -0
  134. package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +1 -0
  135. package/lib/vite/traceViewer/index.BQs8gGhY.js +249 -0
  136. package/lib/vite/traceViewer/index.BVu7tZDe.css +1 -0
  137. package/lib/vite/traceViewer/index.BoLn624r.js +2 -0
  138. package/lib/vite/traceViewer/index.Bq_EaK8x.js +249 -0
  139. package/lib/vite/traceViewer/index.C8YVh4B5.js +2 -0
  140. package/lib/vite/traceViewer/index.Cr7-GRf8.js +2 -0
  141. package/lib/vite/traceViewer/index.G-7UhDxt.css +164 -0
  142. package/lib/vite/traceViewer/index.html +4 -4
  143. package/lib/vite/traceViewer/sw.bundle.js +5 -3
  144. package/lib/vite/traceViewer/uiMode.-Kflt2XM.css +1440 -0
  145. package/lib/vite/traceViewer/uiMode.BTRKnokb.js +5 -0
  146. package/lib/vite/traceViewer/uiMode.CEZ5RVHh.js +5 -0
  147. package/lib/vite/traceViewer/uiMode.CIWF23si.js +1829 -0
  148. package/lib/vite/traceViewer/uiMode.Wi-DvIEY.js +1829 -0
  149. package/lib/vite/traceViewer/uiMode.html +3 -3
  150. package/lib/vite/traceViewer/uiMode.zEH1ejvz.js +5 -0
  151. package/lib/vite/traceViewer/xtermModule.BKlWQB97.css +218 -0
  152. package/package.json +3 -1
  153. package/types/protocol.d.ts +738 -159
  154. package/types/types.d.ts +25 -38
  155. package/lib/vite/recorder/assets/index-DJqDAOZp.js +0 -193
@@ -22,6 +22,7 @@ __export(network_exports, {
22
22
  Response: () => Response,
23
23
  Route: () => Route,
24
24
  WebSocket: () => WebSocket,
25
+ applyHeadersOverrides: () => applyHeadersOverrides,
25
26
  filterCookies: () => filterCookies,
26
27
  isLocalHostname: () => isLocalHostname,
27
28
  kMaxCookieExpiresDateInSeconds: () => kMaxCookieExpiresDateInSeconds,
@@ -61,6 +62,48 @@ function filterCookies(cookies, urls) {
61
62
  function isLocalHostname(hostname) {
62
63
  return hostname === "localhost" || hostname.endsWith(".localhost");
63
64
  }
65
+ const FORBIDDEN_HEADER_NAMES = /* @__PURE__ */ new Set([
66
+ "accept-charset",
67
+ "accept-encoding",
68
+ "access-control-request-headers",
69
+ "access-control-request-method",
70
+ "connection",
71
+ "content-length",
72
+ "cookie",
73
+ "date",
74
+ "dnt",
75
+ "expect",
76
+ "host",
77
+ "keep-alive",
78
+ "origin",
79
+ "referer",
80
+ "set-cookie",
81
+ "te",
82
+ "trailer",
83
+ "transfer-encoding",
84
+ "upgrade",
85
+ "via"
86
+ ]);
87
+ const FORBIDDEN_METHODS = /* @__PURE__ */ new Set(["CONNECT", "TRACE", "TRACK"]);
88
+ function isForbiddenHeader(name, value) {
89
+ const lowerName = name.toLowerCase();
90
+ if (FORBIDDEN_HEADER_NAMES.has(lowerName))
91
+ return true;
92
+ if (lowerName.startsWith("proxy-"))
93
+ return true;
94
+ if (lowerName.startsWith("sec-"))
95
+ return true;
96
+ if (lowerName === "x-http-method" || lowerName === "x-http-method-override" || lowerName === "x-method-override") {
97
+ if (value && FORBIDDEN_METHODS.has(value.toUpperCase()))
98
+ return true;
99
+ }
100
+ return false;
101
+ }
102
+ function applyHeadersOverrides(original, overrides) {
103
+ const forbiddenHeaders = original.filter((header) => isForbiddenHeader(header.name, header.value));
104
+ const allowedHeaders = overrides.filter((header) => !isForbiddenHeader(header.name, header.value));
105
+ return mergeHeaders([allowedHeaders, forbiddenHeaders]);
106
+ }
64
107
  const kMaxCookieExpiresDateInSeconds = 253402300799;
65
108
  function rewriteCookies(cookies) {
66
109
  return cookies.map((c) => {
@@ -99,7 +142,6 @@ class Request extends import_instrumentation.SdkObject {
99
142
  this._response = null;
100
143
  this._redirectedTo = null;
101
144
  this._failureText = null;
102
- this._headersMap = /* @__PURE__ */ new Map();
103
145
  this._frame = null;
104
146
  this._serviceWorker = null;
105
147
  this._rawRequestHeadersPromise = new import_manualPromise.ManualPromise();
@@ -118,7 +160,6 @@ class Request extends import_instrumentation.SdkObject {
118
160
  this._method = method;
119
161
  this._postData = postData;
120
162
  this._headers = headers;
121
- this._updateHeadersMap();
122
163
  this._isFavicon = url.endsWith("/favicon.ico") || !!redirectedFrom?._isFavicon;
123
164
  }
124
165
  static {
@@ -132,13 +173,8 @@ class Request extends import_instrumentation.SdkObject {
132
173
  }
133
174
  _applyOverrides(overrides) {
134
175
  this._overrides = { ...this._overrides, ...overrides };
135
- this._updateHeadersMap();
136
176
  return this._overrides;
137
177
  }
138
- _updateHeadersMap() {
139
- for (const { name, value } of this.headers())
140
- this._headersMap.set(name.toLowerCase(), value);
141
- }
142
178
  overrides() {
143
179
  return this._overrides;
144
180
  }
@@ -158,7 +194,8 @@ class Request extends import_instrumentation.SdkObject {
158
194
  return this._overrides?.headers || this._headers;
159
195
  }
160
196
  headerValue(name) {
161
- return this._headersMap.get(name);
197
+ const lowerCaseName = name.toLowerCase();
198
+ return this.headers().find((h) => h.name.toLowerCase() === lowerCaseName)?.value;
162
199
  }
163
200
  // "null" means no raw headers available - we'll use provisional headers as raw headers.
164
201
  setRawRequestHeaders(headers) {
@@ -309,10 +346,7 @@ class Route extends import_instrumentation.SdkObject {
309
346
  throw new Error("New URL must have same protocol as overridden URL");
310
347
  }
311
348
  if (overrides.headers) {
312
- overrides.headers = overrides.headers?.filter((header) => {
313
- const headerName = header.name.toLowerCase();
314
- return headerName !== "cookie" && headerName !== "host";
315
- });
349
+ overrides.headers = applyHeadersOverrides(this._request._headers, overrides.headers);
316
350
  }
317
351
  overrides = this._request._applyOverrides(overrides);
318
352
  const nextHandler = this._futureHandlers.shift();
@@ -436,6 +470,9 @@ class Response extends import_instrumentation.SdkObject {
436
470
  request() {
437
471
  return this._request;
438
472
  }
473
+ finished() {
474
+ return this._finishedPromise;
475
+ }
439
476
  frame() {
440
477
  return this._request.frame();
441
478
  }
@@ -617,6 +654,7 @@ function mergeHeaders(headers) {
617
654
  Response,
618
655
  Route,
619
656
  WebSocket,
657
+ applyHeadersOverrides,
620
658
  filterCookies,
621
659
  isLocalHostname,
622
660
  kMaxCookieExpiresDateInSeconds,
@@ -31,7 +31,8 @@ __export(page_exports, {
31
31
  InitScript: () => InitScript,
32
32
  Page: () => Page,
33
33
  PageBinding: () => PageBinding,
34
- Worker: () => Worker
34
+ Worker: () => Worker,
35
+ WorkerEvent: () => WorkerEvent
35
36
  });
36
37
  module.exports = __toCommonJS(page_exports);
37
38
  var import_browserContext = require("./browserContext");
@@ -53,6 +54,22 @@ var import_manualPromise = require("../utils/isomorphic/manualPromise");
53
54
  var import_utilityScriptSerializers = require("../utils/isomorphic/utilityScriptSerializers");
54
55
  var import_callLog = require("./callLog");
55
56
  var rawBindingsControllerSource = __toESM(require("../generated/bindingsControllerSource"));
57
+ var import_screencast = require("./screencast");
58
+ const PageEvent = {
59
+ Close: "close",
60
+ Crash: "crash",
61
+ Download: "download",
62
+ EmulatedSizeChanged: "emulatedsizechanged",
63
+ FileChooser: "filechooser",
64
+ FrameAttached: "frameattached",
65
+ FrameDetached: "framedetached",
66
+ InternalFrameNavigatedToNewDocument: "internalframenavigatedtonewdocument",
67
+ LocatorHandlerTriggered: "locatorhandlertriggered",
68
+ ScreencastFrame: "screencastframe",
69
+ Video: "video",
70
+ WebSocket: "websocket",
71
+ Worker: "worker"
72
+ };
56
73
  class Page extends import_instrumentation.SdkObject {
57
74
  constructor(delegate, browserContext) {
58
75
  super(browserContext, "page");
@@ -74,9 +91,6 @@ class Page extends import_instrumentation.SdkObject {
74
91
  this._lastLocatorHandlerUid = 0;
75
92
  this._locatorHandlerRunningCounter = 0;
76
93
  this._networkRequests = [];
77
- // Aiming at 25 fps by default - each frame is 40ms, but we give some slack with 35ms.
78
- // When throttling for tracing, 200ms between frames, except for 10 frames around the action.
79
- this._frameThrottler = new FrameThrottler(10, 35, 200);
80
94
  this.attribution.page = this;
81
95
  this.delegate = delegate;
82
96
  this.browserContext = browserContext;
@@ -85,27 +99,14 @@ class Page extends import_instrumentation.SdkObject {
85
99
  this.touchscreen = new input.Touchscreen(delegate.rawTouchscreen, this);
86
100
  this.screenshotter = new import_screenshotter.Screenshotter(this);
87
101
  this.frameManager = new frames.FrameManager(this);
102
+ this.screencast = new import_screencast.Screencast(this);
88
103
  if (delegate.pdf)
89
104
  this.pdf = delegate.pdf.bind(delegate);
90
105
  this.coverage = delegate.coverage ? delegate.coverage() : null;
91
106
  this.isStorageStatePage = browserContext.isCreatingStorageStatePage();
92
107
  }
93
108
  static {
94
- this.Events = {
95
- Close: "close",
96
- Crash: "crash",
97
- Download: "download",
98
- EmulatedSizeChanged: "emulatedsizechanged",
99
- FileChooser: "filechooser",
100
- FrameAttached: "frameattached",
101
- FrameDetached: "framedetached",
102
- InternalFrameNavigatedToNewDocument: "internalframenavigatedtonewdocument",
103
- LocatorHandlerTriggered: "locatorhandlertriggered",
104
- ScreencastFrame: "screencastframe",
105
- Video: "video",
106
- WebSocket: "websocket",
107
- Worker: "worker"
108
- };
109
+ this.Events = PageEvent;
109
110
  }
110
111
  async reportAsNew(opener, error) {
111
112
  if (opener) {
@@ -158,17 +159,17 @@ class Page extends import_instrumentation.SdkObject {
158
159
  }
159
160
  _didClose() {
160
161
  this.frameManager.dispose();
161
- this._frameThrottler.dispose();
162
+ this.screencast.stopFrameThrottler();
162
163
  (0, import_utils.assert)(this._closedState !== "closed", "Page closed twice");
163
164
  this._closedState = "closed";
164
165
  this.emit(Page.Events.Close);
165
166
  this._closedPromise.resolve();
166
167
  this.instrumentation.onPageClose(this);
167
- this.openScope.close(new import_errors.TargetClosedError());
168
+ this.openScope.close(new import_errors.TargetClosedError(this.closeReason()));
168
169
  }
169
170
  _didCrash() {
170
171
  this.frameManager.dispose();
171
- this._frameThrottler.dispose();
172
+ this.screencast.stopFrameThrottler();
172
173
  this.emit(Page.Events.Crash);
173
174
  this._crashed = true;
174
175
  this.instrumentation.onPageClose(this);
@@ -578,7 +579,7 @@ class Page extends import_instrumentation.SdkObject {
578
579
  if (this._closedState === "closed")
579
580
  return;
580
581
  if (options.reason)
581
- this.closeReason = options.reason;
582
+ this._closeReason = options.reason;
582
583
  const runBeforeUnload = !!options.runBeforeUnload;
583
584
  if (this._closedState !== "closing") {
584
585
  if (!runBeforeUnload)
@@ -641,16 +642,6 @@ class Page extends import_instrumentation.SdkObject {
641
642
  getBinding(name) {
642
643
  return this._pageBindings.get(name) || this.browserContext._pageBindings.get(name);
643
644
  }
644
- setScreencastOptions(options) {
645
- this.delegate.setScreencastOptions(options).catch((e) => import_debugLogger.debugLogger.log("error", e));
646
- this._frameThrottler.setThrottlingEnabled(!!options);
647
- }
648
- throttleScreencastFrameAck(ack) {
649
- this._frameThrottler.ack(ack);
650
- }
651
- temporarilyDisableTracingScreencastThrottling() {
652
- this._frameThrottler.recharge();
653
- }
654
645
  async safeNonStallingEvaluateInAllFrames(expression, world, options = {}) {
655
646
  await Promise.all(this.frames().map(async (frame) => {
656
647
  try {
@@ -665,11 +656,14 @@ class Page extends import_instrumentation.SdkObject {
665
656
  await Promise.all(this.frames().map((frame) => frame.hideHighlight().catch(() => {
666
657
  })));
667
658
  }
668
- async snapshotForAI(progress, options) {
659
+ async snapshotForAI(progress, options = {}) {
669
660
  const snapshot = await snapshotFrameForAI(progress, this.mainFrame(), options);
670
661
  return { full: snapshot.full.join("\n"), incremental: snapshot.incremental?.join("\n") };
671
662
  }
672
663
  }
664
+ const WorkerEvent = {
665
+ Close: "close"
666
+ };
673
667
  class Worker extends import_instrumentation.SdkObject {
674
668
  constructor(parent, url) {
675
669
  super(parent, "worker");
@@ -680,9 +674,7 @@ class Worker extends import_instrumentation.SdkObject {
680
674
  this.url = url;
681
675
  }
682
676
  static {
683
- this.Events = {
684
- Close: "close"
685
- };
677
+ this.Events = WorkerEvent;
686
678
  }
687
679
  createExecutionContext(delegate) {
688
680
  this.existingExecutionContext = new js.ExecutionContext(this, delegate, "worker");
@@ -763,56 +755,7 @@ class InitScript {
763
755
  })();`;
764
756
  }
765
757
  }
766
- class FrameThrottler {
767
- constructor(nonThrottledFrames, defaultInterval, throttlingInterval) {
768
- this._acks = [];
769
- this._throttlingEnabled = false;
770
- this._nonThrottledFrames = nonThrottledFrames;
771
- this._budget = nonThrottledFrames;
772
- this._defaultInterval = defaultInterval;
773
- this._throttlingInterval = throttlingInterval;
774
- this._tick();
775
- }
776
- dispose() {
777
- if (this._timeoutId) {
778
- clearTimeout(this._timeoutId);
779
- this._timeoutId = void 0;
780
- }
781
- }
782
- setThrottlingEnabled(enabled) {
783
- this._throttlingEnabled = enabled;
784
- }
785
- recharge() {
786
- for (const ack of this._acks)
787
- ack();
788
- this._acks = [];
789
- this._budget = this._nonThrottledFrames;
790
- if (this._timeoutId) {
791
- clearTimeout(this._timeoutId);
792
- this._tick();
793
- }
794
- }
795
- ack(ack) {
796
- if (!this._timeoutId) {
797
- ack();
798
- return;
799
- }
800
- this._acks.push(ack);
801
- }
802
- _tick() {
803
- const ack = this._acks.shift();
804
- if (ack) {
805
- --this._budget;
806
- ack();
807
- }
808
- if (this._throttlingEnabled && this._budget <= 0) {
809
- this._timeoutId = setTimeout(() => this._tick(), this._throttlingInterval);
810
- } else {
811
- this._timeoutId = setTimeout(() => this._tick(), this._defaultInterval);
812
- }
813
- }
814
- }
815
- async function snapshotFrameForAI(progress, frame, options) {
758
+ async function snapshotFrameForAI(progress, frame, options = {}) {
816
759
  const snapshot = await frame.retryWithProgressAndTimeouts(progress, [1e3, 2e3, 4e3, 8e3], async (continuePolling) => {
817
760
  try {
818
761
  const context = await progress.race(frame._utilityContext());
@@ -822,7 +765,7 @@ async function snapshotFrameForAI(progress, frame, options) {
822
765
  if (!node)
823
766
  return true;
824
767
  return injected.incrementalAriaSnapshot(node, { mode: "ai", ...options2 });
825
- }, { refPrefix: frame.seq ? "f" + frame.seq : "", track: options.track }));
768
+ }, { refPrefix: frame.seq ? "f" + frame.seq : "", track: options.track, doNotRenderActive: options.doNotRenderActive }));
826
769
  if (snapshotOrRetry === true)
827
770
  return continuePolling;
828
771
  return snapshotOrRetry;
@@ -882,5 +825,6 @@ function ensureArrayLimit(array, limit) {
882
825
  InitScript,
883
826
  Page,
884
827
  PageBinding,
885
- Worker
828
+ Worker,
829
+ WorkerEvent
886
830
  });
@@ -34,19 +34,35 @@ class ProgressController {
34
34
  this.metadata = metadata || { id: "", startTime: 0, endTime: 0, type: "Internal", method: "", params: {}, log: [], internal: true };
35
35
  this._onCallLog = onCallLog;
36
36
  this._forceAbortPromise.catch((e) => null);
37
+ this._controller = new AbortController();
38
+ }
39
+ static createForSdkObject(sdkObject, callMetadata) {
40
+ const logName = sdkObject.logName || "api";
41
+ return new ProgressController(callMetadata, (message) => {
42
+ import_utils.debugLogger.log(logName, message);
43
+ sdkObject.instrumentation.onCallLog(sdkObject, callMetadata, logName, message);
44
+ });
37
45
  }
38
46
  async abort(error) {
39
47
  if (this._state === "running") {
40
48
  error[kAbortErrorSymbol] = true;
41
49
  this._state = { error };
42
50
  this._forceAbortPromise.reject(error);
51
+ this._controller.abort(error);
43
52
  }
44
53
  await this._donePromise;
45
54
  }
46
55
  async run(task, timeout) {
56
+ const deadline = timeout ? (0, import_utils.monotonicTime)() + timeout : 0;
47
57
  (0, import_utils.assert)(this._state === "before");
48
58
  this._state = "running";
59
+ let timer;
49
60
  const progress = {
61
+ timeout: timeout ?? 0,
62
+ deadline,
63
+ disableTimeout: () => {
64
+ clearTimeout(timer);
65
+ },
50
66
  log: (message) => {
51
67
  if (this._state === "running")
52
68
  this.metadata.log.push(message);
@@ -55,24 +71,28 @@ class ProgressController {
55
71
  metadata: this.metadata,
56
72
  race: (promise) => {
57
73
  const promises = Array.isArray(promise) ? promise : [promise];
74
+ if (!promises.length)
75
+ return Promise.resolve();
58
76
  return Promise.race([...promises, this._forceAbortPromise]);
59
77
  },
60
78
  wait: async (timeout2) => {
61
79
  let timer2;
62
80
  const promise = new Promise((f) => timer2 = setTimeout(f, timeout2));
63
81
  return progress.race(promise).finally(() => clearTimeout(timer2));
64
- }
82
+ },
83
+ signal: this._controller.signal
65
84
  };
66
- let timer;
67
- if (timeout) {
85
+ if (deadline) {
68
86
  const timeoutError = new import_errors.TimeoutError(`Timeout ${timeout}ms exceeded.`);
69
87
  timer = setTimeout(() => {
88
+ if (this.metadata.pauseStartTime && !this.metadata.pauseEndTime)
89
+ return;
70
90
  if (this._state === "running") {
71
- timeoutError[kAbortErrorSymbol] = true;
72
91
  this._state = { error: timeoutError };
73
92
  this._forceAbortPromise.reject(timeoutError);
93
+ this._controller.abort(timeoutError);
74
94
  }
75
- }, timeout);
95
+ }, deadline - (0, import_utils.monotonicTime)());
76
96
  }
77
97
  try {
78
98
  const result = await task(progress);
@@ -89,7 +109,7 @@ class ProgressController {
89
109
  }
90
110
  const kAbortErrorSymbol = Symbol("kAbortError");
91
111
  function isAbortError(error) {
92
- return !!error[kAbortErrorSymbol];
112
+ return error instanceof import_errors.TimeoutError || !!error[kAbortErrorSymbol];
93
113
  }
94
114
  async function raceUncancellableOperationWithCleanup(progress, run, cleanup) {
95
115
  let aborted = false;
@@ -53,6 +53,7 @@ class RecorderApp {
53
53
  this._recorderSources = [];
54
54
  this._page = page;
55
55
  this._recorder = recorder;
56
+ this._frontend = createRecorderFrontend(page);
56
57
  this.wsEndpointForTest = wsEndpointForTest;
57
58
  this._languageGeneratorOptions = {
58
59
  browserName: params.browserName,
@@ -64,6 +65,10 @@ class RecorderApp {
64
65
  this._throttledOutputFile = params.outputFile ? new import_throttledFile.ThrottledFile(params.outputFile) : null;
65
66
  this._primaryGeneratorId = process.env.TEST_INSPECTOR_LANGUAGE || params.language || determinePrimaryGeneratorId(params.sdkLanguage);
66
67
  this._selectedGeneratorId = this._primaryGeneratorId;
68
+ for (const languageGenerator of (0, import_languages.languageSet)()) {
69
+ if (languageGenerator.id === this._primaryGeneratorId)
70
+ this._recorder.setLanguage(languageGenerator.highlighter);
71
+ }
67
72
  }
68
73
  async _init(inspectedContext) {
69
74
  await (0, import_launchApp.syncLocalStorageWithSettings)(this._page, "recorder");
@@ -89,7 +94,7 @@ class RecorderApp {
89
94
  });
90
95
  });
91
96
  });
92
- await this._page.exposeBinding(progress, "dispatch", false, (_, data) => this._handleUIEvent(data));
97
+ await this._createDispatcher(progress);
93
98
  this._page.once("close", () => {
94
99
  this._recorder.close();
95
100
  this._page.browserContext.close({ reason: "Recorder window closed" }).catch(() => {
@@ -100,59 +105,56 @@ class RecorderApp {
100
105
  });
101
106
  const url = this._recorder.url();
102
107
  if (url)
103
- this._onPageNavigated(url);
104
- this._onModeChanged(this._recorder.mode());
105
- this._onPausedStateChanged(this._recorder.paused());
108
+ this._frontend.pageNavigated({ url });
109
+ this._frontend.modeChanged({ mode: this._recorder.mode() });
110
+ this._frontend.pauseStateChanged({ paused: this._recorder.paused() });
106
111
  this._updateActions("reveal");
107
112
  this._onUserSourcesChanged(this._recorder.userSources(), this._recorder.pausedSourceId());
108
- this._onCallLogsUpdated(this._recorder.callLog());
113
+ this._frontend.callLogsUpdated({ callLogs: this._recorder.callLog() });
109
114
  this._wireListeners(this._recorder);
110
115
  }
111
- _handleUIEvent(data) {
112
- if (data.event === "clear") {
113
- this._actions = [];
114
- this._updateActions("reveal");
115
- this._recorder.clear();
116
- return;
117
- }
118
- if (data.event === "fileChanged") {
119
- const source = [...this._recorderSources, ...this._userSources].find((s) => s.id === data.params.fileId);
120
- if (source) {
121
- if (source.isRecorded)
122
- this._selectedGeneratorId = source.id;
123
- this._recorder.setLanguage(source.language);
116
+ async _createDispatcher(progress) {
117
+ const dispatcher = {
118
+ clear: async () => {
119
+ this._actions = [];
120
+ this._updateActions("reveal");
121
+ this._recorder.clear();
122
+ },
123
+ fileChanged: async (params) => {
124
+ const source = [...this._recorderSources, ...this._userSources].find((s) => s.id === params.fileId);
125
+ if (source) {
126
+ if (source.isRecorded)
127
+ this._selectedGeneratorId = source.id;
128
+ this._recorder.setLanguage(source.language);
129
+ }
130
+ },
131
+ setAutoExpect: async (params) => {
132
+ this._languageGeneratorOptions.generateAutoExpect = params.autoExpect;
133
+ this._updateActions();
134
+ },
135
+ setMode: async (params) => {
136
+ this._recorder.setMode(params.mode);
137
+ },
138
+ resume: async () => {
139
+ this._recorder.resume();
140
+ },
141
+ pause: async () => {
142
+ this._recorder.pause();
143
+ },
144
+ step: async () => {
145
+ this._recorder.step();
146
+ },
147
+ highlightRequested: async (params) => {
148
+ if (params.selector)
149
+ this._recorder.setHighlightedSelector(params.selector);
150
+ if (params.ariaTemplate)
151
+ this._recorder.setHighlightedAriaTemplate(params.ariaTemplate);
124
152
  }
125
- return;
126
- }
127
- if (data.event === "setAutoExpect") {
128
- this._languageGeneratorOptions.generateAutoExpect = data.params.autoExpect;
129
- this._updateActions();
130
- return;
131
- }
132
- if (data.event === "setMode") {
133
- this._recorder.setMode(data.params.mode);
134
- return;
135
- }
136
- if (data.event === "resume") {
137
- this._recorder.resume();
138
- return;
139
- }
140
- if (data.event === "pause") {
141
- this._recorder.pause();
142
- return;
143
- }
144
- if (data.event === "step") {
145
- this._recorder.step();
146
- return;
147
- }
148
- if (data.event === "highlightRequested") {
149
- if (data.params.selector)
150
- this._recorder.setHighlightedSelector(data.params.selector);
151
- if (data.params.ariaTemplate)
152
- this._recorder.setHighlightedAriaTemplate(data.params.ariaTemplate);
153
- return;
154
- }
155
- throw new Error(`Unknown event: ${data.event}`);
153
+ };
154
+ await this._page.exposeBinding(progress, "sendCommand", false, async (_, data) => {
155
+ const { method, params } = data;
156
+ return await dispatcher[method].call(dispatcher, params);
157
+ });
156
158
  }
157
159
  static async show(context, params) {
158
160
  if (process.env.PW_CODEGEN_NO_INSPECTOR)
@@ -220,25 +222,29 @@ class RecorderApp {
220
222
  this._onSignalAdded(signal);
221
223
  });
222
224
  recorder.on(import_recorder.RecorderEvent.PageNavigated, (url) => {
223
- this._onPageNavigated(url);
225
+ this._frontend.pageNavigated({ url });
224
226
  });
225
227
  recorder.on(import_recorder.RecorderEvent.ContextClosed, () => {
226
- this._onContextClosed();
228
+ this._throttledOutputFile?.flush();
229
+ this._page.browserContext.close({ reason: "Recorder window closed" }).catch(() => {
230
+ });
227
231
  });
228
232
  recorder.on(import_recorder.RecorderEvent.ModeChanged, (mode) => {
229
- this._onModeChanged(mode);
233
+ this._frontend.modeChanged({ mode });
230
234
  });
231
235
  recorder.on(import_recorder.RecorderEvent.PausedStateChanged, (paused) => {
232
- this._onPausedStateChanged(paused);
236
+ this._frontend.pauseStateChanged({ paused });
233
237
  });
234
238
  recorder.on(import_recorder.RecorderEvent.UserSourcesChanged, (sources, pausedSourceId) => {
235
239
  this._onUserSourcesChanged(sources, pausedSourceId);
236
240
  });
237
241
  recorder.on(import_recorder.RecorderEvent.ElementPicked, (elementInfo, userGesture) => {
238
- this._onElementPicked(elementInfo, userGesture);
242
+ if (userGesture)
243
+ this._page.bringToFront();
244
+ this._frontend.elementPicked({ elementInfo, userGesture });
239
245
  });
240
246
  recorder.on(import_recorder.RecorderEvent.CallLogsUpdated, (callLogs) => {
241
- this._onCallLogsUpdated(callLogs);
247
+ this._frontend.callLogsUpdated({ callLogs });
242
248
  });
243
249
  }
244
250
  _onActionAdded(action) {
@@ -251,29 +257,6 @@ class RecorderApp {
251
257
  lastAction.action.signals.push(signal.signal);
252
258
  this._updateActions();
253
259
  }
254
- _onPageNavigated(url) {
255
- this._page.mainFrame().evaluateExpression((({ url: url2 }) => {
256
- window.playwrightSetPageURL(url2);
257
- }).toString(), { isFunction: true }, { url }).catch(() => {
258
- });
259
- }
260
- _onContextClosed() {
261
- this._throttledOutputFile?.flush();
262
- this._page.browserContext.close({ reason: "Recorder window closed" }).catch(() => {
263
- });
264
- }
265
- _onModeChanged(mode) {
266
- this._page.mainFrame().evaluateExpression(((mode2) => {
267
- window.playwrightSetMode(mode2);
268
- }).toString(), { isFunction: true }, mode).catch(() => {
269
- });
270
- }
271
- _onPausedStateChanged(paused) {
272
- this._page.mainFrame().evaluateExpression(((paused2) => {
273
- window.playwrightSetPaused(paused2);
274
- }).toString(), { isFunction: true }, paused).catch(() => {
275
- });
276
- }
277
260
  _onUserSourcesChanged(sources, pausedSourceId) {
278
261
  if (!sources.length && !this._userSources.length)
279
262
  return;
@@ -281,34 +264,14 @@ class RecorderApp {
281
264
  this._pushAllSources();
282
265
  this._revealSource(pausedSourceId);
283
266
  }
284
- _onElementPicked(elementInfo, userGesture) {
285
- if (userGesture)
286
- this._page.bringToFront();
287
- this._page.mainFrame().evaluateExpression(((param) => {
288
- window.playwrightElementPicked(param.elementInfo, param.userGesture);
289
- }).toString(), { isFunction: true }, { elementInfo, userGesture }).catch(() => {
290
- });
291
- }
292
- _onCallLogsUpdated(callLogs) {
293
- this._page.mainFrame().evaluateExpression(((callLogs2) => {
294
- window.playwrightUpdateLogs(callLogs2);
295
- }).toString(), { isFunction: true }, callLogs).catch(() => {
296
- });
297
- }
298
267
  _pushAllSources() {
299
268
  const sources = [...this._userSources, ...this._recorderSources];
300
- this._page.mainFrame().evaluateExpression((({ sources: sources2 }) => {
301
- window.playwrightSetSources(sources2);
302
- }).toString(), { isFunction: true }, { sources }).catch(() => {
303
- });
269
+ this._frontend.sourcesUpdated({ sources });
304
270
  }
305
271
  _revealSource(sourceId) {
306
272
  if (!sourceId)
307
273
  return;
308
- this._page.mainFrame().evaluateExpression((({ sourceId: sourceId2 }) => {
309
- window.playwrightSelectSource(sourceId2);
310
- }).toString(), { isFunction: true }, { sourceId }).catch(() => {
311
- });
274
+ this._frontend.sourceRevealRequested({ sourceId });
312
275
  }
313
276
  _updateActions(reveal) {
314
277
  const recorderSources = [];
@@ -372,6 +335,8 @@ class ProgrammaticRecorderApp {
372
335
  });
373
336
  recorder.on(import_recorder.RecorderEvent.SignalAdded, (signal) => {
374
337
  const page = findPageByGuid(inspectedContext, signal.frame.pageGuid);
338
+ if (!page)
339
+ return;
375
340
  inspectedContext.emit(import_browserContext.BrowserContext.Events.RecorderEvent, { event: "signalAdded", data: signal, page, code: "" });
376
341
  });
377
342
  }
@@ -379,6 +344,20 @@ class ProgrammaticRecorderApp {
379
344
  function findPageByGuid(context, guid) {
380
345
  return context.pages().find((p) => p.guid === guid);
381
346
  }
347
+ function createRecorderFrontend(page) {
348
+ return new Proxy({}, {
349
+ get: (_target, prop) => {
350
+ if (typeof prop !== "string")
351
+ return void 0;
352
+ return (params) => {
353
+ page.mainFrame().evaluateExpression(((event) => {
354
+ window.dispatch(event);
355
+ }).toString(), { isFunction: true }, { method: prop, params }).catch(() => {
356
+ });
357
+ };
358
+ }
359
+ });
360
+ }
382
361
  const recorderAppSymbol = Symbol("recorderApp");
383
362
  // Annotate the CommonJS export names for ESM import in node:
384
363
  0 && (module.exports = {