diff --git a/packages/trace-viewer/src/ui/callTab.css b/packages/trace-viewer/src/ui/callTab.css
index 032c97b165..522a1fae87 100644
--- a/packages/trace-viewer/src/ui/callTab.css
+++ b/packages/trace-viewer/src/ui/callTab.css
@@ -94,12 +94,6 @@
color: var(--blue);
}
-.call-error-message {
- font-family: var(--vscode-editor-font-family);
- font-weight: var(--vscode-editor-font-weight);
- font-size: var(--vscode-editor-font-size);
- background-color: var(--vscode-inputValidation-errorBackground);
- white-space: pre;
- overflow: auto;
+.call-tab .error-message {
padding: 5px;
}
diff --git a/packages/trace-viewer/src/ui/callTab.tsx b/packages/trace-viewer/src/ui/callTab.tsx
index 92ac679fe4..d5a0171127 100644
--- a/packages/trace-viewer/src/ui/callTab.tsx
+++ b/packages/trace-viewer/src/ui/callTab.tsx
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-import ansi2html from 'ansi-to-html';
import type { SerializedValue } from '@protocol/channels';
import type { ActionTraceEvent } from '@trace/trace';
import { msToString } from '@web/uiUtils';
@@ -23,6 +22,7 @@ import './callTab.css';
import { CopyToClipboard } from './copyToClipboard';
import { asLocator } from '@isomorphic/locatorGenerators';
import type { Language } from '@isomorphic/locatorGenerators';
+import { ErrorMessage } from './errorMessage';
export const CallTab: React.FunctionComponent<{
action: ActionTraceEvent | undefined,
@@ -39,7 +39,7 @@ export const CallTab: React.FunctionComponent<{
const wallTime = action.wallTime ? new Date(action.wallTime).toLocaleString() : null;
const duration = action.endTime ? msToString(action.endTime - action.startTime) : 'Timed Out';
return
- {!!error &&
}
+ {!!error &&
}
{!!error &&
Call
}
{action.apiName}
{<>
@@ -144,40 +144,3 @@ function parseSerializedValue(value: SerializedValue, handles: any[] | undefined
}
return '
;
};
-export const TraceView: React.FC<{
- test: TestCase | undefined,
-}> = ({ test }) => {
+export const InProgressTraceView: React.FC<{
+ testResult: TestResult | undefined,
+}> = ({ testResult }) => {
const [model, setModel] = React.useState();
const [stepsProgress, setStepsProgress] = React.useState(0);
updateStepsProgress = () => setStepsProgress(stepsProgress + 1);
React.useEffect(() => {
- (async () => {
- if (!test) {
- setModel(undefined);
- return;
- }
+ setModel(testResult ? stepsToModel(testResult) : undefined);
+ }, [stepsProgress, testResult]);
- const result = test.results?.[0];
- if (result) {
- const attachment = result.attachments.find(a => a.name === 'trace');
- if (attachment && attachment.path)
- loadSingleTraceFile(attachment.path).then(setModel);
- else
- setModel(stepsToModel(result));
- } else {
- setModel(undefined);
- }
- })();
- }, [test, stepsProgress]);
+ return ;
+};
+export const FinishedTraceView: React.FC<{
+ testResult: TestResult,
+}> = ({ testResult }) => {
+ const [model, setModel] = React.useState();
+
+ React.useEffect(() => {
+ // Test finished.
+ const attachment = testResult.attachments.find(a => a.name === 'trace');
+ if (attachment && attachment.path)
+ loadSingleTraceFile(attachment.path).then(setModel);
+ }, [testResult]);
+
+ return ;
+};
+
+export const TraceView: React.FC<{
+ model: MultiTraceModel | undefined,
+}> = ({ model }) => {
const xterm = ;
return xtermDataSource.clear()}>,
@@ -412,7 +434,7 @@ type TreeItemBase = {
title: string;
location: Location,
children: TreeItem[];
- status: 'none' | 'running' | 'passed' | 'failed';
+ status: 'none' | 'running' | 'passed' | 'failed' | 'skipped';
};
type GroupItem = TreeItemBase & {
@@ -476,12 +498,14 @@ function createTree(rootSuite: Suite | undefined, projects: Map
parentGroup.children.push(testCaseItem);
}
- let status: 'none' | 'running' | 'passed' | 'failed' = 'none';
+ let status: 'none' | 'running' | 'passed' | 'failed' | 'skipped' = 'none';
if (test.results.some(r => r.duration === -1))
status = 'running';
+ else if (test.results.length && test.outcome() === 'skipped')
+ status = 'skipped';
else if (test.results.length && test.outcome() !== 'expected')
status = 'failed';
- else if (test.outcome() === 'expected')
+ else if (test.results.length && test.outcome() === 'expected')
status = 'passed';
testCaseItem.tests.push(test);
@@ -508,11 +532,13 @@ function createTree(rootSuite: Suite | undefined, projects: Map
propagateStatus(child);
let allPassed = treeItem.children.length > 0;
+ let allSkipped = treeItem.children.length > 0;
let hasFailed = false;
let hasRunning = false;
for (const child of treeItem.children) {
- allPassed = allPassed && child.status === 'passed';
+ allSkipped = allSkipped && child.status === 'skipped';
+ allPassed = allPassed && (child.status === 'passed' || child.status === 'skipped');
hasFailed = hasFailed || child.status === 'failed';
hasRunning = hasRunning || child.status === 'running';
}
@@ -521,6 +547,8 @@ function createTree(rootSuite: Suite | undefined, projects: Map
treeItem.status = 'running';
else if (hasFailed)
treeItem.status = 'failed';
+ else if (allSkipped)
+ treeItem.status = 'skipped';
else if (allPassed)
treeItem.status = 'passed';
};
diff --git a/packages/web/src/components/codeMirrorWrapper.css b/packages/web/src/components/codeMirrorWrapper.css
index eb3c180760..f209c1260d 100644
--- a/packages/web/src/components/codeMirrorWrapper.css
+++ b/packages/web/src/components/codeMirrorWrapper.css
@@ -117,6 +117,10 @@ body.dark-mode .CodeMirror span.cm-type {
}
.CodeMirror .CodeMirror-gutters {
+ z-index: 0;
+}
+
+.CodeMirror .CodeMirror-gutterwrapper {
background: var(--vscode-editor-background);
border-right: 1px solid var(--vscode-editorGroup-border);
color: var(--vscode-editorLineNumber-foreground);
diff --git a/packages/web/src/components/listView.css b/packages/web/src/components/listView.css
index 5fb533627f..60b789bb78 100644
--- a/packages/web/src/components/listView.css
+++ b/packages/web/src/components/listView.css
@@ -54,6 +54,7 @@
.list-view-content:focus .list-view-entry.selected * {
color: var(--vscode-list-activeSelectionForeground) !important;
+ background-color: transparent !important;
}
.list-view-content:focus .list-view-entry.error.selected {
diff --git a/packages/web/src/components/listView.tsx b/packages/web/src/components/listView.tsx
index fcb1333f45..035ff44322 100644
--- a/packages/web/src/components/listView.tsx
+++ b/packages/web/src/components/listView.tsx
@@ -121,11 +121,19 @@ export function ListView({
onMouseLeave={() => setHighlightedItem(undefined)}
>
{indentation ? : undefined}
- {icon && {
- e.stopPropagation();
- e.preventDefault();
- onIconClicked?.(item);
- }}>
}
+ {icon && {
+ e.preventDefault();
+ e.stopPropagation();
+ }}
+ onClick={e => {
+ e.stopPropagation();
+ e.preventDefault();
+ onIconClicked?.(item);
+ }}
+ >
}
{typeof rendered === 'string' ? {rendered}
: rendered}
;
})}
diff --git a/packages/web/src/components/xtermWrapper.css b/packages/web/src/components/xtermWrapper.css
index 895ccaaafd..d51932ca22 100644
--- a/packages/web/src/components/xtermWrapper.css
+++ b/packages/web/src/components/xtermWrapper.css
@@ -16,6 +16,10 @@
@import '../third_party/vscode/colors.css';
+.xterm-wrapper {
+ padding-left: 5px;
+}
+
.xterm-wrapper .xterm-viewport {
background-color: var(--vscode-panel-background) !important;
color: var(--vscode-foreground) !important;