@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.
- package/ThirdPartyNotices.txt +3223 -308
- package/browsers.json +21 -22
- package/lib/cli/program.js +4 -5
- package/lib/client/api.js +3 -0
- package/lib/client/browser.js +3 -5
- package/lib/client/browserContext.js +35 -0
- package/lib/client/browserType.js +4 -3
- package/lib/client/channelOwner.js +4 -3
- package/lib/client/clientInstrumentation.js +10 -0
- package/lib/client/connection.js +4 -0
- package/lib/client/elementHandle.js +3 -0
- package/lib/client/events.js +3 -0
- package/lib/client/fetch.js +3 -4
- package/lib/client/frame.js +1 -0
- package/lib/client/page.js +28 -1
- package/lib/client/pageAgent.js +64 -0
- package/lib/client/platform.js +3 -0
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/pollingRecorderSource.js +1 -1
- package/lib/mcpBundle.js +84 -0
- package/lib/mcpBundleImpl/index.js +147 -0
- package/lib/protocol/serializers.js +5 -0
- package/lib/protocol/validator.js +92 -3
- package/lib/remote/playwrightServer.js +1 -2
- package/lib/server/agent/actionRunner.js +335 -0
- package/lib/server/agent/actions.js +128 -0
- package/lib/server/agent/codegen.js +111 -0
- package/lib/server/agent/context.js +150 -0
- package/lib/server/agent/expectTools.js +156 -0
- package/lib/server/agent/pageAgent.js +204 -0
- package/lib/server/agent/performTools.js +262 -0
- package/lib/server/agent/tool.js +109 -0
- package/lib/server/artifact.js +1 -1
- package/lib/server/bidi/bidiBrowser.js +56 -12
- package/lib/server/bidi/bidiChromium.js +6 -11
- package/lib/server/bidi/bidiConnection.js +1 -0
- package/lib/server/bidi/bidiDeserializer.js +116 -0
- package/lib/server/bidi/bidiExecutionContext.js +75 -29
- package/lib/server/bidi/bidiFirefox.js +6 -8
- package/lib/server/bidi/bidiNetworkManager.js +1 -1
- package/lib/server/bidi/bidiPage.js +39 -28
- package/lib/server/bidi/third_party/bidiProtocolCore.js +1 -0
- package/lib/server/browserContext.js +32 -25
- package/lib/server/browserType.js +12 -4
- package/lib/server/chromium/chromium.js +14 -21
- package/lib/server/chromium/chromiumSwitches.js +2 -2
- package/lib/server/chromium/crBrowser.js +22 -12
- package/lib/server/chromium/crConnection.js +0 -5
- package/lib/server/chromium/crDevTools.js +0 -2
- package/lib/server/chromium/crNetworkManager.js +43 -2
- package/lib/server/chromium/crPage.js +19 -87
- package/lib/server/codegen/javascript.js +6 -29
- package/lib/server/deviceDescriptorsSource.json +56 -56
- package/lib/server/dispatchers/browserContextDispatcher.js +3 -0
- package/lib/server/dispatchers/dispatcher.js +6 -13
- package/lib/server/dispatchers/frameDispatcher.js +1 -1
- package/lib/server/dispatchers/pageAgentDispatcher.js +96 -0
- package/lib/server/dispatchers/pageDispatcher.js +4 -0
- package/lib/server/dom.js +12 -3
- package/lib/server/electron/electron.js +5 -2
- package/lib/server/firefox/ffBrowser.js +10 -20
- package/lib/server/firefox/ffConnection.js +0 -5
- package/lib/server/firefox/ffNetworkManager.js +2 -2
- package/lib/server/firefox/ffPage.js +15 -18
- package/lib/server/firefox/firefox.js +6 -8
- package/lib/server/frameSelectors.js +9 -3
- package/lib/server/frames.js +49 -33
- package/lib/server/instrumentation.js +3 -0
- package/lib/server/network.js +50 -12
- package/lib/server/page.js +33 -89
- package/lib/server/progress.js +26 -6
- package/lib/server/recorder/recorderApp.js +79 -100
- package/lib/server/recorder.js +55 -0
- package/lib/server/registry/browserFetcher.js +6 -4
- package/lib/server/registry/index.js +172 -149
- package/lib/server/registry/oopDownloadBrowserMain.js +3 -0
- package/lib/server/screencast.js +190 -0
- package/lib/server/screenshotCompositor.js +153 -0
- package/lib/server/trace/recorder/snapshotterInjected.js +21 -1
- package/lib/server/trace/recorder/tracing.js +21 -21
- package/lib/server/trace/viewer/traceParser.js +72 -0
- package/lib/server/trace/viewer/traceViewer.js +17 -13
- package/lib/server/utils/expectUtils.js +87 -2
- package/lib/server/utils/httpServer.js +4 -19
- package/lib/server/utils/network.js +37 -28
- package/lib/server/utils/nodePlatform.js +6 -0
- package/lib/server/videoRecorder.js +124 -0
- package/lib/server/webkit/webkit.js +4 -6
- package/lib/server/webkit/wkBrowser.js +2 -6
- package/lib/server/webkit/wkConnection.js +1 -6
- package/lib/server/webkit/wkInterceptableRequest.js +29 -1
- package/lib/server/webkit/wkPage.js +75 -46
- package/lib/utils/isomorphic/ariaSnapshot.js +60 -2
- package/lib/utils/isomorphic/lruCache.js +51 -0
- package/lib/utils/isomorphic/protocolMetainfo.js +9 -1
- package/lib/utils/isomorphic/stringUtils.js +49 -0
- package/lib/utils/isomorphic/trace/entries.js +16 -0
- package/lib/utils/isomorphic/trace/snapshotRenderer.js +499 -0
- package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
- package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
- package/lib/utils/isomorphic/trace/traceLoader.js +131 -0
- package/lib/utils/isomorphic/trace/traceModel.js +365 -0
- package/lib/utils/isomorphic/trace/traceModernizer.js +400 -0
- package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
- package/lib/utils/isomorphic/yaml.js +84 -0
- package/lib/utils.js +2 -0
- package/lib/utilsBundle.js +2 -5
- package/lib/utilsBundleImpl/index.js +165 -165
- package/lib/vite/htmlReport/index.html +21 -21
- package/lib/vite/recorder/assets/{codeMirrorModule-C3UTv-Ge.css → codeMirrorModule-DYBRYzYX.css} +1 -1
- package/lib/vite/recorder/assets/codeMirrorModule-DadYNm1I.js +32 -0
- package/lib/vite/recorder/assets/{index-Ri0uHF7I.css → index-BSjZa4pk.css} +1 -1
- package/lib/vite/recorder/assets/index-BhTWtUlo.js +193 -0
- package/lib/vite/recorder/index.html +2 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-8UJPCtp4.js +16884 -0
- package/lib/vite/{recorder/assets/codeMirrorModule-BoWUGj0J.js → traceViewer/assets/codeMirrorModule-BNr6yhVP.js} +1 -1
- package/lib/vite/traceViewer/assets/codeMirrorModule-Dimjuz94.js +32 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-DkmsYcws.js +32 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-DySgctgr.js +16884 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-B1vuWQsF.js +266 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-CtEsdeVH.js +266 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-D4fm31R-.js +34087 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-JtyB0yzL.js +34087 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-tEZf-LNj.js +266 -0
- package/lib/vite/traceViewer/assets/xtermModule-DDw6eROI.js +6168 -0
- package/lib/vite/traceViewer/codeMirrorModule.DYBRYzYX.css +1 -0
- package/lib/vite/traceViewer/codeMirrorModule.DuST8d_k.css +344 -0
- package/lib/vite/traceViewer/defaultSettingsView.5FCqBwKs.css +3986 -0
- package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +1 -0
- package/lib/vite/traceViewer/index.BQs8gGhY.js +249 -0
- package/lib/vite/traceViewer/index.BVu7tZDe.css +1 -0
- package/lib/vite/traceViewer/index.BoLn624r.js +2 -0
- package/lib/vite/traceViewer/index.Bq_EaK8x.js +249 -0
- package/lib/vite/traceViewer/index.C8YVh4B5.js +2 -0
- package/lib/vite/traceViewer/index.Cr7-GRf8.js +2 -0
- package/lib/vite/traceViewer/index.G-7UhDxt.css +164 -0
- package/lib/vite/traceViewer/index.html +4 -4
- package/lib/vite/traceViewer/sw.bundle.js +5 -3
- package/lib/vite/traceViewer/uiMode.-Kflt2XM.css +1440 -0
- package/lib/vite/traceViewer/uiMode.BTRKnokb.js +5 -0
- package/lib/vite/traceViewer/uiMode.CEZ5RVHh.js +5 -0
- package/lib/vite/traceViewer/uiMode.CIWF23si.js +1829 -0
- package/lib/vite/traceViewer/uiMode.Wi-DvIEY.js +1829 -0
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/lib/vite/traceViewer/uiMode.zEH1ejvz.js +5 -0
- package/lib/vite/traceViewer/xtermModule.BKlWQB97.css +218 -0
- package/package.json +3 -1
- package/types/protocol.d.ts +738 -159
- package/types/types.d.ts +25 -38
- 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.
|
|
11
|
-
<link rel="modulepreload" crossorigin href="./assets/defaultSettingsView-
|
|
12
|
-
<link rel="stylesheet" crossorigin href="./defaultSettingsView.
|
|
13
|
-
<link rel="stylesheet" crossorigin href="./index.
|
|
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>
|