@checkly/playwright-core 1.47.20-alpha → 1.48.10-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 (167) 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 +22 -12
  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 +79 -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 +15 -9
  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 +28 -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-CND2fZ5Q.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-CEc83sSS.js} +10 -15
  98. package/lib/vite/recorder/index.html +2 -2
  99. package/lib/vite/traceViewer/assets/codeMirrorModule-BdBhzV6t.js +16443 -0
  100. package/lib/vite/traceViewer/assets/codeMirrorModule-BqcXH1AO.js +16838 -0
  101. package/lib/vite/traceViewer/assets/codeMirrorModule-Ca-1BNel.js +24 -0
  102. package/lib/vite/traceViewer/assets/codeMirrorModule-CcviAl53.js +16831 -0
  103. package/lib/vite/traceViewer/assets/codeMirrorModule-DS3v0XrQ.js +24 -0
  104. package/lib/vite/traceViewer/assets/codeMirrorModule-EhKN7Okm.js +16449 -0
  105. package/lib/vite/{recorder/assets/codeMirrorModule-C-fQ5QZD.js → traceViewer/assets/codeMirrorModule-MzSmL4X2.js} +1 -1
  106. package/lib/vite/traceViewer/assets/codeMirrorModule-U6XMqGkV.js +16437 -0
  107. package/lib/vite/traceViewer/assets/inspectorTab-BABZNwlH.js +17351 -0
  108. package/lib/vite/traceViewer/assets/inspectorTab-BPzVEZSf.js +17351 -0
  109. package/lib/vite/traceViewer/assets/inspectorTab-Bbgq0hgt.js +64 -0
  110. package/lib/vite/traceViewer/assets/inspectorTab-DhBbZz8I.js +64 -0
  111. package/lib/vite/traceViewer/assets/inspectorTab-DpvLVMq5.js +17351 -0
  112. package/lib/vite/traceViewer/assets/workbench-B13nfocr.js +9 -0
  113. package/lib/vite/traceViewer/assets/workbench-BcgGQnKb.js +1473 -0
  114. package/lib/vite/traceViewer/assets/workbench-BwodYCgl.js +19119 -0
  115. package/lib/vite/traceViewer/assets/workbench-ByyWxoT8.js +1473 -0
  116. package/lib/vite/traceViewer/assets/workbench-Crj6jzdv.js +19119 -0
  117. package/lib/vite/traceViewer/assets/workbench-DhqI6jeL.js +1473 -0
  118. package/lib/vite/traceViewer/assets/workbench-Pa1v1Ojh.js +72 -0
  119. package/lib/vite/traceViewer/assets/workbench-gtYcQBNA.js +9 -0
  120. package/lib/vite/traceViewer/assets/xtermModule-DZP0glxx.js +5982 -0
  121. package/lib/vite/traceViewer/embedded.27BGR_eD.js +105 -0
  122. package/lib/vite/traceViewer/embedded.BBZ9gQEw.js +104 -0
  123. package/lib/vite/traceViewer/embedded.CorI3dFX.js +104 -0
  124. package/lib/vite/traceViewer/embedded.D4lqGydT.js +2 -0
  125. package/lib/vite/traceViewer/embedded.DTjd2aiy.js +105 -0
  126. package/lib/vite/traceViewer/embedded.DbzY7Q8w.js +2 -0
  127. package/lib/vite/traceViewer/embedded.SsjKHrxC.js +105 -0
  128. package/lib/vite/traceViewer/embedded.f-PLGsBT.js +2 -0
  129. package/lib/vite/traceViewer/embedded.html +5 -3
  130. package/lib/vite/traceViewer/index.B7aiTMfZ.js +2 -0
  131. package/lib/vite/traceViewer/index.BSak5QT9.js +2 -0
  132. package/lib/vite/traceViewer/index.BrT2kfuc.js +2 -0
  133. package/lib/vite/traceViewer/index.DkRbtWVo.js +195 -0
  134. package/lib/vite/traceViewer/index.DsjmhbB6.js +195 -0
  135. package/lib/vite/traceViewer/index.Dz3icWJV.js +196 -0
  136. package/lib/vite/traceViewer/index.PqcsvBxQ.js +196 -0
  137. package/lib/vite/traceViewer/index.html +5 -3
  138. package/lib/vite/traceViewer/index.yxAwzeWG.js +196 -0
  139. package/lib/vite/traceViewer/inspectorTab.DGJWXOSd.css +3145 -0
  140. package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +1 -0
  141. package/lib/vite/traceViewer/recorder.7Wl6HrQl.js +550 -0
  142. package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
  143. package/lib/vite/traceViewer/recorder.BufKu9Hp.js +550 -0
  144. package/lib/vite/traceViewer/recorder.Ch-WHviK.js +2 -0
  145. package/lib/vite/traceViewer/recorder.DBDpiNOK.css +15 -0
  146. package/lib/vite/traceViewer/recorder.POd-toIn.js +2 -0
  147. package/lib/vite/traceViewer/recorder.am-MV-DQ.js +550 -0
  148. package/lib/vite/traceViewer/recorder.html +17 -0
  149. package/lib/vite/traceViewer/sw.bundle.js +3 -3
  150. package/lib/vite/traceViewer/uiMode.BEZVCe5O.js +5 -0
  151. package/lib/vite/traceViewer/uiMode.BZoFj6zV.js +1723 -0
  152. package/lib/vite/traceViewer/uiMode.C4nbcio6.js +1730 -0
  153. package/lib/vite/traceViewer/uiMode.CAYqod-m.css +1 -0
  154. package/lib/vite/traceViewer/uiMode.DRmgrHSk.css +1462 -0
  155. package/lib/vite/traceViewer/uiMode.DdtUZZVS.js +5 -0
  156. package/lib/vite/traceViewer/uiMode.Dlo9s_YX.js +1723 -0
  157. package/lib/vite/traceViewer/uiMode.O07awP3T.js +10 -0
  158. package/lib/vite/traceViewer/uiMode.gGHHTsyL.js +1730 -0
  159. package/lib/vite/traceViewer/uiMode.html +6 -4
  160. package/lib/vite/traceViewer/uiMode.wsGnVMQK.js +1723 -0
  161. package/lib/vite/traceViewer/workbench.BQNDbcQ0.css +550 -0
  162. package/lib/vite/traceViewer/workbench.DjbIuxix.css +1 -0
  163. package/lib/vite/traceViewer/workbench.DlsCx8k5.css +1 -0
  164. package/lib/vite/traceViewer/workbench.wuxQoE2z.css +3703 -0
  165. package/package.json +1 -1
  166. package/types/protocol.d.ts +610 -173
  167. package/types/types.d.ts +2037 -949
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RecorderInTraceViewer = void 0;
7
+ var _path = _interopRequireDefault(require("path"));
8
+ var _events = require("events");
9
+ var _traceViewer = require("../trace/viewer/traceViewer");
10
+ var _manualPromise = require("../../utils/manualPromise");
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ /**
13
+ * Copyright (c) Microsoft Corporation.
14
+ *
15
+ * Licensed under the Apache License, Version 2.0 (the "License");
16
+ * you may not use this file except in compliance with the License.
17
+ * You may obtain a copy of the License at
18
+ *
19
+ * http://www.apache.org/licenses/LICENSE-2.0
20
+ *
21
+ * Unless required by applicable law or agreed to in writing, software
22
+ * distributed under the License is distributed on an "AS IS" BASIS,
23
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24
+ * See the License for the specific language governing permissions and
25
+ * limitations under the License.
26
+ */
27
+
28
+ class RecorderInTraceViewer extends _events.EventEmitter {
29
+ static factory(context) {
30
+ return async recorder => {
31
+ const transport = new RecorderTransport();
32
+ const trace = _path.default.join(context._browser.options.tracesDir, 'trace');
33
+ const {
34
+ wsEndpointForTest,
35
+ tracePage,
36
+ traceServer
37
+ } = await openApp(trace, {
38
+ transport,
39
+ headless: !context._browser.options.headful
40
+ });
41
+ return new RecorderInTraceViewer(transport, tracePage, traceServer, wsEndpointForTest);
42
+ };
43
+ }
44
+ constructor(transport, tracePage, traceServer, wsEndpointForTest) {
45
+ super();
46
+ this.wsEndpointForTest = void 0;
47
+ this._transport = void 0;
48
+ this._tracePage = void 0;
49
+ this._traceServer = void 0;
50
+ this._transport = transport;
51
+ this._transport.eventSink.resolve(this);
52
+ this._tracePage = tracePage;
53
+ this._traceServer = traceServer;
54
+ this.wsEndpointForTest = wsEndpointForTest;
55
+ this._tracePage.once('close', () => {
56
+ this.close();
57
+ });
58
+ }
59
+ async close() {
60
+ await this._tracePage.context().close({
61
+ reason: 'Recorder window closed'
62
+ });
63
+ await this._traceServer.stop();
64
+ }
65
+ async setPaused(paused) {
66
+ this._transport.deliverEvent('setPaused', {
67
+ paused
68
+ });
69
+ }
70
+ async setMode(mode) {
71
+ this._transport.deliverEvent('setMode', {
72
+ mode
73
+ });
74
+ }
75
+ async setRunningFile(file) {
76
+ this._transport.deliverEvent('setRunningFile', {
77
+ file
78
+ });
79
+ }
80
+ async setSelector(selector, userGesture) {
81
+ this._transport.deliverEvent('setSelector', {
82
+ selector,
83
+ userGesture
84
+ });
85
+ }
86
+ async updateCallLogs(callLogs) {
87
+ this._transport.deliverEvent('updateCallLogs', {
88
+ callLogs
89
+ });
90
+ }
91
+ async setSources(sources) {
92
+ this._transport.deliverEvent('setSources', {
93
+ sources
94
+ });
95
+ if (process.env.PWTEST_CLI_IS_UNDER_TEST && sources.length) {
96
+ if (process._didSetSourcesForTest(sources[0].text)) this.close();
97
+ }
98
+ }
99
+ async setActions(actions, sources) {
100
+ this._transport.deliverEvent('setActions', {
101
+ actions,
102
+ sources
103
+ });
104
+ }
105
+ }
106
+ exports.RecorderInTraceViewer = RecorderInTraceViewer;
107
+ async function openApp(trace, options) {
108
+ const traceServer = await (0, _traceViewer.startTraceViewerServer)(options);
109
+ await (0, _traceViewer.installRootRedirect)(traceServer, [trace], {
110
+ ...options,
111
+ webApp: 'recorder.html'
112
+ });
113
+ const page = await (0, _traceViewer.openTraceViewerApp)(traceServer.urlPrefix('precise'), 'chromium', options);
114
+ return {
115
+ wsEndpointForTest: page.context()._browser.options.wsEndpoint,
116
+ tracePage: page,
117
+ traceServer
118
+ };
119
+ }
120
+ class RecorderTransport {
121
+ constructor() {
122
+ this._connected = new _manualPromise.ManualPromise();
123
+ this.eventSink = new _manualPromise.ManualPromise();
124
+ this.sendEvent = void 0;
125
+ this.close = void 0;
126
+ }
127
+ onconnect() {
128
+ this._connected.resolve();
129
+ }
130
+ async dispatch(method, params) {
131
+ const eventSink = await this.eventSink;
132
+ eventSink.emit('event', {
133
+ event: method,
134
+ params
135
+ });
136
+ }
137
+ onclose() {}
138
+ deliverEvent(method, params) {
139
+ this._connected.then(() => {
140
+ var _this$sendEvent;
141
+ return (_this$sendEvent = this.sendEvent) === null || _this$sendEvent === void 0 ? void 0 : _this$sendEvent.call(this, method, params);
142
+ });
143
+ }
144
+ }
@@ -4,9 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.performAction = performAction;
7
+ exports.toClickOptions = toClickOptions;
7
8
  var _utils = require("../../utils");
8
9
  var _language = require("../codegen/language");
9
10
  var _recorderUtils = require("./recorderUtils");
11
+ var _recorderUtils2 = require("../../utils/isomorphic/recorderUtils");
10
12
  /**
11
13
  * Copyright (c) Microsoft Corporation.
12
14
  *
@@ -23,125 +25,93 @@ var _recorderUtils = require("./recorderUtils");
23
25
  * limitations under the License.
24
26
  */
25
27
 
26
- async function innerPerformAction(mainFrame, action, params, cb) {
27
- const callMetadata = {
28
- id: `call@${(0, _utils.createGuid)()}`,
29
- apiName: 'frame.' + action,
30
- objectId: mainFrame.guid,
31
- pageId: mainFrame._page.guid,
32
- frameId: mainFrame.guid,
33
- startTime: (0, _utils.monotonicTime)(),
34
- endTime: 0,
35
- type: 'Frame',
36
- method: action,
37
- params,
38
- log: []
39
- };
40
- try {
41
- await mainFrame.instrumentation.onBeforeCall(mainFrame, callMetadata);
42
- await cb(callMetadata);
43
- } catch (e) {
44
- callMetadata.endTime = (0, _utils.monotonicTime)();
45
- await mainFrame.instrumentation.onAfterCall(mainFrame, callMetadata);
46
- return false;
47
- }
48
- callMetadata.endTime = (0, _utils.monotonicTime)();
49
- await mainFrame.instrumentation.onAfterCall(mainFrame, callMetadata);
50
- return true;
51
- }
52
- async function performAction(pageAliases, actionInContext) {
53
- var _find;
54
- const pageAlias = actionInContext.frame.pageAlias;
55
- const page = (_find = [...pageAliases.entries()].find(([, alias]) => pageAlias === alias)) === null || _find === void 0 ? void 0 : _find[0];
56
- if (!page) throw new Error('Internal error: page not found');
57
- const mainFrame = page.mainFrame();
28
+ async function performAction(callMetadata, pageAliases, actionInContext) {
29
+ const mainFrame = (0, _recorderUtils.mainFrameForAction)(pageAliases, actionInContext);
58
30
  const {
59
31
  action
60
32
  } = actionInContext;
61
33
  const kActionTimeout = 5000;
62
- if (action.name === 'navigate') return await innerPerformAction(mainFrame, 'goto', {
63
- url: action.url
64
- }, callMetadata => mainFrame.goto(callMetadata, action.url, {
65
- timeout: kActionTimeout
66
- }));
34
+ if (action.name === 'navigate') {
35
+ await mainFrame.goto(callMetadata, action.url, {
36
+ timeout: kActionTimeout
37
+ });
38
+ return;
39
+ }
67
40
  if (action.name === 'openPage') throw Error('Not reached');
68
- if (action.name === 'closePage') return await innerPerformAction(mainFrame, 'close', {}, callMetadata => mainFrame._page.close(callMetadata));
69
- const selector = (0, _recorderUtils.buildFullSelector)(actionInContext.frame.framePath, action.selector);
41
+ if (action.name === 'closePage') {
42
+ await mainFrame._page.close(callMetadata);
43
+ return;
44
+ }
45
+ const selector = (0, _recorderUtils2.buildFullSelector)(actionInContext.frame.framePath, action.selector);
70
46
  if (action.name === 'click') {
71
- const options = (0, _language.toClickOptions)(action);
72
- return await innerPerformAction(mainFrame, 'click', {
73
- selector
74
- }, callMetadata => mainFrame.click(callMetadata, selector, {
47
+ const options = toClickOptions(action);
48
+ await mainFrame.click(callMetadata, selector, {
75
49
  ...options,
76
50
  timeout: kActionTimeout,
77
51
  strict: true
78
- }));
52
+ });
53
+ return;
79
54
  }
80
55
  if (action.name === 'press') {
81
56
  const modifiers = (0, _language.toKeyboardModifiers)(action.modifiers);
82
57
  const shortcut = [...modifiers, action.key].join('+');
83
- return await innerPerformAction(mainFrame, 'press', {
58
+ await mainFrame.press(callMetadata, selector, shortcut, {
59
+ timeout: kActionTimeout,
60
+ strict: true
61
+ });
62
+ return;
63
+ }
64
+ if (action.name === 'fill') {
65
+ await mainFrame.fill(callMetadata, selector, action.text, {
66
+ timeout: kActionTimeout,
67
+ strict: true
68
+ });
69
+ return;
70
+ }
71
+ if (action.name === 'setInputFiles') {
72
+ await mainFrame.setInputFiles(callMetadata, selector, {
84
73
  selector,
85
- key: shortcut
86
- }, callMetadata => mainFrame.press(callMetadata, selector, shortcut, {
74
+ payloads: [],
87
75
  timeout: kActionTimeout,
88
76
  strict: true
89
- }));
77
+ });
78
+ return;
79
+ }
80
+ if (action.name === 'check') {
81
+ await mainFrame.check(callMetadata, selector, {
82
+ timeout: kActionTimeout,
83
+ strict: true
84
+ });
85
+ return;
86
+ }
87
+ if (action.name === 'uncheck') {
88
+ await mainFrame.uncheck(callMetadata, selector, {
89
+ timeout: kActionTimeout,
90
+ strict: true
91
+ });
92
+ return;
90
93
  }
91
- if (action.name === 'fill') return await innerPerformAction(mainFrame, 'fill', {
92
- selector,
93
- text: action.text
94
- }, callMetadata => mainFrame.fill(callMetadata, selector, action.text, {
95
- timeout: kActionTimeout,
96
- strict: true
97
- }));
98
- if (action.name === 'setInputFiles') return await innerPerformAction(mainFrame, 'setInputFiles', {
99
- selector,
100
- files: action.files
101
- }, callMetadata => mainFrame.setInputFiles(callMetadata, selector, {
102
- selector,
103
- payloads: [],
104
- timeout: kActionTimeout,
105
- strict: true
106
- }));
107
- if (action.name === 'check') return await innerPerformAction(mainFrame, 'check', {
108
- selector
109
- }, callMetadata => mainFrame.check(callMetadata, selector, {
110
- timeout: kActionTimeout,
111
- strict: true
112
- }));
113
- if (action.name === 'uncheck') return await innerPerformAction(mainFrame, 'uncheck', {
114
- selector
115
- }, callMetadata => mainFrame.uncheck(callMetadata, selector, {
116
- timeout: kActionTimeout,
117
- strict: true
118
- }));
119
94
  if (action.name === 'select') {
120
95
  const values = action.options.map(value => ({
121
96
  value
122
97
  }));
123
- return await innerPerformAction(mainFrame, 'selectOption', {
124
- selector,
125
- values
126
- }, callMetadata => mainFrame.selectOption(callMetadata, selector, [], values, {
98
+ await mainFrame.selectOption(callMetadata, selector, [], values, {
127
99
  timeout: kActionTimeout,
128
100
  strict: true
129
- }));
101
+ });
102
+ return;
130
103
  }
131
104
  if (action.name === 'assertChecked') {
132
- return await innerPerformAction(mainFrame, 'expect', {
133
- selector
134
- }, callMetadata => mainFrame.expect(callMetadata, selector, {
105
+ await mainFrame.expect(callMetadata, selector, {
135
106
  selector,
136
107
  expression: 'to.be.checked',
137
108
  isNot: !action.checked,
138
109
  timeout: kActionTimeout
139
- }));
110
+ });
111
+ return;
140
112
  }
141
113
  if (action.name === 'assertText') {
142
- return await innerPerformAction(mainFrame, 'expect', {
143
- selector
144
- }, callMetadata => mainFrame.expect(callMetadata, selector, {
114
+ await mainFrame.expect(callMetadata, selector, {
145
115
  selector,
146
116
  expression: 'to.have.text',
147
117
  expectedText: (0, _utils.serializeExpectedTextValues)([action.text], {
@@ -150,28 +120,36 @@ async function performAction(pageAliases, actionInContext) {
150
120
  }),
151
121
  isNot: false,
152
122
  timeout: kActionTimeout
153
- }));
123
+ });
124
+ return;
154
125
  }
155
126
  if (action.name === 'assertValue') {
156
- return await innerPerformAction(mainFrame, 'expect', {
157
- selector
158
- }, callMetadata => mainFrame.expect(callMetadata, selector, {
127
+ await mainFrame.expect(callMetadata, selector, {
159
128
  selector,
160
129
  expression: 'to.have.value',
161
130
  expectedValue: action.value,
162
131
  isNot: false,
163
132
  timeout: kActionTimeout
164
- }));
133
+ });
134
+ return;
165
135
  }
166
136
  if (action.name === 'assertVisible') {
167
- return await innerPerformAction(mainFrame, 'expect', {
168
- selector
169
- }, callMetadata => mainFrame.expect(callMetadata, selector, {
137
+ await mainFrame.expect(callMetadata, selector, {
170
138
  selector,
171
139
  expression: 'to.be.visible',
172
140
  isNot: false,
173
141
  timeout: kActionTimeout
174
- }));
142
+ });
143
+ return;
175
144
  }
176
145
  throw new Error('Internal error: unexpected action ' + action.name);
146
+ }
147
+ function toClickOptions(action) {
148
+ const modifiers = (0, _language.toKeyboardModifiers)(action.modifiers);
149
+ const options = {};
150
+ if (action.button !== 'left') options.button = action.button;
151
+ if (modifiers.length) options.modifiers = modifiers;
152
+ if (action.clickCount > 1) options.clickCount = action.clickCount;
153
+ if (action.position) options.position = action.position;
154
+ return options;
177
155
  }
@@ -3,10 +3,13 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.buildFullSelector = buildFullSelector;
6
+ exports.callMetadataForAction = callMetadataForAction;
7
+ exports.collapseActions = collapseActions;
7
8
  exports.frameForAction = frameForAction;
8
9
  exports.mainFrameForAction = mainFrameForAction;
9
10
  exports.metadataToCallLog = metadataToCallLog;
11
+ var _utils = require("../../utils");
12
+ var _recorderUtils = require("../../utils/isomorphic/recorderUtils");
10
13
  /**
11
14
  * Copyright (c) Microsoft Corporation.
12
15
  *
@@ -49,14 +52,11 @@ function metadataToCallLog(metadata, status) {
49
52
  };
50
53
  return callLog;
51
54
  }
52
- function buildFullSelector(framePath, selector) {
53
- return [...framePath, selector].join(' >> internal:control=enter-frame >> ');
54
- }
55
55
  function mainFrameForAction(pageAliases, actionInContext) {
56
56
  var _find;
57
57
  const pageAlias = actionInContext.frame.pageAlias;
58
58
  const page = (_find = [...pageAliases.entries()].find(([, alias]) => pageAlias === alias)) === null || _find === void 0 ? void 0 : _find[0];
59
- if (!page) throw new Error('Internal error: page not found');
59
+ if (!page) throw new Error(`Internal error: page ${pageAlias} not found in [${[...pageAliases.values()]}]`);
60
60
  return page.mainFrame();
61
61
  }
62
62
  async function frameForAction(pageAliases, actionInContext, action) {
@@ -64,8 +64,49 @@ async function frameForAction(pageAliases, actionInContext, action) {
64
64
  const pageAlias = actionInContext.frame.pageAlias;
65
65
  const page = (_find2 = [...pageAliases.entries()].find(([, alias]) => pageAlias === alias)) === null || _find2 === void 0 ? void 0 : _find2[0];
66
66
  if (!page) throw new Error('Internal error: page not found');
67
- const fullSelector = buildFullSelector(actionInContext.frame.framePath, action.selector);
67
+ const fullSelector = (0, _recorderUtils.buildFullSelector)(actionInContext.frame.framePath, action.selector);
68
68
  const result = await page.mainFrame().selectors.resolveFrameForSelector(fullSelector);
69
69
  if (!result) throw new Error('Internal error: frame not found');
70
70
  return result.frame;
71
+ }
72
+ function callMetadataForAction(pageAliases, actionInContext) {
73
+ const mainFrame = mainFrameForAction(pageAliases, actionInContext);
74
+ const {
75
+ method,
76
+ params
77
+ } = (0, _recorderUtils.traceParamsForAction)(actionInContext);
78
+ const callMetadata = {
79
+ id: `call@${(0, _utils.createGuid)()}`,
80
+ apiName: 'page.' + method,
81
+ objectId: mainFrame.guid,
82
+ pageId: mainFrame._page.guid,
83
+ frameId: mainFrame.guid,
84
+ startTime: actionInContext.startTime,
85
+ endTime: 0,
86
+ type: 'Frame',
87
+ method,
88
+ params,
89
+ log: []
90
+ };
91
+ return {
92
+ callMetadata,
93
+ mainFrame
94
+ };
95
+ }
96
+ function collapseActions(actions) {
97
+ const result = [];
98
+ for (const action of actions) {
99
+ const lastAction = result[result.length - 1];
100
+ const isSameAction = lastAction && lastAction.action.name === action.action.name && lastAction.frame.pageAlias === action.frame.pageAlias && lastAction.frame.framePath.join('|') === action.frame.framePath.join('|');
101
+ const isSameSelector = lastAction && 'selector' in lastAction.action && 'selector' in action.action && action.action.selector === lastAction.action.selector;
102
+ const shouldMerge = isSameAction && (action.action.name === 'navigate' || action.action.name === 'fill' && isSameSelector);
103
+ if (!shouldMerge) {
104
+ result.push(action);
105
+ continue;
106
+ }
107
+ const startTime = result[result.length - 1].startTime;
108
+ result[result.length - 1] = action;
109
+ result[result.length - 1].startTime = startTime;
110
+ }
111
+ return result;
71
112
  }
@@ -12,6 +12,7 @@ var _browserContext = require("./browserContext");
12
12
  var _debugger = require("./debugger");
13
13
  var _contextRecorder = require("./recorder/contextRecorder");
14
14
  var _recorderUtils = require("./recorder/recorderUtils");
15
+ var _recorderUtils2 = require("../utils/isomorphic/recorderUtils");
15
16
  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); }
16
17
  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; }
17
18
  /**
@@ -32,26 +33,28 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
32
33
 
33
34
  const recorderSymbol = Symbol('recorderSymbol');
34
35
  class Recorder {
35
- static showInspector(context, recorderAppFactory) {
36
- const params = {};
36
+ static async showInspector(context, params, recorderAppFactory) {
37
37
  if ((0, _utils.isUnderTest)()) params.language = process.env.TEST_INSPECTOR_LANGUAGE;
38
- Recorder.show(context, recorderAppFactory, params).catch(() => {});
38
+ return await Recorder.show('actions', context, recorderAppFactory, params);
39
39
  }
40
- static show(context, recorderAppFactory, params = {}) {
40
+ static showInspectorNoReply(context, recorderAppFactory) {
41
+ Recorder.showInspector(context, {}, recorderAppFactory).catch(() => {});
42
+ }
43
+ static show(codegenMode, context, recorderAppFactory, params) {
41
44
  let recorderPromise = context[recorderSymbol];
42
45
  if (!recorderPromise) {
43
- recorderPromise = Recorder._create(context, recorderAppFactory, params);
46
+ recorderPromise = Recorder._create(codegenMode, context, recorderAppFactory, params);
44
47
  context[recorderSymbol] = recorderPromise;
45
48
  }
46
49
  return recorderPromise;
47
50
  }
48
- static async _create(context, recorderAppFactory, params = {}) {
49
- const recorder = new Recorder(context, params);
51
+ static async _create(codegenMode, context, recorderAppFactory, params = {}) {
52
+ const recorder = new Recorder(codegenMode, context, params);
50
53
  const recorderApp = await recorderAppFactory(recorder);
51
54
  await recorder._install(recorderApp);
52
55
  return recorder;
53
56
  }
54
- constructor(context, params) {
57
+ constructor(codegenMode, context, params) {
55
58
  this._context = void 0;
56
59
  this._mode = void 0;
57
60
  this._highlightedSelector = '';
@@ -67,7 +70,7 @@ class Recorder {
67
70
  this._omitCallTracking = false;
68
71
  this._currentLanguage = void 0;
69
72
  this._mode = params.mode || 'none';
70
- this._contextRecorder = new _contextRecorder.ContextRecorder(context, params, {});
73
+ this._contextRecorder = new _contextRecorder.ContextRecorder(codegenMode, context, params, {});
71
74
  this._context = context;
72
75
  this._omitCallTracking = !!params.omitCallTracking;
73
76
  this._debugger = context.debugger();
@@ -123,10 +126,10 @@ class Recorder {
123
126
  (_this$_recorderApp = this._recorderApp) === null || _this$_recorderApp === void 0 || _this$_recorderApp.close().catch(() => {});
124
127
  });
125
128
  this._contextRecorder.on(_contextRecorder.ContextRecorder.Events.Change, data => {
126
- var _this$_recorderApp2;
127
129
  this._recorderSources = data.sources;
130
+ recorderApp.setActions(data.actions, data.sources);
131
+ recorderApp.setRunningFile(undefined);
128
132
  this._pushAllSources();
129
- (_this$_recorderApp2 = this._recorderApp) === null || _this$_recorderApp2 === void 0 || _this$_recorderApp2.setFileIfNeeded(data.primaryFileName);
130
133
  });
131
134
  await this._context.exposeBinding('__pw_recorderState', false, source => {
132
135
  let actionSelector = '';
@@ -154,9 +157,9 @@ class Recorder {
154
157
  await this._context.exposeBinding('__pw_recorderSetSelector', false, async ({
155
158
  frame
156
159
  }, selector) => {
157
- var _this$_recorderApp3;
160
+ var _this$_recorderApp2;
158
161
  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));
162
+ await ((_this$_recorderApp2 = this._recorderApp) === null || _this$_recorderApp2 === void 0 ? void 0 : _this$_recorderApp2.setSelector((0, _recorderUtils2.buildFullSelector)(selectorChain, selector), true));
160
163
  });
161
164
  await this._context.exposeBinding('__pw_recorderSetMode', false, async ({
162
165
  frame
@@ -180,7 +183,7 @@ class Recorder {
180
183
  this._context.recorderAppForTest = this._recorderApp;
181
184
  }
182
185
  _pausedStateChanged() {
183
- var _this$_recorderApp4;
186
+ var _this$_recorderApp3;
184
187
  // If we are called upon page.pause, we don't have metadatas, populate them.
185
188
  for (const {
186
189
  metadata,
@@ -188,16 +191,16 @@ class Recorder {
188
191
  } of this._debugger.pausedDetails()) {
189
192
  if (!this._currentCallsMetadata.has(metadata)) this.onBeforeCall(sdkObject, metadata);
190
193
  }
191
- (_this$_recorderApp4 = this._recorderApp) === null || _this$_recorderApp4 === void 0 || _this$_recorderApp4.setPaused(this._debugger.isPaused());
194
+ (_this$_recorderApp3 = this._recorderApp) === null || _this$_recorderApp3 === void 0 || _this$_recorderApp3.setPaused(this._debugger.isPaused());
192
195
  this._updateUserSources();
193
196
  this.updateCallLog([...this._currentCallsMetadata.keys()]);
194
197
  }
195
198
  setMode(mode) {
196
- var _this$_recorderApp5;
199
+ var _this$_recorderApp4;
197
200
  if (this._mode === mode) return;
198
201
  this._highlightedSelector = '';
199
202
  this._mode = mode;
200
- (_this$_recorderApp5 = this._recorderApp) === null || _this$_recorderApp5 === void 0 || _this$_recorderApp5.setMode(this._mode);
203
+ (_this$_recorderApp4 = this._recorderApp) === null || _this$_recorderApp4 === void 0 || _this$_recorderApp4.setMode(this._mode);
201
204
  this._contextRecorder.setEnabled(this._mode === 'recording' || this._mode === 'assertingText' || this._mode === 'assertingVisibility' || this._mode === 'assertingValue');
202
205
  this._debugger.setMuted(this._mode === 'recording' || this._mode === 'assertingText' || this._mode === 'assertingVisibility' || this._mode === 'assertingValue');
203
206
  if (this._mode !== 'none' && this._mode !== 'standby' && this._context.pages().length === 1) this._context.pages()[0].bringToFront().catch(() => {});
@@ -231,9 +234,9 @@ class Recorder {
231
234
  if (isScreenshotCommand(metadata)) {
232
235
  this.hideHighlightedSelector();
233
236
  } else if (metadata.params && metadata.params.selector) {
234
- var _this$_recorderApp6;
237
+ var _this$_recorderApp5;
235
238
  this._highlightedSelector = metadata.params.selector;
236
- (_this$_recorderApp6 = this._recorderApp) === null || _this$_recorderApp6 === void 0 || _this$_recorderApp6.setSelector(this._highlightedSelector).catch(() => {});
239
+ (_this$_recorderApp5 = this._recorderApp) === null || _this$_recorderApp5 === void 0 || _this$_recorderApp5.setSelector(this._highlightedSelector).catch(() => {});
237
240
  }
238
241
  }
239
242
  async onAfterCall(sdkObject, metadata) {
@@ -243,7 +246,7 @@ class Recorder {
243
246
  this.updateCallLog([metadata]);
244
247
  }
245
248
  _updateUserSources() {
246
- var _this$_recorderApp7;
249
+ var _this$_recorderApp6;
247
250
  // Remove old decorations.
248
251
  for (const source of this._userSources.values()) {
249
252
  source.highlight = [];
@@ -281,18 +284,18 @@ class Recorder {
281
284
  }
282
285
  }
283
286
  this._pushAllSources();
284
- if (fileToSelect) (_this$_recorderApp7 = this._recorderApp) === null || _this$_recorderApp7 === void 0 || _this$_recorderApp7.setFileIfNeeded(fileToSelect);
287
+ if (fileToSelect) (_this$_recorderApp6 = this._recorderApp) === null || _this$_recorderApp6 === void 0 || _this$_recorderApp6.setRunningFile(fileToSelect);
285
288
  }
286
289
  _pushAllSources() {
287
- var _this$_recorderApp8;
288
- (_this$_recorderApp8 = this._recorderApp) === null || _this$_recorderApp8 === void 0 || _this$_recorderApp8.setSources([...this._recorderSources, ...this._userSources.values()]);
290
+ var _this$_recorderApp7;
291
+ (_this$_recorderApp7 = this._recorderApp) === null || _this$_recorderApp7 === void 0 || _this$_recorderApp7.setSources([...this._recorderSources, ...this._userSources.values()]);
289
292
  }
290
293
  async onBeforeInputAction(sdkObject, metadata) {}
291
294
  async onCallLog(sdkObject, metadata, logName, message) {
292
295
  this.updateCallLog([metadata]);
293
296
  }
294
297
  updateCallLog(metadatas) {
295
- var _this$_recorderApp9;
298
+ var _this$_recorderApp8;
296
299
  if (this._mode === 'recording' || this._mode === 'assertingText' || this._mode === 'assertingVisibility' || this._mode === 'assertingValue') return;
297
300
  const logs = [];
298
301
  for (const metadata of metadatas) {
@@ -302,7 +305,7 @@ class Recorder {
302
305
  if (this._debugger.isPaused(metadata)) status = 'paused';
303
306
  logs.push((0, _recorderUtils.metadataToCallLog)(metadata, status));
304
307
  }
305
- (_this$_recorderApp9 = this._recorderApp) === null || _this$_recorderApp9 === void 0 || _this$_recorderApp9.updateCallLogs(logs);
308
+ (_this$_recorderApp8 = this._recorderApp) === null || _this$_recorderApp8 === void 0 || _this$_recorderApp8.updateCallLogs(logs);
306
309
  }
307
310
  _readSource(fileName) {
308
311
  try {