@checkly/playwright-core 1.47.20-alpha → 1.48.20

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 (203) hide show
  1. package/browsers.json +14 -10
  2. package/lib/checkly/escapeRegExp.js +33 -0
  3. package/lib/checkly/secretsFilter.js +23 -0
  4. package/lib/cli/program.js +26 -14
  5. package/lib/client/api.js +6 -0
  6. package/lib/client/browserContext.js +20 -2
  7. package/lib/client/channelOwner.js +5 -2
  8. package/lib/client/connection.js +3 -0
  9. package/lib/client/fetch.js +16 -3
  10. package/lib/client/jsHandle.js +0 -8
  11. package/lib/client/localUtils.js +1 -0
  12. package/lib/client/network.js +175 -17
  13. package/lib/client/page.js +21 -0
  14. package/lib/client/playwright.js +6 -3
  15. package/lib/client/tracing.js +16 -20
  16. package/lib/generated/consoleApiSource.js +1 -1
  17. package/lib/generated/injectedScriptSource.js +1 -1
  18. package/lib/generated/pollingRecorderSource.js +7 -0
  19. package/lib/generated/webSocketMockSource.js +7 -0
  20. package/lib/protocol/validator.js +80 -14
  21. package/lib/server/bidi/bidiBrowser.js +23 -8
  22. package/lib/server/bidi/bidiChromium.js +124 -0
  23. package/lib/server/bidi/bidiConnection.js +1 -1
  24. package/lib/server/bidi/bidiExecutionContext.js +0 -3
  25. package/lib/server/bidi/bidiFirefox.js +15 -21
  26. package/lib/server/bidi/bidiInput.js +16 -32
  27. package/lib/server/bidi/bidiNetworkManager.js +39 -5
  28. package/lib/server/bidi/bidiOverCdp.js +103 -0
  29. package/lib/server/bidi/bidiPage.js +98 -25
  30. package/lib/server/bidi/bidiPdf.js +140 -0
  31. package/lib/server/bidi/third_party/firefoxPrefs.js +221 -0
  32. package/lib/server/browser.js +13 -2
  33. package/lib/server/browserContext.js +6 -23
  34. package/lib/server/browserType.js +39 -11
  35. package/lib/server/chromium/chromium.js +3 -15
  36. package/lib/server/chromium/chromiumSwitches.js +3 -1
  37. package/lib/server/chromium/crBrowser.js +4 -3
  38. package/lib/server/chromium/crExecutionContext.js +0 -7
  39. package/lib/server/chromium/crPage.js +5 -2
  40. package/lib/server/chromium/videoRecorder.js +1 -1
  41. package/lib/server/codegen/csharp.js +2 -2
  42. package/lib/server/codegen/java.js +1 -1
  43. package/lib/server/codegen/javascript.js +1 -1
  44. package/lib/server/codegen/language.js +14 -2
  45. package/lib/server/codegen/python.js +2 -2
  46. package/lib/server/cookieStore.js +73 -0
  47. package/lib/server/debugController.js +2 -2
  48. package/lib/server/deviceDescriptorsSource.json +51 -51
  49. package/lib/server/dialog.js +1 -0
  50. package/lib/server/dispatchers/browserContextDispatcher.js +19 -2
  51. package/lib/server/dispatchers/jsHandleDispatcher.js +0 -5
  52. package/lib/server/dispatchers/pageDispatcher.js +9 -0
  53. package/lib/server/dispatchers/playwrightDispatcher.js +2 -1
  54. package/lib/server/dispatchers/webSocketRouteDispatcher.js +189 -0
  55. package/lib/server/download.js +9 -2
  56. package/lib/server/fetch.js +96 -99
  57. package/lib/server/firefox/ffBrowser.js +6 -4
  58. package/lib/server/firefox/ffExecutionContext.js +0 -3
  59. package/lib/server/firefox/ffPage.js +3 -0
  60. package/lib/server/firefox/firefox.js +2 -13
  61. package/lib/server/frameSelectors.js +1 -1
  62. package/lib/server/frames.js +3 -2
  63. package/lib/server/har/harTracer.js +11 -0
  64. package/lib/server/input.js +0 -1
  65. package/lib/server/javascript.js +0 -7
  66. package/lib/server/page.js +5 -1
  67. package/lib/server/playwright.js +5 -2
  68. package/lib/server/recorder/contextRecorder.js +33 -50
  69. package/lib/server/recorder/recorderActions.js +2 -1
  70. package/lib/server/recorder/recorderApp.js +16 -10
  71. package/lib/server/recorder/recorderCollection.js +68 -79
  72. package/lib/server/recorder/recorderFrontend.js +5 -0
  73. package/lib/server/recorder/recorderInTraceViewer.js +144 -0
  74. package/lib/server/recorder/recorderRunner.js +75 -97
  75. package/lib/server/recorder/recorderUtils.js +47 -6
  76. package/lib/server/recorder.js +30 -25
  77. package/lib/server/registry/index.js +85 -4
  78. package/lib/server/socksClientCertificatesInterceptor.js +15 -3
  79. package/lib/server/trace/recorder/snapshotter.js +1 -0
  80. package/lib/server/trace/recorder/snapshotterInjected.js +2 -2
  81. package/lib/server/trace/recorder/tracing.js +70 -5
  82. package/lib/server/trace/test/inMemorySnapshotter.js +1 -1
  83. package/lib/server/trace/viewer/traceViewer.js +2 -5
  84. package/lib/server/webkit/webkit.js +1 -1
  85. package/lib/server/webkit/wkBrowser.js +6 -5
  86. package/lib/server/webkit/wkExecutionContext.js +0 -3
  87. package/lib/server/webkit/wkPage.js +4 -1
  88. package/lib/utils/happy-eyeballs.js +13 -0
  89. package/lib/utils/hostPlatform.js +2 -2
  90. package/lib/utils/httpServer.js +1 -0
  91. package/lib/utils/isomorphic/locatorGenerators.js +9 -18
  92. package/lib/utils/isomorphic/locatorParser.js +2 -2
  93. package/lib/utils/isomorphic/recorderUtils.js +195 -0
  94. package/lib/vite/htmlReport/index.html +12 -12
  95. package/lib/vite/recorder/assets/codeMirrorModule-d0KhC1qL.js +24 -0
  96. package/lib/vite/recorder/assets/{index-B-MT5gKo.css → index-BW-aOBcL.css} +1 -1
  97. package/lib/vite/recorder/assets/{index-D-5S5PPN.js → index-Bxxcmxlu.js} +10 -15
  98. package/lib/vite/recorder/index.html +2 -2
  99. package/lib/vite/traceViewer/assets/codeMirrorModule-BTYWvxEC.js +16437 -0
  100. package/lib/vite/traceViewer/assets/codeMirrorModule-BdBhzV6t.js +16443 -0
  101. package/lib/vite/traceViewer/assets/codeMirrorModule-BqcXH1AO.js +16838 -0
  102. package/lib/vite/traceViewer/assets/codeMirrorModule-Ca-1BNel.js +24 -0
  103. package/lib/vite/traceViewer/assets/codeMirrorModule-CcviAl53.js +16831 -0
  104. package/lib/vite/traceViewer/assets/codeMirrorModule-DS3v0XrQ.js +24 -0
  105. package/lib/vite/traceViewer/assets/codeMirrorModule-DZoSgqUd.js +24 -0
  106. package/lib/vite/traceViewer/assets/codeMirrorModule-DblsdhjA.js +16449 -0
  107. package/lib/vite/traceViewer/assets/codeMirrorModule-DtXZtbmO.js +16437 -0
  108. package/lib/vite/traceViewer/assets/codeMirrorModule-EhKN7Okm.js +16449 -0
  109. package/lib/vite/{recorder/assets/codeMirrorModule-C-fQ5QZD.js → traceViewer/assets/codeMirrorModule-MzSmL4X2.js} +1 -1
  110. package/lib/vite/traceViewer/assets/codeMirrorModule-U6XMqGkV.js +16437 -0
  111. package/lib/vite/traceViewer/assets/codeMirrorModule-lDjkI8Ax.js +24 -0
  112. package/lib/vite/traceViewer/assets/inspectorTab-BABZNwlH.js +17351 -0
  113. package/lib/vite/traceViewer/assets/inspectorTab-BB2Bm-wy.js +17361 -0
  114. package/lib/vite/traceViewer/assets/inspectorTab-BHcfR9dD.js +64 -0
  115. package/lib/vite/traceViewer/assets/inspectorTab-BPzVEZSf.js +17351 -0
  116. package/lib/vite/traceViewer/assets/inspectorTab-BPzhNk9r.js +64 -0
  117. package/lib/vite/traceViewer/assets/inspectorTab-Bbgq0hgt.js +64 -0
  118. package/lib/vite/traceViewer/assets/inspectorTab-C_OTuI8x.js +17361 -0
  119. package/lib/vite/traceViewer/assets/inspectorTab-DOc4D3cX.js +17361 -0
  120. package/lib/vite/traceViewer/assets/inspectorTab-DhBbZz8I.js +64 -0
  121. package/lib/vite/traceViewer/assets/inspectorTab-DpvLVMq5.js +17351 -0
  122. package/lib/vite/traceViewer/assets/workbench-B13nfocr.js +9 -0
  123. package/lib/vite/traceViewer/assets/workbench-BcgGQnKb.js +1473 -0
  124. package/lib/vite/traceViewer/assets/workbench-BwodYCgl.js +19119 -0
  125. package/lib/vite/traceViewer/assets/workbench-ByyWxoT8.js +1473 -0
  126. package/lib/vite/traceViewer/assets/workbench-CWtpwfKK.js +1473 -0
  127. package/lib/vite/traceViewer/assets/workbench-Crj6jzdv.js +19119 -0
  128. package/lib/vite/traceViewer/assets/workbench-DLv_q9ji.js +9 -0
  129. package/lib/vite/traceViewer/assets/workbench-DZqNXdoV.js +9 -0
  130. package/lib/vite/traceViewer/assets/workbench-DhqI6jeL.js +1473 -0
  131. package/lib/vite/traceViewer/assets/workbench-I4s6sWjN.js +1473 -0
  132. package/lib/vite/traceViewer/assets/workbench-M-Dh_RgU.js +1473 -0
  133. package/lib/vite/traceViewer/assets/workbench-Pa1v1Ojh.js +72 -0
  134. package/lib/vite/traceViewer/assets/workbench-gtYcQBNA.js +9 -0
  135. package/lib/vite/traceViewer/assets/xtermModule-DZP0glxx.js +5982 -0
  136. package/lib/vite/traceViewer/embedded.27BGR_eD.js +105 -0
  137. package/lib/vite/traceViewer/embedded.BBZ9gQEw.js +104 -0
  138. package/lib/vite/traceViewer/embedded.BIubxTi3.js +2 -0
  139. package/lib/vite/traceViewer/embedded.CHH7D63q.js +106 -0
  140. package/lib/vite/traceViewer/embedded.CorI3dFX.js +104 -0
  141. package/lib/vite/traceViewer/embedded.D4lqGydT.js +2 -0
  142. package/lib/vite/traceViewer/embedded.DTjd2aiy.js +105 -0
  143. package/lib/vite/traceViewer/embedded.DbzY7Q8w.js +2 -0
  144. package/lib/vite/traceViewer/embedded.Dxe2heQk.js +2 -0
  145. package/lib/vite/traceViewer/embedded.SsjKHrxC.js +105 -0
  146. package/lib/vite/traceViewer/embedded.Zu332ZC1.js +106 -0
  147. package/lib/vite/traceViewer/embedded.f-PLGsBT.js +2 -0
  148. package/lib/vite/traceViewer/embedded.html +5 -3
  149. package/lib/vite/traceViewer/embedded.ymLJ2mBS.js +106 -0
  150. package/lib/vite/traceViewer/index.B7aiTMfZ.js +2 -0
  151. package/lib/vite/traceViewer/index.BSak5QT9.js +2 -0
  152. package/lib/vite/traceViewer/index.Bfh46hDK.js +197 -0
  153. package/lib/vite/traceViewer/index.BrT2kfuc.js +2 -0
  154. package/lib/vite/traceViewer/index.C8ZWP1Qw.js +197 -0
  155. package/lib/vite/traceViewer/index.CB297BuW.js +2 -0
  156. package/lib/vite/traceViewer/index.CLxsp2W_.js +197 -0
  157. package/lib/vite/traceViewer/index.DPD22sZn.js +2 -0
  158. package/lib/vite/traceViewer/index.DkRbtWVo.js +195 -0
  159. package/lib/vite/traceViewer/index.DsjmhbB6.js +195 -0
  160. package/lib/vite/traceViewer/index.Dz3icWJV.js +196 -0
  161. package/lib/vite/traceViewer/index.PqcsvBxQ.js +196 -0
  162. package/lib/vite/traceViewer/index.html +5 -3
  163. package/lib/vite/traceViewer/index.yxAwzeWG.js +196 -0
  164. package/lib/vite/traceViewer/inspectorTab.DGJWXOSd.css +3145 -0
  165. package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +1 -0
  166. package/lib/vite/traceViewer/recorder.7Wl6HrQl.js +550 -0
  167. package/lib/vite/traceViewer/recorder.BHq8OXiu.js +551 -0
  168. package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
  169. package/lib/vite/traceViewer/recorder.BaRuS6Pc.js +2 -0
  170. package/lib/vite/traceViewer/recorder.BufKu9Hp.js +550 -0
  171. package/lib/vite/traceViewer/recorder.C88JDknq.js +2 -0
  172. package/lib/vite/traceViewer/recorder.Ch-WHviK.js +2 -0
  173. package/lib/vite/traceViewer/recorder.DBDpiNOK.css +15 -0
  174. package/lib/vite/traceViewer/recorder.Fwf59ZKh.js +551 -0
  175. package/lib/vite/traceViewer/recorder.POd-toIn.js +2 -0
  176. package/lib/vite/traceViewer/recorder.am-MV-DQ.js +550 -0
  177. package/lib/vite/traceViewer/recorder.html +17 -0
  178. package/lib/vite/traceViewer/recorder.zV_xPHM4.js +551 -0
  179. package/lib/vite/traceViewer/sw.bundle.js +3 -3
  180. package/lib/vite/traceViewer/uiMode.2tr9k625.js +5 -0
  181. package/lib/vite/traceViewer/uiMode.B11wexdJ.js +5 -0
  182. package/lib/vite/traceViewer/uiMode.BEZVCe5O.js +5 -0
  183. package/lib/vite/traceViewer/uiMode.BH2Nj2h0.js +1724 -0
  184. package/lib/vite/traceViewer/uiMode.BZoFj6zV.js +1723 -0
  185. package/lib/vite/traceViewer/uiMode.C4nbcio6.js +1730 -0
  186. package/lib/vite/traceViewer/uiMode.CAYqod-m.css +1 -0
  187. package/lib/vite/traceViewer/uiMode.CBRJkC_K.js +1724 -0
  188. package/lib/vite/traceViewer/uiMode.CpC2B27N.js +1724 -0
  189. package/lib/vite/traceViewer/uiMode.DRmgrHSk.css +1462 -0
  190. package/lib/vite/traceViewer/uiMode.DdtUZZVS.js +5 -0
  191. package/lib/vite/traceViewer/uiMode.Dlo9s_YX.js +1723 -0
  192. package/lib/vite/traceViewer/uiMode.O07awP3T.js +10 -0
  193. package/lib/vite/traceViewer/uiMode.gGHHTsyL.js +1730 -0
  194. package/lib/vite/traceViewer/uiMode.html +6 -4
  195. package/lib/vite/traceViewer/uiMode.wsGnVMQK.js +1723 -0
  196. package/lib/vite/traceViewer/workbench.9Es1K_T7.css +549 -0
  197. package/lib/vite/traceViewer/workbench.BQNDbcQ0.css +550 -0
  198. package/lib/vite/traceViewer/workbench.DjbIuxix.css +1 -0
  199. package/lib/vite/traceViewer/workbench.DlsCx8k5.css +1 -0
  200. package/lib/vite/traceViewer/workbench.wuxQoE2z.css +3703 -0
  201. package/package.json +1 -1
  202. package/types/protocol.d.ts +610 -173
  203. package/types/types.d.ts +2037 -949
@@ -156,12 +156,22 @@ class HarTracer {
156
156
  if (this._started) this._delegate.onEntryStarted(harEntry);
157
157
  }
158
158
  _onAPIRequestFinished(event) {
159
+ var _event$body$length, _event$body;
159
160
  const harEntry = this._entryForRequest(event.requestEvent);
160
161
  if (!harEntry) return;
161
162
  harEntry.response.status = event.statusCode;
162
163
  harEntry.response.statusText = event.statusMessage;
163
164
  harEntry.response.httpVersion = event.httpVersion;
164
165
  harEntry.response.redirectURL = event.headers.location || '';
166
+ if (!this._options.omitServerIP) {
167
+ harEntry.serverIPAddress = event.serverIPAddress;
168
+ harEntry._serverPort = event.serverPort;
169
+ }
170
+ if (!this._options.omitTiming) {
171
+ harEntry.timings = event.timings;
172
+ this._computeHarEntryTotalTime(harEntry);
173
+ }
174
+ if (!this._options.omitSecurityDetails) harEntry._securityDetails = event.securityDetails;
165
175
  for (let i = 0; i < event.rawHeaders.length; i += 2) {
166
176
  harEntry.response.headers.push({
167
177
  name: event.rawHeaders[i],
@@ -178,6 +188,7 @@ class HarTracer {
178
188
  const contentType = event.headers['content-type'];
179
189
  if (contentType) content.mimeType = contentType;
180
190
  this._storeResponseContent(event.body, content, 'other');
191
+ if (!this._options.omitSizes) harEntry.response.bodySize = (_event$body$length = (_event$body = event.body) === null || _event$body === void 0 ? void 0 : _event$body.length) !== null && _event$body$length !== void 0 ? _event$body$length : 0;
181
192
  if (this._started) this._delegate.onEntryFinished(harEntry);
182
193
  }
183
194
  _onRequest(request) {
@@ -189,7 +189,6 @@ class Mouse {
189
189
  x,
190
190
  y
191
191
  };
192
- if (this._raw.click) return await this._raw.click(x, y, options);
193
192
  const {
194
193
  delay = null,
195
194
  clickCount = 1
@@ -85,9 +85,6 @@ class ExecutionContext extends _instrumentation.SdkObject {
85
85
  }
86
86
  return this._utilityScriptPromise;
87
87
  }
88
- async objectCount(objectId) {
89
- return this._delegate.objectCount(objectId);
90
- }
91
88
  async doSlowMo() {
92
89
  // overridden in FrameExecutionContext
93
90
  }
@@ -189,10 +186,6 @@ class JSHandle extends _instrumentation.SdkObject {
189
186
  this._preview = preview;
190
187
  if (this._previewCallback) this._previewCallback(preview);
191
188
  }
192
- async objectCount() {
193
- if (!this._objectId) throw new Error('Can only count objects for a handle that points to the constructor prototype');
194
- return this._context.objectCount(this._objectId);
195
- }
196
189
  }
197
190
  exports.JSHandle = JSHandle;
198
191
  async function evaluate(context, returnByValue, pageFunction, ...args) {
@@ -285,6 +285,9 @@ class Page extends _instrumentation.SdkObject {
285
285
  return response;
286
286
  }), this._timeoutSettings.navigationTimeout(options));
287
287
  }
288
+ requestGC() {
289
+ return this._delegate.requestGC();
290
+ }
288
291
  registerLocatorHandler(selector, noWaitAfter) {
289
292
  const uid = ++this._lastLocatorHandlerUid;
290
293
  this._locatorHandlers.set(uid, {
@@ -324,7 +327,7 @@ class Page extends _instrumentation.SdkObject {
324
327
  progress.throwIfAborted();
325
328
  if (!handler.noWaitAfter) {
326
329
  progress.log(` locator handler has finished, waiting for ${(0, _utils.asLocator)(this.attribution.playwright.options.sdkLanguage, handler.selector)} to be hidden`);
327
- await this.mainFrame().waitForSelectorInternal(progress, handler.selector, {
330
+ await this.mainFrame().waitForSelectorInternal(progress, handler.selector, false, {
328
331
  state: 'hidden'
329
332
  });
330
333
  } else {
@@ -668,6 +671,7 @@ class PageBinding {
668
671
  context: page._browserContext
669
672
  }, handle);
670
673
  } else {
674
+ if (!Array.isArray(serializedArgs)) throw new Error(`serializedArgs is not an array. This can happen when Array.prototype.toJSON is defined incorrectly`);
671
675
  const args = serializedArgs.map(a => (0, _utilityScriptSerializers.parseEvaluationResultValue)(a));
672
676
  result = await binding.playwrightFunction({
673
677
  frame: context.frame,
@@ -15,6 +15,7 @@ var _webkit = require("./webkit/webkit");
15
15
  var _instrumentation = require("./instrumentation");
16
16
  var _utils = require("../utils");
17
17
  var _debugController = require("./debugController");
18
+ var _bidiChromium = require("./bidi/bidiChromium");
18
19
  var _bidiFirefox = require("./bidi/bidiFirefox");
19
20
  /**
20
21
  * Copyright (c) Microsoft Corporation.
@@ -42,9 +43,10 @@ class Playwright extends _instrumentation.SdkObject {
42
43
  this.chromium = void 0;
43
44
  this.android = void 0;
44
45
  this.electron = void 0;
45
- this.bidi = void 0;
46
46
  this.firefox = void 0;
47
47
  this.webkit = void 0;
48
+ this.bidiChromium = void 0;
49
+ this.bidiFirefox = void 0;
48
50
  this.options = void 0;
49
51
  this.debugController = void 0;
50
52
  this._allPages = new Set();
@@ -61,7 +63,8 @@ class Playwright extends _instrumentation.SdkObject {
61
63
  }
62
64
  }, null);
63
65
  this.chromium = new _chromium.Chromium(this);
64
- this.bidi = new _bidiFirefox.BidiFirefox(this);
66
+ this.bidiChromium = new _bidiChromium.BidiChromium(this);
67
+ this.bidiFirefox = new _bidiFirefox.BidiFirefox(this);
65
68
  this.firefox = new _firefox.Firefox(this);
66
69
  this.webkit = new _webkit.WebKit(this);
67
70
  this.electron = new _electron.Electron(this);
@@ -6,14 +6,13 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.ContextRecorder = void 0;
7
7
  exports.generateFrameSelector = generateFrameSelector;
8
8
  var _events = require("events");
9
- var recorderSource = _interopRequireWildcard(require("../../generated/recorderSource"));
9
+ var recorderSource = _interopRequireWildcard(require("../../generated/pollingRecorderSource"));
10
10
  var _utils = require("../../utils");
11
11
  var _timeoutRunner = require("../../utils/timeoutRunner");
12
12
  var _browserContext = require("../browserContext");
13
13
  var _languages = require("../codegen/languages");
14
14
  var _frames = require("../frames");
15
15
  var _page = require("../page");
16
- var _recorderRunner = require("./recorderRunner");
17
16
  var _throttledFile = require("./throttledFile");
18
17
  var _recorderCollection = require("./recorderCollection");
19
18
  var _language = require("../codegen/language");
@@ -36,14 +35,13 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
36
35
  */
37
36
 
38
37
  class ContextRecorder extends _events.EventEmitter {
39
- constructor(context, params, delegate) {
38
+ constructor(codegenMode, context, params, delegate) {
40
39
  super();
41
40
  this._collection = void 0;
42
41
  this._pageAliases = new Map();
43
42
  this._lastPopupOrdinal = 0;
44
43
  this._lastDialogOrdinal = -1;
45
44
  this._lastDownloadOrdinal = -1;
46
- this._timers = new Set();
47
45
  this._context = void 0;
48
46
  this._params = void 0;
49
47
  this._delegate = void 0;
@@ -51,6 +49,8 @@ class ContextRecorder extends _events.EventEmitter {
51
49
  this._throttledOutputFile = null;
52
50
  this._orderedLanguages = [];
53
51
  this._listeners = [];
52
+ this._codegenMode = void 0;
53
+ this._codegenMode = codegenMode;
54
54
  this._context = context;
55
55
  this._params = params;
56
56
  this._delegate = delegate;
@@ -63,7 +63,8 @@ class ContextRecorder extends _events.EventEmitter {
63
63
  browserName: context._browser.options.name,
64
64
  launchOptions: {
65
65
  headless: false,
66
- ...params.launchOptions
66
+ ...params.launchOptions,
67
+ tracesDir: undefined
67
68
  },
68
69
  contextOptions: {
69
70
  ...params.contextOptions
@@ -71,8 +72,8 @@ class ContextRecorder extends _events.EventEmitter {
71
72
  deviceName: params.device,
72
73
  saveStorage: params.saveStorage
73
74
  };
74
- const collection = new _recorderCollection.RecorderCollection(params.mode === 'recording');
75
- collection.on('change', () => {
75
+ this._collection = new _recorderCollection.RecorderCollection(this._pageAliases);
76
+ this._collection.on('change', actions => {
76
77
  this._recorderSources = [];
77
78
  for (const languageGenerator of this._orderedLanguages) {
78
79
  var _this$_throttledOutpu;
@@ -81,7 +82,7 @@ class ContextRecorder extends _events.EventEmitter {
81
82
  footer,
82
83
  actionTexts,
83
84
  text
84
- } = (0, _language.generateCode)(collection.actions(), languageGenerator, languageGeneratorOptions);
85
+ } = (0, _language.generateCode)(actions, languageGenerator, languageGeneratorOptions);
85
86
  const source = {
86
87
  isRecorded: true,
87
88
  label: languageGenerator.name,
@@ -100,7 +101,7 @@ class ContextRecorder extends _events.EventEmitter {
100
101
  }
101
102
  this.emit(ContextRecorder.Events.Change, {
102
103
  sources: this._recorderSources,
103
- primaryFileName: this._orderedLanguages[0].id
104
+ actions
104
105
  });
105
106
  });
106
107
  context.on(_browserContext.BrowserContext.Events.BeforeClose, () => {
@@ -111,7 +112,7 @@ class ContextRecorder extends _events.EventEmitter {
111
112
  var _this$_throttledOutpu3;
112
113
  (_this$_throttledOutpu3 = this._throttledOutputFile) === null || _this$_throttledOutpu3 === void 0 || _this$_throttledOutpu3.flush();
113
114
  }));
114
- this._collection = collection;
115
+ this.setEnabled(true);
115
116
  }
116
117
  setOutput(codegenId, outputFile) {
117
118
  var _this$_collection;
@@ -144,23 +145,29 @@ class ContextRecorder extends _events.EventEmitter {
144
145
  }
145
146
  setEnabled(enabled) {
146
147
  this._collection.setEnabled(enabled);
148
+ if (this._codegenMode === 'trace-events') {
149
+ if (enabled) this._context.tracing.startChunk({
150
+ name: 'trace',
151
+ title: 'trace'
152
+ }).catch(() => {});else this._context.tracing.stopChunk({
153
+ mode: 'discard'
154
+ }).catch(() => {});
155
+ }
147
156
  }
148
157
  dispose() {
149
- for (const timer of this._timers) clearTimeout(timer);
150
- this._timers.clear();
151
158
  _utils.eventsHelper.removeEventListeners(this._listeners);
152
159
  }
153
160
  async _onPage(page) {
154
161
  // First page is called page, others are called popup1, popup2, etc.
155
162
  const frame = page.mainFrame();
156
163
  page.on('close', () => {
157
- this._collection.addAction({
164
+ this._collection.addRecordedAction({
158
165
  frame: this._describeMainFrame(page),
159
- committed: true,
160
166
  action: {
161
167
  name: 'closePage',
162
168
  signals: []
163
- }
169
+ },
170
+ startTime: (0, _utils.monotonicTime)()
164
171
  });
165
172
  this._pageAliases.delete(page);
166
173
  });
@@ -174,14 +181,14 @@ class ContextRecorder extends _events.EventEmitter {
174
181
  if (page.opener()) {
175
182
  this._onPopup(page.opener(), page);
176
183
  } else {
177
- this._collection.addAction({
184
+ this._collection.addRecordedAction({
178
185
  frame: this._describeMainFrame(page),
179
- committed: true,
180
186
  action: {
181
187
  name: 'openPage',
182
188
  url: page.mainFrame().url(),
183
189
  signals: []
184
- }
190
+ },
191
+ startTime: (0, _utils.monotonicTime)()
185
192
  });
186
193
  }
187
194
  }
@@ -206,47 +213,23 @@ class ContextRecorder extends _events.EventEmitter {
206
213
  testIdAttributeName() {
207
214
  return this._params.testIdAttributeName || this._context.selectors().testIdAttributeName() || 'data-testid';
208
215
  }
209
- async _performAction(frame, action) {
216
+ async _createActionInContext(frame, action) {
210
217
  var _this$_delegate$rewri, _this$_delegate;
211
- // Commit last action so that no further signals are added to it.
212
- this._collection.commitLastAction();
213
218
  const frameDescription = await this._describeFrame(frame);
214
219
  const actionInContext = {
215
220
  frame: frameDescription,
216
221
  action,
217
- description: undefined
222
+ description: undefined,
223
+ startTime: (0, _utils.monotonicTime)()
218
224
  };
219
225
  await ((_this$_delegate$rewri = (_this$_delegate = this._delegate).rewriteActionInContext) === null || _this$_delegate$rewri === void 0 ? void 0 : _this$_delegate$rewri.call(_this$_delegate, this._pageAliases, actionInContext));
220
- this._collection.willPerformAction(actionInContext);
221
- const success = await (0, _recorderRunner.performAction)(this._pageAliases, actionInContext);
222
- if (success) {
223
- this._collection.didPerformAction(actionInContext);
224
- this._setCommittedAfterTimeout(actionInContext);
225
- } else {
226
- this._collection.performedActionFailed(actionInContext);
227
- }
226
+ return actionInContext;
228
227
  }
229
- async _recordAction(frame, action) {
230
- var _this$_delegate$rewri2, _this$_delegate2;
231
- // Commit last action so that no further signals are added to it.
232
- this._collection.commitLastAction();
233
- const frameDescription = await this._describeFrame(frame);
234
- const actionInContext = {
235
- frame: frameDescription,
236
- action,
237
- description: undefined
238
- };
239
- await ((_this$_delegate$rewri2 = (_this$_delegate2 = this._delegate).rewriteActionInContext) === null || _this$_delegate$rewri2 === void 0 ? void 0 : _this$_delegate$rewri2.call(_this$_delegate2, this._pageAliases, actionInContext));
240
- this._setCommittedAfterTimeout(actionInContext);
241
- this._collection.addAction(actionInContext);
228
+ async _performAction(frame, action) {
229
+ await this._collection.performAction(await this._createActionInContext(frame, action));
242
230
  }
243
- _setCommittedAfterTimeout(actionInContext) {
244
- const timer = setTimeout(() => {
245
- // Commit the action after 5 seconds so that no further signals are added to it.
246
- actionInContext.committed = true;
247
- this._timers.delete(timer);
248
- }, (0, _utils.isUnderTest)() ? 500 : 5000);
249
- this._timers.add(timer);
231
+ async _recordAction(frame, action) {
232
+ this._collection.addRecordedAction(await this._createActionInContext(frame, action));
250
233
  }
251
234
  _onFrameNavigated(frame, page) {
252
235
  const pageAlias = this._pageAliases.get(page);
@@ -2,4 +2,5 @@
2
2
 
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
- });
5
+ });
6
+ //# sourceMappingURL=recorderActions.js.map
@@ -30,25 +30,30 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
30
30
  */
31
31
 
32
32
  class EmptyRecorderApp extends _events.EventEmitter {
33
+ constructor(...args) {
34
+ super(...args);
35
+ this.wsEndpointForTest = void 0;
36
+ }
33
37
  async close() {}
34
38
  async setPaused(paused) {}
35
39
  async setMode(mode) {}
36
- async setFileIfNeeded(file) {}
40
+ async setRunningFile(file) {}
37
41
  async setSelector(selector, userGesture) {}
38
42
  async updateCallLogs(callLogs) {}
39
43
  async setSources(sources) {}
44
+ async setActions(actions, sources) {}
40
45
  }
41
46
  exports.EmptyRecorderApp = EmptyRecorderApp;
42
47
  class RecorderApp extends _events.EventEmitter {
43
48
  constructor(recorder, page, wsEndpoint) {
44
49
  super();
45
50
  this._page = void 0;
46
- this.wsEndpoint = void 0;
51
+ this.wsEndpointForTest = void 0;
47
52
  this._recorder = void 0;
48
53
  this.setMaxListeners(0);
49
54
  this._recorder = recorder;
50
55
  this._page = page;
51
- this.wsEndpoint = wsEndpoint;
56
+ this.wsEndpointForTest = wsEndpoint;
52
57
  }
53
58
  async close() {
54
59
  await this._page.context().close({
@@ -63,7 +68,6 @@ class RecorderApp extends _events.EventEmitter {
63
68
  const file = require.resolve('../../vite/recorder/' + uri);
64
69
  _fs.default.promises.readFile(file).then(buffer => {
65
70
  route.fulfill({
66
- requestUrl: route.request().url(),
67
71
  status: 200,
68
72
  headers: [{
69
73
  name: 'Content-Type',
@@ -114,9 +118,8 @@ class RecorderApp extends _events.EventEmitter {
114
118
  persistentContextOptions: {
115
119
  noDefaultViewport: true,
116
120
  headless: !!process.env.PWTEST_CLI_HEADLESS || (0, _utils.isUnderTest)() && !headed,
117
- useWebSocket: !!process.env.PWTEST_RECORDER_PORT,
118
- handleSIGINT: false,
119
- args: process.env.PWTEST_RECORDER_PORT ? [`--remote-debugging-port=${process.env.PWTEST_RECORDER_PORT}`] : [],
121
+ useWebSocket: (0, _utils.isUnderTest)(),
122
+ handleSIGINT: recorder.handleSIGINT,
120
123
  executablePath: inspectedContext._browser.options.isChromium ? inspectedContext._browser.options.customExecutablePath : undefined
121
124
  }
122
125
  });
@@ -135,9 +138,9 @@ class RecorderApp extends _events.EventEmitter {
135
138
  isFunction: true
136
139
  }, mode).catch(() => {});
137
140
  }
138
- async setFileIfNeeded(file) {
141
+ async setRunningFile(file) {
139
142
  await this._page.mainFrame().evaluateExpression((file => {
140
- window.playwrightSetFileIfNeeded(file);
143
+ window.playwrightSetRunningFile(file);
141
144
  }).toString(), {
142
145
  isFunction: true
143
146
  }, file).catch(() => {});
@@ -157,8 +160,11 @@ class RecorderApp extends _events.EventEmitter {
157
160
  }, sources).catch(() => {});
158
161
 
159
162
  // Testing harness for runCLI mode.
160
- if (process.env.PWTEST_CLI_IS_UNDER_TEST && sources.length) process._didSetSourcesForTest(sources[0].text);
163
+ if (process.env.PWTEST_CLI_IS_UNDER_TEST && sources.length) {
164
+ if (process._didSetSourcesForTest(sources[0].text)) this.close();
165
+ }
161
166
  }
167
+ async setActions(actions, sources) {}
162
168
  async setSelector(selector, userGesture) {
163
169
  if (userGesture) {
164
170
  var _this$_recorder;
@@ -5,6 +5,11 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.RecorderCollection = void 0;
7
7
  var _events = require("events");
8
+ var _time = require("../../utils/time");
9
+ var _recorderUtils = require("./recorderUtils");
10
+ var _errors = require("../errors");
11
+ var _recorderRunner = require("./recorderRunner");
12
+ var _debug = require("../../utils/debug");
8
13
  /**
9
14
  * Copyright (c) Microsoft Corporation.
10
15
  *
@@ -22,106 +27,90 @@ var _events = require("events");
22
27
  */
23
28
 
24
29
  class RecorderCollection extends _events.EventEmitter {
25
- constructor(enabled) {
30
+ constructor(pageAliases) {
26
31
  super();
27
- this._currentAction = null;
28
- this._lastAction = null;
29
32
  this._actions = [];
30
- this._enabled = void 0;
31
- this._enabled = enabled;
32
- this.restart();
33
+ this._enabled = false;
34
+ this._pageAliases = void 0;
35
+ this._pageAliases = pageAliases;
33
36
  }
34
37
  restart() {
35
- this._currentAction = null;
36
- this._lastAction = null;
37
38
  this._actions = [];
38
- this.emit('change');
39
- }
40
- actions() {
41
- return this._actions;
39
+ this._fireChange();
42
40
  }
43
41
  setEnabled(enabled) {
44
42
  this._enabled = enabled;
45
43
  }
46
- addAction(action) {
47
- if (!this._enabled) return;
48
- this.willPerformAction(action);
49
- this.didPerformAction(action);
50
- }
51
- willPerformAction(action) {
52
- if (!this._enabled) return;
53
- this._currentAction = action;
44
+ async performAction(actionInContext) {
45
+ await this._addAction(actionInContext, async callMetadata => {
46
+ await (0, _recorderRunner.performAction)(callMetadata, this._pageAliases, actionInContext);
47
+ });
54
48
  }
55
- performedActionFailed(action) {
56
- if (!this._enabled) return;
57
- if (this._currentAction === action) this._currentAction = null;
49
+ addRecordedAction(actionInContext) {
50
+ if (['openPage', 'closePage'].includes(actionInContext.action.name)) {
51
+ this._actions.push(actionInContext);
52
+ this._fireChange();
53
+ return;
54
+ }
55
+ this._addAction(actionInContext).catch(() => {});
58
56
  }
59
- didPerformAction(actionInContext) {
57
+ async _addAction(actionInContext, callback) {
60
58
  if (!this._enabled) return;
61
- const action = actionInContext.action;
62
- let eraseLastAction = false;
63
- if (this._lastAction && this._lastAction.frame.pageAlias === actionInContext.frame.pageAlias) {
64
- const lastAction = this._lastAction.action;
65
- // We augment last action based on the type.
66
- if (this._lastAction && action.name === 'fill' && lastAction.name === 'fill') {
67
- if (action.selector === lastAction.selector) eraseLastAction = true;
68
- }
69
- if (lastAction && action.name === 'click' && lastAction.name === 'click') {
70
- if (action.selector === lastAction.selector && action.clickCount > lastAction.clickCount) eraseLastAction = true;
71
- }
72
- if (lastAction && action.name === 'navigate' && lastAction.name === 'navigate') {
73
- if (action.url === lastAction.url) {
74
- // Already at a target URL.
75
- this._currentAction = null;
76
- return;
77
- }
78
- }
79
- // Check and uncheck erase click.
80
- if (lastAction && (action.name === 'check' || action.name === 'uncheck') && lastAction.name === 'click') {
81
- if (action.selector === lastAction.selector) eraseLastAction = true;
82
- }
59
+ if (actionInContext.action.name === 'openPage' || actionInContext.action.name === 'closePage') {
60
+ this._actions.push(actionInContext);
61
+ this._fireChange();
62
+ return;
83
63
  }
84
- this._lastAction = actionInContext;
85
- this._currentAction = null;
86
- if (eraseLastAction) this._actions.pop();
64
+ const {
65
+ callMetadata,
66
+ mainFrame
67
+ } = (0, _recorderUtils.callMetadataForAction)(this._pageAliases, actionInContext);
68
+ await mainFrame.instrumentation.onBeforeCall(mainFrame, callMetadata);
87
69
  this._actions.push(actionInContext);
88
- this.emit('change');
89
- }
90
- commitLastAction() {
91
- if (!this._enabled) return;
92
- const action = this._lastAction;
93
- if (action) action.committed = true;
70
+ this._fireChange();
71
+ const error = await (callback === null || callback === void 0 ? void 0 : callback(callMetadata).catch(e => e));
72
+ callMetadata.endTime = (0, _time.monotonicTime)();
73
+ actionInContext.endTime = callMetadata.endTime;
74
+ callMetadata.error = error ? (0, _errors.serializeError)(error) : undefined;
75
+ // Do not wait for onAfterCall so that performAction returned immediately after the action.
76
+ mainFrame.instrumentation.onAfterCall(mainFrame, callMetadata).then(() => {
77
+ this._fireChange();
78
+ }).catch(() => {});
94
79
  }
95
80
  signal(pageAlias, frame, signal) {
96
81
  if (!this._enabled) return;
97
-
98
- // Signal either arrives while action is being performed or shortly after.
99
- if (this._currentAction) {
100
- this._currentAction.action.signals.push(signal);
82
+ if (signal.name === 'navigation' && frame._page.mainFrame() === frame) {
83
+ const timestamp = (0, _time.monotonicTime)();
84
+ const lastAction = this._actions[this._actions.length - 1];
85
+ const signalThreshold = (0, _debug.isUnderTest)() ? 500 : 5000;
86
+ let generateGoto = false;
87
+ if (!lastAction) generateGoto = true;else if (lastAction.action.name !== 'click' && lastAction.action.name !== 'press') generateGoto = true;else if (timestamp - lastAction.startTime > signalThreshold) generateGoto = true;
88
+ if (generateGoto) {
89
+ this.addRecordedAction({
90
+ frame: {
91
+ pageAlias,
92
+ framePath: []
93
+ },
94
+ action: {
95
+ name: 'navigate',
96
+ url: frame.url(),
97
+ signals: []
98
+ },
99
+ startTime: timestamp,
100
+ endTime: timestamp
101
+ });
102
+ }
101
103
  return;
102
104
  }
103
- if (this._lastAction && (!this._lastAction.committed || signal.name !== 'navigation')) {
104
- const signals = this._lastAction.action.signals;
105
- if (signal.name === 'navigation' && signals.length && signals[signals.length - 1].name === 'download') return;
106
- if (signal.name === 'download' && signals.length && signals[signals.length - 1].name === 'navigation') signals.length = signals.length - 1;
107
- this._lastAction.action.signals.push(signal);
108
- this.emit('change');
105
+ if (this._actions.length) {
106
+ this._actions[this._actions.length - 1].action.signals.push(signal);
107
+ this._fireChange();
109
108
  return;
110
109
  }
111
- if (signal.name === 'navigation' && frame._page.mainFrame() === frame) {
112
- this.addAction({
113
- frame: {
114
- pageAlias,
115
- framePath: []
116
- },
117
- committed: true,
118
- action: {
119
- name: 'navigate',
120
- url: frame.url(),
121
- signals: []
122
- }
123
- });
124
- }
110
+ }
111
+ _fireChange() {
112
+ if (!this._enabled) return;
113
+ this.emit('change', (0, _recorderUtils.collapseActions)(this._actions));
125
114
  }
126
115
  }
127
116
  exports.RecorderCollection = RecorderCollection;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });