mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
chore: allow showing live trace (#35957)
This commit is contained in:
parent
3ef9baa1d1
commit
0535a2ee11
@ -19,11 +19,14 @@ import { applyTheme } from '@web/theme';
|
|||||||
import '@web/third_party/vscode/codicon.css';
|
import '@web/third_party/vscode/codicon.css';
|
||||||
import * as ReactDOM from 'react-dom/client';
|
import * as ReactDOM from 'react-dom/client';
|
||||||
import { WorkbenchLoader } from './ui/workbenchLoader';
|
import { WorkbenchLoader } from './ui/workbenchLoader';
|
||||||
|
import { LiveWorkbenchLoader } from './ui/liveWorkbenchLoader';
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
|
const queryParams = new URLSearchParams(window.location.search);
|
||||||
|
|
||||||
applyTheme();
|
applyTheme();
|
||||||
if (window.location.protocol !== 'file:') {
|
if (window.location.protocol !== 'file:') {
|
||||||
if (window.location.href.includes('isUnderTest=true'))
|
if (queryParams.get('isUnderTest') === 'true')
|
||||||
await new Promise(f => setTimeout(f, 1000));
|
await new Promise(f => setTimeout(f, 1000));
|
||||||
if (!navigator.serviceWorker)
|
if (!navigator.serviceWorker)
|
||||||
throw new Error(`Service workers are not supported.\nMake sure to serve the Trace Viewer (${window.location}) via HTTPS or localhost.`);
|
throw new Error(`Service workers are not supported.\nMake sure to serve the Trace Viewer (${window.location}) via HTTPS or localhost.`);
|
||||||
@ -38,5 +41,8 @@ import { WorkbenchLoader } from './ui/workbenchLoader';
|
|||||||
setInterval(function() { fetch('ping'); }, 10000);
|
setInterval(function() { fetch('ping'); }, 10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
ReactDOM.createRoot(document.querySelector('#root')!).render(<WorkbenchLoader/>);
|
const trace = queryParams.get('trace');
|
||||||
|
const traceIsLive = trace?.endsWith('.json');
|
||||||
|
const workbench = traceIsLive ? <LiveWorkbenchLoader traceJson={trace!} /> : <WorkbenchLoader/>;
|
||||||
|
ReactDOM.createRoot(document.querySelector('#root')!).render(workbench);
|
||||||
})();
|
})();
|
||||||
|
61
packages/trace-viewer/src/ui/liveWorkbenchLoader.tsx
Normal file
61
packages/trace-viewer/src/ui/liveWorkbenchLoader.tsx
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) Microsoft Corporation.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import * as React from 'react';
|
||||||
|
import { MultiTraceModel } from './modelUtil';
|
||||||
|
import './workbenchLoader.css';
|
||||||
|
import { Workbench } from './workbench';
|
||||||
|
|
||||||
|
import type { ContextEntry } from '../types/entries';
|
||||||
|
|
||||||
|
export const LiveWorkbenchLoader: React.FC<{ traceJson: string }> = ({ traceJson }) => {
|
||||||
|
const [model, setModel] = React.useState<MultiTraceModel | undefined>(undefined);
|
||||||
|
const [counter, setCounter] = React.useState(0);
|
||||||
|
const pollTimer = React.useRef<NodeJS.Timeout | null>(null);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (pollTimer.current)
|
||||||
|
clearTimeout(pollTimer.current);
|
||||||
|
|
||||||
|
// Start polling running test.
|
||||||
|
pollTimer.current = setTimeout(async () => {
|
||||||
|
try {
|
||||||
|
const model = await loadSingleTraceFile(traceJson);
|
||||||
|
setModel(model);
|
||||||
|
} catch {
|
||||||
|
const model = new MultiTraceModel([]);
|
||||||
|
setModel(model);
|
||||||
|
} finally {
|
||||||
|
setCounter(counter + 1);
|
||||||
|
}
|
||||||
|
}, 500);
|
||||||
|
return () => {
|
||||||
|
if (pollTimer.current)
|
||||||
|
clearTimeout(pollTimer.current);
|
||||||
|
};
|
||||||
|
}, [traceJson, counter]);
|
||||||
|
|
||||||
|
return <Workbench model={model} isLive={true} />;
|
||||||
|
};
|
||||||
|
|
||||||
|
async function loadSingleTraceFile(traceJson: string): Promise<MultiTraceModel> {
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
params.set('trace', traceJson);
|
||||||
|
params.set('limit', '1');
|
||||||
|
const response = await fetch(`contexts?${params.toString()}`);
|
||||||
|
const contextEntries = await response.json() as ContextEntry[];
|
||||||
|
return new MultiTraceModel(contextEntries);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user