@checkly/playwright-core 1.48.22 → 1.51.11-beta.2

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 (307) hide show
  1. package/ThirdPartyNotices.txt +60 -48
  2. package/bin/reinstall_chrome_beta_linux.sh +10 -8
  3. package/bin/reinstall_chrome_stable_linux.sh +10 -8
  4. package/bin/reinstall_msedge_beta_linux.sh +17 -9
  5. package/bin/reinstall_msedge_dev_linux.sh +17 -9
  6. package/bin/reinstall_msedge_stable_linux.sh +17 -9
  7. package/browsers.json +33 -12
  8. package/index.js +0 -1
  9. package/lib/androidServerImpl.js +5 -5
  10. package/lib/browserServerImpl.js +18 -9
  11. package/lib/checkly/secretsFilter.js +1 -1
  12. package/lib/cli/driver.js +6 -6
  13. package/lib/cli/program.js +38 -43
  14. package/lib/cli/programWithTestStub.js +2 -1
  15. package/lib/client/android.js +37 -58
  16. package/lib/client/artifact.js +4 -7
  17. package/lib/client/browser.js +10 -15
  18. package/lib/client/browserContext.js +69 -62
  19. package/lib/client/browserType.js +30 -64
  20. package/lib/client/channelOwner.js +53 -68
  21. package/lib/client/clientHelper.js +4 -6
  22. package/lib/client/clientInstrumentation.js +2 -0
  23. package/lib/client/clientStackTrace.js +65 -0
  24. package/lib/client/connection.js +48 -41
  25. package/lib/client/consoleMessage.js +4 -7
  26. package/lib/client/electron.js +10 -10
  27. package/lib/client/elementHandle.js +32 -33
  28. package/lib/client/errors.js +2 -2
  29. package/lib/client/eventEmitter.js +5 -8
  30. package/lib/client/fetch.js +61 -62
  31. package/lib/client/fileUtils.js +31 -0
  32. package/lib/client/frame.js +22 -23
  33. package/lib/client/harRouter.js +7 -9
  34. package/lib/client/jsHandle.js +3 -4
  35. package/lib/client/localUtils.js +24 -0
  36. package/lib/client/locator.js +27 -13
  37. package/lib/client/network.js +44 -37
  38. package/lib/client/page.js +50 -41
  39. package/lib/client/platform.js +71 -0
  40. package/lib/client/playwright.js +21 -1
  41. package/lib/client/selectors.js +8 -2
  42. package/lib/client/stream.js +2 -21
  43. package/lib/client/timeoutSettings.js +65 -0
  44. package/lib/client/tracing.js +29 -7
  45. package/lib/client/video.js +2 -2
  46. package/lib/client/waiter.js +19 -16
  47. package/lib/client/webSocket.js +106 -0
  48. package/lib/client/worker.js +4 -4
  49. package/lib/client/writableStream.js +2 -21
  50. package/lib/generated/consoleApiSource.js +1 -1
  51. package/lib/generated/injectedScriptSource.js +1 -1
  52. package/lib/generated/pollingRecorderSource.js +1 -1
  53. package/lib/generated/recorderSource.js +7 -0
  54. package/lib/generated/webSocketMockSource.js +1 -1
  55. package/lib/inProcessFactory.js +8 -3
  56. package/lib/outofprocess.js +12 -8
  57. package/lib/protocol/debug.js +1 -1
  58. package/lib/protocol/validator.js +77 -11
  59. package/lib/protocol/validatorPrimitives.js +1 -2
  60. package/lib/remote/playwrightConnection.js +21 -12
  61. package/lib/remote/playwrightServer.js +22 -8
  62. package/lib/server/android/android.js +17 -14
  63. package/lib/server/android/backendAdb.js +14 -14
  64. package/lib/server/artifact.js +3 -3
  65. package/lib/server/bidi/bidiBrowser.js +11 -8
  66. package/lib/server/bidi/bidiChromium.js +5 -4
  67. package/lib/server/bidi/bidiConnection.js +1 -3
  68. package/lib/server/bidi/bidiExecutionContext.js +71 -25
  69. package/lib/server/bidi/bidiFirefox.js +4 -3
  70. package/lib/server/bidi/bidiInput.js +11 -12
  71. package/lib/server/bidi/bidiNetworkManager.js +11 -12
  72. package/lib/server/bidi/bidiOverCdp.js +2 -2
  73. package/lib/server/bidi/bidiPage.js +39 -66
  74. package/lib/server/bidi/third_party/bidiKeyboard.js +9 -7
  75. package/lib/server/bidi/third_party/firefoxPrefs.js +19 -3
  76. package/lib/server/browser.js +2 -2
  77. package/lib/server/browserContext.js +60 -55
  78. package/lib/server/browserType.js +22 -18
  79. package/lib/server/callLog.js +79 -0
  80. package/lib/server/chromium/chromium.js +20 -16
  81. package/lib/server/chromium/chromiumSwitches.js +32 -9
  82. package/lib/server/chromium/crBrowser.js +25 -24
  83. package/lib/server/chromium/crConnection.js +2 -2
  84. package/lib/server/chromium/crCoverage.js +1 -1
  85. package/lib/server/chromium/crDevTools.js +1 -1
  86. package/lib/server/chromium/crDragDrop.js +1 -1
  87. package/lib/server/chromium/crExecutionContext.js +26 -35
  88. package/lib/server/chromium/crInput.js +17 -6
  89. package/lib/server/chromium/crNetworkManager.js +3 -3
  90. package/lib/server/chromium/crPage.js +43 -55
  91. package/lib/server/chromium/crPdf.js +1 -1
  92. package/lib/server/chromium/crProtocolHelper.js +3 -3
  93. package/lib/server/chromium/crServiceWorker.js +2 -2
  94. package/lib/server/chromium/videoRecorder.js +2 -2
  95. package/lib/server/clock.js +1 -1
  96. package/lib/server/codegen/csharp.js +21 -16
  97. package/lib/server/codegen/java.js +17 -9
  98. package/lib/server/codegen/javascript.js +37 -7
  99. package/lib/server/codegen/jsonl.js +1 -1
  100. package/lib/server/codegen/languages.js +2 -2
  101. package/lib/server/codegen/python.js +14 -17
  102. package/lib/server/debugController.js +23 -45
  103. package/lib/server/debugger.js +1 -1
  104. package/lib/server/deviceDescriptors.js +1 -1
  105. package/lib/server/deviceDescriptorsSource.json +131 -131
  106. package/lib/server/dispatchers/androidDispatcher.js +14 -3
  107. package/lib/server/dispatchers/artifactDispatcher.js +3 -3
  108. package/lib/server/dispatchers/browserContextDispatcher.js +21 -32
  109. package/lib/server/dispatchers/browserTypeDispatcher.js +1 -1
  110. package/lib/server/dispatchers/cdpSessionDispatcher.js +1 -1
  111. package/lib/server/dispatchers/debugControllerDispatcher.js +5 -3
  112. package/lib/server/dispatchers/dispatcher.js +27 -25
  113. package/lib/server/dispatchers/electronDispatcher.js +3 -3
  114. package/lib/server/dispatchers/elementHandlerDispatcher.js +7 -2
  115. package/lib/server/dispatchers/frameDispatcher.js +9 -3
  116. package/lib/server/dispatchers/jsonPipeDispatcher.js +2 -2
  117. package/lib/server/dispatchers/localUtilsDispatcher.js +25 -291
  118. package/lib/server/dispatchers/networkDispatchers.js +3 -3
  119. package/lib/server/dispatchers/pageDispatcher.js +10 -8
  120. package/lib/server/dispatchers/playwrightDispatcher.js +5 -5
  121. package/lib/server/dispatchers/streamDispatcher.js +4 -3
  122. package/lib/server/dispatchers/tracingDispatcher.js +10 -0
  123. package/lib/server/dispatchers/webSocketRouteDispatcher.js +18 -18
  124. package/lib/server/dispatchers/writableStreamDispatcher.js +5 -6
  125. package/lib/server/dom.js +102 -48
  126. package/lib/server/download.js +1 -1
  127. package/lib/server/electron/electron.js +17 -16
  128. package/lib/server/errors.js +1 -1
  129. package/lib/server/fetch.js +49 -33
  130. package/lib/server/fileUploadUtils.js +7 -4
  131. package/lib/server/firefox/ffBrowser.js +17 -9
  132. package/lib/server/firefox/ffConnection.js +1 -1
  133. package/lib/server/firefox/ffExecutionContext.js +25 -29
  134. package/lib/server/firefox/ffInput.js +15 -4
  135. package/lib/server/firefox/ffNetworkManager.js +3 -3
  136. package/lib/server/firefox/ffPage.js +29 -50
  137. package/lib/server/firefox/firefox.js +7 -9
  138. package/lib/server/frameSelectors.js +1 -1
  139. package/lib/server/frames.js +65 -55
  140. package/lib/server/har/harRecorder.js +4 -4
  141. package/lib/server/har/harTracer.js +8 -9
  142. package/lib/server/harBackend.js +157 -0
  143. package/lib/server/helper.js +2 -2
  144. package/lib/server/index.js +1 -14
  145. package/lib/server/input.js +3 -4
  146. package/lib/server/instrumentation.js +2 -2
  147. package/lib/server/isomorphic/utilityScriptSerializers.js +3 -0
  148. package/lib/server/javascript.js +26 -33
  149. package/lib/server/launchApp.js +7 -7
  150. package/lib/server/localUtils.js +203 -0
  151. package/lib/server/network.js +5 -5
  152. package/lib/server/page.js +76 -37
  153. package/lib/server/pipeTransport.js +1 -1
  154. package/lib/server/playwright.js +5 -5
  155. package/lib/server/progress.js +1 -4
  156. package/lib/server/protocolError.js +1 -1
  157. package/lib/server/recorder/chat.js +177 -0
  158. package/lib/server/recorder/codeGenerator.js +154 -0
  159. package/lib/server/recorder/contextRecorder.js +9 -18
  160. package/lib/server/recorder/csharp.js +311 -0
  161. package/lib/server/recorder/java.js +249 -0
  162. package/lib/server/recorder/javascript.js +230 -0
  163. package/lib/server/recorder/jsonl.js +48 -0
  164. package/lib/server/recorder/language.js +45 -0
  165. package/lib/server/recorder/python.js +276 -0
  166. package/lib/server/recorder/recorderActions.js +6 -0
  167. package/lib/server/recorder/recorderApp.js +25 -28
  168. package/lib/server/recorder/recorderCollection.js +9 -21
  169. package/lib/server/recorder/recorderInTraceViewer.js +1 -1
  170. package/lib/server/recorder/recorderRunner.js +7 -3
  171. package/lib/server/recorder/recorderUtils.js +5 -28
  172. package/lib/server/recorder/throttledFile.js +3 -4
  173. package/lib/server/recorder/utils.js +46 -0
  174. package/lib/server/recorder.js +83 -43
  175. package/lib/server/registry/browserFetcher.js +10 -8
  176. package/lib/server/registry/dependencies.js +20 -20
  177. package/lib/server/registry/index.js +215 -61
  178. package/lib/server/registry/nativeDeps.js +10 -4
  179. package/lib/server/registry/oopDownloadBrowserMain.js +3 -3
  180. package/lib/server/screenshotter.js +1 -1
  181. package/lib/server/selectors.js +3 -3
  182. package/lib/server/socksClientCertificatesInterceptor.js +8 -8
  183. package/lib/server/socksInterceptor.js +8 -5
  184. package/lib/server/storageScript.js +160 -0
  185. package/lib/server/timeoutSettings.js +74 -0
  186. package/lib/server/trace/recorder/snapshotter.js +10 -20
  187. package/lib/server/trace/recorder/snapshotterInjected.js +26 -1
  188. package/lib/server/trace/recorder/tracing.js +108 -45
  189. package/lib/server/trace/test/inMemorySnapshotter.js +6 -6
  190. package/lib/server/trace/viewer/traceViewer.js +21 -7
  191. package/lib/server/transport.js +3 -2
  192. package/lib/server/utils/ascii.js +31 -0
  193. package/lib/server/utils/comparators.js +159 -0
  194. package/lib/server/utils/crypto.js +171 -0
  195. package/lib/server/utils/debug.js +38 -0
  196. package/lib/server/utils/debugLogger.js +93 -0
  197. package/lib/server/utils/env.js +53 -0
  198. package/lib/server/utils/eventsHelper.js +38 -0
  199. package/lib/server/utils/expectUtils.js +33 -0
  200. package/lib/server/utils/fileUtils.js +204 -0
  201. package/lib/server/utils/happyEyeballs.js +207 -0
  202. package/lib/server/utils/hostPlatform.js +145 -0
  203. package/lib/server/utils/httpServer.js +233 -0
  204. package/lib/server/utils/image_tools/colorUtils.js +98 -0
  205. package/lib/server/utils/image_tools/compare.js +108 -0
  206. package/lib/server/utils/image_tools/imageChannel.js +70 -0
  207. package/lib/server/utils/image_tools/stats.js +102 -0
  208. package/lib/server/utils/linuxUtils.js +58 -0
  209. package/lib/server/utils/network.js +160 -0
  210. package/lib/server/utils/nodePlatform.js +140 -0
  211. package/lib/server/utils/pipeTransport.js +82 -0
  212. package/lib/server/utils/processLauncher.js +248 -0
  213. package/lib/server/utils/profiler.js +52 -0
  214. package/lib/server/utils/socksProxy.js +570 -0
  215. package/lib/server/utils/spawnAsync.js +45 -0
  216. package/lib/server/utils/task.js +58 -0
  217. package/lib/server/utils/userAgent.js +91 -0
  218. package/lib/server/utils/wsServer.js +128 -0
  219. package/lib/server/utils/zipFile.js +75 -0
  220. package/lib/server/utils/zones.js +54 -0
  221. package/lib/server/webkit/webkit.js +4 -4
  222. package/lib/server/webkit/wkBrowser.js +10 -10
  223. package/lib/server/webkit/wkConnection.js +1 -1
  224. package/lib/server/webkit/wkExecutionContext.js +26 -30
  225. package/lib/server/webkit/wkInput.js +17 -7
  226. package/lib/server/webkit/wkInterceptableRequest.js +2 -2
  227. package/lib/server/webkit/wkPage.js +80 -66
  228. package/lib/server/webkit/wkProvisionalPage.js +1 -1
  229. package/lib/server/webkit/wkWorkers.js +2 -2
  230. package/lib/utils/fileUtils.js +1 -1
  231. package/lib/utils/glob.js +84 -0
  232. package/lib/utils/isomorphic/ariaSnapshot.js +392 -0
  233. package/lib/utils/isomorphic/assert.js +25 -0
  234. package/lib/utils/isomorphic/colors.js +65 -0
  235. package/lib/utils/isomorphic/cssParser.js +5 -5
  236. package/lib/utils/isomorphic/headers.js +52 -0
  237. package/lib/utils/isomorphic/locatorGenerators.js +38 -8
  238. package/lib/utils/isomorphic/locatorParser.js +19 -13
  239. package/lib/utils/isomorphic/manualPromise.js +107 -0
  240. package/lib/utils/isomorphic/mimeType.js +11 -3
  241. package/lib/utils/isomorphic/multimap.js +73 -0
  242. package/lib/utils/isomorphic/rtti.js +41 -0
  243. package/lib/utils/isomorphic/semaphore.js +51 -0
  244. package/lib/utils/isomorphic/stackTrace.js +169 -0
  245. package/lib/utils/isomorphic/stringUtils.js +31 -1
  246. package/lib/utils/isomorphic/time.js +25 -0
  247. package/lib/utils/isomorphic/timeoutRunner.js +66 -0
  248. package/lib/utils/isomorphic/traceUtils.js +23 -0
  249. package/lib/utils/isomorphic/types.js +5 -0
  250. package/lib/utils/isomorphic/urlMatch.js +7 -5
  251. package/lib/utils/mimeType.js +30 -0
  252. package/lib/utils/stackTrace.js +1 -1
  253. package/lib/utils.js +447 -0
  254. package/lib/utilsBundle.js +4 -29
  255. package/lib/utilsBundleImpl/index.js +188 -33
  256. package/lib/vite/htmlReport/index.html +20 -17
  257. package/lib/vite/recorder/assets/codeMirrorModule-B9YMkrwa.js +24 -0
  258. package/lib/vite/recorder/assets/index-ELPgmkwA.js +184 -0
  259. package/lib/vite/recorder/assets/{index-BW-aOBcL.css → index-eHBmevrY.css} +1 -1
  260. package/lib/vite/recorder/index.html +2 -2
  261. package/lib/vite/traceViewer/assets/codeMirrorModule-gU1OOCQO.js +24 -0
  262. package/lib/vite/traceViewer/assets/defaultSettingsView-B5n_FjMx.js +1 -0
  263. package/lib/vite/traceViewer/assets/inspectorTab-6Tru8Mn_.js +235 -0
  264. package/lib/vite/traceViewer/assets/workbench-B_Nj4NA2.js +25 -0
  265. package/lib/vite/traceViewer/assets/{xtermModule-BeNbaIVa.js → xtermModule-BoAIEibi.js} +7 -7
  266. package/lib/vite/traceViewer/defaultSettingsView.CO3FR0CX.css +1 -0
  267. package/lib/vite/traceViewer/{embedded.BkvOrz5Z.js → embedded.DpNPH6mk.js} +2 -2
  268. package/lib/vite/traceViewer/embedded.html +6 -6
  269. package/lib/vite/traceViewer/index.CuE3SYGw.js +2 -0
  270. package/lib/vite/traceViewer/index.html +27 -9
  271. package/lib/vite/traceViewer/inspectorTab.CXDulcFG.css +1 -0
  272. package/lib/vite/traceViewer/{recorder.DNMfnSiu.js → recorder.BD-uZJs7.js} +2 -2
  273. package/lib/vite/traceViewer/recorder.html +4 -4
  274. package/lib/vite/traceViewer/sw.bundle.js +7888 -3
  275. package/lib/vite/traceViewer/{uiMode.CAYqod-m.css → uiMode.BatfzHMG.css} +1 -1
  276. package/lib/vite/traceViewer/uiMode.DHrNgddz.js +5 -0
  277. package/lib/vite/traceViewer/uiMode.html +8 -7
  278. package/lib/vite/traceViewer/workbench.B9vIAzH9.css +1 -0
  279. package/lib/zipBundleImpl.js +4 -4
  280. package/package.json +7 -7
  281. package/types/protocol.d.ts +820 -153
  282. package/types/types.d.ts +285 -82
  283. package/bin/PrintDeps.exe +0 -0
  284. package/bin/README.md +0 -2
  285. package/lib/vite/recorder/assets/codeMirrorModule-d0KhC1qL.js +0 -24
  286. package/lib/vite/recorder/assets/index-Bxxcmxlu.js +0 -42
  287. package/lib/vite/traceViewer/assets/codeMirrorModule-pBPtArIT.js +0 -24
  288. package/lib/vite/traceViewer/assets/codeMirrorModule-tzBrK1V4.js +0 -24
  289. package/lib/vite/traceViewer/assets/inspectorTab-BuJ3wAX_.js +0 -64
  290. package/lib/vite/traceViewer/assets/inspectorTab-Soeeuvzv.js +0 -64
  291. package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +0 -1
  292. package/lib/vite/traceViewer/assets/workbench-DdmJ9AJV.js +0 -9
  293. package/lib/vite/traceViewer/assets/workbench-lypYlf00.js +0 -9
  294. package/lib/vite/traceViewer/embedded.DInvAijy.js +0 -2
  295. package/lib/vite/traceViewer/index.Dha3cgqs.js +0 -2
  296. package/lib/vite/traceViewer/index._Iolt-uE.js +0 -2
  297. package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +0 -1
  298. package/lib/vite/traceViewer/recorder.DTSaNaly.js +0 -2
  299. package/lib/vite/traceViewer/uiMode.BM7yhjzl.js +0 -5
  300. package/lib/vite/traceViewer/uiMode.Cr1tvTWS.js +0 -5
  301. package/lib/vite/traceViewer/workbench.DlsCx8k5.css +0 -1
  302. /package/lib/vite/recorder/assets/{codeMirrorModule-ez37Vkbh.css → codeMirrorModule-C3UTv-Ge.css} +0 -0
  303. /package/lib/vite/traceViewer/{codeMirrorModule.ez37Vkbh.css → codeMirrorModule.C3UTv-Ge.css} +0 -0
  304. /package/lib/vite/traceViewer/{embedded.w7WN2u1R.css → embedded.mLhjB5IF.css} +0 -0
  305. /package/lib/vite/traceViewer/{index.CrbWWHbf.css → index.CFOW-Ezb.css} +0 -0
  306. /package/lib/vite/traceViewer/{recorder.B_SY1GJM.css → recorder.tn0RQdqM.css} +0 -0
  307. /package/lib/vite/traceViewer/{xtermModule.DSXBckUd.css → xtermModule.Beg8tuEN.css} +0 -0
@@ -4,19 +4,19 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.BidiPage = void 0;
7
- var _eventsHelper = require("../../utils/eventsHelper");
8
7
  var _utils = require("../../utils");
9
- var dom = _interopRequireWildcard(require("../dom"));
8
+ var _eventsHelper = require("../utils/eventsHelper");
9
+ var _browserContext = require("../browserContext");
10
10
  var dialog = _interopRequireWildcard(require("../dialog"));
11
+ var dom = _interopRequireWildcard(require("../dom"));
11
12
  var _page = require("../page");
12
- var _bidiInput = require("./bidiInput");
13
- var bidi = _interopRequireWildcard(require("./third_party/bidiProtocol"));
14
13
  var _bidiExecutionContext = require("./bidiExecutionContext");
14
+ var _bidiInput = require("./bidiInput");
15
15
  var _bidiNetworkManager = require("./bidiNetworkManager");
16
- var _browserContext = require("../browserContext");
17
16
  var _bidiPdf = require("./bidiPdf");
17
+ var bidi = _interopRequireWildcard(require("./third_party/bidiProtocol"));
18
18
  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); }
19
- 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
+ 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 && {}.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; }
20
20
  /**
21
21
  * Copyright (c) Microsoft Corporation.
22
22
  *
@@ -41,7 +41,6 @@ class BidiPage {
41
41
  this.rawKeyboard = void 0;
42
42
  this.rawTouchscreen = void 0;
43
43
  this._page = void 0;
44
- this._pagePromise = void 0;
45
44
  this._session = void 0;
46
45
  this._opener = void 0;
47
46
  this._realmToContext = void 0;
@@ -49,7 +48,6 @@ class BidiPage {
49
48
  this._browserContext = void 0;
50
49
  this._networkManager = void 0;
51
50
  this._pdf = void 0;
52
- this._initializedPage = null;
53
51
  this._initScriptIds = [];
54
52
  this._session = bidiSession;
55
53
  this._opener = opener;
@@ -65,15 +63,13 @@ class BidiPage {
65
63
  this._sessionListeners = [_eventsHelper.eventsHelper.addEventListener(bidiSession, 'script.realmCreated', this._onRealmCreated.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'script.message', this._onScriptMessage.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))];
66
64
 
67
65
  // Initialize main frame.
68
- this._pagePromise = this._initialize().finally(async () => {
69
- await this._page.initOpener(this._opener);
70
- }).then(() => {
71
- this._initializedPage = this._page;
72
- this._page.reportAsNew();
73
- return this._page;
74
- }).catch(e => {
75
- this._page.reportAsNew(e);
76
- return e;
66
+ // TODO: Wait for first execution context to be created and maybe about:blank navigated.
67
+ this._initialize().then(() => {
68
+ var _this$_opener;
69
+ return this._page.reportAsNew((_this$_opener = this._opener) === null || _this$_opener === void 0 ? void 0 : _this$_opener._page);
70
+ }, error => {
71
+ var _this$_opener2;
72
+ return this._page.reportAsNew((_this$_opener2 = this._opener) === null || _this$_opener2 === void 0 ? void 0 : _this$_opener2._page, error);
77
73
  });
78
74
  }
79
75
  async _initialize() {
@@ -84,18 +80,11 @@ class BidiPage {
84
80
  async _addAllInitScripts() {
85
81
  return Promise.all(this._page.allInitScripts().map(initScript => this.addInitScript(initScript)));
86
82
  }
87
- potentiallyUninitializedPage() {
88
- return this._page;
89
- }
90
83
  didClose() {
91
84
  this._session.dispose();
92
85
  _eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);
93
86
  this._page._didClose();
94
87
  }
95
- async pageOrError() {
96
- // TODO: Wait for first execution context to be created and maybe about:blank navigated.
97
- return this._pagePromise;
98
- }
99
88
  _onFrameAttached(frameId, parentFrameId) {
100
89
  return this._page._frameManager.frameAttached(frameId, parentFrameId);
101
90
  }
@@ -112,7 +101,6 @@ class BidiPage {
112
101
  if (realmInfo.type !== 'window') return;
113
102
  const frame = this._page._frameManager.frame(realmInfo.context);
114
103
  if (!frame) return;
115
- const delegate = new _bidiExecutionContext.BidiExecutionContext(this._session, realmInfo);
116
104
  let worldName;
117
105
  if (!realmInfo.sandbox) {
118
106
  worldName = 'main';
@@ -123,8 +111,8 @@ class BidiPage {
123
111
  } else {
124
112
  return;
125
113
  }
114
+ const delegate = new _bidiExecutionContext.BidiExecutionContext(this._session, realmInfo);
126
115
  const context = new dom.FrameExecutionContext(delegate, frame, worldName);
127
- context[contextDelegateSymbol] = delegate;
128
116
  frame._contextCreated(worldName, context);
129
117
  this._realmToContext.set(realmInfo.realm, context);
130
118
  }
@@ -213,10 +201,7 @@ class BidiPage {
213
201
  lineNumber: 1,
214
202
  columnNumber: 1
215
203
  };
216
- this._page._addConsoleMessage(entry.method, entry.args.map(arg => context.createHandle({
217
- objectId: arg.handle,
218
- ...arg
219
- })), location, params.text || undefined);
204
+ this._page._addConsoleMessage(entry.method, entry.args.map(arg => (0, _bidiExecutionContext.createHandle)(context, arg)), location, params.text || undefined);
220
205
  }
221
206
  async navigateFrame(frame, url, referrer) {
222
207
  const {
@@ -311,7 +296,7 @@ class BidiPage {
311
296
  }
312
297
  async _onScriptMessage(event) {
313
298
  if (event.channel !== kPlaywrightBindingChannel) return;
314
- const pageOrError = await this.pageOrError();
299
+ const pageOrError = await this._page.waitForInitializedOrError();
315
300
  if (pageOrError instanceof Error) return;
316
301
  const context = this._realmToContext.get(event.source.realm);
317
302
  if (!context) return;
@@ -351,7 +336,7 @@ class BidiPage {
351
336
  context: this._session.sessionId,
352
337
  format: {
353
338
  type: `image/${format === 'png' ? 'png' : 'jpeg'}`,
354
- quality: quality || 80
339
+ quality: quality ? quality / 100 : 0.8
355
340
  },
356
341
  origin: documentRect ? 'document' : 'viewport',
357
342
  clip: {
@@ -363,21 +348,20 @@ class BidiPage {
363
348
  }
364
349
  async getContentFrame(handle) {
365
350
  const executionContext = toBidiExecutionContext(handle._context);
366
- const contentWindow = await executionContext.rawCallFunction('e => e.contentWindow', {
367
- handle: handle._objectId
368
- });
369
- if (contentWindow.type === 'window') {
370
- const frameId = contentWindow.value.context;
371
- const result = this._page._frameManager.frame(frameId);
372
- return result;
373
- }
374
- return null;
351
+ const frameId = await executionContext.contentFrameIdForFrame(handle);
352
+ if (!frameId) return null;
353
+ return this._page._frameManager.frame(frameId);
375
354
  }
376
355
  async getOwnerFrame(handle) {
377
- throw new Error('Method not implemented.');
378
- }
379
- isElementHandle(remoteObject) {
380
- return remoteObject.type === 'node';
356
+ // TODO: switch to utility world?
357
+ const windowHandle = await handle.evaluateHandle(node => {
358
+ var _node$ownerDocument;
359
+ const doc = (_node$ownerDocument = node.ownerDocument) !== null && _node$ownerDocument !== void 0 ? _node$ownerDocument : node;
360
+ return doc.defaultView;
361
+ });
362
+ if (!windowHandle) return null;
363
+ const executionContext = toBidiExecutionContext(handle._context);
364
+ return executionContext.frameIdForWindowHandle(windowHandle);
381
365
  }
382
366
  async getBoundingBox(handle) {
383
367
  const box = await handle.evaluate(element => {
@@ -460,29 +444,19 @@ class BidiPage {
460
444
  }));
461
445
  return quads;
462
446
  }
463
- async setInputFiles(handle, files) {
464
- throw new Error('Method not implemented.');
465
- }
466
447
  async setInputFilePaths(handle, paths) {
467
- throw new Error('Method not implemented.');
448
+ const fromContext = toBidiExecutionContext(handle._context);
449
+ await this._session.send('input.setFiles', {
450
+ context: this._session.sessionId,
451
+ element: await fromContext.nodeIdForElementHandle(handle),
452
+ files: paths
453
+ });
468
454
  }
469
455
  async adoptElementHandle(handle, to) {
470
456
  const fromContext = toBidiExecutionContext(handle._context);
471
- const shared = await fromContext.rawCallFunction('x => x', {
472
- handle: handle._objectId
473
- });
474
- // TODO: store sharedId in the handle.
475
- if (!('sharedId' in shared)) throw new Error('Element is not a node');
476
- const sharedId = shared.sharedId;
457
+ const nodeId = await fromContext.nodeIdForElementHandle(handle);
477
458
  const executionContext = toBidiExecutionContext(to);
478
- const result = await executionContext.rawCallFunction('x => x', {
479
- sharedId
480
- });
481
- if ('handle' in result) return to.createHandle({
482
- objectId: result.handle,
483
- ...result
484
- });
485
- throw new Error('Failed to adopt element handle.');
459
+ return await executionContext.remoteObjectForNodeId(to, nodeId);
486
460
  }
487
461
  async getAccessibilityTree(needle) {
488
462
  throw new Error('Method not implemented.');
@@ -524,6 +498,5 @@ function addMainBinding(callback) {
524
498
  globalThis['__playwright__binding__'] = callback;
525
499
  }
526
500
  function toBidiExecutionContext(executionContext) {
527
- return executionContext[contextDelegateSymbol];
528
- }
529
- const contextDelegateSymbol = Symbol('delegate');
501
+ return executionContext.delegate;
502
+ }
@@ -13,18 +13,18 @@ exports.getBidiKeyValue = void 0;
13
13
 
14
14
  /* eslint-disable curly */
15
15
 
16
- const getBidiKeyValue = key => {
17
- switch (key) {
16
+ const getBidiKeyValue = keyName => {
17
+ switch (keyName) {
18
18
  case '\r':
19
19
  case '\n':
20
- key = 'Enter';
20
+ keyName = 'Enter';
21
21
  break;
22
22
  }
23
23
  // Measures the number of code points rather than UTF-16 code units.
24
- if ([...key].length === 1) {
25
- return key;
24
+ if ([...keyName].length === 1) {
25
+ return keyName;
26
26
  }
27
- switch (key) {
27
+ switch (keyName) {
28
28
  case 'Cancel':
29
29
  return '\uE001';
30
30
  case 'Help':
@@ -137,6 +137,8 @@ const getBidiKeyValue = key => {
137
137
  return '\uE052';
138
138
  case 'MetaRight':
139
139
  return '\uE053';
140
+ case 'Space':
141
+ return ' ';
140
142
  case 'Digit0':
141
143
  return '0';
142
144
  case 'Digit1':
@@ -232,7 +234,7 @@ const getBidiKeyValue = key => {
232
234
  case 'Quote':
233
235
  return '"';
234
236
  default:
235
- throw new Error(`Unknown key: "${key}"`);
237
+ throw new Error(`Unknown key: "${keyName}"`);
236
238
  }
237
239
  };
238
240
  exports.getBidiKeyValue = getBidiKeyValue;
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.createProfile = createProfile;
7
7
  var _fs = _interopRequireDefault(require("fs"));
8
8
  var _path = _interopRequireDefault(require("path"));
9
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
10
  /**
11
11
  * @license
12
12
  * Copyright 2023 Google Inc.
@@ -47,6 +47,13 @@ function defaultProfilePreferences(extraPrefs) {
47
47
  // console
48
48
  // https://bugzilla.mozilla.org/show_bug.cgi?id=1543115
49
49
  'browser.dom.window.dump.enabled': true,
50
+ // Make sure newtab weather doesn't hit the network to retrieve weather data.
51
+ 'browser.newtabpage.activity-stream.discoverystream.region-weather-config': '',
52
+ // Make sure newtab wallpapers don't hit the network to retrieve wallpaper data.
53
+ 'browser.newtabpage.activity-stream.newtabWallpapers.enabled': false,
54
+ 'browser.newtabpage.activity-stream.newtabWallpapers.v2.enabled': false,
55
+ // Make sure Topsites doesn't hit the network to retrieve sponsored tiles.
56
+ 'browser.newtabpage.activity-stream.showSponsoredTopSites': false,
50
57
  // Disable topstories
51
58
  'browser.newtabpage.activity-stream.feeds.system.topstories': false,
52
59
  // Always display a blank page
@@ -112,6 +119,13 @@ function defaultProfilePreferences(extraPrefs) {
112
119
  // Disable slow script dialogues
113
120
  'dom.max_chrome_script_run_time': 0,
114
121
  'dom.max_script_run_time': 0,
122
+ // Disable background timer throttling to allow tests to run in parallel
123
+ // without a decrease in performance.
124
+ 'dom.min_background_timeout_value': 0,
125
+ 'dom.min_background_timeout_value_without_budget_throttling': 0,
126
+ 'dom.timeout.enable_budget_timer_throttling': false,
127
+ // Disable HTTPS-First upgrades
128
+ 'dom.security.https_first': false,
115
129
  // Only load extensions from the application and user profile
116
130
  // AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_APPLICATION
117
131
  'extensions.autoDisableScopes': 0,
@@ -141,10 +155,14 @@ function defaultProfilePreferences(extraPrefs) {
141
155
  'hangmonitor.timeout': 0,
142
156
  // Show chrome errors and warnings in the error console
143
157
  'javascript.options.showInConsole': true,
158
+ // Do not throttle rendering (requestAnimationFrame) in background tabs
159
+ 'layout.testing.top-level-always-active': true,
144
160
  // Disable download and usage of OpenH264: and Widevine plugins
145
161
  'media.gmp-manager.updateEnabled': false,
146
162
  // Disable the GFX sanity window
147
163
  'media.sanity-test.disabled': true,
164
+ // Disable connectivity service pings
165
+ 'network.connectivity-service.enabled': false,
148
166
  // Disable experimental feature that is only available in Nightly
149
167
  'network.cookie.sameSite.laxByDefault': false,
150
168
  // Do not prompt for temporary redirects
@@ -169,8 +187,6 @@ function defaultProfilePreferences(extraPrefs) {
169
187
  'security.fileuri.strict_origin_policy': false,
170
188
  // Do not wait for the notification button security delay
171
189
  'security.notification_enable_delay': 0,
172
- // Ensure blocklist updates do not hit the network
173
- 'services.settings.server': `http://${server}/dummy/blocklist/`,
174
190
  // Do not automatically fill sign-in forms with known usernames and
175
191
  // passwords
176
192
  'signon.autofillForms': false,
@@ -4,11 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Browser = void 0;
7
+ var _artifact = require("./artifact");
7
8
  var _browserContext = require("./browserContext");
8
- var _page = require("./page");
9
9
  var _download = require("./download");
10
10
  var _instrumentation = require("./instrumentation");
11
- var _artifact = require("./artifact");
11
+ var _page = require("./page");
12
12
  var _socksClientCertificatesInterceptor = require("./socksClientCertificatesInterceptor");
13
13
  /**
14
14
  * Copyright (c) Microsoft Corporation.
@@ -9,26 +9,29 @@ exports.normalizeProxySettings = normalizeProxySettings;
9
9
  exports.validateBrowserContextOptions = validateBrowserContextOptions;
10
10
  exports.verifyClientCertificates = verifyClientCertificates;
11
11
  exports.verifyGeolocation = verifyGeolocation;
12
- var _timeoutSettings = require("../common/timeoutSettings");
13
- var _utils = require("../utils");
14
- var _fileUtils = require("../utils/fileUtils");
15
- var _helper = require("./helper");
16
- var network = _interopRequireWildcard(require("./network"));
17
- var _page6 = require("./page");
18
- var _path = _interopRequireDefault(require("path"));
19
12
  var _fs = _interopRequireDefault(require("fs"));
20
- var _instrumentation = require("./instrumentation");
13
+ var _path = _interopRequireDefault(require("path"));
14
+ var _timeoutSettings = require("./timeoutSettings");
15
+ var _crypto = require("./utils/crypto");
16
+ var _debug = require("./utils/debug");
17
+ var _clock = require("./clock");
21
18
  var _debugger = require("./debugger");
22
- var _tracing = require("./trace/recorder/tracing");
19
+ var _fetch = require("./fetch");
20
+ var _fileUtils = require("./utils/fileUtils");
23
21
  var _harRecorder = require("./har/harRecorder");
22
+ var _helper = require("./helper");
23
+ var _instrumentation = require("./instrumentation");
24
+ var utilityScriptSerializers = _interopRequireWildcard(require("./isomorphic/utilityScriptSerializers"));
25
+ var network = _interopRequireWildcard(require("./network"));
26
+ var _page6 = require("./page");
24
27
  var _recorder = require("./recorder");
25
- var consoleApiSource = _interopRequireWildcard(require("../generated/consoleApiSource"));
26
- var _fetch = require("./fetch");
27
- var _clock = require("./clock");
28
28
  var _recorderApp = require("./recorder/recorderApp");
29
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+ var storageScript = _interopRequireWildcard(require("./storageScript"));
30
+ var consoleApiSource = _interopRequireWildcard(require("../generated/consoleApiSource"));
31
+ var _tracing = require("./trace/recorder/tracing");
30
32
  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); }
31
- 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; }
33
+ 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 && {}.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; }
34
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
32
35
  /**
33
36
  * Copyright 2017 Google Inc. All rights reserved.
34
37
  * Modifications copyright (c) Microsoft Corporation.
@@ -102,7 +105,7 @@ class BrowserContext extends _instrumentation.SdkObject {
102
105
  this._debugger = new _debugger.Debugger(this);
103
106
 
104
107
  // When PWDEBUG=1, show inspector for each context.
105
- if ((0, _utils.debugMode)() === 'inspector') await _recorder.Recorder.show('actions', this, _recorderApp.RecorderApp.factory(this), {
108
+ if ((0, _debug.debugMode)() === 'inspector') await _recorder.Recorder.show(this, _recorderApp.RecorderApp.factory(this), {
106
109
  pauseOnNextStatement: true
107
110
  });
108
111
 
@@ -111,7 +114,7 @@ class BrowserContext extends _instrumentation.SdkObject {
111
114
  this._debugger.on(_debugger.Debugger.Events.PausedStateChanged, () => {
112
115
  if (this._debugger.isPaused()) _recorder.Recorder.showInspectorNoReply(this, _recorderApp.RecorderApp.factory(this));
113
116
  });
114
- if ((0, _utils.debugMode)() === 'console') await this.extendInjectedScript(consoleApiSource.source);
117
+ if ((0, _debug.debugMode)() === 'console') await this.extendInjectedScript(consoleApiSource.source);
115
118
  if (this._options.serviceWorkers === 'block') await this.addInitScript(`\nif (navigator.serviceWorker) navigator.serviceWorker.register = async () => { console.warn('Service Worker registration blocked by Playwright'); };\n`);
116
119
  if (this._options.permissions) await this.grantPermissions(this._options.permissions);
117
120
  }
@@ -201,6 +204,9 @@ class BrowserContext extends _instrumentation.SdkObject {
201
204
  this._closePromiseFulfill(new Error('Context closed'));
202
205
  this.emit(BrowserContext.Events.Close);
203
206
  }
207
+ pages() {
208
+ return this.possiblyUninitializedPages().filter(page => page.initializedOrUndefined());
209
+ }
204
210
 
205
211
  // BrowserContext methods.
206
212
 
@@ -227,6 +233,9 @@ class BrowserContext extends _instrumentation.SdkObject {
227
233
  setHTTPCredentials(httpCredentials) {
228
234
  return this.doSetHTTPCredentials(httpCredentials);
229
235
  }
236
+ hasBinding(name) {
237
+ return this._pageBindings.has(name);
238
+ }
230
239
  async exposeBinding(name, needsHandle, playwrightBinding) {
231
240
  if (this._pageBindings.has(name)) throw new Error(`Function "${name}" has been already registered`);
232
241
  for (const page of this.pages()) {
@@ -266,27 +275,29 @@ class BrowserContext extends _instrumentation.SdkObject {
266
275
  this._timeoutSettings.setDefaultTimeout(timeout);
267
276
  }
268
277
  async _loadDefaultContextAsIs(progress) {
269
- if (!this.pages().length) {
278
+ if (!this.possiblyUninitializedPages().length) {
270
279
  const waitForEvent = _helper.helper.waitForEvent(progress, this, BrowserContext.Events.Page);
271
280
  progress.cleanupWhenAborted(() => waitForEvent.dispose);
272
- const page = await waitForEvent.promise;
273
- if (page._pageIsError) throw page._pageIsError;
281
+ // Race against BrowserContext.close
282
+ await Promise.race([waitForEvent.promise, this._closePromise]);
274
283
  }
275
- const pages = this.pages();
276
- if (pages[0]._pageIsError) throw pages[0]._pageIsError;
277
- await pages[0].mainFrame()._waitForLoadState(progress, 'load');
278
- return pages;
284
+ const page = this.possiblyUninitializedPages()[0];
285
+ if (!page) return;
286
+ const pageOrError = await page.waitForInitializedOrError();
287
+ if (pageOrError instanceof Error) throw pageOrError;
288
+ await page.mainFrame()._waitForLoadState(progress, 'load');
289
+ return page;
279
290
  }
280
291
  async _loadDefaultContext(progress) {
281
- const pages = await this._loadDefaultContextAsIs(progress);
292
+ const defaultPage = await this._loadDefaultContextAsIs(progress);
293
+ if (!defaultPage) return;
282
294
  const browserName = this._browser.options.name;
283
295
  if (this._options.isMobile && browserName === 'chromium' || this._options.locale && browserName === 'webkit') {
284
296
  // Workaround for:
285
297
  // - chromium fails to change isMobile for existing page;
286
298
  // - webkit fails to change locale for existing page.
287
- const oldPage = pages[0];
288
299
  await this.newPage(progress.metadata);
289
- await oldPage.close(progress.metadata);
300
+ await defaultPage.close(progress.metadata);
290
301
  }
291
302
  }
292
303
  _authenticateProxyViaHeader() {
@@ -319,8 +330,8 @@ class BrowserContext extends _instrumentation.SdkObject {
319
330
  password: password || ''
320
331
  };
321
332
  }
322
- async addInitScript(source) {
323
- const initScript = new _page6.InitScript(source);
333
+ async addInitScript(source, name) {
334
+ const initScript = new _page6.InitScript(source, false /* internal */, name);
324
335
  this.initScripts.push(initScript);
325
336
  await this.doAddInitScript(initScript);
326
337
  }
@@ -380,9 +391,9 @@ class BrowserContext extends _instrumentation.SdkObject {
380
391
  await this._closePromise;
381
392
  }
382
393
  async newPage(metadata) {
383
- const pageDelegate = await this.newPageDelegate();
384
- if (metadata.isServerSide) pageDelegate.potentiallyUninitializedPage().markAsServerSideOnly();
385
- const pageOrError = await pageDelegate.pageOrError();
394
+ const page = await this.doCreateNewPage();
395
+ if (metadata.isServerSide) page.markAsServerSideOnly();
396
+ const pageOrError = await page.waitForInitializedOrError();
386
397
  if (pageOrError instanceof _page6.Page) {
387
398
  if (pageOrError.isClosed()) throw new Error('Page has been closed.');
388
399
  return pageOrError;
@@ -392,24 +403,25 @@ class BrowserContext extends _instrumentation.SdkObject {
392
403
  addVisitedOrigin(origin) {
393
404
  this._origins.add(origin);
394
405
  }
395
- async storageState() {
406
+ async storageState(indexedDB = false) {
396
407
  const result = {
397
408
  cookies: await this.cookies(),
398
409
  origins: []
399
410
  };
400
411
  const originsToSave = new Set(this._origins);
412
+ const collectScript = `(${storageScript.collect})((${utilityScriptSerializers.source})(), ${this._browser.options.name === 'firefox'}, ${indexedDB})`;
401
413
 
402
414
  // First try collecting storage stage from existing pages.
403
415
  for (const page of this.pages()) {
404
416
  const origin = page.mainFrame().origin();
405
417
  if (!origin || !originsToSave.has(origin)) continue;
406
418
  try {
407
- const storage = await page.mainFrame().nonStallingEvaluateInExistingContext(`({
408
- localStorage: Object.keys(localStorage).map(name => ({ name, value: localStorage.getItem(name) })),
409
- })`, 'utility');
410
- if (storage.localStorage.length) result.origins.push({
419
+ var _storage$indexedDB;
420
+ const storage = await page.mainFrame().nonStallingEvaluateInExistingContext(collectScript, 'utility');
421
+ if (storage.localStorage.length || (_storage$indexedDB = storage.indexedDB) !== null && _storage$indexedDB !== void 0 && _storage$indexedDB.length) result.origins.push({
411
422
  origin,
412
- localStorage: storage.localStorage
423
+ localStorage: storage.localStorage,
424
+ indexedDB: storage.indexedDB
413
425
  });
414
426
  originsToSave.delete(origin);
415
427
  } catch {
@@ -428,19 +440,17 @@ class BrowserContext extends _instrumentation.SdkObject {
428
440
  return true;
429
441
  });
430
442
  for (const origin of originsToSave) {
431
- const originStorage = {
432
- origin,
433
- localStorage: []
434
- };
443
+ var _storage$indexedDB2;
435
444
  const frame = page.mainFrame();
436
445
  await frame.goto(internalMetadata, origin);
437
- const storage = await frame.evaluateExpression(`({
438
- localStorage: Object.keys(localStorage).map(name => ({ name, value: localStorage.getItem(name) })),
439
- })`, {
446
+ const storage = await frame.evaluateExpression(collectScript, {
440
447
  world: 'utility'
441
448
  });
442
- originStorage.localStorage = storage.localStorage;
443
- if (storage.localStorage.length) result.origins.push(originStorage);
449
+ if (storage.localStorage.length || (_storage$indexedDB2 = storage.indexedDB) !== null && _storage$indexedDB2 !== void 0 && _storage$indexedDB2.length) result.origins.push({
450
+ origin,
451
+ localStorage: storage.localStorage,
452
+ indexedDB: storage.indexedDB
453
+ });
444
454
  }
445
455
  await page.close(internalMetadata);
446
456
  }
@@ -498,14 +508,9 @@ class BrowserContext extends _instrumentation.SdkObject {
498
508
  for (const originState of state.origins) {
499
509
  const frame = page.mainFrame();
500
510
  await frame.goto(metadata, originState.origin);
501
- await frame.evaluateExpression(`
502
- originState => {
503
- for (const { name, value } of (originState.localStorage || []))
504
- localStorage.setItem(name, value);
505
- }`, {
506
- isFunction: true,
511
+ await frame.evaluateExpression(`(${storageScript.restore})(${JSON.stringify(originState)}, (${utilityScriptSerializers.source})())`, {
507
512
  world: 'utility'
508
- }, originState);
513
+ });
509
514
  }
510
515
  await page.close(internalMetadata);
511
516
  }
@@ -526,7 +531,7 @@ class BrowserContext extends _instrumentation.SdkObject {
526
531
  await Promise.all(this.pages().map(page => page.safeNonStallingEvaluateInAllFrames(expression, world, options)));
527
532
  }
528
533
  async _harStart(page, options) {
529
- const harId = (0, _utils.createGuid)();
534
+ const harId = (0, _crypto.createGuid)();
530
535
  this._harRecorders.set(harId, new _harRecorder.HarRecorder(this, page, options));
531
536
  return harId;
532
537
  }
@@ -651,7 +656,7 @@ function normalizeProxySettings(proxy) {
651
656
  bypass
652
657
  };
653
658
  }
654
- const paramsThatAllowContextReuse = ['colorScheme', 'forcedColors', 'reducedMotion', 'screen', 'userAgent', 'viewport'];
659
+ const paramsThatAllowContextReuse = ['colorScheme', 'forcedColors', 'reducedMotion', 'contrast', 'screen', 'userAgent', 'viewport'];
655
660
  const defaultNewContextParamValues = {
656
661
  noDefaultViewport: false,
657
662
  ignoreHTTPSErrors: false,