@smoothdeploy/playwright-core 1.57.1 → 1.58.1-beta-1770452953000

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.

Potentially problematic release.


This version of @smoothdeploy/playwright-core might be problematic. Click here for more details.

Files changed (155) hide show
  1. package/ThirdPartyNotices.txt +3223 -308
  2. package/browsers.json +21 -22
  3. package/lib/cli/program.js +4 -5
  4. package/lib/client/api.js +3 -0
  5. package/lib/client/browser.js +3 -5
  6. package/lib/client/browserContext.js +35 -0
  7. package/lib/client/browserType.js +4 -3
  8. package/lib/client/channelOwner.js +4 -3
  9. package/lib/client/clientInstrumentation.js +10 -0
  10. package/lib/client/connection.js +4 -0
  11. package/lib/client/elementHandle.js +3 -0
  12. package/lib/client/events.js +3 -0
  13. package/lib/client/fetch.js +3 -4
  14. package/lib/client/frame.js +1 -0
  15. package/lib/client/page.js +28 -1
  16. package/lib/client/pageAgent.js +64 -0
  17. package/lib/client/platform.js +3 -0
  18. package/lib/generated/injectedScriptSource.js +1 -1
  19. package/lib/generated/pollingRecorderSource.js +1 -1
  20. package/lib/mcpBundle.js +84 -0
  21. package/lib/mcpBundleImpl/index.js +147 -0
  22. package/lib/protocol/serializers.js +5 -0
  23. package/lib/protocol/validator.js +92 -3
  24. package/lib/remote/playwrightServer.js +1 -2
  25. package/lib/server/agent/actionRunner.js +335 -0
  26. package/lib/server/agent/actions.js +128 -0
  27. package/lib/server/agent/codegen.js +111 -0
  28. package/lib/server/agent/context.js +150 -0
  29. package/lib/server/agent/expectTools.js +156 -0
  30. package/lib/server/agent/pageAgent.js +204 -0
  31. package/lib/server/agent/performTools.js +262 -0
  32. package/lib/server/agent/tool.js +109 -0
  33. package/lib/server/artifact.js +1 -1
  34. package/lib/server/bidi/bidiBrowser.js +56 -12
  35. package/lib/server/bidi/bidiChromium.js +6 -11
  36. package/lib/server/bidi/bidiConnection.js +1 -0
  37. package/lib/server/bidi/bidiDeserializer.js +116 -0
  38. package/lib/server/bidi/bidiExecutionContext.js +75 -29
  39. package/lib/server/bidi/bidiFirefox.js +6 -8
  40. package/lib/server/bidi/bidiNetworkManager.js +1 -1
  41. package/lib/server/bidi/bidiPage.js +39 -28
  42. package/lib/server/bidi/third_party/bidiProtocolCore.js +1 -0
  43. package/lib/server/browserContext.js +32 -25
  44. package/lib/server/browserType.js +12 -4
  45. package/lib/server/chromium/chromium.js +14 -21
  46. package/lib/server/chromium/chromiumSwitches.js +2 -2
  47. package/lib/server/chromium/crBrowser.js +22 -12
  48. package/lib/server/chromium/crConnection.js +0 -5
  49. package/lib/server/chromium/crDevTools.js +0 -2
  50. package/lib/server/chromium/crNetworkManager.js +43 -2
  51. package/lib/server/chromium/crPage.js +19 -87
  52. package/lib/server/codegen/javascript.js +6 -29
  53. package/lib/server/deviceDescriptorsSource.json +56 -56
  54. package/lib/server/dispatchers/browserContextDispatcher.js +3 -0
  55. package/lib/server/dispatchers/dispatcher.js +6 -13
  56. package/lib/server/dispatchers/frameDispatcher.js +1 -1
  57. package/lib/server/dispatchers/pageAgentDispatcher.js +96 -0
  58. package/lib/server/dispatchers/pageDispatcher.js +4 -0
  59. package/lib/server/dom.js +12 -3
  60. package/lib/server/electron/electron.js +5 -2
  61. package/lib/server/firefox/ffBrowser.js +10 -20
  62. package/lib/server/firefox/ffConnection.js +0 -5
  63. package/lib/server/firefox/ffNetworkManager.js +2 -2
  64. package/lib/server/firefox/ffPage.js +15 -18
  65. package/lib/server/firefox/firefox.js +6 -8
  66. package/lib/server/frameSelectors.js +9 -3
  67. package/lib/server/frames.js +49 -33
  68. package/lib/server/instrumentation.js +3 -0
  69. package/lib/server/network.js +50 -12
  70. package/lib/server/page.js +33 -89
  71. package/lib/server/progress.js +26 -6
  72. package/lib/server/recorder/recorderApp.js +79 -100
  73. package/lib/server/recorder.js +55 -0
  74. package/lib/server/registry/browserFetcher.js +6 -4
  75. package/lib/server/registry/index.js +172 -149
  76. package/lib/server/registry/oopDownloadBrowserMain.js +3 -0
  77. package/lib/server/screencast.js +190 -0
  78. package/lib/server/screenshotCompositor.js +153 -0
  79. package/lib/server/trace/recorder/snapshotterInjected.js +21 -1
  80. package/lib/server/trace/recorder/tracing.js +21 -21
  81. package/lib/server/trace/viewer/traceParser.js +72 -0
  82. package/lib/server/trace/viewer/traceViewer.js +17 -13
  83. package/lib/server/utils/expectUtils.js +87 -2
  84. package/lib/server/utils/httpServer.js +4 -19
  85. package/lib/server/utils/network.js +37 -28
  86. package/lib/server/utils/nodePlatform.js +6 -0
  87. package/lib/server/videoRecorder.js +124 -0
  88. package/lib/server/webkit/webkit.js +4 -6
  89. package/lib/server/webkit/wkBrowser.js +2 -6
  90. package/lib/server/webkit/wkConnection.js +1 -6
  91. package/lib/server/webkit/wkInterceptableRequest.js +29 -1
  92. package/lib/server/webkit/wkPage.js +75 -46
  93. package/lib/utils/isomorphic/ariaSnapshot.js +60 -2
  94. package/lib/utils/isomorphic/lruCache.js +51 -0
  95. package/lib/utils/isomorphic/protocolMetainfo.js +9 -1
  96. package/lib/utils/isomorphic/stringUtils.js +49 -0
  97. package/lib/utils/isomorphic/trace/entries.js +16 -0
  98. package/lib/utils/isomorphic/trace/snapshotRenderer.js +499 -0
  99. package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
  100. package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
  101. package/lib/utils/isomorphic/trace/traceLoader.js +131 -0
  102. package/lib/utils/isomorphic/trace/traceModel.js +365 -0
  103. package/lib/utils/isomorphic/trace/traceModernizer.js +400 -0
  104. package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
  105. package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
  106. package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
  107. package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
  108. package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
  109. package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
  110. package/lib/utils/isomorphic/yaml.js +84 -0
  111. package/lib/utils.js +2 -0
  112. package/lib/utilsBundle.js +2 -5
  113. package/lib/utilsBundleImpl/index.js +165 -165
  114. package/lib/vite/htmlReport/index.html +21 -21
  115. package/lib/vite/recorder/assets/{codeMirrorModule-C3UTv-Ge.css → codeMirrorModule-DYBRYzYX.css} +1 -1
  116. package/lib/vite/recorder/assets/codeMirrorModule-DadYNm1I.js +32 -0
  117. package/lib/vite/recorder/assets/{index-Ri0uHF7I.css → index-BSjZa4pk.css} +1 -1
  118. package/lib/vite/recorder/assets/index-BhTWtUlo.js +193 -0
  119. package/lib/vite/recorder/index.html +2 -2
  120. package/lib/vite/traceViewer/assets/codeMirrorModule-8UJPCtp4.js +16884 -0
  121. package/lib/vite/{recorder/assets/codeMirrorModule-BoWUGj0J.js → traceViewer/assets/codeMirrorModule-BNr6yhVP.js} +1 -1
  122. package/lib/vite/traceViewer/assets/codeMirrorModule-Dimjuz94.js +32 -0
  123. package/lib/vite/traceViewer/assets/codeMirrorModule-DkmsYcws.js +32 -0
  124. package/lib/vite/traceViewer/assets/codeMirrorModule-DySgctgr.js +16884 -0
  125. package/lib/vite/traceViewer/assets/defaultSettingsView-B1vuWQsF.js +266 -0
  126. package/lib/vite/traceViewer/assets/defaultSettingsView-CtEsdeVH.js +266 -0
  127. package/lib/vite/traceViewer/assets/defaultSettingsView-D4fm31R-.js +34087 -0
  128. package/lib/vite/traceViewer/assets/defaultSettingsView-JtyB0yzL.js +34087 -0
  129. package/lib/vite/traceViewer/assets/defaultSettingsView-tEZf-LNj.js +266 -0
  130. package/lib/vite/traceViewer/assets/xtermModule-DDw6eROI.js +6168 -0
  131. package/lib/vite/traceViewer/codeMirrorModule.DYBRYzYX.css +1 -0
  132. package/lib/vite/traceViewer/codeMirrorModule.DuST8d_k.css +344 -0
  133. package/lib/vite/traceViewer/defaultSettingsView.5FCqBwKs.css +3986 -0
  134. package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +1 -0
  135. package/lib/vite/traceViewer/index.BQs8gGhY.js +249 -0
  136. package/lib/vite/traceViewer/index.BVu7tZDe.css +1 -0
  137. package/lib/vite/traceViewer/index.BoLn624r.js +2 -0
  138. package/lib/vite/traceViewer/index.Bq_EaK8x.js +249 -0
  139. package/lib/vite/traceViewer/index.C8YVh4B5.js +2 -0
  140. package/lib/vite/traceViewer/index.Cr7-GRf8.js +2 -0
  141. package/lib/vite/traceViewer/index.G-7UhDxt.css +164 -0
  142. package/lib/vite/traceViewer/index.html +4 -4
  143. package/lib/vite/traceViewer/sw.bundle.js +5 -3
  144. package/lib/vite/traceViewer/uiMode.-Kflt2XM.css +1440 -0
  145. package/lib/vite/traceViewer/uiMode.BTRKnokb.js +5 -0
  146. package/lib/vite/traceViewer/uiMode.CEZ5RVHh.js +5 -0
  147. package/lib/vite/traceViewer/uiMode.CIWF23si.js +1829 -0
  148. package/lib/vite/traceViewer/uiMode.Wi-DvIEY.js +1829 -0
  149. package/lib/vite/traceViewer/uiMode.html +3 -3
  150. package/lib/vite/traceViewer/uiMode.zEH1ejvz.js +5 -0
  151. package/lib/vite/traceViewer/xtermModule.BKlWQB97.css +218 -0
  152. package/package.json +3 -1
  153. package/types/protocol.d.ts +738 -159
  154. package/types/types.d.ts +25 -38
  155. package/lib/vite/recorder/assets/index-DJqDAOZp.js +0 -193
@@ -0,0 +1,249 @@
1
+ import { M as MultiTraceModel, r as reactExports, T as TestServerConnection, W as WebSocketTestServerTransport, j as jsxRuntimeExports, D as DialogToolbarButton, a as DefaultSettingsView, b as Workbench, c as Dialog, d as applyTheme, e as clientExports } from "./assets/defaultSettingsView-JtyB0yzL.js";
2
+ const WorkbenchLoader = () => {
3
+ const [isServer, setIsServer] = reactExports.useState(false);
4
+ const [traceURL, setTraceURL] = reactExports.useState();
5
+ const [uploadedTraceName, setUploadedTraceName] = reactExports.useState();
6
+ const [model, setModel] = reactExports.useState(emptyModel);
7
+ const [progress, setProgress] = reactExports.useState({ done: 0, total: 0 });
8
+ const [dragOver, setDragOver] = reactExports.useState(false);
9
+ const [processingErrorMessage, setProcessingErrorMessage] = reactExports.useState(null);
10
+ const [fileForLocalModeError, setFileForLocalModeError] = reactExports.useState(null);
11
+ const [showProgressDialog, setShowProgressDialog] = reactExports.useState(false);
12
+ const processTraceFiles = reactExports.useCallback((files) => {
13
+ const url = new URL(window.location.href);
14
+ if (!files.length)
15
+ return;
16
+ const file = files.item(0);
17
+ const blobTraceURL = URL.createObjectURL(file);
18
+ url.searchParams.append("trace", blobTraceURL);
19
+ const href = url.toString();
20
+ window.history.pushState({}, "", href);
21
+ setTraceURL(blobTraceURL);
22
+ setUploadedTraceName(file.name);
23
+ setDragOver(false);
24
+ setProcessingErrorMessage(null);
25
+ }, []);
26
+ reactExports.useEffect(() => {
27
+ const listener = async (e) => {
28
+ var _a;
29
+ if (!((_a = e.clipboardData) == null ? void 0 : _a.files.length))
30
+ return;
31
+ for (const file of e.clipboardData.files) {
32
+ if (file.type !== "application/zip")
33
+ return;
34
+ }
35
+ e.preventDefault();
36
+ processTraceFiles(e.clipboardData.files);
37
+ };
38
+ document.addEventListener("paste", listener);
39
+ return () => document.removeEventListener("paste", listener);
40
+ });
41
+ reactExports.useEffect(() => {
42
+ const listener = (e) => {
43
+ const { method, params } = e.data;
44
+ if (method !== "load" || !((params == null ? void 0 : params.trace) instanceof Blob))
45
+ return;
46
+ const traceFile = new File([params.trace], "trace.zip", { type: "application/zip" });
47
+ const dataTransfer = new DataTransfer();
48
+ dataTransfer.items.add(traceFile);
49
+ processTraceFiles(dataTransfer.files);
50
+ };
51
+ window.addEventListener("message", listener);
52
+ return () => window.removeEventListener("message", listener);
53
+ });
54
+ const handleDropEvent = reactExports.useCallback((event) => {
55
+ event.preventDefault();
56
+ processTraceFiles(event.dataTransfer.files);
57
+ }, [processTraceFiles]);
58
+ const handleFileInputChange = reactExports.useCallback((event) => {
59
+ event.preventDefault();
60
+ if (!event.target.files)
61
+ return;
62
+ processTraceFiles(event.target.files);
63
+ }, [processTraceFiles]);
64
+ reactExports.useEffect(() => {
65
+ const params = new URL(window.location.href).searchParams;
66
+ const url = params.get("trace");
67
+ setIsServer(params.has("isServer"));
68
+ if (url == null ? void 0 : url.startsWith("file:")) {
69
+ setFileForLocalModeError(url || null);
70
+ return;
71
+ }
72
+ if (params.has("isServer")) {
73
+ const guid = new URLSearchParams(window.location.search).get("ws");
74
+ const wsURL = new URL(`../${guid}`, window.location.toString());
75
+ wsURL.protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
76
+ const testServerConnection = new TestServerConnection(new WebSocketTestServerTransport(wsURL));
77
+ testServerConnection.onLoadTraceRequested(async (params2) => {
78
+ setTraceURL(params2.traceUrl);
79
+ setDragOver(false);
80
+ setProcessingErrorMessage(null);
81
+ });
82
+ testServerConnection.initialize({}).catch(() => {
83
+ });
84
+ } else if (url && !url.startsWith("blob:")) {
85
+ setTraceURL(url);
86
+ }
87
+ }, []);
88
+ reactExports.useEffect(() => {
89
+ (async () => {
90
+ if (!traceURL) {
91
+ setModel(emptyModel);
92
+ return;
93
+ }
94
+ const swListener = (event) => {
95
+ if (event.data.method === "progress")
96
+ setProgress(event.data.params);
97
+ };
98
+ try {
99
+ navigator.serviceWorker.addEventListener("message", swListener);
100
+ setProgress({ done: 0, total: 1 });
101
+ const params = new URLSearchParams();
102
+ params.set("trace", traceURL);
103
+ const response = await fetch(`contexts?${params.toString()}`);
104
+ if (!response.ok) {
105
+ if (!isServer)
106
+ setTraceURL(void 0);
107
+ setProcessingErrorMessage((await response.json()).error);
108
+ return;
109
+ }
110
+ const contextEntries = await response.json();
111
+ const model2 = new MultiTraceModel(traceURL, contextEntries);
112
+ setProgress({ done: 0, total: 0 });
113
+ setModel(model2);
114
+ } finally {
115
+ navigator.serviceWorker.removeEventListener("message", swListener);
116
+ }
117
+ })();
118
+ }, [isServer, traceURL, uploadedTraceName]);
119
+ const showLoading = progress.done !== progress.total && progress.total !== 0 && !processingErrorMessage;
120
+ reactExports.useEffect(() => {
121
+ if (showLoading) {
122
+ const timeout = setTimeout(() => {
123
+ setShowProgressDialog(true);
124
+ }, 200);
125
+ return () => clearTimeout(timeout);
126
+ } else {
127
+ setShowProgressDialog(false);
128
+ }
129
+ }, [showLoading]);
130
+ const showFileUploadDropArea = !!(!isServer && !dragOver && !fileForLocalModeError && (!traceURL || processingErrorMessage));
131
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vbox workbench-loader", onDragOver: (event) => {
132
+ event.preventDefault();
133
+ setDragOver(true);
134
+ }, children: [
135
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hbox header", ...showFileUploadDropArea ? { inert: true } : {}, children: [
136
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "logo", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: "playwright-logo.svg", alt: "Playwright logo" }) }),
137
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "product", children: "Playwright" }),
138
+ model.title && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", children: model.title }),
139
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "spacer" }),
140
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogToolbarButton, { icon: "settings-gear", title: "Settings", dialogDataTestId: "settings-toolbar-dialog", children: /* @__PURE__ */ jsxRuntimeExports.jsx(DefaultSettingsView, { location: "trace-viewer" }) })
141
+ ] }),
142
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Workbench, { model, inert: showFileUploadDropArea }),
143
+ fileForLocalModeError && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "drop-target", children: [
144
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "Trace Viewer uses Service Workers to show traces. To view trace:" }),
145
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { paddingTop: 20 }, children: [
146
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
147
+ "1. Click ",
148
+ /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: fileForLocalModeError, children: "here" }),
149
+ " to put your trace into the download shelf"
150
+ ] }),
151
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
152
+ "2. Go to ",
153
+ /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "https://trace.playwright.dev", children: "trace.playwright.dev" })
154
+ ] }),
155
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "3. Drop the trace from the download shelf into the page" })
156
+ ] })
157
+ ] }),
158
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: showProgressDialog, isModal: true, className: "progress-dialog", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "progress-content", children: [
159
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", role: "heading", "aria-level": 1, children: "Loading Playwright Trace..." }),
160
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "progress-wrapper", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "inner-progress", style: { width: progress.total ? 100 * progress.done / progress.total + "%" : 0 } }) })
161
+ ] }) }),
162
+ showFileUploadDropArea && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "drop-target", children: [
163
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "processing-error", role: "alert", children: processingErrorMessage }),
164
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", role: "heading", "aria-level": 1, children: "Drop Playwright Trace to load" }),
165
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "or" }),
166
+ /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => {
167
+ const input = document.createElement("input");
168
+ input.type = "file";
169
+ input.click();
170
+ input.addEventListener("change", (e) => handleFileInputChange(e));
171
+ }, type: "button", children: "Select file" }),
172
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "info", children: "Playwright Trace Viewer is a Progressive Web App, it does not send your trace anywhere, it opens it locally." }),
173
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "version", children: [
174
+ "Playwright v",
175
+ "1.57.1"
176
+ ] })
177
+ ] }),
178
+ isServer && !traceURL && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "drop-target", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", children: "Select test to see the trace" }) }),
179
+ dragOver && /* @__PURE__ */ jsxRuntimeExports.jsx(
180
+ "div",
181
+ {
182
+ className: "drop-target",
183
+ onDragLeave: () => {
184
+ setDragOver(false);
185
+ },
186
+ onDrop: (event) => handleDropEvent(event),
187
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", children: "Release to analyse the Playwright Trace" })
188
+ }
189
+ )
190
+ ] });
191
+ };
192
+ const emptyModel = new MultiTraceModel("", []);
193
+ const LiveWorkbenchLoader = ({ traceJson }) => {
194
+ const [model, setModel] = reactExports.useState(void 0);
195
+ const [counter, setCounter] = reactExports.useState(0);
196
+ const pollTimer = reactExports.useRef(null);
197
+ reactExports.useEffect(() => {
198
+ if (pollTimer.current)
199
+ clearTimeout(pollTimer.current);
200
+ pollTimer.current = setTimeout(async () => {
201
+ try {
202
+ const model2 = await loadSingleTraceFile(traceJson);
203
+ setModel(model2);
204
+ } catch {
205
+ const model2 = new MultiTraceModel("", []);
206
+ setModel(model2);
207
+ } finally {
208
+ setCounter(counter + 1);
209
+ }
210
+ }, 500);
211
+ return () => {
212
+ if (pollTimer.current)
213
+ clearTimeout(pollTimer.current);
214
+ };
215
+ }, [traceJson, counter]);
216
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Workbench, { isLive: true, model });
217
+ };
218
+ async function loadSingleTraceFile(traceJson) {
219
+ const params = new URLSearchParams();
220
+ params.set("trace", traceJson);
221
+ const response = await fetch(`contexts?${params.toString()}`);
222
+ const contextEntries = await response.json();
223
+ return new MultiTraceModel(traceJson, contextEntries);
224
+ }
225
+ (async () => {
226
+ const queryParams = new URLSearchParams(window.location.search);
227
+ applyTheme();
228
+ if (window.location.protocol !== "file:") {
229
+ if (queryParams.get("isUnderTest") === "true")
230
+ await new Promise((f) => setTimeout(f, 1e3));
231
+ if (!navigator.serviceWorker)
232
+ throw new Error(`Service workers are not supported.
233
+ Make sure to serve the Trace Viewer (${window.location}) via HTTPS or localhost.`);
234
+ navigator.serviceWorker.register("sw.bundle.js");
235
+ if (!navigator.serviceWorker.controller) {
236
+ await new Promise((f) => {
237
+ navigator.serviceWorker.oncontrollerchange = () => f();
238
+ });
239
+ }
240
+ setInterval(function() {
241
+ fetch("ping");
242
+ }, 1e4);
243
+ }
244
+ const trace = queryParams.get("trace");
245
+ const traceIsLive = trace == null ? void 0 : trace.endsWith(".json");
246
+ const workbench = traceIsLive ? /* @__PURE__ */ jsxRuntimeExports.jsx(LiveWorkbenchLoader, { traceJson: trace }) : /* @__PURE__ */ jsxRuntimeExports.jsx(WorkbenchLoader, {});
247
+ clientExports.createRoot(document.querySelector("#root")).render(workbench);
248
+ })();
249
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguQnFfRWFLOHguanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RyYWNlLXZpZXdlci9zcmMvdWkvd29ya2JlbmNoTG9hZGVyLnRzeCIsIi4uLy4uLy4uLy4uL3RyYWNlLXZpZXdlci9zcmMvdWkvbGl2ZVdvcmtiZW5jaExvYWRlci50c3giLCIuLi8uLi8uLi8uLi90cmFjZS12aWV3ZXIvc3JjL2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBNdWx0aVRyYWNlTW9kZWwgfSBmcm9tICcuL21vZGVsVXRpbCc7XG5pbXBvcnQgJy4vd29ya2JlbmNoTG9hZGVyLmNzcyc7XG5pbXBvcnQgeyBXb3JrYmVuY2ggfSBmcm9tICcuL3dvcmtiZW5jaCc7XG5pbXBvcnQgeyBUZXN0U2VydmVyQ29ubmVjdGlvbiwgV2ViU29ja2V0VGVzdFNlcnZlclRyYW5zcG9ydCB9IGZyb20gJ0B0ZXN0SXNvbW9ycGhpYy90ZXN0U2VydmVyQ29ubmVjdGlvbic7XG5pbXBvcnQgeyBEaWFsb2dUb29sYmFyQnV0dG9uIH0gZnJvbSAnQHdlYi9jb21wb25lbnRzL2RpYWxvZ1Rvb2xiYXJCdXR0b24nO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSAnQHdlYi9zaGFyZWQvZGlhbG9nJztcbmltcG9ydCB7IERlZmF1bHRTZXR0aW5nc1ZpZXcgfSBmcm9tICcuL2RlZmF1bHRTZXR0aW5nc1ZpZXcnO1xuXG5leHBvcnQgY29uc3QgV29ya2JlbmNoTG9hZGVyOiBSZWFjdC5GdW5jdGlvbkNvbXBvbmVudDx7XG59PiA9ICgpID0+IHtcbiAgY29uc3QgW2lzU2VydmVyLCBzZXRJc1NlcnZlcl0gPSBSZWFjdC51c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFt0cmFjZVVSTCwgc2V0VHJhY2VVUkxdID0gUmVhY3QudXNlU3RhdGU8c3RyaW5nPigpO1xuICBjb25zdCBbdXBsb2FkZWRUcmFjZU5hbWUsIHNldFVwbG9hZGVkVHJhY2VOYW1lXSA9IFJlYWN0LnVzZVN0YXRlPHN0cmluZz4oKTtcbiAgY29uc3QgW21vZGVsLCBzZXRNb2RlbF0gPSBSZWFjdC51c2VTdGF0ZTxNdWx0aVRyYWNlTW9kZWw+KGVtcHR5TW9kZWwpO1xuICBjb25zdCBbcHJvZ3Jlc3MsIHNldFByb2dyZXNzXSA9IFJlYWN0LnVzZVN0YXRlPHsgZG9uZTogbnVtYmVyLCB0b3RhbDogbnVtYmVyIH0+KHsgZG9uZTogMCwgdG90YWw6IDAgfSk7XG4gIGNvbnN0IFtkcmFnT3Zlciwgc2V0RHJhZ092ZXJdID0gUmVhY3QudXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbcHJvY2Vzc2luZ0Vycm9yTWVzc2FnZSwgc2V0UHJvY2Vzc2luZ0Vycm9yTWVzc2FnZV0gPSBSZWFjdC51c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2ZpbGVGb3JMb2NhbE1vZGVFcnJvciwgc2V0RmlsZUZvckxvY2FsTW9kZUVycm9yXSA9IFJlYWN0LnVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbc2hvd1Byb2dyZXNzRGlhbG9nLCBzZXRTaG93UHJvZ3Jlc3NEaWFsb2ddID0gUmVhY3QudXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGNvbnN0IHByb2Nlc3NUcmFjZUZpbGVzID0gUmVhY3QudXNlQ2FsbGJhY2soKGZpbGVzOiBGaWxlTGlzdCkgPT4ge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIGlmICghZmlsZXMubGVuZ3RoKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGZpbGUgPSBmaWxlcy5pdGVtKDApITtcbiAgICBjb25zdCBibG9iVHJhY2VVUkwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCd0cmFjZScsIGJsb2JUcmFjZVVSTCk7XG4gICAgY29uc3QgaHJlZiA9IHVybC50b1N0cmluZygpO1xuICAgIC8vIFNuYXBzaG90IGxvYWRlcnMgd2lsbCBpbmhlcml0IHRoZSB0cmFjZSB1cmwgZnJvbSB0aGUgcXVlcnkgcGFyYW1ldGVycyxcbiAgICAvLyBzbyBzZXQgaXQgaGVyZS5cbiAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoe30sICcnLCBocmVmKTtcbiAgICBzZXRUcmFjZVVSTChibG9iVHJhY2VVUkwpO1xuICAgIHNldFVwbG9hZGVkVHJhY2VOYW1lKGZpbGUubmFtZSk7XG4gICAgc2V0RHJhZ092ZXIoZmFsc2UpO1xuICAgIHNldFByb2Nlc3NpbmdFcnJvck1lc3NhZ2UobnVsbCk7XG4gIH0sIFtdKTtcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGxpc3RlbmVyID0gYXN5bmMgKGU6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWUuY2xpcGJvYXJkRGF0YT8uZmlsZXMubGVuZ3RoKVxuICAgICAgICByZXR1cm47XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZS5jbGlwYm9hcmREYXRhLmZpbGVzKSB7XG4gICAgICAgIGlmIChmaWxlLnR5cGUgIT09ICdhcHBsaWNhdGlvbi96aXAnKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHByb2Nlc3NUcmFjZUZpbGVzKGUuY2xpcGJvYXJkRGF0YS5maWxlcyk7XG4gICAgfTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIGxpc3RlbmVyKTtcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBsaXN0ZW5lcik7XG4gIH0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGxpc3RlbmVyID0gKGU6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyBtZXRob2QsIHBhcmFtcyB9ID0gZS5kYXRhO1xuXG4gICAgICBpZiAobWV0aG9kICE9PSAnbG9hZCcgfHwgIShwYXJhbXM/LnRyYWNlIGluc3RhbmNlb2YgQmxvYikpXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY29uc3QgdHJhY2VGaWxlID0gbmV3IEZpbGUoW3BhcmFtcy50cmFjZV0sICd0cmFjZS56aXAnLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi96aXAnIH0pO1xuICAgICAgY29uc3QgZGF0YVRyYW5zZmVyID0gbmV3IERhdGFUcmFuc2ZlcigpO1xuXG4gICAgICBkYXRhVHJhbnNmZXIuaXRlbXMuYWRkKHRyYWNlRmlsZSk7XG5cbiAgICAgIHByb2Nlc3NUcmFjZUZpbGVzKGRhdGFUcmFuc2Zlci5maWxlcyk7XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyKTtcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lcik7XG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZURyb3BFdmVudCA9IFJlYWN0LnVzZUNhbGxiYWNrKChldmVudDogUmVhY3QuRHJhZ0V2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgcHJvY2Vzc1RyYWNlRmlsZXMoZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzKTtcbiAgfSwgW3Byb2Nlc3NUcmFjZUZpbGVzXSk7XG5cbiAgY29uc3QgaGFuZGxlRmlsZUlucHV0Q2hhbmdlID0gUmVhY3QudXNlQ2FsbGJhY2soKGV2ZW50OiBhbnkpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICghZXZlbnQudGFyZ2V0LmZpbGVzKVxuICAgICAgcmV0dXJuO1xuICAgIHByb2Nlc3NUcmFjZUZpbGVzKGV2ZW50LnRhcmdldC5maWxlcyk7XG4gIH0sIFtwcm9jZXNzVHJhY2VGaWxlc10pO1xuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zO1xuICAgIGNvbnN0IHVybCA9IHBhcmFtcy5nZXQoJ3RyYWNlJyk7XG4gICAgc2V0SXNTZXJ2ZXIocGFyYW1zLmhhcygnaXNTZXJ2ZXInKSk7XG5cbiAgICAvLyBEb24ndCBhY2NlcHQgZmlsZTovLyBVUkxzIC0gdGhpcyBtZWFucyB3ZSByZSBvcGVuZWQgbG9jYWxseS5cbiAgICBpZiAodXJsPy5zdGFydHNXaXRoKCdmaWxlOicpKSB7XG4gICAgICBzZXRGaWxlRm9yTG9jYWxNb2RlRXJyb3IodXJsIHx8IG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaGFzKCdpc1NlcnZlcicpKSB7XG4gICAgICBjb25zdCBndWlkID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3dzJyk7XG4gICAgICBjb25zdCB3c1VSTCA9IG5ldyBVUkwoYC4uLyR7Z3VpZH1gLCB3aW5kb3cubG9jYXRpb24udG9TdHJpbmcoKSk7XG4gICAgICB3c1VSTC5wcm90b2NvbCA9ICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonID8gJ3dzczonIDogJ3dzOicpO1xuICAgICAgY29uc3QgdGVzdFNlcnZlckNvbm5lY3Rpb24gPSBuZXcgVGVzdFNlcnZlckNvbm5lY3Rpb24obmV3IFdlYlNvY2tldFRlc3RTZXJ2ZXJUcmFuc3BvcnQod3NVUkwpKTtcbiAgICAgIHRlc3RTZXJ2ZXJDb25uZWN0aW9uLm9uTG9hZFRyYWNlUmVxdWVzdGVkKGFzeW5jIHBhcmFtcyA9PiB7XG4gICAgICAgIHNldFRyYWNlVVJMKHBhcmFtcy50cmFjZVVybCk7XG4gICAgICAgIHNldERyYWdPdmVyKGZhbHNlKTtcbiAgICAgICAgc2V0UHJvY2Vzc2luZ0Vycm9yTWVzc2FnZShudWxsKTtcbiAgICAgIH0pO1xuICAgICAgdGVzdFNlcnZlckNvbm5lY3Rpb24uaW5pdGlhbGl6ZSh7fSkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH0gZWxzZSBpZiAodXJsICYmICF1cmwuc3RhcnRzV2l0aCgnYmxvYjonKSkge1xuICAgICAgLy8gRG9uJ3QgcmUtdXNlIGJsb2IgZmlsZSBVUkxzIG9uIHBhZ2UgbG9hZCAocmVzdWx0cyBpbiBGZXRjaCBlcnJvcilcbiAgICAgIHNldFRyYWNlVVJMKHVybCk7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCF0cmFjZVVSTCkge1xuICAgICAgICBzZXRNb2RlbChlbXB0eU1vZGVsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzd0xpc3RlbmVyID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEubWV0aG9kID09PSAncHJvZ3Jlc3MnKVxuICAgICAgICAgIHNldFByb2dyZXNzKGV2ZW50LmRhdGEucGFyYW1zKTtcbiAgICAgIH07XG4gICAgICB0cnkge1xuICAgICAgICBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgc3dMaXN0ZW5lcik7XG4gICAgICAgIHNldFByb2dyZXNzKHsgZG9uZTogMCwgdG90YWw6IDEgfSk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBwYXJhbXMuc2V0KCd0cmFjZScsIHRyYWNlVVJMKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgY29udGV4dHM/JHtwYXJhbXMudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIGlmICghaXNTZXJ2ZXIpXG4gICAgICAgICAgICBzZXRUcmFjZVVSTCh1bmRlZmluZWQpO1xuICAgICAgICAgIHNldFByb2Nlc3NpbmdFcnJvck1lc3NhZ2UoKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkuZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250ZXh0RW50cmllcyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBuZXcgTXVsdGlUcmFjZU1vZGVsKHRyYWNlVVJMLCBjb250ZXh0RW50cmllcyk7XG4gICAgICAgIHNldFByb2dyZXNzKHsgZG9uZTogMCwgdG90YWw6IDAgfSk7XG4gICAgICAgIHNldE1vZGVsKG1vZGVsKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBzd0xpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9LCBbaXNTZXJ2ZXIsIHRyYWNlVVJMLCB1cGxvYWRlZFRyYWNlTmFtZV0pO1xuXG4gIGNvbnN0IHNob3dMb2FkaW5nID0gcHJvZ3Jlc3MuZG9uZSAhPT0gcHJvZ3Jlc3MudG90YWwgJiYgcHJvZ3Jlc3MudG90YWwgIT09IDAgJiYgIXByb2Nlc3NpbmdFcnJvck1lc3NhZ2U7XG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc2hvd0xvYWRpbmcpIHtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgc2V0U2hvd1Byb2dyZXNzRGlhbG9nKHRydWUpO1xuICAgICAgfSwgMjAwKTtcblxuICAgICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0U2hvd1Byb2dyZXNzRGlhbG9nKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtzaG93TG9hZGluZ10pO1xuXG4gIGNvbnN0IHNob3dGaWxlVXBsb2FkRHJvcEFyZWEgPSAhISghaXNTZXJ2ZXIgJiYgIWRyYWdPdmVyICYmICFmaWxlRm9yTG9jYWxNb2RlRXJyb3IgJiYgKCF0cmFjZVVSTCB8fCBwcm9jZXNzaW5nRXJyb3JNZXNzYWdlKSk7XG5cbiAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPSd2Ym94IHdvcmtiZW5jaC1sb2FkZXInIG9uRHJhZ092ZXI9e2V2ZW50ID0+IHsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgc2V0RHJhZ092ZXIodHJ1ZSk7IH19PlxuICAgIDxkaXYgY2xhc3NOYW1lPSdoYm94IGhlYWRlcicgey4uLihzaG93RmlsZVVwbG9hZERyb3BBcmVhID8geyBpbmVydDogdHJ1ZSB9IDoge30pfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdsb2dvJz5cbiAgICAgICAgPGltZyBzcmM9J3BsYXl3cmlnaHQtbG9nby5zdmcnIGFsdD0nUGxheXdyaWdodCBsb2dvJyAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ncHJvZHVjdCc+UGxheXdyaWdodDwvZGl2PlxuICAgICAge21vZGVsLnRpdGxlICYmIDxkaXYgY2xhc3NOYW1lPSd0aXRsZSc+e21vZGVsLnRpdGxlfTwvZGl2Pn1cbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdzcGFjZXInPjwvZGl2PlxuICAgICAgPERpYWxvZ1Rvb2xiYXJCdXR0b24gaWNvbj0nc2V0dGluZ3MtZ2VhcicgdGl0bGU9J1NldHRpbmdzJyBkaWFsb2dEYXRhVGVzdElkPSdzZXR0aW5ncy10b29sYmFyLWRpYWxvZyc+XG4gICAgICAgIDxEZWZhdWx0U2V0dGluZ3NWaWV3IGxvY2F0aW9uPSd0cmFjZS12aWV3ZXInIC8+XG4gICAgICA8L0RpYWxvZ1Rvb2xiYXJCdXR0b24+XG4gICAgPC9kaXY+XG4gICAgPFdvcmtiZW5jaCBtb2RlbD17bW9kZWx9IGluZXJ0PXtzaG93RmlsZVVwbG9hZERyb3BBcmVhfSAvPlxuICAgIHtmaWxlRm9yTG9jYWxNb2RlRXJyb3IgJiYgPGRpdiBjbGFzc05hbWU9J2Ryb3AtdGFyZ2V0Jz5cbiAgICAgIDxkaXY+VHJhY2UgVmlld2VyIHVzZXMgU2VydmljZSBXb3JrZXJzIHRvIHNob3cgdHJhY2VzLiBUbyB2aWV3IHRyYWNlOjwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT17eyBwYWRkaW5nVG9wOiAyMCB9fT5cbiAgICAgICAgPGRpdj4xLiBDbGljayA8YSBocmVmPXtmaWxlRm9yTG9jYWxNb2RlRXJyb3J9PmhlcmU8L2E+IHRvIHB1dCB5b3VyIHRyYWNlIGludG8gdGhlIGRvd25sb2FkIHNoZWxmPC9kaXY+XG4gICAgICAgIDxkaXY+Mi4gR28gdG8gPGEgaHJlZj0naHR0cHM6Ly90cmFjZS5wbGF5d3JpZ2h0LmRldic+dHJhY2UucGxheXdyaWdodC5kZXY8L2E+PC9kaXY+XG4gICAgICAgIDxkaXY+My4gRHJvcCB0aGUgdHJhY2UgZnJvbSB0aGUgZG93bmxvYWQgc2hlbGYgaW50byB0aGUgcGFnZTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+fVxuICAgIDxEaWFsb2cgb3Blbj17c2hvd1Byb2dyZXNzRGlhbG9nfSBpc01vZGFsPXt0cnVlfSBjbGFzc05hbWU9J3Byb2dyZXNzLWRpYWxvZyc+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ncHJvZ3Jlc3MtY29udGVudCc+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSd0aXRsZScgcm9sZT0naGVhZGluZycgYXJpYS1sZXZlbD17MX0+TG9hZGluZyBQbGF5d3JpZ2h0IFRyYWNlLi4uPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwcm9ncmVzcy13cmFwcGVyJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0naW5uZXItcHJvZ3Jlc3MnIHN0eWxlPXt7IHdpZHRoOiBwcm9ncmVzcy50b3RhbCA/ICgxMDAgKiBwcm9ncmVzcy5kb25lIC8gcHJvZ3Jlc3MudG90YWwpICsgJyUnIDogMCB9fT48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L0RpYWxvZz5cbiAgICB7c2hvd0ZpbGVVcGxvYWREcm9wQXJlYSAmJiA8ZGl2IGNsYXNzTmFtZT0nZHJvcC10YXJnZXQnPlxuICAgICAgPGRpdiBjbGFzc05hbWU9J3Byb2Nlc3NpbmctZXJyb3InIHJvbGU9J2FsZXJ0Jz57cHJvY2Vzc2luZ0Vycm9yTWVzc2FnZX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPSd0aXRsZScgcm9sZT0naGVhZGluZycgYXJpYS1sZXZlbD17MX0+RHJvcCBQbGF5d3JpZ2h0IFRyYWNlIHRvIGxvYWQ8L2Rpdj5cbiAgICAgIDxkaXY+b3I8L2Rpdj5cbiAgICAgIDxidXR0b24gb25DbGljaz17KCkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgIGlucHV0LnR5cGUgPSAnZmlsZSc7XG4gICAgICAgIGlucHV0LmNsaWNrKCk7XG4gICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGUgPT4gaGFuZGxlRmlsZUlucHV0Q2hhbmdlKGUpKTtcbiAgICAgIH19IHR5cGU9J2J1dHRvbic+U2VsZWN0IGZpbGU8L2J1dHRvbj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdpbmZvJz5QbGF5d3JpZ2h0IFRyYWNlIFZpZXdlciBpcyBhIFByb2dyZXNzaXZlIFdlYiBBcHAsIGl0IGRvZXMgbm90IHNlbmQgeW91ciB0cmFjZSBhbnl3aGVyZSxcbiAgICAgICAgaXQgb3BlbnMgaXQgbG9jYWxseS48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPSd2ZXJzaW9uJz5QbGF5d3JpZ2h0IHZ7X19BUFBfVkVSU0lPTl9ffTwvZGl2PlxuICAgIDwvZGl2Pn1cbiAgICB7aXNTZXJ2ZXIgJiYgIXRyYWNlVVJMICYmIDxkaXYgY2xhc3NOYW1lPSdkcm9wLXRhcmdldCc+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ndGl0bGUnPlNlbGVjdCB0ZXN0IHRvIHNlZSB0aGUgdHJhY2U8L2Rpdj5cbiAgICA8L2Rpdj59XG4gICAge2RyYWdPdmVyICYmIDxkaXYgY2xhc3NOYW1lPSdkcm9wLXRhcmdldCdcbiAgICAgIG9uRHJhZ0xlYXZlPXsoKSA9PiB7IHNldERyYWdPdmVyKGZhbHNlKTsgfX1cbiAgICAgIG9uRHJvcD17ZXZlbnQgPT4gaGFuZGxlRHJvcEV2ZW50KGV2ZW50KX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ndGl0bGUnPlJlbGVhc2UgdG8gYW5hbHlzZSB0aGUgUGxheXdyaWdodCBUcmFjZTwvZGl2PlxuICAgIDwvZGl2Pn1cbiAgPC9kaXY+O1xufTtcblxuZXhwb3J0IGNvbnN0IGVtcHR5TW9kZWwgPSBuZXcgTXVsdGlUcmFjZU1vZGVsKCcnLCBbXSk7XG4iLCIvKlxuICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBNdWx0aVRyYWNlTW9kZWwgfSBmcm9tICcuL21vZGVsVXRpbCc7XG5pbXBvcnQgJy4vd29ya2JlbmNoTG9hZGVyLmNzcyc7XG5pbXBvcnQgeyBXb3JrYmVuY2ggfSBmcm9tICcuL3dvcmtiZW5jaCc7XG5cbmltcG9ydCB0eXBlIHsgQ29udGV4dEVudHJ5IH0gZnJvbSAnLi4vdHlwZXMvZW50cmllcyc7XG5cbmV4cG9ydCBjb25zdCBMaXZlV29ya2JlbmNoTG9hZGVyOiBSZWFjdC5GQzx7IHRyYWNlSnNvbjogc3RyaW5nIH0+ID0gKHsgdHJhY2VKc29uIH0pID0+IHtcbiAgY29uc3QgW21vZGVsLCBzZXRNb2RlbF0gPSBSZWFjdC51c2VTdGF0ZTxNdWx0aVRyYWNlTW9kZWwgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IFtjb3VudGVyLCBzZXRDb3VudGVyXSA9IFJlYWN0LnVzZVN0YXRlKDApO1xuICBjb25zdCBwb2xsVGltZXIgPSBSZWFjdC51c2VSZWY8Tm9kZUpTLlRpbWVvdXQgfCBudWxsPihudWxsKTtcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChwb2xsVGltZXIuY3VycmVudClcbiAgICAgIGNsZWFyVGltZW91dChwb2xsVGltZXIuY3VycmVudCk7XG5cbiAgICAvLyBTdGFydCBwb2xsaW5nIHJ1bm5pbmcgdGVzdC5cbiAgICBwb2xsVGltZXIuY3VycmVudCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCBsb2FkU2luZ2xlVHJhY2VGaWxlKHRyYWNlSnNvbik7XG4gICAgICAgIHNldE1vZGVsKG1vZGVsKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG5ldyBNdWx0aVRyYWNlTW9kZWwoJycsIFtdKTtcbiAgICAgICAgc2V0TW9kZWwobW9kZWwpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0Q291bnRlcihjb3VudGVyICsgMSk7XG4gICAgICB9XG4gICAgfSwgNTAwKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHBvbGxUaW1lci5jdXJyZW50KVxuICAgICAgICBjbGVhclRpbWVvdXQocG9sbFRpbWVyLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFt0cmFjZUpzb24sIGNvdW50ZXJdKTtcblxuICByZXR1cm4gPFdvcmtiZW5jaCBpc0xpdmU9e3RydWV9IG1vZGVsPXttb2RlbH0gLz47XG59O1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkU2luZ2xlVHJhY2VGaWxlKHRyYWNlSnNvbjogc3RyaW5nKTogUHJvbWlzZTxNdWx0aVRyYWNlTW9kZWw+IHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICBwYXJhbXMuc2V0KCd0cmFjZScsIHRyYWNlSnNvbik7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGNvbnRleHRzPyR7cGFyYW1zLnRvU3RyaW5nKCl9YCk7XG4gIGNvbnN0IGNvbnRleHRFbnRyaWVzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIENvbnRleHRFbnRyeVtdO1xuICByZXR1cm4gbmV3IE11bHRpVHJhY2VNb2RlbCh0cmFjZUpzb24sIGNvbnRleHRFbnRyaWVzKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCAnQHdlYi9jb21tb24uY3NzJztcbmltcG9ydCB7IGFwcGx5VGhlbWUgfSBmcm9tICdAd2ViL3RoZW1lJztcbmltcG9ydCAnQHdlYi90aGlyZF9wYXJ0eS92c2NvZGUvY29kaWNvbi5jc3MnO1xuaW1wb3J0ICogYXMgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tL2NsaWVudCc7XG5pbXBvcnQgeyBXb3JrYmVuY2hMb2FkZXIgfSBmcm9tICcuL3VpL3dvcmtiZW5jaExvYWRlcic7XG5pbXBvcnQgeyBMaXZlV29ya2JlbmNoTG9hZGVyIH0gZnJvbSAnLi91aS9saXZlV29ya2JlbmNoTG9hZGVyJztcblxuKGFzeW5jICgpID0+IHtcbiAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuXG4gIGFwcGx5VGhlbWUoKTtcbiAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCAhPT0gJ2ZpbGU6Jykge1xuICAgIGlmIChxdWVyeVBhcmFtcy5nZXQoJ2lzVW5kZXJUZXN0JykgPT09ICd0cnVlJylcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKGYgPT4gc2V0VGltZW91dChmLCAxMDAwKSk7XG4gICAgaWYgKCFuYXZpZ2F0b3Iuc2VydmljZVdvcmtlcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2VydmljZSB3b3JrZXJzIGFyZSBub3Qgc3VwcG9ydGVkLlxcbk1ha2Ugc3VyZSB0byBzZXJ2ZSB0aGUgVHJhY2UgVmlld2VyICgke3dpbmRvdy5sb2NhdGlvbn0pIHZpYSBIVFRQUyBvciBsb2NhbGhvc3QuYCk7XG4gICAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVnaXN0ZXIoJ3N3LmJ1bmRsZS5qcycpO1xuICAgIGlmICghbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIuY29udHJvbGxlcikge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oZiA9PiB7XG4gICAgICAgIG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLm9uY29udHJvbGxlcmNoYW5nZSA9ICgpID0+IGYoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEtlZXAgU1cgcnVubmluZy5cbiAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsgZmV0Y2goJ3BpbmcnKTsgfSwgMTAwMDApO1xuICB9XG5cbiAgY29uc3QgdHJhY2UgPSBxdWVyeVBhcmFtcy5nZXQoJ3RyYWNlJyk7XG4gIGNvbnN0IHRyYWNlSXNMaXZlID0gdHJhY2U/LmVuZHNXaXRoKCcuanNvbicpO1xuICBjb25zdCB3b3JrYmVuY2ggPSB0cmFjZUlzTGl2ZSA/IDxMaXZlV29ya2JlbmNoTG9hZGVyIHRyYWNlSnNvbj17dHJhY2UhfSAvPiA6IDxXb3JrYmVuY2hMb2FkZXIvPjtcbiAgUmVhY3RET00uY3JlYXRlUm9vdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm9vdCcpISkucmVuZGVyKHdvcmtiZW5jaCk7XG59KSgpO1xuIl0sIm5hbWVzIjpbIlJlYWN0LnVzZVN0YXRlIiwiUmVhY3QudXNlQ2FsbGJhY2siLCJSZWFjdC51c2VFZmZlY3QiLCJwYXJhbXMiLCJtb2RlbCIsImpzeHMiLCJqc3giLCJSZWFjdC51c2VSZWYiLCJSZWFjdERPTS5jcmVhdGVSb290Il0sIm1hcHBpbmdzIjoiO0FBeUJPLE1BQU0sa0JBQ1IsTUFBTTtBQUNULFFBQU0sQ0FBQyxVQUFVLFdBQVcsSUFBSUEsYUFBQUEsU0FBd0IsS0FBSztBQUM3RCxRQUFNLENBQUMsVUFBVSxXQUFXLElBQUlBLHNCQUFNO0FBQ3RDLFFBQU0sQ0FBQyxtQkFBbUIsb0JBQW9CLElBQUlBLHNCQUFNO0FBQ3hELFFBQU0sQ0FBQyxPQUFPLFFBQVEsSUFBSUEsYUFBQUEsU0FBZ0MsVUFBVTtBQUNwRSxRQUFNLENBQUMsVUFBVSxXQUFXLElBQUlBLGFBQUFBLFNBQWdELEVBQUUsTUFBTSxHQUFHLE9BQU8sR0FBRztBQUNyRyxRQUFNLENBQUMsVUFBVSxXQUFXLElBQUlBLGFBQUFBLFNBQXdCLEtBQUs7QUFDN0QsUUFBTSxDQUFDLHdCQUF3Qix5QkFBeUIsSUFBSUEsYUFB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
@@ -0,0 +1,2 @@
1
+ import{T as x,r,a as C,W as F,j as e,D as z,b as I,c as P,d as A,e as O,f as V}from"./assets/defaultSettingsView-CtEsdeVH.js";const $=()=>{const[o,c]=r.useState(!1),[n,l]=r.useState(),[h,u]=r.useState(),[p,b]=r.useState(N),[f,j]=r.useState({done:0,total:0}),[k,v]=r.useState(!1),[y,m]=r.useState(null),[T,R]=r.useState(null),[U,E]=r.useState(!1),g=r.useCallback(t=>{const s=new URL(window.location.href);if(!t.length)return;const i=t.item(0),a=URL.createObjectURL(i);s.searchParams.append("trace",a);const d=s.toString();window.history.pushState({},"",d),l(a),u(i.name),v(!1),m(null)},[]);r.useEffect(()=>{const t=async s=>{var a;if(!((a=s.clipboardData)!=null&&a.files.length))return;const i=["application/zip","application/x-zip-compressed"];for(const d of s.clipboardData.files)if(!i.includes(d.type))return;s.preventDefault(),g(s.clipboardData.files)};return document.addEventListener("paste",t),()=>document.removeEventListener("paste",t)}),r.useEffect(()=>{const t=s=>{const{method:i,params:a}=s.data;if(i!=="load"||!((a==null?void 0:a.trace)instanceof Blob))return;const d=new File([a.trace],"trace.zip",{type:"application/zip"}),w=new DataTransfer;w.items.add(d),g(w.files)};return window.addEventListener("message",t),()=>window.removeEventListener("message",t)});const W=r.useCallback(t=>{t.preventDefault(),g(t.dataTransfer.files)},[g]),M=r.useCallback(t=>{t.preventDefault(),t.target.files&&g(t.target.files)},[g]);r.useEffect(()=>{const t=new URL(window.location.href).searchParams,s=t.get("trace");if(c(t.has("isServer")),s!=null&&s.startsWith("file:")){R(s||null);return}if(t.has("isServer")){const i=new URLSearchParams(window.location.search).get("ws"),a=new URL(`../${i}`,window.location.toString());a.protocol=window.location.protocol==="https:"?"wss:":"ws:";const d=new C(new F(a));d.onLoadTraceRequested(async w=>{l(w.traceUrl),v(!1),m(null)}),d.initialize({}).catch(()=>{})}else s&&!s.startsWith("blob:")&&l(s)},[]);const S=r.useCallback(async t=>{const s=new URLSearchParams;s.set("trace",t);const i=await fetch(`contexts?${s.toString()}`);if(!i.ok){const{error:w}=await i.json();return m(w),w}const a=await i.json(),d=new x(t,a);j({done:0,total:0}),m(null),b(d)},[]);r.useEffect(()=>{(async()=>{if(!n){b(N);return}const t=s=>{s.data.method==="progress"&&j(s.data.params)};try{navigator.serviceWorker.addEventListener("message",t),j({done:0,total:1});let s=await S(n);s!=null&&s.includes("please grant permission for Local Network Access")&&(await fetch(n,{method:"HEAD",headers:{"x-pw-serviceworker":"skip"}}),s=await S(n)),s&&(o||l(void 0))}finally{navigator.serviceWorker.removeEventListener("message",t)}})()},[o,n,h,S]);const D=f.done!==f.total&&f.total!==0&&!y;r.useEffect(()=>{if(D){const t=setTimeout(()=>{E(!0)},200);return()=>clearTimeout(t)}else E(!1)},[D]);const L=!!(!o&&!k&&!T&&(!n||y));return e.jsxs("div",{className:"vbox workbench-loader",onDragOver:t=>{t.preventDefault(),t.dataTransfer.types.includes("Files")&&v(!0)},children:[e.jsxs("div",{className:"hbox header",...L?{inert:!0}:{},children:[e.jsx("div",{className:"logo",children:e.jsx("img",{src:"playwright-logo.svg",alt:"Playwright logo"})}),e.jsx("div",{className:"product",children:"Playwright"}),p.title&&e.jsx("div",{className:"title",children:p.title}),e.jsx("div",{className:"spacer"}),e.jsx(z,{icon:"settings-gear",title:"Settings",dialogDataTestId:"settings-toolbar-dialog",children:e.jsx(I,{location:"trace-viewer"})})]}),e.jsx(P,{model:p,inert:L}),T&&e.jsxs("div",{className:"drop-target",children:[e.jsx("div",{children:"Trace Viewer uses Service Workers to show traces. To view trace:"}),e.jsxs("div",{style:{paddingTop:20},children:[e.jsxs("div",{children:["1. Click ",e.jsx("a",{href:T,children:"here"})," to put your trace into the download shelf"]}),e.jsxs("div",{children:["2. Go to ",e.jsx("a",{href:"https://trace.playwright.dev",children:"trace.playwright.dev"})]}),e.jsx("div",{children:"3. Drop the trace from the download shelf into the page"})]})]}),e.jsx(A,{open:U,isModal:!0,className:"progress-dialog",children:e.jsxs("div",{className:"progress-content",children:[e.jsx("div",{className:"title",role:"heading","aria-level":1,children:"Loading Playwright Trace..."}),e.jsx("div",{className:"progress-wrapper",children:e.jsx("div",{className:"inner-progress",style:{width:f.total?100*f.done/f.total+"%":0}})})]})}),L&&e.jsxs("div",{className:"drop-target",children:[e.jsx("div",{className:"processing-error",role:"alert",children:y}),e.jsx("div",{className:"title",role:"heading","aria-level":1,children:"Drop Playwright Trace to load"}),e.jsx("div",{children:"or"}),e.jsx("button",{onClick:()=>{const t=document.createElement("input");t.type="file",t.click(),t.addEventListener("change",s=>M(s))},type:"button",children:"Select file"}),e.jsx("div",{className:"info",children:"Playwright Trace Viewer is a Progressive Web App, it does not send your trace anywhere, it opens it locally."}),e.jsxs("div",{className:"version",children:["Playwright v","1.58.1"]})]}),o&&!n&&e.jsx("div",{className:"drop-target",children:e.jsx("div",{className:"title",children:"Select test to see the trace"})}),k&&e.jsx("div",{className:"drop-target",onDragLeave:()=>{v(!1)},onDrop:t=>W(t),children:e.jsx("div",{className:"title",children:"Release to analyse the Playwright Trace"})})]})},N=new x("",[]),q=({traceJson:o})=>{const[c,n]=r.useState(void 0),[l,h]=r.useState(0),u=r.useRef(null);return r.useEffect(()=>(u.current&&clearTimeout(u.current),u.current=setTimeout(async()=>{try{const p=await B(o);n(p)}catch{const p=new x("",[]);n(p)}finally{h(l+1)}},500),()=>{u.current&&clearTimeout(u.current)}),[o,l]),e.jsx(P,{isLive:!0,model:c})};async function B(o){const c=new URLSearchParams;c.set("trace",o);const l=await(await fetch(`contexts?${c.toString()}`)).json();return new x(o,l)}(async()=>{const o=new URLSearchParams(window.location.search);if(O(),window.location.protocol!=="file:"){if(o.get("isUnderTest")==="true"&&await new Promise(h=>setTimeout(h,1e3)),!navigator.serviceWorker)throw new Error(`Service workers are not supported.
2
+ Make sure to serve the Trace Viewer (${window.location}) via HTTPS or localhost.`);navigator.serviceWorker.register("sw.bundle.js"),navigator.serviceWorker.controller||await new Promise(h=>{navigator.serviceWorker.oncontrollerchange=()=>h()}),setInterval(function(){fetch("ping")},1e4)}const c=o.get("trace"),l=(c==null?void 0:c.endsWith(".json"))?e.jsx(q,{traceJson:c}):e.jsx($,{});V.createRoot(document.querySelector("#root")).render(l)})();
@@ -0,0 +1,2 @@
1
+ import{T as x,r,a as C,W as F,j as e,D as z,b as I,c as P,d as A,e as O,f as V}from"./assets/defaultSettingsView-B1vuWQsF.js";const $=()=>{const[o,c]=r.useState(!1),[n,l]=r.useState(),[h,u]=r.useState(),[p,b]=r.useState(N),[f,j]=r.useState({done:0,total:0}),[k,v]=r.useState(!1),[y,m]=r.useState(null),[T,R]=r.useState(null),[U,E]=r.useState(!1),g=r.useCallback(t=>{const s=new URL(window.location.href);if(!t.length)return;const i=t.item(0),a=URL.createObjectURL(i);s.searchParams.append("trace",a);const d=s.toString();window.history.pushState({},"",d),l(a),u(i.name),v(!1),m(null)},[]);r.useEffect(()=>{const t=async s=>{var a;if(!((a=s.clipboardData)!=null&&a.files.length))return;const i=["application/zip","application/x-zip-compressed"];for(const d of s.clipboardData.files)if(!i.includes(d.type))return;s.preventDefault(),g(s.clipboardData.files)};return document.addEventListener("paste",t),()=>document.removeEventListener("paste",t)}),r.useEffect(()=>{const t=s=>{const{method:i,params:a}=s.data;if(i!=="load"||!((a==null?void 0:a.trace)instanceof Blob))return;const d=new File([a.trace],"trace.zip",{type:"application/zip"}),w=new DataTransfer;w.items.add(d),g(w.files)};return window.addEventListener("message",t),()=>window.removeEventListener("message",t)});const W=r.useCallback(t=>{t.preventDefault(),g(t.dataTransfer.files)},[g]),M=r.useCallback(t=>{t.preventDefault(),t.target.files&&g(t.target.files)},[g]);r.useEffect(()=>{const t=new URL(window.location.href).searchParams,s=t.get("trace");if(c(t.has("isServer")),s!=null&&s.startsWith("file:")){R(s||null);return}if(t.has("isServer")){const i=new URLSearchParams(window.location.search).get("ws"),a=new URL(`../${i}`,window.location.toString());a.protocol=window.location.protocol==="https:"?"wss:":"ws:";const d=new C(new F(a));d.onLoadTraceRequested(async w=>{l(w.traceUrl),v(!1),m(null)}),d.initialize({}).catch(()=>{})}else s&&!s.startsWith("blob:")&&l(s)},[]);const S=r.useCallback(async t=>{const s=new URLSearchParams;s.set("trace",t);const i=await fetch(`contexts?${s.toString()}`);if(!i.ok){const{error:w}=await i.json();return m(w),w}const a=await i.json(),d=new x(t,a);j({done:0,total:0}),m(null),b(d)},[]);r.useEffect(()=>{(async()=>{if(!n){b(N);return}const t=s=>{s.data.method==="progress"&&j(s.data.params)};try{navigator.serviceWorker.addEventListener("message",t),j({done:0,total:1});let s=await S(n);s!=null&&s.includes("please grant permission for Local Network Access")&&(await fetch(n,{method:"HEAD",headers:{"x-pw-serviceworker":"skip"}}),s=await S(n)),s&&(o||l(void 0))}finally{navigator.serviceWorker.removeEventListener("message",t)}})()},[o,n,h,S]);const D=f.done!==f.total&&f.total!==0&&!y;r.useEffect(()=>{if(D){const t=setTimeout(()=>{E(!0)},200);return()=>clearTimeout(t)}else E(!1)},[D]);const L=!!(!o&&!k&&!T&&(!n||y));return e.jsxs("div",{className:"vbox workbench-loader",onDragOver:t=>{t.preventDefault(),t.dataTransfer.types.includes("Files")&&v(!0)},children:[e.jsxs("div",{className:"hbox header",...L?{inert:!0}:{},children:[e.jsx("div",{className:"logo",children:e.jsx("img",{src:"playwright-logo.svg",alt:"Playwright logo"})}),e.jsx("div",{className:"product",children:"Playwright"}),p.title&&e.jsx("div",{className:"title",children:p.title}),e.jsx("div",{className:"spacer"}),e.jsx(z,{icon:"settings-gear",title:"Settings",dialogDataTestId:"settings-toolbar-dialog",children:e.jsx(I,{location:"trace-viewer"})})]}),e.jsx(P,{model:p,inert:L}),T&&e.jsxs("div",{className:"drop-target",children:[e.jsx("div",{children:"Trace Viewer uses Service Workers to show traces. To view trace:"}),e.jsxs("div",{style:{paddingTop:20},children:[e.jsxs("div",{children:["1. Click ",e.jsx("a",{href:T,children:"here"})," to put your trace into the download shelf"]}),e.jsxs("div",{children:["2. Go to ",e.jsx("a",{href:"https://trace.playwright.dev",children:"trace.playwright.dev"})]}),e.jsx("div",{children:"3. Drop the trace from the download shelf into the page"})]})]}),e.jsx(A,{open:U,isModal:!0,className:"progress-dialog",children:e.jsxs("div",{className:"progress-content",children:[e.jsx("div",{className:"title",role:"heading","aria-level":1,children:"Loading Playwright Trace..."}),e.jsx("div",{className:"progress-wrapper",children:e.jsx("div",{className:"inner-progress",style:{width:f.total?100*f.done/f.total+"%":0}})})]})}),L&&e.jsxs("div",{className:"drop-target",children:[e.jsx("div",{className:"processing-error",role:"alert",children:y}),e.jsx("div",{className:"title",role:"heading","aria-level":1,children:"Drop Playwright Trace to load"}),e.jsx("div",{children:"or"}),e.jsx("button",{onClick:()=>{const t=document.createElement("input");t.type="file",t.click(),t.addEventListener("change",s=>M(s))},type:"button",children:"Select file"}),e.jsx("div",{className:"info",children:"Playwright Trace Viewer is a Progressive Web App, it does not send your trace anywhere, it opens it locally."}),e.jsxs("div",{className:"version",children:["Playwright v","1.58.1"]})]}),o&&!n&&e.jsx("div",{className:"drop-target",children:e.jsx("div",{className:"title",children:"Select test to see the trace"})}),k&&e.jsx("div",{className:"drop-target",onDragLeave:()=>{v(!1)},onDrop:t=>W(t),children:e.jsx("div",{className:"title",children:"Release to analyse the Playwright Trace"})})]})},N=new x("",[]),q=({traceJson:o})=>{const[c,n]=r.useState(void 0),[l,h]=r.useState(0),u=r.useRef(null);return r.useEffect(()=>(u.current&&clearTimeout(u.current),u.current=setTimeout(async()=>{try{const p=await B(o);n(p)}catch{const p=new x("",[]);n(p)}finally{h(l+1)}},500),()=>{u.current&&clearTimeout(u.current)}),[o,l]),e.jsx(P,{isLive:!0,model:c})};async function B(o){const c=new URLSearchParams;c.set("trace",o);const l=await(await fetch(`contexts?${c.toString()}`)).json();return new x(o,l)}(async()=>{const o=new URLSearchParams(window.location.search);if(O(),window.location.protocol!=="file:"){if(o.get("isUnderTest")==="true"&&await new Promise(h=>setTimeout(h,1e3)),!navigator.serviceWorker)throw new Error(`Service workers are not supported.
2
+ Make sure to serve the Trace Viewer (${window.location}) via HTTPS or localhost.`);navigator.serviceWorker.register("sw.bundle.js"),navigator.serviceWorker.controller||await new Promise(h=>{navigator.serviceWorker.oncontrollerchange=()=>h()}),setInterval(function(){fetch("ping")},1e4)}const c=o.get("trace"),l=(c==null?void 0:c.endsWith(".json"))?e.jsx(q,{traceJson:c}):e.jsx($,{});V.createRoot(document.querySelector("#root")).render(l)})();
@@ -0,0 +1,164 @@
1
+ /*
2
+ Copyright (c) Microsoft Corporation.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ .drop-target {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ flex: auto;
22
+ flex-direction: column;
23
+ background-color: var(--vscode-editor-background);
24
+ position: absolute;
25
+ top: 0;
26
+ right: 0;
27
+ bottom: 0;
28
+ left: 0;
29
+ z-index: 100;
30
+ line-height: 24px;
31
+ }
32
+
33
+ body .drop-target {
34
+ background: rgba(255, 255, 255, 0.8);
35
+ }
36
+
37
+ :root.dark-mode .drop-target {
38
+ background: rgba(0, 0, 0, 0.8);
39
+ }
40
+
41
+ .drop-target .title {
42
+ font-size: 24px;
43
+ font-weight: bold;
44
+ margin-bottom: 30px;
45
+ }
46
+
47
+ .drop-target .info {
48
+ max-width: 400px;
49
+ text-align: center;
50
+ }
51
+
52
+ .drop-target .processing-error {
53
+ font-size: 24px;
54
+ color: #e74c3c;
55
+ font-weight: bold;
56
+ text-align: center;
57
+ margin: 30px;
58
+ }
59
+
60
+ .drop-target input {
61
+ margin-top: 50px;
62
+ }
63
+
64
+ .drop-target button {
65
+ color: rgb(255, 255, 255);
66
+ background-color: rgb(0, 122, 204);
67
+ padding: 8px 12px;
68
+ border: none;
69
+ margin: 30px 0;
70
+ cursor: pointer;
71
+ }
72
+
73
+ .drop-target .version {
74
+ color: var(--vscode-disabledForeground);
75
+ margin-top: 8px;
76
+ }
77
+
78
+ .progress-dialog {
79
+ width: 400px;
80
+ inset: 0;
81
+ border: none;
82
+ outline: none;
83
+ background-color: var(--vscode-sideBar-background);
84
+ }
85
+
86
+ .progress-dialog::backdrop {
87
+ background-color: rgba(0, 0, 0, 0.4);
88
+ }
89
+
90
+ .progress-content {
91
+ padding: 16px;
92
+ }
93
+
94
+ .progress-content .title {
95
+ /* This is set in common.css */
96
+ background-color: unset;
97
+ font-size: 18px;
98
+ font-weight: bold;
99
+ padding: 0;
100
+ }
101
+
102
+ .progress-wrapper {
103
+ background-color: var(--vscode-commandCenter-activeBackground);
104
+ width: 100%;
105
+ margin-top: 16px;
106
+ margin-bottom: 8px;
107
+ }
108
+
109
+ .inner-progress {
110
+ background-color: var(--vscode-progressBar-background);
111
+ height: 4px;
112
+ }
113
+
114
+ .header {
115
+ display: flex;
116
+ background-color: #000;
117
+ flex: none;
118
+ flex-basis: 48px;
119
+ line-height: 48px;
120
+ font-size: 16px;
121
+ color: #cccccc;
122
+ }
123
+
124
+ .workbench-loader {
125
+ contain: size;
126
+ }
127
+
128
+ .workbench-loader .header .toolbar-button {
129
+ margin: 12px;
130
+ padding: 8px 4px;
131
+ }
132
+
133
+ .workbench-loader .logo {
134
+ margin-left: 16px;
135
+ display: flex;
136
+ align-items: center;
137
+ }
138
+
139
+ .workbench-loader .logo img {
140
+ height: 32px;
141
+ width: 32px;
142
+ pointer-events: none;
143
+ flex: none;
144
+ }
145
+
146
+ .workbench-loader .product {
147
+ font-weight: 600;
148
+ margin-left: 16px;
149
+ flex: none;
150
+ }
151
+
152
+ .workbench-loader .header .title {
153
+ margin-left: 16px;
154
+ overflow: hidden;
155
+ text-overflow: ellipsis;
156
+ text-wrap: nowrap;
157
+ }
158
+
159
+ /* Limit to a reasonable minimum viewport */
160
+ html, body {
161
+ min-width: 550px;
162
+ min-height: 450px;
163
+ overflow: auto;
164
+ }
@@ -7,10 +7,10 @@
7
7
  <link rel="icon" href="./playwright-logo.svg" type="image/svg+xml">
8
8
  <link rel="manifest" href="./manifest.webmanifest">
9
9
  <title>Playwright Trace Viewer</title>
10
- <script type="module" crossorigin src="./index.DM2kY0Ok.js"></script>
11
- <link rel="modulepreload" crossorigin href="./assets/defaultSettingsView-D-QZZQWH.js">
12
- <link rel="stylesheet" crossorigin href="./defaultSettingsView.ConWv5KN.css">
13
- <link rel="stylesheet" crossorigin href="./index.C4Y3Aw8n.css">
10
+ <script type="module" crossorigin src="./index.Cr7-GRf8.js"></script>
11
+ <link rel="modulepreload" crossorigin href="./assets/defaultSettingsView-B1vuWQsF.js">
12
+ <link rel="stylesheet" crossorigin href="./defaultSettingsView.7ch9cixO.css">
13
+ <link rel="stylesheet" crossorigin href="./index.BVu7tZDe.css">
14
14
  </head>
15
15
  <body>
16
16
  <div id="root"></div>