@checkly/playwright-core 1.42.18 → 1.47.20-alpha

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 (238) hide show
  1. package/ThirdPartyNotices.txt +144 -109
  2. package/browsers.json +15 -25
  3. package/lib/androidServerImpl.js +1 -1
  4. package/lib/browserServerImpl.js +1 -1
  5. package/lib/cli/driver.js +1 -3
  6. package/lib/cli/program.js +5 -10
  7. package/lib/client/android.js +1 -1
  8. package/lib/client/api.js +7 -0
  9. package/lib/client/browserContext.js +37 -5
  10. package/lib/client/browserType.js +19 -11
  11. package/lib/client/channelOwner.js +19 -16
  12. package/lib/client/clientInstrumentation.js +17 -7
  13. package/lib/client/clock.js +68 -0
  14. package/lib/client/connection.js +9 -6
  15. package/lib/client/electron.js +7 -5
  16. package/lib/client/elementHandle.js +44 -14
  17. package/lib/client/eventEmitter.js +314 -0
  18. package/lib/client/fetch.js +81 -28
  19. package/lib/client/frame.js +2 -4
  20. package/lib/client/jsHandle.js +7 -1
  21. package/lib/client/locator.js +9 -0
  22. package/lib/client/network.js +12 -9
  23. package/lib/client/page.js +45 -23
  24. package/lib/client/playwright.js +3 -0
  25. package/lib/client/tracing.js +7 -4
  26. package/lib/common/socksProxy.js +2 -2
  27. package/lib/generated/clockSource.js +7 -0
  28. package/lib/generated/injectedScriptSource.js +1 -1
  29. package/lib/generated/recorderSource.js +1 -1
  30. package/lib/generated/utilityScriptSource.js +1 -1
  31. package/lib/protocol/serializers.js +12 -11
  32. package/lib/protocol/validator.js +137 -55
  33. package/lib/server/bidi/bidiBrowser.js +296 -0
  34. package/lib/server/bidi/bidiConnection.js +206 -0
  35. package/lib/server/bidi/bidiExecutionContext.js +162 -0
  36. package/lib/server/bidi/bidiFirefox.js +110 -0
  37. package/lib/server/bidi/bidiInput.js +174 -0
  38. package/lib/server/bidi/bidiNetworkManager.js +304 -0
  39. package/lib/server/bidi/bidiPage.js +456 -0
  40. package/lib/server/bidi/third_party/bidiDeserializer.js +93 -0
  41. package/lib/server/bidi/third_party/bidiKeyboard.js +238 -0
  42. package/lib/server/bidi/third_party/bidiProtocol.js +139 -0
  43. package/lib/server/bidi/third_party/bidiSerializer.js +144 -0
  44. package/lib/server/browser.js +9 -1
  45. package/lib/server/browserContext.js +97 -22
  46. package/lib/server/browserType.js +27 -20
  47. package/lib/server/chromium/chromium.js +30 -15
  48. package/lib/server/chromium/chromiumSwitches.js +6 -3
  49. package/lib/server/chromium/crBrowser.js +11 -17
  50. package/lib/server/chromium/crConnection.js +2 -2
  51. package/lib/server/chromium/crDragDrop.js +28 -29
  52. package/lib/server/chromium/crNetworkManager.js +130 -84
  53. package/lib/server/chromium/crPage.js +34 -79
  54. package/lib/server/chromium/crProtocolHelper.js +3 -1
  55. package/lib/server/chromium/crServiceWorker.js +20 -23
  56. package/lib/server/chromium/videoRecorder.js +1 -1
  57. package/lib/server/clock.js +125 -0
  58. package/lib/server/codegen/csharp.js +299 -0
  59. package/lib/server/codegen/java.js +235 -0
  60. package/lib/server/codegen/javascript.js +223 -0
  61. package/lib/server/codegen/jsonl.js +47 -0
  62. package/lib/server/codegen/language.js +76 -0
  63. package/lib/server/codegen/languages.js +30 -0
  64. package/lib/server/codegen/python.js +265 -0
  65. package/lib/server/codegen/types.js +5 -0
  66. package/lib/server/debugController.js +3 -5
  67. package/lib/server/deviceDescriptors.js +9 -4
  68. package/lib/server/deviceDescriptorsSource.json +239 -119
  69. package/lib/server/dispatchers/androidDispatcher.js +1 -1
  70. package/lib/server/dispatchers/browserContextDispatcher.js +51 -7
  71. package/lib/server/dispatchers/dispatcher.js +36 -40
  72. package/lib/server/dispatchers/frameDispatcher.js +1 -2
  73. package/lib/server/dispatchers/jsHandleDispatcher.js +1 -1
  74. package/lib/server/dispatchers/jsonPipeDispatcher.js +4 -6
  75. package/lib/server/dispatchers/localUtilsDispatcher.js +19 -5
  76. package/lib/server/dispatchers/networkDispatchers.js +2 -2
  77. package/lib/server/dispatchers/pageDispatcher.js +5 -2
  78. package/lib/server/dispatchers/playwrightDispatcher.js +1 -0
  79. package/lib/server/dispatchers/writableStreamDispatcher.js +8 -5
  80. package/lib/server/dom.js +90 -53
  81. package/lib/server/electron/electron.js +21 -4
  82. package/lib/server/fetch.js +74 -25
  83. package/lib/server/fileUploadUtils.js +7 -3
  84. package/lib/server/firefox/ffBrowser.js +36 -25
  85. package/lib/server/firefox/ffConnection.js +2 -2
  86. package/lib/server/firefox/ffNetworkManager.js +6 -4
  87. package/lib/server/firefox/ffPage.js +22 -24
  88. package/lib/server/firefox/firefox.js +25 -6
  89. package/lib/server/frameSelectors.js +2 -2
  90. package/lib/server/frames.js +205 -159
  91. package/lib/server/har/harTracer.js +4 -12
  92. package/lib/server/helper.js +3 -3
  93. package/lib/server/index.js +18 -0
  94. package/lib/server/input.js +18 -8
  95. package/lib/server/instrumentation.js +0 -4
  96. package/lib/server/isomorphic/utilityScriptSerializers.js +19 -5
  97. package/lib/server/javascript.js +3 -2
  98. package/lib/server/launchApp.js +3 -2
  99. package/lib/server/network.js +14 -4
  100. package/lib/server/page.js +75 -46
  101. package/lib/server/playwright.js +5 -2
  102. package/lib/server/recorder/codeGenerator.js +2 -1
  103. package/lib/server/recorder/contextRecorder.js +316 -0
  104. package/lib/server/recorder/csharp.js +2 -1
  105. package/lib/server/recorder/java.js +2 -1
  106. package/lib/server/recorder/javascript.js +2 -1
  107. package/lib/server/recorder/jsonl.js +2 -1
  108. package/lib/server/recorder/language.js +2 -1
  109. package/lib/server/recorder/python.js +2 -1
  110. package/lib/server/recorder/recorderApp.js +14 -5
  111. package/lib/server/recorder/recorderCollection.js +127 -0
  112. package/lib/server/recorder/recorderRunner.js +177 -0
  113. package/lib/server/recorder/recorderUtils.js +23 -0
  114. package/lib/server/recorder/throttledFile.js +46 -0
  115. package/lib/server/recorder/utils.js +2 -1
  116. package/lib/server/recorder.js +42 -418
  117. package/lib/server/registry/index.js +99 -100
  118. package/lib/server/registry/nativeDeps.js +107 -0
  119. package/lib/server/screenshotter.js +6 -12
  120. package/lib/server/socksClientCertificatesInterceptor.js +328 -0
  121. package/lib/server/trace/recorder/snapshotter.js +4 -1
  122. package/lib/server/trace/recorder/tracing.js +27 -96
  123. package/lib/server/trace/viewer/traceViewer.js +54 -67
  124. package/lib/server/transport.js +1 -1
  125. package/lib/server/webkit/webkit.js +5 -5
  126. package/lib/server/webkit/wkBrowser.js +14 -14
  127. package/lib/server/webkit/wkConnection.js +3 -3
  128. package/lib/server/webkit/wkInterceptableRequest.js +8 -4
  129. package/lib/server/webkit/wkPage.js +52 -34
  130. package/lib/server/webkit/wkProvisionalPage.js +36 -1
  131. package/lib/utils/crypto.js +141 -0
  132. package/lib/utils/debugLogger.js +2 -0
  133. package/lib/utils/env.js +4 -2
  134. package/lib/utils/expectUtils.js +33 -0
  135. package/lib/utils/fileUtils.js +140 -1
  136. package/lib/utils/glob.js +2 -1
  137. package/lib/utils/happy-eyeballs.js +29 -2
  138. package/lib/utils/hostPlatform.js +13 -4
  139. package/lib/utils/httpServer.js +54 -13
  140. package/lib/utils/index.js +53 -31
  141. package/lib/utils/isomorphic/cssTokenizer.js +1 -1
  142. package/lib/utils/isomorphic/locatorParser.js +1 -1
  143. package/lib/utils/isomorphic/mimeType.js +29 -0
  144. package/lib/utils/isomorphic/stringUtils.js +28 -1
  145. package/lib/utils/isomorphic/urlMatch.js +120 -0
  146. package/lib/utils/mimeType.js +2 -1
  147. package/lib/utils/network.js +7 -35
  148. package/lib/utils/stackTrace.js +2 -4
  149. package/lib/utils/timeoutRunner.js +11 -76
  150. package/lib/utils/zones.js +23 -60
  151. package/lib/utilsBundle.js +2 -1
  152. package/lib/utilsBundleImpl/index.js +33 -31
  153. package/lib/vite/htmlReport/index.html +12 -12
  154. package/lib/vite/recorder/assets/codeMirrorModule-C-fQ5QZD.js +24 -0
  155. package/lib/vite/recorder/assets/{codicon-zGuYmc9o.ttf → codicon-DCmgc-ay.ttf} +0 -0
  156. package/lib/vite/recorder/assets/index-B-MT5gKo.css +1 -0
  157. package/lib/vite/recorder/assets/index-D-5S5PPN.js +47 -0
  158. package/lib/vite/recorder/index.html +2 -2
  159. package/lib/vite/traceViewer/assets/codeMirrorModule-5yiV-3wl.js +16831 -0
  160. package/lib/vite/traceViewer/assets/codeMirrorModule-B7Z3vq11.js +24 -0
  161. package/lib/vite/traceViewer/assets/codeMirrorModule-C6p3E9Zg.js +24 -0
  162. package/lib/vite/traceViewer/assets/codeMirrorModule-CqYUz5ms.js +24 -0
  163. package/lib/vite/traceViewer/assets/codeMirrorModule-Dx6AXgMV.js +16838 -0
  164. package/lib/vite/traceViewer/assets/codeMirrorModule-T_sdMrbM.js +24 -0
  165. package/lib/vite/traceViewer/assets/codeMirrorModule-V7N6ppkd.js +15585 -0
  166. package/lib/vite/traceViewer/assets/testServerConnection-D-tXL3sj.js +224 -0
  167. package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +1 -0
  168. package/lib/vite/traceViewer/assets/workbench-Bjkiwcr1.js +19119 -0
  169. package/lib/vite/traceViewer/assets/workbench-C43LWZEX.js +72 -0
  170. package/lib/vite/traceViewer/assets/workbench-C5OQh9VX.js +19119 -0
  171. package/lib/vite/traceViewer/assets/workbench-DrQjKdyE.js +72 -0
  172. package/lib/vite/traceViewer/assets/workbench-caTaZnzx.js +72 -0
  173. package/lib/vite/traceViewer/assets/workbench-u2lRPMOT.js +72 -0
  174. package/lib/vite/traceViewer/assets/wsPort-EUvw-dwH.js +18540 -0
  175. package/lib/vite/traceViewer/assets/xtermModule-CZ7sDYXB.js +6529 -0
  176. package/lib/vite/traceViewer/assets/xtermModule-_6TC5FYT.js +6529 -0
  177. package/lib/vite/traceViewer/codeMirrorModule.Cy8X9Wtw.css +344 -0
  178. package/lib/vite/traceViewer/codeMirrorModule.svF_VrcJ.css +344 -0
  179. package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
  180. package/lib/vite/traceViewer/embedded.BQq6Psnz.js +104 -0
  181. package/lib/vite/traceViewer/embedded.BVDVQOzc.js +2 -0
  182. package/lib/vite/traceViewer/embedded.Bn8Ptzv6.js +2 -0
  183. package/lib/vite/traceViewer/embedded.CvhnUgIi.js +2 -0
  184. package/lib/vite/traceViewer/embedded.D27cnKiB.js +104 -0
  185. package/lib/vite/traceViewer/embedded.DPqrDeET.js +2 -0
  186. package/lib/vite/traceViewer/embedded.DjZq4InJ.css +68 -0
  187. package/lib/vite/traceViewer/embedded.html +16 -0
  188. package/lib/vite/traceViewer/embedded.w7WN2u1R.css +1 -0
  189. package/lib/vite/traceViewer/index.5mge2rY_.css +124 -0
  190. package/lib/vite/traceViewer/index.6KJ-JQ0L.js +180 -0
  191. package/lib/vite/traceViewer/index.B8dgQwuN.js +2 -0
  192. package/lib/vite/traceViewer/index.BGj8jY3H.js +2 -0
  193. package/lib/vite/traceViewer/index.C0EgJ4oW.js +195 -0
  194. package/lib/vite/traceViewer/index.CUpI-BFe.js +195 -0
  195. package/lib/vite/traceViewer/{index.-g_5lMbJ.css → index.CrbWWHbf.css} +1 -1
  196. package/lib/vite/traceViewer/index.QanXxRUb.css +131 -0
  197. package/lib/vite/traceViewer/index._cX8k4co.js +2 -0
  198. package/lib/vite/traceViewer/index.html +5 -4
  199. package/lib/vite/traceViewer/index.pMAN88y-.js +2 -0
  200. package/lib/vite/traceViewer/snapshot.html +1 -1
  201. package/lib/vite/traceViewer/sw.bundle.js +3 -4
  202. package/lib/vite/traceViewer/uiMode.D-tg1Oci.js +1730 -0
  203. package/lib/vite/traceViewer/uiMode.D3cNFP6u.css +1 -0
  204. package/lib/vite/traceViewer/uiMode.DKjMBMlc.js +1730 -0
  205. package/lib/vite/traceViewer/uiMode.DVWUEIHq.css +1424 -0
  206. package/lib/vite/traceViewer/uiMode.DVrL7a1K.js +10 -0
  207. package/lib/vite/traceViewer/uiMode.Dg9oJCQU.js +10 -0
  208. package/lib/vite/traceViewer/uiMode.DwZAzstF.js +10 -0
  209. package/lib/vite/traceViewer/uiMode.html +5 -4
  210. package/lib/vite/traceViewer/uiMode.iq7CyYy7.js +1490 -0
  211. package/lib/vite/traceViewer/uiMode.jY2s-9ps.js +10 -0
  212. package/lib/vite/traceViewer/uiMode.xvJHbkzl.css +1324 -0
  213. package/lib/vite/traceViewer/workbench.B3X2QtYa.css +3702 -0
  214. package/lib/vite/traceViewer/workbench.DyTpxWVb.css +1 -0
  215. package/lib/vite/traceViewer/wsPort.p5jUwABW.css +3450 -0
  216. package/lib/vite/traceViewer/xtermModule.4oRVGWQ-.css +209 -0
  217. package/lib/vite/traceViewer/xtermModule.OKEVRlkP.css +209 -0
  218. package/package.json +2 -2
  219. package/types/protocol.d.ts +960 -78
  220. package/types/structs.d.ts +1 -1
  221. package/types/types.d.ts +3083 -2448
  222. package/lib/vite/recorder/assets/codeMirrorModule-W69B4LBB.js +0 -24
  223. package/lib/vite/recorder/assets/index-Ly3PcVUb.js +0 -47
  224. package/lib/vite/recorder/assets/index-ljsTwXtJ.css +0 -1
  225. package/lib/vite/traceViewer/assets/codeMirrorModule-0bpaqixv.js +0 -24
  226. package/lib/vite/traceViewer/assets/codeMirrorModule-wLpsbIhd.js +0 -24
  227. package/lib/vite/traceViewer/assets/wsPort-_JBDEilC.js +0 -69
  228. package/lib/vite/traceViewer/assets/wsPort-f2dAQL4I.js +0 -69
  229. package/lib/vite/traceViewer/index.-_8-eHEE.js +0 -2
  230. package/lib/vite/traceViewer/index.u51inEcm.js +0 -2
  231. package/lib/vite/traceViewer/uiMode.9CwNsWc6.js +0 -10
  232. package/lib/vite/traceViewer/uiMode.Fb0bNA4H.js +0 -10
  233. package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +0 -1
  234. package/lib/vite/traceViewer/wsPort.zR1WIy9-.css +0 -1
  235. /package/lib/vite/recorder/assets/{codeMirrorModule-Hs9-1ZG4.css → codeMirrorModule-ez37Vkbh.css} +0 -0
  236. /package/lib/vite/traceViewer/assets/{xtermModule-Yt6xwiJ_.js → xtermModule-BeNbaIVa.js} +0 -0
  237. /package/lib/vite/traceViewer/{codeMirrorModule.Hs9-1ZG4.css → codeMirrorModule.ez37Vkbh.css} +0 -0
  238. /package/lib/vite/traceViewer/{xtermModule.0lwXJFHT.css → xtermModule.DSXBckUd.css} +0 -0
@@ -5,27 +5,13 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.Recorder = void 0;
7
7
  var fs = _interopRequireWildcard(require("fs"));
8
- var _codeGenerator = require("./recorder/codeGenerator");
9
- var _utils = require("./recorder/utils");
10
- var _page = require("./page");
11
- var _frames = require("./frames");
12
- var _browserContext = require("./browserContext");
13
- var _java = require("./recorder/java");
14
- var _javascript = require("./recorder/javascript");
15
- var _jsonl = require("./recorder/jsonl");
16
- var _csharp = require("./recorder/csharp");
17
- var _python = require("./recorder/python");
18
- var recorderSource = _interopRequireWildcard(require("../generated/recorderSource"));
19
8
  var consoleApiSource = _interopRequireWildcard(require("../generated/consoleApiSource"));
20
- var _recorderApp = require("./recorder/recorderApp");
21
- var _utils2 = require("../utils");
22
- var _recorderUtils = require("./recorder/recorderUtils");
23
- var _debugger = require("./debugger");
24
- var _events = require("events");
25
- var _timeoutRunner = require("../utils/timeoutRunner");
9
+ var _utils = require("../utils");
26
10
  var _locatorParser = require("../utils/isomorphic/locatorParser");
27
- var _stringUtils = require("../utils/isomorphic/stringUtils");
28
- var _eventsHelper = require("./../utils/eventsHelper");
11
+ var _browserContext = require("./browserContext");
12
+ var _debugger = require("./debugger");
13
+ var _contextRecorder = require("./recorder/contextRecorder");
14
+ var _recorderUtils = require("./recorder/recorderUtils");
29
15
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
30
16
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
31
17
  /**
@@ -46,23 +32,25 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
46
32
 
47
33
  const recorderSymbol = Symbol('recorderSymbol');
48
34
  class Recorder {
49
- static setAppFactory(recorderAppFactory) {
50
- Recorder.recorderAppFactory = recorderAppFactory;
51
- }
52
- static showInspector(context) {
35
+ static showInspector(context, recorderAppFactory) {
53
36
  const params = {};
54
- if ((0, _utils2.isUnderTest)()) params.language = process.env.TEST_INSPECTOR_LANGUAGE;
55
- Recorder.show(context, params).catch(() => {});
37
+ if ((0, _utils.isUnderTest)()) params.language = process.env.TEST_INSPECTOR_LANGUAGE;
38
+ Recorder.show(context, recorderAppFactory, params).catch(() => {});
56
39
  }
57
- static show(context, params = {}) {
40
+ static show(context, recorderAppFactory, params = {}) {
58
41
  let recorderPromise = context[recorderSymbol];
59
42
  if (!recorderPromise) {
60
- const recorder = new Recorder(context, params);
61
- recorderPromise = recorder.install().then(() => recorder);
43
+ recorderPromise = Recorder._create(context, recorderAppFactory, params);
62
44
  context[recorderSymbol] = recorderPromise;
63
45
  }
64
46
  return recorderPromise;
65
47
  }
48
+ static async _create(context, recorderAppFactory, params = {}) {
49
+ const recorder = new Recorder(context, params);
50
+ const recorderApp = await recorderAppFactory(recorder);
51
+ await recorder._install(recorderApp);
52
+ return recorder;
53
+ }
66
54
  constructor(context, params) {
67
55
  this._context = void 0;
68
56
  this._mode = void 0;
@@ -76,28 +64,21 @@ class Recorder {
76
64
  this._userSources = new Map();
77
65
  this._debugger = void 0;
78
66
  this._contextRecorder = void 0;
79
- this._handleSIGINT = void 0;
80
67
  this._omitCallTracking = false;
81
68
  this._currentLanguage = void 0;
82
69
  this._mode = params.mode || 'none';
83
- this._contextRecorder = new ContextRecorder(context, params);
70
+ this._contextRecorder = new _contextRecorder.ContextRecorder(context, params, {});
84
71
  this._context = context;
85
72
  this._omitCallTracking = !!params.omitCallTracking;
86
73
  this._debugger = context.debugger();
87
- this._handleSIGINT = params.handleSIGINT;
88
74
  context.instrumentation.addListener(this, context);
89
75
  this._currentLanguage = this._contextRecorder.languageName();
90
- if ((0, _utils2.isUnderTest)()) {
76
+ if ((0, _utils.isUnderTest)()) {
91
77
  // Most of our tests put elements at the top left, so get out of the way.
92
78
  this._overlayState.offsetX = 200;
93
79
  }
94
80
  }
95
- static async defaultRecorderAppFactory(recorder) {
96
- if (process.env.PW_CODEGEN_NO_INSPECTOR) return new _recorderApp.EmptyRecorderApp();
97
- return await _recorderApp.RecorderApp.open(recorder, recorder._context, recorder._handleSIGINT);
98
- }
99
- async install() {
100
- const recorderApp = await (Recorder.recorderAppFactory || Recorder.defaultRecorderAppFactory)(this);
81
+ async _install(recorderApp) {
101
82
  this._recorderApp = recorderApp;
102
83
  recorderApp.once('close', () => {
103
84
  this._debugger.resume(false);
@@ -136,15 +117,16 @@ class Recorder {
136
117
  });
137
118
  await Promise.all([recorderApp.setMode(this._mode), recorderApp.setPaused(this._debugger.isPaused()), this._pushAllSources()]);
138
119
  this._context.once(_browserContext.BrowserContext.Events.Close, () => {
120
+ var _this$_recorderApp;
139
121
  this._contextRecorder.dispose();
140
122
  this._context.instrumentation.removeListener(this);
141
- recorderApp.close().catch(() => {});
123
+ (_this$_recorderApp = this._recorderApp) === null || _this$_recorderApp === void 0 || _this$_recorderApp.close().catch(() => {});
142
124
  });
143
- this._contextRecorder.on(ContextRecorder.Events.Change, data => {
144
- var _this$_recorderApp;
125
+ this._contextRecorder.on(_contextRecorder.ContextRecorder.Events.Change, data => {
126
+ var _this$_recorderApp2;
145
127
  this._recorderSources = data.sources;
146
128
  this._pushAllSources();
147
- (_this$_recorderApp = this._recorderApp) === null || _this$_recorderApp === void 0 || _this$_recorderApp.setFileIfNeeded(data.primaryFileName);
129
+ (_this$_recorderApp2 = this._recorderApp) === null || _this$_recorderApp2 === void 0 || _this$_recorderApp2.setFileIfNeeded(data.primaryFileName);
148
130
  });
149
131
  await this._context.exposeBinding('__pw_recorderState', false, source => {
150
132
  let actionSelector = '';
@@ -172,16 +154,9 @@ class Recorder {
172
154
  await this._context.exposeBinding('__pw_recorderSetSelector', false, async ({
173
155
  frame
174
156
  }, selector) => {
175
- var _this$_recorderApp2;
176
- const selectorPromises = [];
177
- let currentFrame = frame;
178
- while (currentFrame) {
179
- selectorPromises.push(findFrameSelector(currentFrame));
180
- currentFrame = currentFrame.parentFrame();
181
- }
182
- const fullSelector = (await Promise.all(selectorPromises)).filter(Boolean);
183
- fullSelector.push(selector);
184
- await ((_this$_recorderApp2 = this._recorderApp) === null || _this$_recorderApp2 === void 0 ? void 0 : _this$_recorderApp2.setSelector(fullSelector.join(' >> internal:control=enter-frame >> '), true));
157
+ var _this$_recorderApp3;
158
+ const selectorChain = await (0, _contextRecorder.generateFrameSelector)(frame);
159
+ await ((_this$_recorderApp3 = this._recorderApp) === null || _this$_recorderApp3 === void 0 ? void 0 : _this$_recorderApp3.setSelector((0, _recorderUtils.buildFullSelector)(selectorChain, selector), true));
185
160
  });
186
161
  await this._context.exposeBinding('__pw_recorderSetMode', false, async ({
187
162
  frame
@@ -202,10 +177,10 @@ class Recorder {
202
177
  await this._contextRecorder.install();
203
178
  if (this._debugger.isPaused()) this._pausedStateChanged();
204
179
  this._debugger.on(_debugger.Debugger.Events.PausedStateChanged, () => this._pausedStateChanged());
205
- this._context.recorderAppForTest = recorderApp;
180
+ this._context.recorderAppForTest = this._recorderApp;
206
181
  }
207
182
  _pausedStateChanged() {
208
- var _this$_recorderApp3;
183
+ var _this$_recorderApp4;
209
184
  // If we are called upon page.pause, we don't have metadatas, populate them.
210
185
  for (const {
211
186
  metadata,
@@ -213,16 +188,16 @@ class Recorder {
213
188
  } of this._debugger.pausedDetails()) {
214
189
  if (!this._currentCallsMetadata.has(metadata)) this.onBeforeCall(sdkObject, metadata);
215
190
  }
216
- (_this$_recorderApp3 = this._recorderApp) === null || _this$_recorderApp3 === void 0 || _this$_recorderApp3.setPaused(this._debugger.isPaused());
191
+ (_this$_recorderApp4 = this._recorderApp) === null || _this$_recorderApp4 === void 0 || _this$_recorderApp4.setPaused(this._debugger.isPaused());
217
192
  this._updateUserSources();
218
193
  this.updateCallLog([...this._currentCallsMetadata.keys()]);
219
194
  }
220
195
  setMode(mode) {
221
- var _this$_recorderApp4;
196
+ var _this$_recorderApp5;
222
197
  if (this._mode === mode) return;
223
198
  this._highlightedSelector = '';
224
199
  this._mode = mode;
225
- (_this$_recorderApp4 = this._recorderApp) === null || _this$_recorderApp4 === void 0 || _this$_recorderApp4.setMode(this._mode);
200
+ (_this$_recorderApp5 = this._recorderApp) === null || _this$_recorderApp5 === void 0 || _this$_recorderApp5.setMode(this._mode);
226
201
  this._contextRecorder.setEnabled(this._mode === 'recording' || this._mode === 'assertingText' || this._mode === 'assertingVisibility' || this._mode === 'assertingValue');
227
202
  this._debugger.setMuted(this._mode === 'recording' || this._mode === 'assertingText' || this._mode === 'assertingVisibility' || this._mode === 'assertingValue');
228
203
  if (this._mode !== 'none' && this._mode !== 'standby' && this._context.pages().length === 1) this._context.pages()[0].bringToFront().catch(() => {});
@@ -256,9 +231,9 @@ class Recorder {
256
231
  if (isScreenshotCommand(metadata)) {
257
232
  this.hideHighlightedSelector();
258
233
  } else if (metadata.params && metadata.params.selector) {
259
- var _this$_recorderApp5;
234
+ var _this$_recorderApp6;
260
235
  this._highlightedSelector = metadata.params.selector;
261
- (_this$_recorderApp5 = this._recorderApp) === null || _this$_recorderApp5 === void 0 || _this$_recorderApp5.setSelector(this._highlightedSelector).catch(() => {});
236
+ (_this$_recorderApp6 = this._recorderApp) === null || _this$_recorderApp6 === void 0 || _this$_recorderApp6.setSelector(this._highlightedSelector).catch(() => {});
262
237
  }
263
238
  }
264
239
  async onAfterCall(sdkObject, metadata) {
@@ -268,7 +243,7 @@ class Recorder {
268
243
  this.updateCallLog([metadata]);
269
244
  }
270
245
  _updateUserSources() {
271
- var _this$_recorderApp6;
246
+ var _this$_recorderApp7;
272
247
  // Remove old decorations.
273
248
  for (const source of this._userSources.values()) {
274
249
  source.highlight = [];
@@ -306,18 +281,18 @@ class Recorder {
306
281
  }
307
282
  }
308
283
  this._pushAllSources();
309
- if (fileToSelect) (_this$_recorderApp6 = this._recorderApp) === null || _this$_recorderApp6 === void 0 || _this$_recorderApp6.setFileIfNeeded(fileToSelect);
284
+ if (fileToSelect) (_this$_recorderApp7 = this._recorderApp) === null || _this$_recorderApp7 === void 0 || _this$_recorderApp7.setFileIfNeeded(fileToSelect);
310
285
  }
311
286
  _pushAllSources() {
312
- var _this$_recorderApp7;
313
- (_this$_recorderApp7 = this._recorderApp) === null || _this$_recorderApp7 === void 0 || _this$_recorderApp7.setSources([...this._recorderSources, ...this._userSources.values()]);
287
+ var _this$_recorderApp8;
288
+ (_this$_recorderApp8 = this._recorderApp) === null || _this$_recorderApp8 === void 0 || _this$_recorderApp8.setSources([...this._recorderSources, ...this._userSources.values()]);
314
289
  }
315
290
  async onBeforeInputAction(sdkObject, metadata) {}
316
291
  async onCallLog(sdkObject, metadata, logName, message) {
317
292
  this.updateCallLog([metadata]);
318
293
  }
319
294
  updateCallLog(metadatas) {
320
- var _this$_recorderApp8;
295
+ var _this$_recorderApp9;
321
296
  if (this._mode === 'recording' || this._mode === 'assertingText' || this._mode === 'assertingVisibility' || this._mode === 'assertingValue') return;
322
297
  const logs = [];
323
298
  for (const metadata of metadatas) {
@@ -327,7 +302,7 @@ class Recorder {
327
302
  if (this._debugger.isPaused(metadata)) status = 'paused';
328
303
  logs.push((0, _recorderUtils.metadataToCallLog)(metadata, status));
329
304
  }
330
- (_this$_recorderApp8 = this._recorderApp) === null || _this$_recorderApp8 === void 0 || _this$_recorderApp8.updateCallLogs(logs);
305
+ (_this$_recorderApp9 = this._recorderApp) === null || _this$_recorderApp9 === void 0 || _this$_recorderApp9.updateCallLogs(logs);
331
306
  }
332
307
  _readSource(fileName) {
333
308
  try {
@@ -338,363 +313,12 @@ class Recorder {
338
313
  }
339
314
  }
340
315
  exports.Recorder = Recorder;
341
- Recorder.recorderAppFactory = void 0;
342
- class ContextRecorder extends _events.EventEmitter {
343
- constructor(context, params) {
344
- super();
345
- this._generator = void 0;
346
- this._pageAliases = new Map();
347
- this._lastPopupOrdinal = 0;
348
- this._lastDialogOrdinal = -1;
349
- this._lastDownloadOrdinal = -1;
350
- this._timers = new Set();
351
- this._context = void 0;
352
- this._params = void 0;
353
- this._recorderSources = void 0;
354
- this._throttledOutputFile = null;
355
- this._orderedLanguages = [];
356
- this._listeners = [];
357
- this._context = context;
358
- this._params = params;
359
- this._recorderSources = [];
360
- const language = params.language || context.attribution.playwright.options.sdkLanguage;
361
- this.setOutput(language, params.outputFile);
362
- const generator = new _codeGenerator.CodeGenerator(context._browser.options.name, params.mode === 'recording', params.launchOptions || {}, params.contextOptions || {}, params.device, params.saveStorage);
363
- generator.on('change', () => {
364
- this._recorderSources = [];
365
- for (const languageGenerator of this._orderedLanguages) {
366
- var _this$_throttledOutpu;
367
- const {
368
- header,
369
- footer,
370
- actions,
371
- text
372
- } = generator.generateStructure(languageGenerator);
373
- const source = {
374
- isRecorded: true,
375
- label: languageGenerator.name,
376
- group: languageGenerator.groupName,
377
- id: languageGenerator.id,
378
- text,
379
- header,
380
- footer,
381
- actions,
382
- language: languageGenerator.highlighter,
383
- highlight: []
384
- };
385
- source.revealLine = text.split('\n').length - 1;
386
- this._recorderSources.push(source);
387
- if (languageGenerator === this._orderedLanguages[0]) (_this$_throttledOutpu = this._throttledOutputFile) === null || _this$_throttledOutpu === void 0 || _this$_throttledOutpu.setContent(source.text);
388
- }
389
- this.emit(ContextRecorder.Events.Change, {
390
- sources: this._recorderSources,
391
- primaryFileName: this._orderedLanguages[0].id
392
- });
393
- });
394
- context.on(_browserContext.BrowserContext.Events.BeforeClose, () => {
395
- var _this$_throttledOutpu2;
396
- (_this$_throttledOutpu2 = this._throttledOutputFile) === null || _this$_throttledOutpu2 === void 0 || _this$_throttledOutpu2.flush();
397
- });
398
- this._listeners.push(_eventsHelper.eventsHelper.addEventListener(process, 'exit', () => {
399
- var _this$_throttledOutpu3;
400
- (_this$_throttledOutpu3 = this._throttledOutputFile) === null || _this$_throttledOutpu3 === void 0 || _this$_throttledOutpu3.flush();
401
- }));
402
- this._generator = generator;
403
- }
404
- setOutput(codegenId, outputFile) {
405
- var _this$_generator;
406
- const languages = new Set([new _java.JavaLanguageGenerator('junit'), new _java.JavaLanguageGenerator('library'), new _javascript.JavaScriptLanguageGenerator( /* isPlaywrightTest */false), new _javascript.JavaScriptLanguageGenerator( /* isPlaywrightTest */true), new _python.PythonLanguageGenerator( /* isAsync */false, /* isPytest */true), new _python.PythonLanguageGenerator( /* isAsync */false, /* isPytest */false), new _python.PythonLanguageGenerator( /* isAsync */true, /* isPytest */false), new _csharp.CSharpLanguageGenerator('mstest'), new _csharp.CSharpLanguageGenerator('nunit'), new _csharp.CSharpLanguageGenerator('library'), new _jsonl.JsonlLanguageGenerator()]);
407
- const primaryLanguage = [...languages].find(l => l.id === codegenId);
408
- if (!primaryLanguage) throw new Error(`\n===============================\nUnsupported language: '${codegenId}'\n===============================\n`);
409
- languages.delete(primaryLanguage);
410
- this._orderedLanguages = [primaryLanguage, ...languages];
411
- this._throttledOutputFile = outputFile ? new ThrottledFile(outputFile) : null;
412
- (_this$_generator = this._generator) === null || _this$_generator === void 0 || _this$_generator.restart();
413
- }
414
- languageName(id) {
415
- for (const lang of this._orderedLanguages) {
416
- if (!id || lang.id === id) return lang.highlighter;
417
- }
418
- return 'javascript';
419
- }
420
- async install() {
421
- this._context.on(_browserContext.BrowserContext.Events.Page, page => this._onPage(page));
422
- for (const page of this._context.pages()) this._onPage(page);
423
- this._context.on(_browserContext.BrowserContext.Events.Dialog, dialog => this._onDialog(dialog.page()));
424
-
425
- // Input actions that potentially lead to navigation are intercepted on the page and are
426
- // performed by the Playwright.
427
- await this._context.exposeBinding('__pw_recorderPerformAction', false, (source, action) => this._performAction(source.frame, action));
428
-
429
- // Other non-essential actions are simply being recorded.
430
- await this._context.exposeBinding('__pw_recorderRecordAction', false, (source, action) => this._recordAction(source.frame, action));
431
- await this._context.extendInjectedScript(recorderSource.source);
432
- }
433
- setEnabled(enabled) {
434
- this._generator.setEnabled(enabled);
435
- }
436
- dispose() {
437
- for (const timer of this._timers) clearTimeout(timer);
438
- this._timers.clear();
439
- _eventsHelper.eventsHelper.removeEventListeners(this._listeners);
440
- }
441
- async _onPage(page) {
442
- // First page is called page, others are called popup1, popup2, etc.
443
- const frame = page.mainFrame();
444
- page.on('close', () => {
445
- this._generator.addAction({
446
- frame: this._describeMainFrame(page),
447
- committed: true,
448
- action: {
449
- name: 'closePage',
450
- signals: []
451
- }
452
- });
453
- this._pageAliases.delete(page);
454
- });
455
- frame.on(_frames.Frame.Events.InternalNavigation, event => {
456
- if (event.isPublic) this._onFrameNavigated(frame, page);
457
- });
458
- page.on(_page.Page.Events.Download, () => this._onDownload(page));
459
- const suffix = this._pageAliases.size ? String(++this._lastPopupOrdinal) : '';
460
- const pageAlias = 'page' + suffix;
461
- this._pageAliases.set(page, pageAlias);
462
- if (page.opener()) {
463
- this._onPopup(page.opener(), page);
464
- } else {
465
- this._generator.addAction({
466
- frame: this._describeMainFrame(page),
467
- committed: true,
468
- action: {
469
- name: 'openPage',
470
- url: page.mainFrame().url(),
471
- signals: []
472
- }
473
- });
474
- }
475
- }
476
- clearScript() {
477
- this._generator.restart();
478
- if (this._params.mode === 'recording') {
479
- for (const page of this._context.pages()) this._onFrameNavigated(page.mainFrame(), page);
480
- }
481
- }
482
- _describeMainFrame(page) {
483
- return {
484
- pageAlias: this._pageAliases.get(page),
485
- isMainFrame: true
486
- };
487
- }
488
- async _describeFrame(frame) {
489
- const page = frame._page;
490
- const pageAlias = this._pageAliases.get(page);
491
- const chain = [];
492
- for (let ancestor = frame; ancestor; ancestor = ancestor.parentFrame()) chain.push(ancestor);
493
- chain.reverse();
494
- if (chain.length === 1) return this._describeMainFrame(page);
495
- const selectorPromises = [];
496
- for (let i = 0; i < chain.length - 1; i++) selectorPromises.push(findFrameSelector(chain[i + 1]));
497
- const result = await (0, _timeoutRunner.raceAgainstDeadline)(() => Promise.all(selectorPromises), (0, _utils2.monotonicTime)() + 2000);
498
- if (!result.timedOut && result.result.every(selector => !!selector)) {
499
- return {
500
- pageAlias,
501
- isMainFrame: false,
502
- selectorsChain: result.result
503
- };
504
- }
505
- // Best effort to find a selector for the frame.
506
- const selectorsChain = [];
507
- for (let i = 0; i < chain.length - 1; i++) {
508
- if (chain[i].name()) selectorsChain.push(`iframe[name=${(0, _stringUtils.quoteCSSAttributeValue)(chain[i].name())}]`);else selectorsChain.push(`iframe[src=${(0, _stringUtils.quoteCSSAttributeValue)(chain[i].url())}]`);
509
- }
510
- return {
511
- pageAlias,
512
- isMainFrame: false,
513
- selectorsChain
514
- };
515
- }
516
- testIdAttributeName() {
517
- return this._params.testIdAttributeName || this._context.selectors().testIdAttributeName() || 'data-testid';
518
- }
519
- async _performAction(frame, action) {
520
- // Commit last action so that no further signals are added to it.
521
- this._generator.commitLastAction();
522
- const frameDescription = await this._describeFrame(frame);
523
- const actionInContext = {
524
- frame: frameDescription,
525
- action
526
- };
527
- const perform = async (action, params, cb) => {
528
- const callMetadata = {
529
- id: `call@${(0, _utils2.createGuid)()}`,
530
- apiName: 'frame.' + action,
531
- objectId: frame.guid,
532
- pageId: frame._page.guid,
533
- frameId: frame.guid,
534
- startTime: (0, _utils2.monotonicTime)(),
535
- endTime: 0,
536
- wallTime: Date.now(),
537
- type: 'Frame',
538
- method: action,
539
- params,
540
- log: []
541
- };
542
- this._generator.willPerformAction(actionInContext);
543
- try {
544
- await frame.instrumentation.onBeforeCall(frame, callMetadata);
545
- await cb(callMetadata);
546
- } catch (e) {
547
- callMetadata.endTime = (0, _utils2.monotonicTime)();
548
- await frame.instrumentation.onAfterCall(frame, callMetadata);
549
- this._generator.performedActionFailed(actionInContext);
550
- return;
551
- }
552
- callMetadata.endTime = (0, _utils2.monotonicTime)();
553
- await frame.instrumentation.onAfterCall(frame, callMetadata);
554
- const timer = setTimeout(() => {
555
- // Commit the action after 5 seconds so that no further signals are added to it.
556
- actionInContext.committed = true;
557
- this._timers.delete(timer);
558
- }, 5000);
559
- this._generator.didPerformAction(actionInContext);
560
- this._timers.add(timer);
561
- };
562
- const kActionTimeout = 5000;
563
- if (action.name === 'click') {
564
- const {
565
- options
566
- } = (0, _utils.toClickOptions)(action);
567
- await perform('click', {
568
- selector: action.selector
569
- }, callMetadata => frame.click(callMetadata, action.selector, {
570
- ...options,
571
- timeout: kActionTimeout,
572
- strict: true
573
- }));
574
- }
575
- if (action.name === 'press') {
576
- const modifiers = (0, _utils.toModifiers)(action.modifiers);
577
- const shortcut = [...modifiers, action.key].join('+');
578
- await perform('press', {
579
- selector: action.selector,
580
- key: shortcut
581
- }, callMetadata => frame.press(callMetadata, action.selector, shortcut, {
582
- timeout: kActionTimeout,
583
- strict: true
584
- }));
585
- }
586
- if (action.name === 'check') await perform('check', {
587
- selector: action.selector
588
- }, callMetadata => frame.check(callMetadata, action.selector, {
589
- timeout: kActionTimeout,
590
- strict: true
591
- }));
592
- if (action.name === 'uncheck') await perform('uncheck', {
593
- selector: action.selector
594
- }, callMetadata => frame.uncheck(callMetadata, action.selector, {
595
- timeout: kActionTimeout,
596
- strict: true
597
- }));
598
- if (action.name === 'select') {
599
- const values = action.options.map(value => ({
600
- value
601
- }));
602
- await perform('selectOption', {
603
- selector: action.selector,
604
- values
605
- }, callMetadata => frame.selectOption(callMetadata, action.selector, [], values, {
606
- timeout: kActionTimeout,
607
- strict: true
608
- }));
609
- }
610
- }
611
- async _recordAction(frame, action) {
612
- // Commit last action so that no further signals are added to it.
613
- this._generator.commitLastAction();
614
- const frameDescription = await this._describeFrame(frame);
615
- const actionInContext = {
616
- frame: frameDescription,
617
- action
618
- };
619
- this._generator.addAction(actionInContext);
620
- }
621
- _onFrameNavigated(frame, page) {
622
- const pageAlias = this._pageAliases.get(page);
623
- this._generator.signal(pageAlias, frame, {
624
- name: 'navigation',
625
- url: frame.url()
626
- });
627
- }
628
- _onPopup(page, popup) {
629
- const pageAlias = this._pageAliases.get(page);
630
- const popupAlias = this._pageAliases.get(popup);
631
- this._generator.signal(pageAlias, page.mainFrame(), {
632
- name: 'popup',
633
- popupAlias
634
- });
635
- }
636
- _onDownload(page) {
637
- const pageAlias = this._pageAliases.get(page);
638
- ++this._lastDownloadOrdinal;
639
- this._generator.signal(pageAlias, page.mainFrame(), {
640
- name: 'download',
641
- downloadAlias: this._lastDownloadOrdinal ? String(this._lastDownloadOrdinal) : ''
642
- });
643
- }
644
- _onDialog(page) {
645
- const pageAlias = this._pageAliases.get(page);
646
- ++this._lastDialogOrdinal;
647
- this._generator.signal(pageAlias, page.mainFrame(), {
648
- name: 'dialog',
649
- dialogAlias: this._lastDialogOrdinal ? String(this._lastDialogOrdinal) : ''
650
- });
651
- }
316
+ function isScreenshotCommand(metadata) {
317
+ return metadata.method.toLowerCase().includes('screenshot');
652
318
  }
653
- ContextRecorder.Events = {
654
- Change: 'change'
655
- };
656
319
  function languageForFile(file) {
657
320
  if (file.endsWith('.py')) return 'python';
658
321
  if (file.endsWith('.java')) return 'java';
659
322
  if (file.endsWith('.cs')) return 'csharp';
660
323
  return 'javascript';
661
- }
662
- class ThrottledFile {
663
- constructor(file) {
664
- this._file = void 0;
665
- this._timer = void 0;
666
- this._text = void 0;
667
- this._file = file;
668
- }
669
- setContent(text) {
670
- this._text = text;
671
- if (!this._timer) this._timer = setTimeout(() => this.flush(), 250);
672
- }
673
- flush() {
674
- if (this._timer) {
675
- clearTimeout(this._timer);
676
- this._timer = undefined;
677
- }
678
- if (this._text) fs.writeFileSync(this._file, this._text);
679
- this._text = undefined;
680
- }
681
- }
682
- function isScreenshotCommand(metadata) {
683
- return metadata.method.toLowerCase().includes('screenshot');
684
- }
685
- async function findFrameSelector(frame) {
686
- try {
687
- const parent = frame.parentFrame();
688
- const frameElement = await frame.frameElement();
689
- if (!frameElement || !parent) return;
690
- const utility = await parent._utilityContext();
691
- const injected = await utility.injectedScript();
692
- const selector = await injected.evaluate((injected, element) => {
693
- return injected.generateSelectorSimple(element, {
694
- testIdAttributeName: '',
695
- omitInternalEngines: true
696
- });
697
- }, frameElement);
698
- return selector;
699
- } catch (e) {}
700
324
  }