@checkly/playwright-core 1.47.12 → 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 (227) hide show
  1. package/browsers.json +14 -10
  2. package/lib/cli/program.js +22 -12
  3. package/lib/client/api.js +6 -0
  4. package/lib/client/browserContext.js +20 -2
  5. package/lib/client/channelOwner.js +5 -2
  6. package/lib/client/connection.js +3 -0
  7. package/lib/client/fetch.js +16 -3
  8. package/lib/client/jsHandle.js +0 -8
  9. package/lib/client/localUtils.js +1 -0
  10. package/lib/client/network.js +175 -17
  11. package/lib/client/page.js +21 -0
  12. package/lib/client/playwright.js +6 -3
  13. package/lib/client/tracing.js +16 -20
  14. package/lib/generated/consoleApiSource.js +1 -1
  15. package/lib/generated/injectedScriptSource.js +1 -1
  16. package/lib/generated/pollingRecorderSource.js +7 -0
  17. package/lib/generated/webSocketMockSource.js +7 -0
  18. package/lib/protocol/validator.js +79 -14
  19. package/lib/server/bidi/bidiBrowser.js +23 -8
  20. package/lib/server/bidi/bidiChromium.js +124 -0
  21. package/lib/server/bidi/bidiConnection.js +1 -1
  22. package/lib/server/bidi/bidiExecutionContext.js +0 -3
  23. package/lib/server/bidi/bidiFirefox.js +15 -21
  24. package/lib/server/bidi/bidiInput.js +16 -32
  25. package/lib/server/bidi/bidiNetworkManager.js +39 -5
  26. package/lib/server/bidi/bidiOverCdp.js +103 -0
  27. package/lib/server/bidi/bidiPage.js +98 -25
  28. package/lib/server/bidi/bidiPdf.js +140 -0
  29. package/lib/server/bidi/third_party/firefoxPrefs.js +221 -0
  30. package/lib/server/browser.js +13 -2
  31. package/lib/server/browserContext.js +6 -23
  32. package/lib/server/browserType.js +39 -11
  33. package/lib/server/chromium/chromium.js +3 -15
  34. package/lib/server/chromium/chromiumSwitches.js +3 -1
  35. package/lib/server/chromium/crBrowser.js +4 -3
  36. package/lib/server/chromium/crExecutionContext.js +0 -7
  37. package/lib/server/chromium/crPage.js +5 -2
  38. package/lib/server/chromium/videoRecorder.js +1 -1
  39. package/lib/server/codegen/csharp.js +2 -2
  40. package/lib/server/codegen/java.js +1 -1
  41. package/lib/server/codegen/javascript.js +1 -1
  42. package/lib/server/codegen/language.js +14 -2
  43. package/lib/server/codegen/python.js +2 -2
  44. package/lib/server/cookieStore.js +73 -0
  45. package/lib/server/debugController.js +2 -2
  46. package/lib/server/deviceDescriptorsSource.json +51 -51
  47. package/lib/server/dialog.js +1 -0
  48. package/lib/server/dispatchers/browserContextDispatcher.js +19 -2
  49. package/lib/server/dispatchers/jsHandleDispatcher.js +0 -5
  50. package/lib/server/dispatchers/pageDispatcher.js +9 -0
  51. package/lib/server/dispatchers/playwrightDispatcher.js +2 -1
  52. package/lib/server/dispatchers/webSocketRouteDispatcher.js +189 -0
  53. package/lib/server/download.js +9 -2
  54. package/lib/server/fetch.js +96 -99
  55. package/lib/server/firefox/ffBrowser.js +6 -4
  56. package/lib/server/firefox/ffExecutionContext.js +0 -3
  57. package/lib/server/firefox/ffPage.js +3 -0
  58. package/lib/server/firefox/firefox.js +2 -13
  59. package/lib/server/frameSelectors.js +1 -1
  60. package/lib/server/frames.js +3 -2
  61. package/lib/server/har/harTracer.js +11 -0
  62. package/lib/server/input.js +0 -1
  63. package/lib/server/javascript.js +0 -7
  64. package/lib/server/page.js +5 -1
  65. package/lib/server/playwright.js +5 -2
  66. package/lib/server/recorder/contextRecorder.js +33 -50
  67. package/lib/server/recorder/recorderActions.js +2 -1
  68. package/lib/server/recorder/recorderApp.js +15 -9
  69. package/lib/server/recorder/recorderCollection.js +68 -79
  70. package/lib/server/recorder/recorderFrontend.js +5 -0
  71. package/lib/server/recorder/recorderInTraceViewer.js +144 -0
  72. package/lib/server/recorder/recorderRunner.js +75 -97
  73. package/lib/server/recorder/recorderUtils.js +47 -6
  74. package/lib/server/recorder.js +28 -25
  75. package/lib/server/registry/index.js +85 -4
  76. package/lib/server/socksClientCertificatesInterceptor.js +15 -3
  77. package/lib/server/trace/recorder/snapshotter.js +1 -0
  78. package/lib/server/trace/recorder/snapshotterInjected.js +2 -2
  79. package/lib/server/trace/recorder/tracing.js +58 -2
  80. package/lib/server/trace/test/inMemorySnapshotter.js +1 -1
  81. package/lib/server/trace/viewer/traceViewer.js +2 -5
  82. package/lib/server/webkit/webkit.js +1 -1
  83. package/lib/server/webkit/wkBrowser.js +6 -5
  84. package/lib/server/webkit/wkExecutionContext.js +0 -3
  85. package/lib/server/webkit/wkPage.js +4 -1
  86. package/lib/utils/happy-eyeballs.js +13 -0
  87. package/lib/utils/hostPlatform.js +2 -2
  88. package/lib/utils/httpServer.js +1 -0
  89. package/lib/utils/isomorphic/locatorGenerators.js +9 -18
  90. package/lib/utils/isomorphic/locatorParser.js +2 -2
  91. package/lib/utils/isomorphic/recorderUtils.js +195 -0
  92. package/lib/vite/htmlReport/index.html +12 -12
  93. package/lib/vite/recorder/assets/codeMirrorModule-CND2fZ5Q.js +24 -0
  94. package/lib/vite/recorder/assets/{index-NC7rIA63.css → index-BW-aOBcL.css} +1 -1
  95. package/lib/vite/recorder/assets/{index-A2TWT47O.js → index-CEc83sSS.js} +10 -15
  96. package/lib/vite/recorder/index.html +2 -2
  97. package/lib/vite/traceViewer/assets/codeMirrorModule-5yiV-3wl.js +16831 -0
  98. package/lib/vite/traceViewer/assets/codeMirrorModule-B7Z3vq11.js +24 -0
  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-C6p3E9Zg.js +24 -0
  102. package/lib/vite/traceViewer/assets/codeMirrorModule-Ca-1BNel.js +24 -0
  103. package/lib/vite/traceViewer/assets/codeMirrorModule-CcviAl53.js +16831 -0
  104. package/lib/vite/{recorder/assets/codeMirrorModule-vr7pfcwZ.js → traceViewer/assets/codeMirrorModule-CqYUz5ms.js} +1 -1
  105. package/lib/vite/traceViewer/assets/codeMirrorModule-DS3v0XrQ.js +24 -0
  106. package/lib/vite/traceViewer/assets/codeMirrorModule-Dx6AXgMV.js +16838 -0
  107. package/lib/vite/traceViewer/assets/codeMirrorModule-EhKN7Okm.js +16449 -0
  108. package/lib/vite/traceViewer/assets/codeMirrorModule-MzSmL4X2.js +24 -0
  109. package/lib/vite/traceViewer/assets/{codeMirrorModule-cCPLLRBo.js → codeMirrorModule-T_sdMrbM.js} +1 -1
  110. package/lib/vite/traceViewer/assets/codeMirrorModule-U6XMqGkV.js +16437 -0
  111. package/lib/vite/traceViewer/assets/inspectorTab-BABZNwlH.js +17351 -0
  112. package/lib/vite/traceViewer/assets/inspectorTab-BPzVEZSf.js +17351 -0
  113. package/lib/vite/traceViewer/assets/inspectorTab-Bbgq0hgt.js +64 -0
  114. package/lib/vite/traceViewer/assets/inspectorTab-DhBbZz8I.js +64 -0
  115. package/lib/vite/traceViewer/assets/inspectorTab-DpvLVMq5.js +17351 -0
  116. package/lib/vite/traceViewer/assets/testServerConnection-D-tXL3sj.js +224 -0
  117. package/lib/vite/traceViewer/assets/workbench-B13nfocr.js +9 -0
  118. package/lib/vite/traceViewer/assets/workbench-BcgGQnKb.js +1473 -0
  119. package/lib/vite/traceViewer/assets/{wsPort-MnTGOuCA.js → workbench-Bjkiwcr1.js} +1505 -926
  120. package/lib/vite/traceViewer/assets/workbench-BwodYCgl.js +19119 -0
  121. package/lib/vite/traceViewer/assets/workbench-ByyWxoT8.js +1473 -0
  122. package/lib/vite/traceViewer/assets/{workbench-z8ylMSQK.js → workbench-C43LWZEX.js} +7 -7
  123. package/lib/vite/traceViewer/assets/workbench-C5OQh9VX.js +19119 -0
  124. package/lib/vite/traceViewer/assets/workbench-Crj6jzdv.js +19119 -0
  125. package/lib/vite/traceViewer/assets/workbench-DhqI6jeL.js +1473 -0
  126. package/lib/vite/traceViewer/assets/workbench-DrQjKdyE.js +72 -0
  127. package/lib/vite/traceViewer/assets/workbench-Pa1v1Ojh.js +72 -0
  128. package/lib/vite/traceViewer/assets/workbench-caTaZnzx.js +72 -0
  129. package/lib/vite/traceViewer/assets/workbench-gtYcQBNA.js +9 -0
  130. package/lib/vite/traceViewer/assets/workbench-u2lRPMOT.js +72 -0
  131. package/lib/vite/traceViewer/assets/xtermModule-CZ7sDYXB.js +6529 -0
  132. package/lib/vite/traceViewer/assets/xtermModule-DZP0glxx.js +5982 -0
  133. package/lib/vite/traceViewer/codeMirrorModule.Cy8X9Wtw.css +344 -0
  134. package/lib/vite/traceViewer/embedded.27BGR_eD.js +105 -0
  135. package/lib/vite/traceViewer/embedded.BBZ9gQEw.js +104 -0
  136. package/lib/vite/traceViewer/embedded.BQq6Psnz.js +104 -0
  137. package/lib/vite/traceViewer/{embedded.TOXRJZ9A.js → embedded.BVDVQOzc.js} +1 -1
  138. package/lib/vite/traceViewer/embedded.Bn8Ptzv6.js +2 -0
  139. package/lib/vite/traceViewer/embedded.CorI3dFX.js +104 -0
  140. package/lib/vite/traceViewer/embedded.CvhnUgIi.js +2 -0
  141. package/lib/vite/traceViewer/embedded.D27cnKiB.js +104 -0
  142. package/lib/vite/traceViewer/embedded.D4lqGydT.js +2 -0
  143. package/lib/vite/traceViewer/embedded.DPqrDeET.js +2 -0
  144. package/lib/vite/traceViewer/embedded.DTjd2aiy.js +105 -0
  145. package/lib/vite/traceViewer/embedded.DbzY7Q8w.js +2 -0
  146. package/lib/vite/traceViewer/embedded.DjZq4InJ.css +68 -0
  147. package/lib/vite/traceViewer/embedded.SsjKHrxC.js +105 -0
  148. package/lib/vite/traceViewer/embedded.f-PLGsBT.js +2 -0
  149. package/lib/vite/traceViewer/embedded.html +6 -4
  150. package/lib/vite/traceViewer/index.B7aiTMfZ.js +2 -0
  151. package/lib/vite/traceViewer/{index.e7qpO0B0.js → index.B8dgQwuN.js} +1 -1
  152. package/lib/vite/traceViewer/index.BGj8jY3H.js +2 -0
  153. package/lib/vite/traceViewer/index.BSak5QT9.js +2 -0
  154. package/lib/vite/traceViewer/index.BrT2kfuc.js +2 -0
  155. package/lib/vite/traceViewer/{index.RT4iItO_.js → index.C0EgJ4oW.js} +36 -21
  156. package/lib/vite/traceViewer/index.CUpI-BFe.js +195 -0
  157. package/lib/vite/traceViewer/index.DkRbtWVo.js +195 -0
  158. package/lib/vite/traceViewer/index.DsjmhbB6.js +195 -0
  159. package/lib/vite/traceViewer/index.Dz3icWJV.js +196 -0
  160. package/lib/vite/traceViewer/index.PqcsvBxQ.js +196 -0
  161. package/lib/vite/traceViewer/index.QanXxRUb.css +131 -0
  162. package/lib/vite/traceViewer/index._cX8k4co.js +2 -0
  163. package/lib/vite/traceViewer/index.html +7 -5
  164. package/lib/vite/traceViewer/index.pMAN88y-.js +2 -0
  165. package/lib/vite/traceViewer/index.yxAwzeWG.js +196 -0
  166. package/lib/vite/traceViewer/inspectorTab.DGJWXOSd.css +3145 -0
  167. package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +1 -0
  168. package/lib/vite/traceViewer/recorder.7Wl6HrQl.js +550 -0
  169. package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
  170. package/lib/vite/traceViewer/recorder.BufKu9Hp.js +550 -0
  171. package/lib/vite/traceViewer/recorder.Ch-WHviK.js +2 -0
  172. package/lib/vite/traceViewer/recorder.DBDpiNOK.css +15 -0
  173. package/lib/vite/traceViewer/recorder.POd-toIn.js +2 -0
  174. package/lib/vite/traceViewer/recorder.am-MV-DQ.js +550 -0
  175. package/lib/vite/traceViewer/recorder.html +17 -0
  176. package/lib/vite/traceViewer/sw.bundle.js +3 -3
  177. package/lib/vite/traceViewer/uiMode.BEZVCe5O.js +5 -0
  178. package/lib/vite/traceViewer/uiMode.BZoFj6zV.js +1723 -0
  179. package/lib/vite/traceViewer/uiMode.C4nbcio6.js +1730 -0
  180. package/lib/vite/traceViewer/uiMode.CAYqod-m.css +1 -0
  181. package/lib/vite/traceViewer/uiMode.D-tg1Oci.js +1730 -0
  182. package/lib/vite/traceViewer/uiMode.DKjMBMlc.js +1730 -0
  183. package/lib/vite/traceViewer/uiMode.DRmgrHSk.css +1462 -0
  184. package/lib/vite/traceViewer/uiMode.DVWUEIHq.css +1424 -0
  185. package/lib/vite/traceViewer/{uiMode.MTXOs_2V.js → uiMode.DVrL7a1K.js} +5 -5
  186. package/lib/vite/traceViewer/uiMode.DdtUZZVS.js +5 -0
  187. package/lib/vite/traceViewer/uiMode.Dg9oJCQU.js +10 -0
  188. package/lib/vite/traceViewer/uiMode.Dlo9s_YX.js +1723 -0
  189. package/lib/vite/traceViewer/uiMode.DwZAzstF.js +10 -0
  190. package/lib/vite/traceViewer/uiMode.O07awP3T.js +10 -0
  191. package/lib/vite/traceViewer/uiMode.gGHHTsyL.js +1730 -0
  192. package/lib/vite/traceViewer/uiMode.html +7 -5
  193. package/lib/vite/traceViewer/uiMode.jY2s-9ps.js +10 -0
  194. package/lib/vite/traceViewer/uiMode.wsGnVMQK.js +1723 -0
  195. package/lib/vite/traceViewer/workbench.B3X2QtYa.css +3702 -0
  196. package/lib/vite/traceViewer/workbench.BQNDbcQ0.css +550 -0
  197. package/lib/vite/traceViewer/{workbench.NokwQoMV.css → workbench.DjbIuxix.css} +1 -1
  198. package/lib/vite/traceViewer/workbench.DlsCx8k5.css +1 -0
  199. package/lib/vite/traceViewer/workbench.DyTpxWVb.css +1 -0
  200. package/lib/vite/traceViewer/workbench.wuxQoE2z.css +3703 -0
  201. package/lib/vite/traceViewer/xtermModule.4oRVGWQ-.css +209 -0
  202. package/package.json +1 -1
  203. package/types/protocol.d.ts +610 -173
  204. package/types/types.d.ts +2037 -949
  205. package/lib/vite/traceViewer/assets/codeMirrorModule-0bpaqixv.js +0 -24
  206. package/lib/vite/traceViewer/assets/codeMirrorModule-clyjx5sb.js +0 -15578
  207. package/lib/vite/traceViewer/assets/codeMirrorModule-wLpsbIhd.js +0 -24
  208. package/lib/vite/traceViewer/assets/wsPort-_JBDEilC.js +0 -69
  209. package/lib/vite/traceViewer/assets/wsPort-f2dAQL4I.js +0 -69
  210. package/lib/vite/traceViewer/index.-_8-eHEE.js +0 -2
  211. package/lib/vite/traceViewer/index.-g_5lMbJ.css +0 -1
  212. package/lib/vite/traceViewer/index.u51inEcm.js +0 -2
  213. package/lib/vite/traceViewer/uiMode.9CwNsWc6.js +0 -10
  214. package/lib/vite/traceViewer/uiMode.Fb0bNA4H.js +0 -10
  215. package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +0 -1
  216. package/lib/vite/traceViewer/uiMode.yLNTmFO4.js +0 -1490
  217. package/lib/vite/traceViewer/wsPort.zR1WIy9-.css +0 -1
  218. /package/lib/vite/recorder/assets/{codeMirrorModule-Hs9-1ZG4.css → codeMirrorModule-ez37Vkbh.css} +0 -0
  219. /package/lib/vite/recorder/assets/{codicon-wpoHPmsu.ttf → codicon-DCmgc-ay.ttf} +0 -0
  220. /package/lib/vite/traceViewer/assets/{testServerConnection-_1gRQKgk.js → testServerConnection-DeE2kSzz.js} +0 -0
  221. /package/lib/vite/traceViewer/assets/{xtermModule-Yt6xwiJ_.js → xtermModule-BeNbaIVa.js} +0 -0
  222. /package/lib/vite/traceViewer/{codeMirrorModule.Hs9-1ZG4.css → codeMirrorModule.ez37Vkbh.css} +0 -0
  223. /package/lib/vite/traceViewer/{codicon.wpoHPmsu.ttf → codicon.DCmgc-ay.ttf} +0 -0
  224. /package/lib/vite/traceViewer/{embedded.MO1jdrtU.css → embedded.w7WN2u1R.css} +0 -0
  225. /package/lib/vite/traceViewer/{index.q21lh23x.css → index.CrbWWHbf.css} +0 -0
  226. /package/lib/vite/traceViewer/{uiMode.93DRT-rm.css → uiMode.D3cNFP6u.css} +0 -0
  227. /package/lib/vite/traceViewer/{xtermModule.0lwXJFHT.css → xtermModule.DSXBckUd.css} +0 -0
@@ -0,0 +1,195 @@
1
+ import { M as MultiTraceModel, r as reactExports, j as jsxRuntimeExports, T as ToolbarButton, t as toggleTheme, W as Workbench, a as applyTheme, c as createRoot } from "./assets/workbench-BwodYCgl.js";
2
+ import { T as TestServerConnection, W as WebSocketTestServerTransport } from "./assets/testServerConnection-D-tXL3sj.js";
3
+ const WorkbenchLoader = () => {
4
+ const [isServer, setIsServer] = reactExports.useState(false);
5
+ const [traceURLs, setTraceURLs] = reactExports.useState([]);
6
+ const [uploadedTraceNames, setUploadedTraceNames] = reactExports.useState([]);
7
+ const [model, setModel] = reactExports.useState(emptyModel);
8
+ const [progress, setProgress] = reactExports.useState({ done: 0, total: 0 });
9
+ const [dragOver, setDragOver] = reactExports.useState(false);
10
+ const [processingErrorMessage, setProcessingErrorMessage] = reactExports.useState(null);
11
+ const [fileForLocalModeError, setFileForLocalModeError] = reactExports.useState(null);
12
+ const processTraceFiles = reactExports.useCallback((files) => {
13
+ const blobUrls = [];
14
+ const fileNames = [];
15
+ const url = new URL(window.location.href);
16
+ for (let i = 0; i < files.length; i++) {
17
+ const file = files.item(i);
18
+ if (!file)
19
+ continue;
20
+ const blobTraceURL = URL.createObjectURL(file);
21
+ blobUrls.push(blobTraceURL);
22
+ fileNames.push(file.name);
23
+ url.searchParams.append("trace", blobTraceURL);
24
+ url.searchParams.append("traceFileName", file.name);
25
+ }
26
+ const href = url.toString();
27
+ window.history.pushState({}, "", href);
28
+ setTraceURLs(blobUrls);
29
+ setUploadedTraceNames(fileNames);
30
+ setDragOver(false);
31
+ setProcessingErrorMessage(null);
32
+ }, []);
33
+ reactExports.useEffect(() => {
34
+ const listener = async (e) => {
35
+ var _a;
36
+ if (!((_a = e.clipboardData) == null ? void 0 : _a.files.length))
37
+ return;
38
+ for (const file of e.clipboardData.files) {
39
+ if (file.type !== "application/zip")
40
+ return;
41
+ }
42
+ e.preventDefault();
43
+ processTraceFiles(e.clipboardData.files);
44
+ };
45
+ document.addEventListener("paste", listener);
46
+ return () => document.removeEventListener("paste", listener);
47
+ });
48
+ const handleDropEvent = reactExports.useCallback((event) => {
49
+ event.preventDefault();
50
+ processTraceFiles(event.dataTransfer.files);
51
+ }, [processTraceFiles]);
52
+ const handleFileInputChange = reactExports.useCallback((event) => {
53
+ event.preventDefault();
54
+ if (!event.target.files)
55
+ return;
56
+ processTraceFiles(event.target.files);
57
+ }, [processTraceFiles]);
58
+ reactExports.useEffect(() => {
59
+ const params = new URL(window.location.href).searchParams;
60
+ const newTraceURLs = params.getAll("trace");
61
+ setIsServer(params.has("isServer"));
62
+ for (const url of newTraceURLs) {
63
+ if (url.startsWith("file:")) {
64
+ setFileForLocalModeError(url || null);
65
+ return;
66
+ }
67
+ }
68
+ if (params.has("isServer")) {
69
+ const guid = new URLSearchParams(window.location.search).get("ws");
70
+ const wsURL = new URL(`../${guid}`, window.location.toString());
71
+ wsURL.protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
72
+ const testServerConnection = new TestServerConnection(new WebSocketTestServerTransport(wsURL));
73
+ testServerConnection.onLoadTraceRequested(async (params2) => {
74
+ setTraceURLs(params2.traceUrl ? [params2.traceUrl] : []);
75
+ setDragOver(false);
76
+ setProcessingErrorMessage(null);
77
+ });
78
+ testServerConnection.initialize({}).catch(() => {
79
+ });
80
+ } else if (!newTraceURLs.some((url) => url.startsWith("blob:"))) {
81
+ setTraceURLs(newTraceURLs);
82
+ }
83
+ }, []);
84
+ reactExports.useEffect(() => {
85
+ (async () => {
86
+ if (traceURLs.length) {
87
+ const swListener = (event) => {
88
+ if (event.data.method === "progress")
89
+ setProgress(event.data.params);
90
+ };
91
+ navigator.serviceWorker.addEventListener("message", swListener);
92
+ setProgress({ done: 0, total: 1 });
93
+ const contextEntries = [];
94
+ for (let i = 0; i < traceURLs.length; i++) {
95
+ const url = traceURLs[i];
96
+ const params = new URLSearchParams();
97
+ params.set("trace", url);
98
+ if (uploadedTraceNames.length)
99
+ params.set("traceFileName", uploadedTraceNames[i]);
100
+ const response = await fetch(`contexts?${params.toString()}`);
101
+ if (!response.ok) {
102
+ if (!isServer)
103
+ setTraceURLs([]);
104
+ setProcessingErrorMessage((await response.json()).error);
105
+ return;
106
+ }
107
+ contextEntries.push(...await response.json());
108
+ }
109
+ navigator.serviceWorker.removeEventListener("message", swListener);
110
+ const model2 = new MultiTraceModel(contextEntries);
111
+ setProgress({ done: 0, total: 0 });
112
+ setModel(model2);
113
+ } else {
114
+ setModel(emptyModel);
115
+ }
116
+ })();
117
+ }, [isServer, traceURLs, uploadedTraceNames]);
118
+ const showFileUploadDropArea = !!(!isServer && !dragOver && !fileForLocalModeError && (!traceURLs.length || processingErrorMessage));
119
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vbox workbench-loader", onDragOver: (event) => {
120
+ event.preventDefault();
121
+ setDragOver(true);
122
+ }, children: [
123
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hbox header", ...showFileUploadDropArea ? { inert: "true" } : {}, children: [
124
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "logo", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: "playwright-logo.svg", alt: "Playwright logo" }) }),
125
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "product", children: "Playwright" }),
126
+ model.title && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", children: model.title }),
127
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "spacer" }),
128
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "color-mode", title: "Toggle color mode", toggled: false, onClick: () => toggleTheme() })
129
+ ] }),
130
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "progress", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "inner-progress", style: { width: progress.total ? 100 * progress.done / progress.total + "%" : 0 } }) }),
131
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Workbench, { model, inert: showFileUploadDropArea, showSettings: true }),
132
+ fileForLocalModeError && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "drop-target", children: [
133
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "Trace Viewer uses Service Workers to show traces. To view trace:" }),
134
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { paddingTop: 20 }, children: [
135
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
136
+ "1. Click ",
137
+ /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: fileForLocalModeError, children: "here" }),
138
+ " to put your trace into the download shelf"
139
+ ] }),
140
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
141
+ "2. Go to ",
142
+ /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "https://trace.playwright.dev", children: "trace.playwright.dev" })
143
+ ] }),
144
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "3. Drop the trace from the download shelf into the page" })
145
+ ] })
146
+ ] }),
147
+ showFileUploadDropArea && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "drop-target", children: [
148
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "processing-error", role: "alert", children: processingErrorMessage }),
149
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", role: "heading", "aria-level": 1, children: "Drop Playwright Trace to load" }),
150
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "or" }),
151
+ /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => {
152
+ const input = document.createElement("input");
153
+ input.type = "file";
154
+ input.multiple = true;
155
+ input.click();
156
+ input.addEventListener("change", (e) => handleFileInputChange(e));
157
+ }, type: "button", children: "Select file(s)" }),
158
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { maxWidth: 400 }, children: "Playwright Trace Viewer is a Progressive Web App, it does not send your trace anywhere, it opens it locally." })
159
+ ] }),
160
+ isServer && !traceURLs.length && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "drop-target", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", children: "Select test to see the trace" }) }),
161
+ dragOver && /* @__PURE__ */ jsxRuntimeExports.jsx(
162
+ "div",
163
+ {
164
+ className: "drop-target",
165
+ onDragLeave: () => {
166
+ setDragOver(false);
167
+ },
168
+ onDrop: (event) => handleDropEvent(event),
169
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", children: "Release to analyse the Playwright Trace" })
170
+ }
171
+ )
172
+ ] });
173
+ };
174
+ const emptyModel = new MultiTraceModel([]);
175
+ (async () => {
176
+ applyTheme();
177
+ if (window.location.protocol !== "file:") {
178
+ if (window.location.href.includes("isUnderTest=true"))
179
+ await new Promise((f) => setTimeout(f, 1e3));
180
+ if (!navigator.serviceWorker)
181
+ throw new Error(`Service workers are not supported.
182
+ Make sure to serve the Trace Viewer (${window.location}) via HTTPS or localhost.`);
183
+ navigator.serviceWorker.register("sw.bundle.js");
184
+ if (!navigator.serviceWorker.controller) {
185
+ await new Promise((f) => {
186
+ navigator.serviceWorker.oncontrollerchange = () => f();
187
+ });
188
+ }
189
+ setInterval(function() {
190
+ fetch("ping");
191
+ }, 1e4);
192
+ }
193
+ createRoot(document.querySelector("#root")).render(/* @__PURE__ */ jsxRuntimeExports.jsx(WorkbenchLoader, {}));
194
+ })();
195
+ //# sourceMappingURL=index.DsjmhbB6.js.map
@@ -0,0 +1,196 @@
1
+ import { M as MultiTraceModel, r as reactExports, j as jsxRuntimeExports, T as ToolbarButton, t as toggleTheme, a as applyTheme, c as createRoot } from "./assets/inspectorTab-BPzVEZSf.js";
2
+ import { W as Workbench } from "./assets/workbench-DhqI6jeL.js";
3
+ import { T as TestServerConnection, W as WebSocketTestServerTransport } from "./assets/testServerConnection-D-tXL3sj.js";
4
+ const WorkbenchLoader = () => {
5
+ const [isServer, setIsServer] = reactExports.useState(false);
6
+ const [traceURLs, setTraceURLs] = reactExports.useState([]);
7
+ const [uploadedTraceNames, setUploadedTraceNames] = reactExports.useState([]);
8
+ const [model, setModel] = reactExports.useState(emptyModel);
9
+ const [progress, setProgress] = reactExports.useState({ done: 0, total: 0 });
10
+ const [dragOver, setDragOver] = reactExports.useState(false);
11
+ const [processingErrorMessage, setProcessingErrorMessage] = reactExports.useState(null);
12
+ const [fileForLocalModeError, setFileForLocalModeError] = reactExports.useState(null);
13
+ const processTraceFiles = reactExports.useCallback((files) => {
14
+ const blobUrls = [];
15
+ const fileNames = [];
16
+ const url = new URL(window.location.href);
17
+ for (let i = 0; i < files.length; i++) {
18
+ const file = files.item(i);
19
+ if (!file)
20
+ continue;
21
+ const blobTraceURL = URL.createObjectURL(file);
22
+ blobUrls.push(blobTraceURL);
23
+ fileNames.push(file.name);
24
+ url.searchParams.append("trace", blobTraceURL);
25
+ url.searchParams.append("traceFileName", file.name);
26
+ }
27
+ const href = url.toString();
28
+ window.history.pushState({}, "", href);
29
+ setTraceURLs(blobUrls);
30
+ setUploadedTraceNames(fileNames);
31
+ setDragOver(false);
32
+ setProcessingErrorMessage(null);
33
+ }, []);
34
+ reactExports.useEffect(() => {
35
+ const listener = async (e) => {
36
+ var _a;
37
+ if (!((_a = e.clipboardData) == null ? void 0 : _a.files.length))
38
+ return;
39
+ for (const file of e.clipboardData.files) {
40
+ if (file.type !== "application/zip")
41
+ return;
42
+ }
43
+ e.preventDefault();
44
+ processTraceFiles(e.clipboardData.files);
45
+ };
46
+ document.addEventListener("paste", listener);
47
+ return () => document.removeEventListener("paste", listener);
48
+ });
49
+ const handleDropEvent = reactExports.useCallback((event) => {
50
+ event.preventDefault();
51
+ processTraceFiles(event.dataTransfer.files);
52
+ }, [processTraceFiles]);
53
+ const handleFileInputChange = reactExports.useCallback((event) => {
54
+ event.preventDefault();
55
+ if (!event.target.files)
56
+ return;
57
+ processTraceFiles(event.target.files);
58
+ }, [processTraceFiles]);
59
+ reactExports.useEffect(() => {
60
+ const params = new URL(window.location.href).searchParams;
61
+ const newTraceURLs = params.getAll("trace");
62
+ setIsServer(params.has("isServer"));
63
+ for (const url of newTraceURLs) {
64
+ if (url.startsWith("file:")) {
65
+ setFileForLocalModeError(url || null);
66
+ return;
67
+ }
68
+ }
69
+ if (params.has("isServer")) {
70
+ const guid = new URLSearchParams(window.location.search).get("ws");
71
+ const wsURL = new URL(`../${guid}`, window.location.toString());
72
+ wsURL.protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
73
+ const testServerConnection = new TestServerConnection(new WebSocketTestServerTransport(wsURL));
74
+ testServerConnection.onLoadTraceRequested(async (params2) => {
75
+ setTraceURLs(params2.traceUrl ? [params2.traceUrl] : []);
76
+ setDragOver(false);
77
+ setProcessingErrorMessage(null);
78
+ });
79
+ testServerConnection.initialize({}).catch(() => {
80
+ });
81
+ } else if (!newTraceURLs.some((url) => url.startsWith("blob:"))) {
82
+ setTraceURLs(newTraceURLs);
83
+ }
84
+ }, []);
85
+ reactExports.useEffect(() => {
86
+ (async () => {
87
+ if (traceURLs.length) {
88
+ const swListener = (event) => {
89
+ if (event.data.method === "progress")
90
+ setProgress(event.data.params);
91
+ };
92
+ navigator.serviceWorker.addEventListener("message", swListener);
93
+ setProgress({ done: 0, total: 1 });
94
+ const contextEntries = [];
95
+ for (let i = 0; i < traceURLs.length; i++) {
96
+ const url = traceURLs[i];
97
+ const params = new URLSearchParams();
98
+ params.set("trace", url);
99
+ if (uploadedTraceNames.length)
100
+ params.set("traceFileName", uploadedTraceNames[i]);
101
+ const response = await fetch(`contexts?${params.toString()}`);
102
+ if (!response.ok) {
103
+ if (!isServer)
104
+ setTraceURLs([]);
105
+ setProcessingErrorMessage((await response.json()).error);
106
+ return;
107
+ }
108
+ contextEntries.push(...await response.json());
109
+ }
110
+ navigator.serviceWorker.removeEventListener("message", swListener);
111
+ const model2 = new MultiTraceModel(contextEntries);
112
+ setProgress({ done: 0, total: 0 });
113
+ setModel(model2);
114
+ } else {
115
+ setModel(emptyModel);
116
+ }
117
+ })();
118
+ }, [isServer, traceURLs, uploadedTraceNames]);
119
+ const showFileUploadDropArea = !!(!isServer && !dragOver && !fileForLocalModeError && (!traceURLs.length || processingErrorMessage));
120
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vbox workbench-loader", onDragOver: (event) => {
121
+ event.preventDefault();
122
+ setDragOver(true);
123
+ }, children: [
124
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hbox header", ...showFileUploadDropArea ? { inert: "true" } : {}, children: [
125
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "logo", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: "playwright-logo.svg", alt: "Playwright logo" }) }),
126
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "product", children: "Playwright" }),
127
+ model.title && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", children: model.title }),
128
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "spacer" }),
129
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "color-mode", title: "Toggle color mode", toggled: false, onClick: () => toggleTheme() })
130
+ ] }),
131
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "progress", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "inner-progress", style: { width: progress.total ? 100 * progress.done / progress.total + "%" : 0 } }) }),
132
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Workbench, { model, inert: showFileUploadDropArea, showSettings: true }),
133
+ fileForLocalModeError && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "drop-target", children: [
134
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "Trace Viewer uses Service Workers to show traces. To view trace:" }),
135
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { paddingTop: 20 }, children: [
136
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
137
+ "1. Click ",
138
+ /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: fileForLocalModeError, children: "here" }),
139
+ " to put your trace into the download shelf"
140
+ ] }),
141
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
142
+ "2. Go to ",
143
+ /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "https://trace.playwright.dev", children: "trace.playwright.dev" })
144
+ ] }),
145
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "3. Drop the trace from the download shelf into the page" })
146
+ ] })
147
+ ] }),
148
+ showFileUploadDropArea && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "drop-target", children: [
149
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "processing-error", role: "alert", children: processingErrorMessage }),
150
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", role: "heading", "aria-level": 1, children: "Drop Playwright Trace to load" }),
151
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "or" }),
152
+ /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => {
153
+ const input = document.createElement("input");
154
+ input.type = "file";
155
+ input.multiple = true;
156
+ input.click();
157
+ input.addEventListener("change", (e) => handleFileInputChange(e));
158
+ }, type: "button", children: "Select file(s)" }),
159
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { maxWidth: 400 }, children: "Playwright Trace Viewer is a Progressive Web App, it does not send your trace anywhere, it opens it locally." })
160
+ ] }),
161
+ isServer && !traceURLs.length && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "drop-target", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", children: "Select test to see the trace" }) }),
162
+ dragOver && /* @__PURE__ */ jsxRuntimeExports.jsx(
163
+ "div",
164
+ {
165
+ className: "drop-target",
166
+ onDragLeave: () => {
167
+ setDragOver(false);
168
+ },
169
+ onDrop: (event) => handleDropEvent(event),
170
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", children: "Release to analyse the Playwright Trace" })
171
+ }
172
+ )
173
+ ] });
174
+ };
175
+ const emptyModel = new MultiTraceModel([]);
176
+ (async () => {
177
+ applyTheme();
178
+ if (window.location.protocol !== "file:") {
179
+ if (window.location.href.includes("isUnderTest=true"))
180
+ await new Promise((f) => setTimeout(f, 1e3));
181
+ if (!navigator.serviceWorker)
182
+ throw new Error(`Service workers are not supported.
183
+ Make sure to serve the Trace Viewer (${window.location}) via HTTPS or localhost.`);
184
+ navigator.serviceWorker.register("sw.bundle.js");
185
+ if (!navigator.serviceWorker.controller) {
186
+ await new Promise((f) => {
187
+ navigator.serviceWorker.oncontrollerchange = () => f();
188
+ });
189
+ }
190
+ setInterval(function() {
191
+ fetch("ping");
192
+ }, 1e4);
193
+ }
194
+ createRoot(document.querySelector("#root")).render(/* @__PURE__ */ jsxRuntimeExports.jsx(WorkbenchLoader, {}));
195
+ })();
196
+ //# sourceMappingURL=index.Dz3icWJV.js.map
@@ -0,0 +1,196 @@
1
+ import { M as MultiTraceModel, r as reactExports, j as jsxRuntimeExports, T as ToolbarButton, t as toggleTheme, a as applyTheme, c as createRoot } from "./assets/inspectorTab-DpvLVMq5.js";
2
+ import { W as Workbench } from "./assets/workbench-BcgGQnKb.js";
3
+ import { T as TestServerConnection, W as WebSocketTestServerTransport } from "./assets/testServerConnection-D-tXL3sj.js";
4
+ const WorkbenchLoader = () => {
5
+ const [isServer, setIsServer] = reactExports.useState(false);
6
+ const [traceURLs, setTraceURLs] = reactExports.useState([]);
7
+ const [uploadedTraceNames, setUploadedTraceNames] = reactExports.useState([]);
8
+ const [model, setModel] = reactExports.useState(emptyModel);
9
+ const [progress, setProgress] = reactExports.useState({ done: 0, total: 0 });
10
+ const [dragOver, setDragOver] = reactExports.useState(false);
11
+ const [processingErrorMessage, setProcessingErrorMessage] = reactExports.useState(null);
12
+ const [fileForLocalModeError, setFileForLocalModeError] = reactExports.useState(null);
13
+ const processTraceFiles = reactExports.useCallback((files) => {
14
+ const blobUrls = [];
15
+ const fileNames = [];
16
+ const url = new URL(window.location.href);
17
+ for (let i = 0; i < files.length; i++) {
18
+ const file = files.item(i);
19
+ if (!file)
20
+ continue;
21
+ const blobTraceURL = URL.createObjectURL(file);
22
+ blobUrls.push(blobTraceURL);
23
+ fileNames.push(file.name);
24
+ url.searchParams.append("trace", blobTraceURL);
25
+ url.searchParams.append("traceFileName", file.name);
26
+ }
27
+ const href = url.toString();
28
+ window.history.pushState({}, "", href);
29
+ setTraceURLs(blobUrls);
30
+ setUploadedTraceNames(fileNames);
31
+ setDragOver(false);
32
+ setProcessingErrorMessage(null);
33
+ }, []);
34
+ reactExports.useEffect(() => {
35
+ const listener = async (e) => {
36
+ var _a;
37
+ if (!((_a = e.clipboardData) == null ? void 0 : _a.files.length))
38
+ return;
39
+ for (const file of e.clipboardData.files) {
40
+ if (file.type !== "application/zip")
41
+ return;
42
+ }
43
+ e.preventDefault();
44
+ processTraceFiles(e.clipboardData.files);
45
+ };
46
+ document.addEventListener("paste", listener);
47
+ return () => document.removeEventListener("paste", listener);
48
+ });
49
+ const handleDropEvent = reactExports.useCallback((event) => {
50
+ event.preventDefault();
51
+ processTraceFiles(event.dataTransfer.files);
52
+ }, [processTraceFiles]);
53
+ const handleFileInputChange = reactExports.useCallback((event) => {
54
+ event.preventDefault();
55
+ if (!event.target.files)
56
+ return;
57
+ processTraceFiles(event.target.files);
58
+ }, [processTraceFiles]);
59
+ reactExports.useEffect(() => {
60
+ const params = new URL(window.location.href).searchParams;
61
+ const newTraceURLs = params.getAll("trace");
62
+ setIsServer(params.has("isServer"));
63
+ for (const url of newTraceURLs) {
64
+ if (url.startsWith("file:")) {
65
+ setFileForLocalModeError(url || null);
66
+ return;
67
+ }
68
+ }
69
+ if (params.has("isServer")) {
70
+ const guid = new URLSearchParams(window.location.search).get("ws");
71
+ const wsURL = new URL(`../${guid}`, window.location.toString());
72
+ wsURL.protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
73
+ const testServerConnection = new TestServerConnection(new WebSocketTestServerTransport(wsURL));
74
+ testServerConnection.onLoadTraceRequested(async (params2) => {
75
+ setTraceURLs(params2.traceUrl ? [params2.traceUrl] : []);
76
+ setDragOver(false);
77
+ setProcessingErrorMessage(null);
78
+ });
79
+ testServerConnection.initialize({}).catch(() => {
80
+ });
81
+ } else if (!newTraceURLs.some((url) => url.startsWith("blob:"))) {
82
+ setTraceURLs(newTraceURLs);
83
+ }
84
+ }, []);
85
+ reactExports.useEffect(() => {
86
+ (async () => {
87
+ if (traceURLs.length) {
88
+ const swListener = (event) => {
89
+ if (event.data.method === "progress")
90
+ setProgress(event.data.params);
91
+ };
92
+ navigator.serviceWorker.addEventListener("message", swListener);
93
+ setProgress({ done: 0, total: 1 });
94
+ const contextEntries = [];
95
+ for (let i = 0; i < traceURLs.length; i++) {
96
+ const url = traceURLs[i];
97
+ const params = new URLSearchParams();
98
+ params.set("trace", url);
99
+ if (uploadedTraceNames.length)
100
+ params.set("traceFileName", uploadedTraceNames[i]);
101
+ const response = await fetch(`contexts?${params.toString()}`);
102
+ if (!response.ok) {
103
+ if (!isServer)
104
+ setTraceURLs([]);
105
+ setProcessingErrorMessage((await response.json()).error);
106
+ return;
107
+ }
108
+ contextEntries.push(...await response.json());
109
+ }
110
+ navigator.serviceWorker.removeEventListener("message", swListener);
111
+ const model2 = new MultiTraceModel(contextEntries);
112
+ setProgress({ done: 0, total: 0 });
113
+ setModel(model2);
114
+ } else {
115
+ setModel(emptyModel);
116
+ }
117
+ })();
118
+ }, [isServer, traceURLs, uploadedTraceNames]);
119
+ const showFileUploadDropArea = !!(!isServer && !dragOver && !fileForLocalModeError && (!traceURLs.length || processingErrorMessage));
120
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vbox workbench-loader", onDragOver: (event) => {
121
+ event.preventDefault();
122
+ setDragOver(true);
123
+ }, children: [
124
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hbox header", ...showFileUploadDropArea ? { inert: "true" } : {}, children: [
125
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "logo", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: "playwright-logo.svg", alt: "Playwright logo" }) }),
126
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "product", children: "Playwright" }),
127
+ model.title && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", children: model.title }),
128
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "spacer" }),
129
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "color-mode", title: "Toggle color mode", toggled: false, onClick: () => toggleTheme() })
130
+ ] }),
131
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "progress", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "inner-progress", style: { width: progress.total ? 100 * progress.done / progress.total + "%" : 0 } }) }),
132
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Workbench, { model, inert: showFileUploadDropArea, showSettings: true }),
133
+ fileForLocalModeError && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "drop-target", children: [
134
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "Trace Viewer uses Service Workers to show traces. To view trace:" }),
135
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { paddingTop: 20 }, children: [
136
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
137
+ "1. Click ",
138
+ /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: fileForLocalModeError, children: "here" }),
139
+ " to put your trace into the download shelf"
140
+ ] }),
141
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
142
+ "2. Go to ",
143
+ /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "https://trace.playwright.dev", children: "trace.playwright.dev" })
144
+ ] }),
145
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "3. Drop the trace from the download shelf into the page" })
146
+ ] })
147
+ ] }),
148
+ showFileUploadDropArea && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "drop-target", children: [
149
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "processing-error", role: "alert", children: processingErrorMessage }),
150
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", role: "heading", "aria-level": 1, children: "Drop Playwright Trace to load" }),
151
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "or" }),
152
+ /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => {
153
+ const input = document.createElement("input");
154
+ input.type = "file";
155
+ input.multiple = true;
156
+ input.click();
157
+ input.addEventListener("change", (e) => handleFileInputChange(e));
158
+ }, type: "button", children: "Select file(s)" }),
159
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { maxWidth: 400 }, children: "Playwright Trace Viewer is a Progressive Web App, it does not send your trace anywhere, it opens it locally." })
160
+ ] }),
161
+ isServer && !traceURLs.length && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "drop-target", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", children: "Select test to see the trace" }) }),
162
+ dragOver && /* @__PURE__ */ jsxRuntimeExports.jsx(
163
+ "div",
164
+ {
165
+ className: "drop-target",
166
+ onDragLeave: () => {
167
+ setDragOver(false);
168
+ },
169
+ onDrop: (event) => handleDropEvent(event),
170
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", children: "Release to analyse the Playwright Trace" })
171
+ }
172
+ )
173
+ ] });
174
+ };
175
+ const emptyModel = new MultiTraceModel([]);
176
+ (async () => {
177
+ applyTheme();
178
+ if (window.location.protocol !== "file:") {
179
+ if (window.location.href.includes("isUnderTest=true"))
180
+ await new Promise((f) => setTimeout(f, 1e3));
181
+ if (!navigator.serviceWorker)
182
+ throw new Error(`Service workers are not supported.
183
+ Make sure to serve the Trace Viewer (${window.location}) via HTTPS or localhost.`);
184
+ navigator.serviceWorker.register("sw.bundle.js");
185
+ if (!navigator.serviceWorker.controller) {
186
+ await new Promise((f) => {
187
+ navigator.serviceWorker.oncontrollerchange = () => f();
188
+ });
189
+ }
190
+ setInterval(function() {
191
+ fetch("ping");
192
+ }, 1e4);
193
+ }
194
+ createRoot(document.querySelector("#root")).render(/* @__PURE__ */ jsxRuntimeExports.jsx(WorkbenchLoader, {}));
195
+ })();
196
+ //# sourceMappingURL=index.PqcsvBxQ.js.map