{summaryContent}
@@ -122,7 +121,7 @@ export const AttachmentLink: React.FunctionComponent<{
return (
@@ -155,8 +154,9 @@ export const TraceLink: React.FC<{ test: TestCaseSummary, trailingSeparator?: bo
const SearchParamsContext = React.createContext(new URLSearchParams(window.location.hash.slice(1)));
-export function useSearchParams() {
- return new URLSearchParams(React.useContext(SearchParamsContext));
+// Note: make sure you are not mutating the returned URLSearchParams object.
+export function useSearchParams(): URLSearchParams {
+ return React.useContext(SearchParamsContext);
}
export const SearchParamsProvider: React.FunctionComponent = ({ children }) => {
@@ -198,8 +198,7 @@ export function useAnchor(id: AnchorID, onReveal: React.EffectCallback) {
}
export function useIsAnchored(id: AnchorID) {
- const searchParams = useSearchParams();
- const anchor = searchParams.get('anchor');
+ const anchor = useSearchParams().get('anchor');
if (anchor === null)
return false;
if (typeof id === 'undefined')
diff --git a/packages/html-reporter/src/metadataView.tsx b/packages/html-reporter/src/metadataView.tsx
index 41ff80257e24a..a3dcb16f83cf0 100644
--- a/packages/html-reporter/src/metadataView.tsx
+++ b/packages/html-reporter/src/metadataView.tsx
@@ -57,9 +57,8 @@ export const MetadataView: React.FC<{ metadata: Metadata }> = params => {
};
const InnerMetadataView: React.FC<{ metadata: Metadata }> = params => {
- const searchParams = useSearchParams();
const commitInfo = params.metadata as MetadataWithCommitInfo;
- const otherEntries = searchParams.has('show-metadata-other') ? Object.entries(params.metadata).filter(([key]) => !ignoreKeys.has(key)) : [];
+ const otherEntries = useSearchParams().has('show-metadata-other') ? Object.entries(params.metadata).filter(([key]) => !ignoreKeys.has(key)) : [];
const hasMetadata = commitInfo.ci || commitInfo.gitCommit || otherEntries.length > 0;
if (!hasMetadata)
return;
diff --git a/packages/html-reporter/src/reportView.tsx b/packages/html-reporter/src/reportView.tsx
index 5652c2af77d9e..0bc6144802bf7 100644
--- a/packages/html-reporter/src/reportView.tsx
+++ b/packages/html-reporter/src/reportView.tsx
@@ -90,6 +90,7 @@ export const ReportView: React.FC<{
if (event.target instanceof HTMLInputElement || event.target instanceof HTMLTextAreaElement || event.shiftKey || event.ctrlKey || event.metaKey || event.altKey)
return;
+ const params = new URLSearchParams(searchParams);
switch (event.key) {
case 'a':
event.preventDefault();
@@ -97,28 +98,28 @@ export const ReportView: React.FC<{
break;
case 'p':
event.preventDefault();
- searchParams.delete('testId');
- searchParams.delete('speedboard');
- navigate(filterWithQuery(searchParams, 's:passed', false));
+ params.delete('testId');
+ params.delete('speedboard');
+ navigate(filterWithQuery(params, 's:passed', false));
break;
case 'f':
event.preventDefault();
- searchParams.delete('testId');
- searchParams.delete('speedboard');
- navigate(filterWithQuery(searchParams, 's:failed', false));
+ params.delete('testId');
+ params.delete('speedboard');
+ navigate(filterWithQuery(params, 's:failed', false));
break;
case 'ArrowLeft':
if (prev) {
event.preventDefault();
- searchParams.delete('testId');
- navigate(testResultHref({ test: prev }, searchParams) + filterParam);
+ params.delete('testId');
+ navigate(testResultHref({ test: prev }, params) + filterParam);
}
break;
case 'ArrowRight':
if (next) {
event.preventDefault();
- searchParams.delete('testId');
- navigate(testResultHref({ test: next }, searchParams) + filterParam);
+ params.delete('testId');
+ navigate(testResultHref({ test: next }, params) + filterParam);
}
break;
}
@@ -165,9 +166,8 @@ const TestCaseViewLoader: React.FC<{
prev?: TestCaseSummary,
testIdToFileIdMap: Map,
}> = ({ report, testIdToFileIdMap, next, prev, testId }) => {
- const searchParams = useSearchParams();
const [test, setTest] = React.useState('loading');
- const run = +(searchParams.get('run') || '0');
+ const run = +(useSearchParams().get('run') || '0');
React.useEffect(() => {
(async () => {
diff --git a/packages/playwright-core/browsers.json b/packages/playwright-core/browsers.json
index a49bb00e71d68..3a3432ceb7c82 100644
--- a/packages/playwright-core/browsers.json
+++ b/packages/playwright-core/browsers.json
@@ -17,16 +17,16 @@
},
{
"name": "chromium-tip-of-tree",
- "revision": "1392",
+ "revision": "1401",
"installByDefault": false,
- "browserVersion": "144.0.7559.20",
+ "browserVersion": "146.0.7644.0",
"title": "Chrome Canary for Testing"
},
{
"name": "chromium-tip-of-tree-headless-shell",
- "revision": "1392",
+ "revision": "1401",
"installByDefault": false,
- "browserVersion": "144.0.7559.20",
+ "browserVersion": "146.0.7644.0",
"title": "Chrome Canary Headless Shell"
},
{
diff --git a/packages/trace-viewer/src/ui/uiModeTraceView.tsx b/packages/trace-viewer/src/ui/uiModeTraceView.tsx
index 1135417741629..31b6c8f9a1e68 100644
--- a/packages/trace-viewer/src/ui/uiModeTraceView.tsx
+++ b/packages/trace-viewer/src/ui/uiModeTraceView.tsx
@@ -46,7 +46,7 @@ export const TraceView: React.FC<{
clearTimeout(pollTimer.current);
const result = item.testCase?.results[0];
- if (!result) {
+ if (!result || item.treeItem?.status === 'scheduled') {
setModel(undefined);
return;
}
diff --git a/tests/playwright-test/ui-mode-test-source.spec.ts b/tests/playwright-test/ui-mode-test-source.spec.ts
index 9bc6719ffc3e9..5b958395a896d 100644
--- a/tests/playwright-test/ui-mode-test-source.spec.ts
+++ b/tests/playwright-test/ui-mode-test-source.spec.ts
@@ -192,3 +192,22 @@ test('should load error (dupe tests) indicator on sources', async ({ runUITest }
Error: duplicate test title "first", first declared in a.test.ts:3
`);
});
+
+test('should keep showing source when test is pending', async ({ runUITest }, testInfo) => {
+ const { page } = await runUITest({
+ 'a.test.ts': `
+ import { test } from '@playwright/test';
+ test('zero', () => {});
+ test('first', async () => {
+ await new Promise(f => setTimeout(f, ${testInfo.timeout}));
+ });
+ test('second', () => {});
+ `,
+ });
+
+ await page.getByTitle('Run all').click();
+ await page.getByTestId('test-tree').getByText('second').click();
+ await expect(page.getByTestId('status-line')).toHaveText('Running 1/3 passed (33%)');
+ await expect(page.getByTestId('source-code').locator('.source-tab-file-name')).toHaveText('a.test.ts');
+ await expect(page.locator('.CodeMirror .source-line-running')).toHaveText(`7 test('second', () => {});`);
+});