cherry-pick(#31952): fix(ui mode): api review feedback (#31964)

- Hide "Testing Options" as not ready.
- Update SettingsView margins.
- Include `page.route` and similar methods into "Show route actions".
This commit is contained in:
Dmitry Gozman 2024-08-01 11:23:07 -07:00 committed by GitHub
parent b20e154902
commit 29ba72c06b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 34 additions and 24 deletions

View file

@ -409,3 +409,11 @@ function collectSources(actions: trace.ActionTraceEvent[], errorDescriptors: Err
} }
return result; return result;
} }
const kRouteMethods = new Set([
'page.route', 'page.routefromhar', 'page.unroute', 'page.unrouteall',
'browsercontext.route', 'browsercontext.routefromhar', 'browsercontext.unroute', 'browsercontext.unrouteall',
]);
export function isRouteAction(action: ActionTraceEventInContext) {
return action.class === 'Route' || kRouteMethods.has(action.apiName.toLowerCase());
}

View file

@ -24,7 +24,7 @@
} }
.ui-mode-sidebar > .settings-view { .ui-mode-sidebar > .settings-view {
margin: 0 0 3px 23px; margin: 0 0 8px 23px;
} }
.ui-mode-sidebar input[type=search] { .ui-mode-sidebar input[type=search] {

View file

@ -98,6 +98,7 @@ export const UIModeView: React.FC<{}> = ({
const [testingOptionsVisible, setTestingOptionsVisible] = React.useState(false); const [testingOptionsVisible, setTestingOptionsVisible] = React.useState(false);
const [revealSource, setRevealSource] = React.useState(false); const [revealSource, setRevealSource] = React.useState(false);
const onRevealSource = React.useCallback(() => setRevealSource(true), [setRevealSource]); const onRevealSource = React.useCallback(() => setRevealSource(true), [setRevealSource]);
const showTestingOptions = false;
const [runWorkers, setRunWorkers] = React.useState(queryParams.workers); const [runWorkers, setRunWorkers] = React.useState(queryParams.workers);
const singleWorkerSetting = React.useMemo(() => { const singleWorkerSetting = React.useMemo(() => {
@ -497,19 +498,21 @@ export const UIModeView: React.FC<{}> = ({
setFilterText={setFilterText} setFilterText={setFilterText}
onRevealSource={onRevealSource} onRevealSource={onRevealSource}
/> />
<Toolbar noShadow={true} noMinHeight={true} className='settings-toolbar' onClick={() => setTestingOptionsVisible(!testingOptionsVisible)}> {showTestingOptions && <>
<span <Toolbar noShadow={true} noMinHeight={true} className='settings-toolbar' onClick={() => setTestingOptionsVisible(!testingOptionsVisible)}>
className={`codicon codicon-${testingOptionsVisible ? 'chevron-down' : 'chevron-right'}`} <span
style={{ marginLeft: 5 }} className={`codicon codicon-${testingOptionsVisible ? 'chevron-down' : 'chevron-right'}`}
title={testingOptionsVisible ? 'Hide Testing Options' : 'Show Testing Options'} style={{ marginLeft: 5 }}
/> title={testingOptionsVisible ? 'Hide Testing Options' : 'Show Testing Options'}
<div className='section-title'>Testing Options</div> />
</Toolbar> <div className='section-title'>Testing Options</div>
{testingOptionsVisible && <SettingsView settings={[ </Toolbar>
singleWorkerSetting, {testingOptionsVisible && <SettingsView settings={[
showBrowserSetting, singleWorkerSetting,
updateSnapshotsSetting, showBrowserSetting,
]} />} updateSnapshotsSetting,
]} />}
</>}
<Toolbar noShadow={true} noMinHeight={true} className='settings-toolbar' onClick={() => setSettingsVisible(!settingsVisible)}> <Toolbar noShadow={true} noMinHeight={true} className='settings-toolbar' onClick={() => setSettingsVisible(!settingsVisible)}>
<span <span
className={`codicon codicon-${settingsVisible ? 'chevron-down' : 'chevron-right'}`} className={`codicon codicon-${settingsVisible ? 'chevron-down' : 'chevron-right'}`}

View file

@ -23,7 +23,7 @@ import { ErrorsTab, useErrorsTabModel } from './errorsTab';
import type { ConsoleEntry } from './consoleTab'; import type { ConsoleEntry } from './consoleTab';
import { ConsoleTab, useConsoleTabModel } from './consoleTab'; import { ConsoleTab, useConsoleTabModel } from './consoleTab';
import type * as modelUtil from './modelUtil'; import type * as modelUtil from './modelUtil';
import type { ActionTraceEventInContext, MultiTraceModel } from './modelUtil'; import { isRouteAction } from './modelUtil';
import type { StackFrame } from '@protocol/channels'; import type { StackFrame } from '@protocol/channels';
import { NetworkTab, useNetworkTabModel } from './networkTab'; import { NetworkTab, useNetworkTabModel } from './networkTab';
import { SnapshotTab } from './snapshotTab'; import { SnapshotTab } from './snapshotTab';
@ -44,12 +44,12 @@ import type { UITestStatus } from './testUtils';
import { SettingsView } from './settingsView'; import { SettingsView } from './settingsView';
export const Workbench: React.FunctionComponent<{ export const Workbench: React.FunctionComponent<{
model?: MultiTraceModel, model?: modelUtil.MultiTraceModel,
showSourcesFirst?: boolean, showSourcesFirst?: boolean,
rootDir?: string, rootDir?: string,
fallbackLocation?: modelUtil.SourceLocation, fallbackLocation?: modelUtil.SourceLocation,
initialSelection?: ActionTraceEventInContext, initialSelection?: modelUtil.ActionTraceEventInContext,
onSelectionChanged?: (action: ActionTraceEventInContext) => void, onSelectionChanged?: (action: modelUtil.ActionTraceEventInContext) => void,
isLive?: boolean, isLive?: boolean,
status?: UITestStatus, status?: UITestStatus,
inert?: boolean, inert?: boolean,
@ -58,9 +58,9 @@ export const Workbench: React.FunctionComponent<{
onOpenExternally?: (location: modelUtil.SourceLocation) => void, onOpenExternally?: (location: modelUtil.SourceLocation) => void,
revealSource?: boolean, revealSource?: boolean,
}> = ({ showRouteActionsSetting, model, showSourcesFirst, rootDir, fallbackLocation, initialSelection, onSelectionChanged, isLive, status, inert, openPage, onOpenExternally, revealSource }) => { }> = ({ showRouteActionsSetting, model, showSourcesFirst, rootDir, fallbackLocation, initialSelection, onSelectionChanged, isLive, status, inert, openPage, onOpenExternally, revealSource }) => {
const [selectedAction, setSelectedActionImpl] = React.useState<ActionTraceEventInContext | undefined>(undefined); const [selectedAction, setSelectedActionImpl] = React.useState<modelUtil.ActionTraceEventInContext | undefined>(undefined);
const [revealedStack, setRevealedStack] = React.useState<StackFrame[] | undefined>(undefined); const [revealedStack, setRevealedStack] = React.useState<StackFrame[] | undefined>(undefined);
const [highlightedAction, setHighlightedAction] = React.useState<ActionTraceEventInContext | undefined>(); const [highlightedAction, setHighlightedAction] = React.useState<modelUtil.ActionTraceEventInContext | undefined>();
const [highlightedEntry, setHighlightedEntry] = React.useState<Entry | undefined>(); const [highlightedEntry, setHighlightedEntry] = React.useState<Entry | undefined>();
const [highlightedConsoleMessage, setHighlightedConsoleMessage] = React.useState<ConsoleEntry | undefined>(); const [highlightedConsoleMessage, setHighlightedConsoleMessage] = React.useState<ConsoleEntry | undefined>();
const [selectedNavigatorTab, setSelectedNavigatorTab] = React.useState<string>('actions'); const [selectedNavigatorTab, setSelectedNavigatorTab] = React.useState<string>('actions');
@ -77,10 +77,10 @@ export const Workbench: React.FunctionComponent<{
const showRouteActions = showRouteActionsSetting[0]; const showRouteActions = showRouteActionsSetting[0];
const filteredActions = React.useMemo(() => { const filteredActions = React.useMemo(() => {
return (model?.actions || []).filter(action => showRouteActions || action.class !== 'Route'); return (model?.actions || []).filter(action => showRouteActions || !isRouteAction(action));
}, [model, showRouteActions]); }, [model, showRouteActions]);
const setSelectedAction = React.useCallback((action: ActionTraceEventInContext | undefined) => { const setSelectedAction = React.useCallback((action: modelUtil.ActionTraceEventInContext | undefined) => {
setSelectedActionImpl(action); setSelectedActionImpl(action);
setRevealedStack(action?.stack); setRevealedStack(action?.stack);
}, [setSelectedActionImpl, setRevealedStack]); }, [setSelectedActionImpl, setRevealedStack]);
@ -113,7 +113,7 @@ export const Workbench: React.FunctionComponent<{
} }
}, [model, selectedAction, setSelectedAction, initialSelection]); }, [model, selectedAction, setSelectedAction, initialSelection]);
const onActionSelected = React.useCallback((action: ActionTraceEventInContext) => { const onActionSelected = React.useCallback((action: modelUtil.ActionTraceEventInContext) => {
setSelectedAction(action); setSelectedAction(action);
onSelectionChanged?.(action); onSelectionChanged?.(action);
}, [setSelectedAction, onSelectionChanged]); }, [setSelectedAction, onSelectionChanged]);

View file

@ -1357,7 +1357,6 @@ test('should allow hiding route actions', {
await traceViewer.page.getByRole('checkbox', { name: 'Show route actions' }).uncheck(); await traceViewer.page.getByRole('checkbox', { name: 'Show route actions' }).uncheck();
await traceViewer.page.getByText('Actions', { exact: true }).click(); await traceViewer.page.getByText('Actions', { exact: true }).click();
await expect(traceViewer.actionTitles).toHaveText([ await expect(traceViewer.actionTitles).toHaveText([
/page.route/,
/page.goto.*empty.html/, /page.goto.*empty.html/,
]); ]);