diff --git a/packages/trace-viewer/src/ui/snapshotTab.tsx b/packages/trace-viewer/src/ui/snapshotTab.tsx index 4a9d4846dda85..a986eee8cfef7 100644 --- a/packages/trace-viewer/src/ui/snapshotTab.tsx +++ b/packages/trace-viewer/src/ui/snapshotTab.tsx @@ -51,8 +51,9 @@ export const SnapshotTabsView: React.FunctionComponent<{ setIsInspecting: (isInspecting: boolean) => void, highlightedElement: HighlightedElement, setHighlightedElement: (element: HighlightedElement) => void, - playback: PlaybackState -}> = ({ action, model, sdkLanguage, testIdAttributeName, isInspecting, setIsInspecting, highlightedElement, setHighlightedElement, playback }) => { + playback: PlaybackState, + onCollapse?: () => void, +}> = ({ action, model, sdkLanguage, testIdAttributeName, isInspecting, setIsInspecting, highlightedElement, setHighlightedElement, playback, onCollapse }) => { const [snapshotTab, setSnapshotTab] = React.useState<'action'|'before'|'after'>('action'); const [shouldPopulateCanvasFromScreenshot] = useSetting('shouldPopulateCanvasFromScreenshot', false); @@ -90,6 +91,7 @@ export const SnapshotTabsView: React.FunctionComponent<{ injectedScript.consoleApi.install(); }); }} /> + {onCollapse && } ('navigatorTab', 'actions'); const [selectedPropertiesTab, setSelectedPropertiesTab] = useSetting('propertiesTab', showSourcesFirst ? 'source' : 'call'); const [sidebarLocation, setSidebarLocation] = useSetting<'bottom' | 'right'>('propertiesSidebarLocation', 'bottom'); + const [browserCollapsed, setBrowserCollapsed] = useSetting('browserCollapsed', false); const [actionsFilter] = useSetting('actionsFilter', []); // Per-model settings, should be primitive non-retaining types. @@ -361,6 +362,36 @@ const PartitionedWorkbench: React.FunctionComponent; + const snapshotView = setBrowserCollapsed(true)} />; + + const propertiesView = setBrowserCollapsed(false)} /> + ] : [ + sidebarLocation === 'bottom' ? + { + setSidebarLocation('right'); + }} /> : + { + setSidebarLocation('bottom'); + }} /> + ]} + mode={!browserCollapsed && sidebarLocation === 'right' ? 'select' : 'default'} + />; + return
{!hideTimeline && } + main={browserCollapsed ? propertiesView : snapshotView} sidebar={ } />} - sidebar={ { - setSidebarLocation('right'); - }} /> : - { - setSidebarLocation('bottom'); - }} /> - ]} - mode={sidebarLocation === 'bottom' ? 'default' : 'select'} - />} + sidebar={propertiesView} />
; }; diff --git a/tests/library/trace-viewer.spec.ts b/tests/library/trace-viewer.spec.ts index e8bc8e1d359c3..a7030d5c1386e 100644 --- a/tests/library/trace-viewer.spec.ts +++ b/tests/library/trace-viewer.spec.ts @@ -459,6 +459,22 @@ test('should have correct snapshot size', async ({ showTraceViewer }, testInfo) await expect(traceViewer.snapshotContainer).toHaveCSS('height', '600px'); }); +test('should collapse and expand browser', async ({ showTraceViewer }) => { + const traceViewer = await showTraceViewer(traceFile); + await traceViewer.selectAction('Click'); + await expect(traceViewer.snapshotContainer).toBeVisible(); + + // Collapse the browser, the network/properties panel becomes the central panel. + await traceViewer.page.getByRole('button', { name: 'Collapse browser' }).click(); + await expect(traceViewer.snapshotContainer).toBeHidden(); + await traceViewer.showNetworkTab(); + await expect(traceViewer.networkRequests.first()).toBeVisible(); + + // Restore the browser. + await traceViewer.page.getByRole('button', { name: 'Show browser' }).click(); + await expect(traceViewer.snapshotContainer).toBeVisible(); +}); + test('should have correct stack trace', async ({ showTraceViewer }) => { const traceViewer = await showTraceViewer(traceFile);