@checkly/playwright-core 1.42.18 → 1.47.11

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 (250) 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-BN0yUF4I.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-DVt3E1Ef.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-CcviAl53.js +16831 -0
  163. package/lib/vite/traceViewer/assets/codeMirrorModule-CqYUz5ms.js +24 -0
  164. package/lib/vite/traceViewer/assets/codeMirrorModule-DS3v0XrQ.js +24 -0
  165. package/lib/vite/traceViewer/assets/codeMirrorModule-Dx6AXgMV.js +16838 -0
  166. package/lib/vite/traceViewer/assets/codeMirrorModule-T_sdMrbM.js +24 -0
  167. package/lib/vite/traceViewer/assets/codeMirrorModule-V7N6ppkd.js +15585 -0
  168. package/lib/vite/traceViewer/assets/testServerConnection-D-tXL3sj.js +224 -0
  169. package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +1 -0
  170. package/lib/vite/traceViewer/assets/workbench-Bjkiwcr1.js +19119 -0
  171. package/lib/vite/traceViewer/assets/workbench-C43LWZEX.js +72 -0
  172. package/lib/vite/traceViewer/assets/workbench-C5OQh9VX.js +19119 -0
  173. package/lib/vite/traceViewer/assets/workbench-Crj6jzdv.js +19119 -0
  174. package/lib/vite/traceViewer/assets/workbench-DrQjKdyE.js +72 -0
  175. package/lib/vite/traceViewer/assets/workbench-Pa1v1Ojh.js +72 -0
  176. package/lib/vite/traceViewer/assets/workbench-caTaZnzx.js +72 -0
  177. package/lib/vite/traceViewer/assets/workbench-u2lRPMOT.js +72 -0
  178. package/lib/vite/traceViewer/assets/wsPort-EUvw-dwH.js +18540 -0
  179. package/lib/vite/traceViewer/assets/xtermModule-CZ7sDYXB.js +6529 -0
  180. package/lib/vite/traceViewer/assets/xtermModule-_6TC5FYT.js +6529 -0
  181. package/lib/vite/traceViewer/codeMirrorModule.Cy8X9Wtw.css +344 -0
  182. package/lib/vite/traceViewer/codeMirrorModule.svF_VrcJ.css +344 -0
  183. package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
  184. package/lib/vite/traceViewer/embedded.BBZ9gQEw.js +104 -0
  185. package/lib/vite/traceViewer/embedded.BQq6Psnz.js +104 -0
  186. package/lib/vite/traceViewer/embedded.BVDVQOzc.js +2 -0
  187. package/lib/vite/traceViewer/embedded.Bn8Ptzv6.js +2 -0
  188. package/lib/vite/traceViewer/embedded.CvhnUgIi.js +2 -0
  189. package/lib/vite/traceViewer/embedded.D27cnKiB.js +104 -0
  190. package/lib/vite/traceViewer/embedded.DPqrDeET.js +2 -0
  191. package/lib/vite/traceViewer/embedded.DbzY7Q8w.js +2 -0
  192. package/lib/vite/traceViewer/embedded.DjZq4InJ.css +68 -0
  193. package/lib/vite/traceViewer/embedded.html +16 -0
  194. package/lib/vite/traceViewer/embedded.w7WN2u1R.css +1 -0
  195. package/lib/vite/traceViewer/index.5mge2rY_.css +124 -0
  196. package/lib/vite/traceViewer/index.6KJ-JQ0L.js +180 -0
  197. package/lib/vite/traceViewer/index.B8dgQwuN.js +2 -0
  198. package/lib/vite/traceViewer/index.BGj8jY3H.js +2 -0
  199. package/lib/vite/traceViewer/index.BSak5QT9.js +2 -0
  200. package/lib/vite/traceViewer/index.C0EgJ4oW.js +195 -0
  201. package/lib/vite/traceViewer/index.CUpI-BFe.js +195 -0
  202. package/lib/vite/traceViewer/{index.-g_5lMbJ.css → index.CrbWWHbf.css} +1 -1
  203. package/lib/vite/traceViewer/index.DkRbtWVo.js +195 -0
  204. package/lib/vite/traceViewer/index.QanXxRUb.css +131 -0
  205. package/lib/vite/traceViewer/index._cX8k4co.js +2 -0
  206. package/lib/vite/traceViewer/index.html +5 -4
  207. package/lib/vite/traceViewer/index.pMAN88y-.js +2 -0
  208. package/lib/vite/traceViewer/snapshot.html +1 -1
  209. package/lib/vite/traceViewer/sw.bundle.js +3 -4
  210. package/lib/vite/traceViewer/uiMode.D-tg1Oci.js +1730 -0
  211. package/lib/vite/traceViewer/uiMode.D3cNFP6u.css +1 -0
  212. package/lib/vite/traceViewer/uiMode.DKjMBMlc.js +1730 -0
  213. package/lib/vite/traceViewer/uiMode.DVWUEIHq.css +1424 -0
  214. package/lib/vite/traceViewer/uiMode.DVrL7a1K.js +10 -0
  215. package/lib/vite/traceViewer/uiMode.Dg9oJCQU.js +10 -0
  216. package/lib/vite/traceViewer/uiMode.DwZAzstF.js +10 -0
  217. package/lib/vite/traceViewer/uiMode.O07awP3T.js +10 -0
  218. package/lib/vite/traceViewer/uiMode.gGHHTsyL.js +1730 -0
  219. package/lib/vite/traceViewer/uiMode.html +5 -4
  220. package/lib/vite/traceViewer/uiMode.iq7CyYy7.js +1490 -0
  221. package/lib/vite/traceViewer/uiMode.jY2s-9ps.js +10 -0
  222. package/lib/vite/traceViewer/uiMode.xvJHbkzl.css +1324 -0
  223. package/lib/vite/traceViewer/workbench.B3X2QtYa.css +3702 -0
  224. package/lib/vite/traceViewer/workbench.DjbIuxix.css +1 -0
  225. package/lib/vite/traceViewer/workbench.DyTpxWVb.css +1 -0
  226. package/lib/vite/traceViewer/workbench.wuxQoE2z.css +3703 -0
  227. package/lib/vite/traceViewer/wsPort.p5jUwABW.css +3450 -0
  228. package/lib/vite/traceViewer/xtermModule.4oRVGWQ-.css +209 -0
  229. package/lib/vite/traceViewer/xtermModule.OKEVRlkP.css +209 -0
  230. package/package.json +2 -2
  231. package/types/protocol.d.ts +960 -78
  232. package/types/structs.d.ts +1 -1
  233. package/types/types.d.ts +3083 -2448
  234. package/lib/vite/recorder/assets/codeMirrorModule-W69B4LBB.js +0 -24
  235. package/lib/vite/recorder/assets/index-Ly3PcVUb.js +0 -47
  236. package/lib/vite/recorder/assets/index-ljsTwXtJ.css +0 -1
  237. package/lib/vite/traceViewer/assets/codeMirrorModule-0bpaqixv.js +0 -24
  238. package/lib/vite/traceViewer/assets/codeMirrorModule-wLpsbIhd.js +0 -24
  239. package/lib/vite/traceViewer/assets/wsPort-_JBDEilC.js +0 -69
  240. package/lib/vite/traceViewer/assets/wsPort-f2dAQL4I.js +0 -69
  241. package/lib/vite/traceViewer/index.-_8-eHEE.js +0 -2
  242. package/lib/vite/traceViewer/index.u51inEcm.js +0 -2
  243. package/lib/vite/traceViewer/uiMode.9CwNsWc6.js +0 -10
  244. package/lib/vite/traceViewer/uiMode.Fb0bNA4H.js +0 -10
  245. package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +0 -1
  246. package/lib/vite/traceViewer/wsPort.zR1WIy9-.css +0 -1
  247. /package/lib/vite/recorder/assets/{codeMirrorModule-Hs9-1ZG4.css → codeMirrorModule-ez37Vkbh.css} +0 -0
  248. /package/lib/vite/traceViewer/assets/{xtermModule-Yt6xwiJ_.js → xtermModule-BeNbaIVa.js} +0 -0
  249. /package/lib/vite/traceViewer/{codeMirrorModule.Hs9-1ZG4.css → codeMirrorModule.ez37Vkbh.css} +0 -0
  250. /package/lib/vite/traceViewer/{xtermModule.0lwXJFHT.css → xtermModule.DSXBckUd.css} +0 -0
@@ -0,0 +1,456 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.BidiPage = void 0;
7
+ var _eventsHelper = require("../../utils/eventsHelper");
8
+ var _utils = require("../../utils");
9
+ var dom = _interopRequireWildcard(require("../dom"));
10
+ var dialog = _interopRequireWildcard(require("../dialog"));
11
+ var _page = require("../page");
12
+ var _bidiInput = require("./bidiInput");
13
+ var bidi = _interopRequireWildcard(require("./third_party/bidiProtocol"));
14
+ var _bidiExecutionContext = require("./bidiExecutionContext");
15
+ var _bidiNetworkManager = require("./bidiNetworkManager");
16
+ var _browserContext = require("../browserContext");
17
+ 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); }
18
+ 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; }
19
+ /**
20
+ * Copyright (c) Microsoft Corporation.
21
+ *
22
+ * Licensed under the Apache License, Version 2.0 (the 'License');
23
+ * you may not use this file except in compliance with the License.
24
+ * You may obtain a copy of the License at
25
+ *
26
+ * http://www.apache.org/licenses/LICENSE-2.0
27
+ *
28
+ * Unless required by applicable law or agreed to in writing, software
29
+ * distributed under the License is distributed on an 'AS IS' BASIS,
30
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
31
+ * See the License for the specific language governing permissions and
32
+ * limitations under the License.
33
+ */
34
+
35
+ const UTILITY_WORLD_NAME = '__playwright_utility_world__';
36
+ class BidiPage {
37
+ constructor(browserContext, bidiSession, opener) {
38
+ this.rawMouse = void 0;
39
+ this.rawKeyboard = void 0;
40
+ this.rawTouchscreen = void 0;
41
+ this._page = void 0;
42
+ this._pagePromise = void 0;
43
+ this._session = void 0;
44
+ this._opener = void 0;
45
+ this._realmToContext = void 0;
46
+ this._sessionListeners = [];
47
+ this._browserContext = void 0;
48
+ this._networkManager = void 0;
49
+ this._initializedPage = null;
50
+ this._session = bidiSession;
51
+ this._opener = opener;
52
+ this.rawKeyboard = new _bidiInput.RawKeyboardImpl(bidiSession);
53
+ this.rawMouse = new _bidiInput.RawMouseImpl(bidiSession);
54
+ this.rawTouchscreen = new _bidiInput.RawTouchscreenImpl(bidiSession);
55
+ this._realmToContext = new Map();
56
+ this._page = new _page.Page(this, browserContext);
57
+ this._browserContext = browserContext;
58
+ this._networkManager = new _bidiNetworkManager.BidiNetworkManager(this._session, this._page, this._onNavigationResponseStarted.bind(this));
59
+ this._page.on(_page.Page.Events.FrameDetached, frame => this._removeContextsForFrame(frame, false));
60
+ this._sessionListeners = [_eventsHelper.eventsHelper.addEventListener(bidiSession, 'script.realmCreated', this._onRealmCreated.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.contextDestroyed', this._onBrowsingContextDestroyed.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationStarted', this._onNavigationStarted.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationAborted', this._onNavigationAborted.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationFailed', this._onNavigationFailed.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.fragmentNavigated', this._onFragmentNavigated.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.domContentLoaded', this._onDomContentLoaded.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.load', this._onLoad.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.userPromptOpened', this._onUserPromptOpened.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'log.entryAdded', this._onLogEntryAdded.bind(this))];
61
+
62
+ // Initialize main frame.
63
+ this._pagePromise = this._initialize().finally(async () => {
64
+ await this._page.initOpener(this._opener);
65
+ }).then(() => {
66
+ this._initializedPage = this._page;
67
+ this._page.reportAsNew();
68
+ return this._page;
69
+ }).catch(e => {
70
+ this._page.reportAsNew(e);
71
+ return e;
72
+ });
73
+ }
74
+ async _initialize() {
75
+ const {
76
+ contexts
77
+ } = await this._session.send('browsingContext.getTree', {
78
+ root: this._session.sessionId
79
+ });
80
+ this._handleFrameTree(contexts[0]);
81
+ await Promise.all([this.updateHttpCredentials(), this.updateRequestInterception(), this._updateViewport()]);
82
+ }
83
+ _handleFrameTree(frameTree) {
84
+ this._onFrameAttached(frameTree.context, frameTree.parent || null);
85
+ if (!frameTree.children) return;
86
+ for (const child of frameTree.children) this._handleFrameTree(child);
87
+ }
88
+ potentiallyUninitializedPage() {
89
+ return this._page;
90
+ }
91
+ didClose() {
92
+ this._session.dispose();
93
+ _eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);
94
+ this._page._didClose();
95
+ }
96
+ async pageOrError() {
97
+ // TODO: Wait for first execution context to be created and maybe about:blank navigated.
98
+ return this._pagePromise;
99
+ }
100
+ _onFrameAttached(frameId, parentFrameId) {
101
+ return this._page._frameManager.frameAttached(frameId, parentFrameId);
102
+ }
103
+ _removeContextsForFrame(frame, notifyFrame) {
104
+ for (const [contextId, context] of this._realmToContext) {
105
+ if (context.frame === frame) {
106
+ this._realmToContext.delete(contextId);
107
+ if (notifyFrame) frame._contextDestroyed(context);
108
+ }
109
+ }
110
+ }
111
+ _onRealmCreated(realmInfo) {
112
+ if (this._realmToContext.has(realmInfo.realm)) return;
113
+ if (realmInfo.type !== 'window') return;
114
+ const frame = this._page._frameManager.frame(realmInfo.context);
115
+ if (!frame) return;
116
+ const delegate = new _bidiExecutionContext.BidiExecutionContext(this._session, realmInfo);
117
+ let worldName;
118
+ if (!realmInfo.sandbox) {
119
+ worldName = 'main';
120
+ // Force creating utility world every time the main world is created (e.g. due to navigation).
121
+ this._touchUtilityWorld(realmInfo.context);
122
+ } else if (realmInfo.sandbox === UTILITY_WORLD_NAME) {
123
+ worldName = 'utility';
124
+ } else {
125
+ return;
126
+ }
127
+ const context = new dom.FrameExecutionContext(delegate, frame, worldName);
128
+ context[contextDelegateSymbol] = delegate;
129
+ frame._contextCreated(worldName, context);
130
+ this._realmToContext.set(realmInfo.realm, context);
131
+ }
132
+ async _touchUtilityWorld(context) {
133
+ await this._session.sendMayFail('script.evaluate', {
134
+ expression: '1 + 1',
135
+ target: {
136
+ context,
137
+ sandbox: UTILITY_WORLD_NAME
138
+ },
139
+ serializationOptions: {
140
+ maxObjectDepth: 10,
141
+ maxDomDepth: 10
142
+ },
143
+ awaitPromise: true,
144
+ userActivation: true
145
+ });
146
+ }
147
+ _onRealmDestroyed(params) {
148
+ const context = this._realmToContext.get(params.realm);
149
+ if (!context) return false;
150
+ this._realmToContext.delete(params.realm);
151
+ context.frame._contextDestroyed(context);
152
+ return true;
153
+ }
154
+
155
+ // TODO: route the message directly to the browser
156
+ _onBrowsingContextDestroyed(params) {
157
+ this._browserContext._browser._onBrowsingContextDestroyed(params);
158
+ }
159
+ _onNavigationStarted(params) {
160
+ const frameId = params.context;
161
+ this._page._frameManager.frameRequestedNavigation(frameId, params.navigation);
162
+ const url = params.url.toLowerCase();
163
+ if (url.startsWith('file:') || url.startsWith('data:') || url === 'about:blank') {
164
+ // Navigation to file urls doesn't emit network events, so we fire 'commit' event right when navigation is started.
165
+ // Doing it in domcontentload would be too late as we'd clear frame tree.
166
+ const frame = this._page._frameManager.frame(frameId);
167
+ if (frame) this._page._frameManager.frameCommittedNewDocumentNavigation(frameId, params.url, '', params.navigation, /* initial */false);
168
+ }
169
+ }
170
+
171
+ // TODO: there is no separate event for committed navigation, so we approximate it with responseStarted.
172
+ _onNavigationResponseStarted(params) {
173
+ const frameId = params.context;
174
+ const frame = this._page._frameManager.frame(frameId);
175
+ (0, _utils.assert)(frame);
176
+ this._page._frameManager.frameCommittedNewDocumentNavigation(frameId, params.response.url, '', params.navigation, /* initial */false);
177
+ // if (!initial)
178
+ // this._firstNonInitialNavigationCommittedFulfill();
179
+ }
180
+ _onDomContentLoaded(params) {
181
+ const frameId = params.context;
182
+ this._page._frameManager.frameLifecycleEvent(frameId, 'domcontentloaded');
183
+ }
184
+ _onLoad(params) {
185
+ this._page._frameManager.frameLifecycleEvent(params.context, 'load');
186
+ }
187
+ _onNavigationAborted(params) {
188
+ this._page._frameManager.frameAbortedNavigation(params.context, 'Navigation aborted', params.navigation || undefined);
189
+ }
190
+ _onNavigationFailed(params) {
191
+ this._page._frameManager.frameAbortedNavigation(params.context, 'Navigation failed', params.navigation || undefined);
192
+ }
193
+ _onFragmentNavigated(params) {
194
+ this._page._frameManager.frameCommittedSameDocumentNavigation(params.context, params.url);
195
+ }
196
+ _onUserPromptOpened(event) {
197
+ this._page.emitOnContext(_browserContext.BrowserContext.Events.Dialog, new dialog.Dialog(this._page, event.type, event.message, async (accept, userText) => {
198
+ await this._session.send('browsingContext.handleUserPrompt', {
199
+ context: event.context,
200
+ accept,
201
+ userText
202
+ });
203
+ }, event.defaultValue));
204
+ }
205
+ _onLogEntryAdded(params) {
206
+ var _params$stackTrace;
207
+ if (params.type !== 'console') return;
208
+ const entry = params;
209
+ const context = this._realmToContext.get(params.source.realm);
210
+ if (!context) return;
211
+ const callFrame = (_params$stackTrace = params.stackTrace) === null || _params$stackTrace === void 0 ? void 0 : _params$stackTrace.callFrames[0];
212
+ const location = callFrame !== null && callFrame !== void 0 ? callFrame : {
213
+ url: '',
214
+ lineNumber: 1,
215
+ columnNumber: 1
216
+ };
217
+ this._page._addConsoleMessage(entry.method, entry.args.map(arg => context.createHandle({
218
+ objectId: arg.handle,
219
+ ...arg
220
+ })), location, params.text || undefined);
221
+ }
222
+ async navigateFrame(frame, url, referrer) {
223
+ const {
224
+ navigation
225
+ } = await this._session.send('browsingContext.navigate', {
226
+ context: frame._id,
227
+ url
228
+ });
229
+ return {
230
+ newDocumentId: navigation || undefined
231
+ };
232
+ }
233
+ async updateExtraHTTPHeaders() {}
234
+ async updateEmulateMedia() {}
235
+ async updateEmulatedViewportSize() {
236
+ await this._updateViewport();
237
+ }
238
+ async updateUserAgent() {}
239
+ async bringToFront() {}
240
+ async _updateViewport() {
241
+ const options = this._browserContext._options;
242
+ const deviceSize = this._page.emulatedSize();
243
+ if (deviceSize === null) return;
244
+ const viewportSize = deviceSize.viewport;
245
+ await this._session.send('browsingContext.setViewport', {
246
+ context: this._session.sessionId,
247
+ viewport: {
248
+ width: viewportSize.width,
249
+ height: viewportSize.height
250
+ },
251
+ devicePixelRatio: options.deviceScaleFactor || 1
252
+ });
253
+ }
254
+ async updateRequestInterception() {
255
+ await this._networkManager.setRequestInterception(this._page.needsRequestInterception());
256
+ }
257
+ async updateOffline() {}
258
+ async updateHttpCredentials() {
259
+ await this._networkManager.setCredentials(this._browserContext._options.httpCredentials);
260
+ }
261
+ async updateFileChooserInterception() {}
262
+ async reload() {
263
+ await this._session.send('browsingContext.reload', {
264
+ context: this._session.sessionId,
265
+ // ignoreCache: true,
266
+ wait: bidi.BrowsingContext.ReadinessState.Interactive
267
+ });
268
+ }
269
+ goBack() {
270
+ throw new Error('Method not implemented.');
271
+ }
272
+ goForward() {
273
+ throw new Error('Method not implemented.');
274
+ }
275
+ async addInitScript(initScript) {
276
+ await this._updateBootstrapScript();
277
+ }
278
+ async removeNonInternalInitScripts() {
279
+ await this._updateBootstrapScript();
280
+ }
281
+ async _updateBootstrapScript() {
282
+ throw new Error('Method not implemented.');
283
+ }
284
+ async closePage(runBeforeUnload) {
285
+ await this._session.send('browsingContext.close', {
286
+ context: this._session.sessionId,
287
+ promptUnload: runBeforeUnload
288
+ });
289
+ }
290
+ async setBackgroundColor(color) {}
291
+ async takeScreenshot(progress, format, documentRect, viewportRect, quality, fitsViewport, scale) {
292
+ throw new Error('Method not implemented.');
293
+ }
294
+ async getContentFrame(handle) {
295
+ const executionContext = toBidiExecutionContext(handle._context);
296
+ const contentWindow = await executionContext.rawCallFunction('e => e.contentWindow', {
297
+ handle: handle._objectId
298
+ });
299
+ if (contentWindow.type === 'window') {
300
+ const frameId = contentWindow.value.context;
301
+ const result = this._page._frameManager.frame(frameId);
302
+ return result;
303
+ }
304
+ return null;
305
+ }
306
+ async getOwnerFrame(handle) {
307
+ throw new Error('Method not implemented.');
308
+ }
309
+ isElementHandle(remoteObject) {
310
+ return remoteObject.type === 'node';
311
+ }
312
+ async getBoundingBox(handle) {
313
+ const box = await handle.evaluate(element => {
314
+ if (!(element instanceof Element)) return null;
315
+ const rect = element.getBoundingClientRect();
316
+ return {
317
+ x: rect.x,
318
+ y: rect.y,
319
+ width: rect.width,
320
+ height: rect.height
321
+ };
322
+ });
323
+ if (!box) return null;
324
+ const position = await this._framePosition(handle._frame);
325
+ if (!position) return null;
326
+ box.x += position.x;
327
+ box.y += position.y;
328
+ return box;
329
+ }
330
+
331
+ // TODO: move to Frame.
332
+ async _framePosition(frame) {
333
+ if (frame === this._page.mainFrame()) return {
334
+ x: 0,
335
+ y: 0
336
+ };
337
+ const element = await frame.frameElement();
338
+ const box = await element.boundingBox();
339
+ if (!box) return null;
340
+ const style = await element.evaluateInUtility(([injected, iframe]) => injected.describeIFrameStyle(iframe), {}).catch(e => 'error:notconnected');
341
+ if (style === 'error:notconnected' || style === 'transformed') return null;
342
+ // Content box is offset by border and padding widths.
343
+ box.x += style.left;
344
+ box.y += style.top;
345
+ return box;
346
+ }
347
+ async scrollRectIntoViewIfNeeded(handle, rect) {
348
+ return await handle.evaluateInUtility(([injected, node]) => {
349
+ node.scrollIntoView({
350
+ block: 'center',
351
+ inline: 'center',
352
+ behavior: 'instant'
353
+ });
354
+ }, null).then(() => 'done').catch(e => {
355
+ if (e instanceof Error && e.message.includes('Node is detached from document')) return 'error:notconnected';
356
+ if (e instanceof Error && e.message.includes('Node does not have a layout object')) return 'error:notvisible';
357
+ throw e;
358
+ });
359
+ }
360
+ async setScreencastOptions(options) {}
361
+ rafCountForStablePosition() {
362
+ return 1;
363
+ }
364
+ async getContentQuads(handle) {
365
+ const quads = await handle.evaluateInUtility(([injected, node]) => {
366
+ if (!node.isConnected) return 'error:notconnected';
367
+ const rects = node.getClientRects();
368
+ if (!rects) return null;
369
+ return [...rects].map(rect => [{
370
+ x: rect.left,
371
+ y: rect.top
372
+ }, {
373
+ x: rect.right,
374
+ y: rect.top
375
+ }, {
376
+ x: rect.right,
377
+ y: rect.bottom
378
+ }, {
379
+ x: rect.left,
380
+ y: rect.bottom
381
+ }]);
382
+ }, null);
383
+ if (!quads || quads === 'error:notconnected') return quads;
384
+ // TODO: consider transforming quads to support clicks in iframes.
385
+ const position = await this._framePosition(handle._frame);
386
+ if (!position) return null;
387
+ quads.forEach(quad => quad.forEach(point => {
388
+ point.x += position.x;
389
+ point.y += position.y;
390
+ }));
391
+ return quads;
392
+ }
393
+ async setInputFiles(handle, files) {
394
+ throw new Error('Method not implemented.');
395
+ }
396
+ async setInputFilePaths(handle, paths) {
397
+ throw new Error('Method not implemented.');
398
+ }
399
+ async adoptElementHandle(handle, to) {
400
+ const fromContext = toBidiExecutionContext(handle._context);
401
+ const shared = await fromContext.rawCallFunction('x => x', {
402
+ handle: handle._objectId
403
+ });
404
+ // TODO: store sharedId in the handle.
405
+ if (!('sharedId' in shared)) throw new Error('Element is not a node');
406
+ const sharedId = shared.sharedId;
407
+ const executionContext = toBidiExecutionContext(to);
408
+ const result = await executionContext.rawCallFunction('x => x', {
409
+ sharedId
410
+ });
411
+ if ('handle' in result) return to.createHandle({
412
+ objectId: result.handle,
413
+ ...result
414
+ });
415
+ throw new Error('Failed to adopt element handle.');
416
+ }
417
+ async getAccessibilityTree(needle) {
418
+ throw new Error('Method not implemented.');
419
+ }
420
+ async inputActionEpilogue() {}
421
+ async resetForReuse() {}
422
+ async getFrameElement(frame) {
423
+ const parent = frame.parentFrame();
424
+ if (!parent) throw new Error('Frame has been detached.');
425
+ const parentContext = await parent._mainContext();
426
+ const list = await parentContext.evaluateHandle(() => {
427
+ return [...document.querySelectorAll('iframe,frame')];
428
+ });
429
+ const length = await list.evaluate(list => list.length);
430
+ let foundElement = null;
431
+ for (let i = 0; i < length; i++) {
432
+ const element = await list.evaluateHandle((list, i) => list[i], i);
433
+ const candidate = await element.contentFrame();
434
+ if (frame === candidate) {
435
+ foundElement = element;
436
+ break;
437
+ } else {
438
+ element.dispose();
439
+ }
440
+ }
441
+ list.dispose();
442
+ if (!foundElement) throw new Error('Frame has been detached.');
443
+ return foundElement;
444
+ }
445
+ shouldToggleStyleSheetToSyncAnimations() {
446
+ return true;
447
+ }
448
+ useMainWorldForSetContent() {
449
+ return true;
450
+ }
451
+ }
452
+ exports.BidiPage = BidiPage;
453
+ function toBidiExecutionContext(executionContext) {
454
+ return executionContext[contextDelegateSymbol];
455
+ }
456
+ const contextDelegateSymbol = Symbol('delegate');
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.BidiDeserializer = void 0;
7
+ /**
8
+ * @license
9
+ * Copyright 2024 Google Inc.
10
+ * Modifications copyright (c) Microsoft Corporation.
11
+ * SPDX-License-Identifier: Apache-2.0
12
+ */
13
+
14
+ /* eslint-disable object-curly-spacing */
15
+
16
+ /**
17
+ * @internal
18
+ */
19
+ class BidiDeserializer {
20
+ static deserialize(result) {
21
+ var _result$value, _result$value2, _result$value3, _result$value4;
22
+ if (!result) return undefined;
23
+ switch (result.type) {
24
+ case 'array':
25
+ return (_result$value = result.value) === null || _result$value === void 0 ? void 0 : _result$value.map(value => {
26
+ return BidiDeserializer.deserialize(value);
27
+ });
28
+ case 'set':
29
+ return (_result$value2 = result.value) === null || _result$value2 === void 0 ? void 0 : _result$value2.reduce((acc, value) => {
30
+ return acc.add(BidiDeserializer.deserialize(value));
31
+ }, new Set());
32
+ case 'object':
33
+ return (_result$value3 = result.value) === null || _result$value3 === void 0 ? void 0 : _result$value3.reduce((acc, tuple) => {
34
+ const {
35
+ key,
36
+ value
37
+ } = BidiDeserializer._deserializeTuple(tuple);
38
+ acc[key] = value;
39
+ return acc;
40
+ }, {});
41
+ case 'map':
42
+ return (_result$value4 = result.value) === null || _result$value4 === void 0 ? void 0 : _result$value4.reduce((acc, tuple) => {
43
+ const {
44
+ key,
45
+ value
46
+ } = BidiDeserializer._deserializeTuple(tuple);
47
+ return acc.set(key, value);
48
+ }, new Map());
49
+ case 'promise':
50
+ return {};
51
+ case 'regexp':
52
+ return new RegExp(result.value.pattern, result.value.flags);
53
+ case 'date':
54
+ return new Date(result.value);
55
+ case 'undefined':
56
+ return undefined;
57
+ case 'null':
58
+ return null;
59
+ case 'number':
60
+ return BidiDeserializer._deserializeNumber(result.value);
61
+ case 'bigint':
62
+ return BigInt(result.value);
63
+ case 'boolean':
64
+ return Boolean(result.value);
65
+ case 'string':
66
+ return result.value;
67
+ }
68
+ throw new Error(`Deserialization of type ${result.type} not supported.`);
69
+ }
70
+ static _deserializeNumber(value) {
71
+ switch (value) {
72
+ case '-0':
73
+ return -0;
74
+ case 'NaN':
75
+ return NaN;
76
+ case 'Infinity':
77
+ return Infinity;
78
+ case '-Infinity':
79
+ return -Infinity;
80
+ default:
81
+ return value;
82
+ }
83
+ }
84
+ static _deserializeTuple([serializedKey, serializedValue]) {
85
+ const key = typeof serializedKey === 'string' ? serializedKey : BidiDeserializer.deserialize(serializedKey);
86
+ const value = BidiDeserializer.deserialize(serializedValue);
87
+ return {
88
+ key,
89
+ value
90
+ };
91
+ }
92
+ }
93
+ exports.BidiDeserializer = BidiDeserializer;