Skip to content

Commit f9e5033

Browse files
authored
feat: Improve spacing network details (#38307)
1 parent 06e3a30 commit f9e5033

File tree

3 files changed

+60
-50
lines changed

3 files changed

+60
-50
lines changed

packages/trace-viewer/src/ui/networkResourceDetails.css

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,9 @@
2323
flex: none;
2424
}
2525

26-
.network-request-details-url {
27-
white-space: normal;
28-
word-wrap: break-word;
29-
margin-left: 10px;
30-
}
31-
32-
.network-request-details-headers {
33-
white-space: pre;
34-
overflow: hidden;
35-
margin-left: 10px;
36-
}
37-
3826
.network-request-details-tab .expandable-title {
3927
padding-left: 3px;
28+
background-color: var(--vscode-sideBar-background);
4029
}
4130

4231
.network-request-details-tab .expandable-content {
@@ -50,9 +39,22 @@
5039
font-weight: bold;
5140
}
5241

53-
.network-request-details-general {
54-
white-space: pre;
55-
margin-left: 10px;
42+
.network-request-details-table {
43+
width: 100%;
44+
line-height: 18px;
45+
padding: 8px 0 8px 8px;
46+
white-space: pre-wrap;
47+
}
48+
49+
.network-request-details-table td:first-of-type {
50+
width: 30%;
51+
min-width: 160px;
52+
vertical-align: top;
53+
}
54+
55+
.network-request-details-table td:nth-of-type(2) {
56+
word-break: break-all;
57+
vertical-align: center;
5658
}
5759

5860
.network-request-details-tab .cm-wrapper {

packages/trace-viewer/src/ui/networkResourceDetails.tsx

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,10 @@ const CopyDropdown: React.FC<{
108108

109109
const ExpandableSection: React.FC<{
110110
title: string;
111+
data?: { name: string, value: React.ReactNode }[],
111112
children?: React.ReactNode
112113
className?: string;
113-
}> = ({ title, children, className }) => {
114+
}> = ({ title, data, children, className }) => {
114115
const [expanded, setExpanded] = useSetting(`trace-viewer-network-details-${title.replaceAll(' ', '-')}`, true);
115116
return <Expandable
116117
expanded={expanded}
@@ -119,6 +120,17 @@ const ExpandableSection: React.FC<{
119120
title={<span className='network-request-details-header'>{title}</span>}
120121
className={className}
121122
>
123+
{data && <table className='network-request-details-table'>
124+
<tbody>
125+
{data.map(({ name, value }, index) => (
126+
value !== null &&
127+
(<tr key={index}>
128+
<td>{name}</td>
129+
<td>{value}</td>
130+
</tr>)
131+
))}
132+
</tbody>
133+
</table>}
122134
{children}
123135
</Expandable>;
124136
};
@@ -128,33 +140,26 @@ const RequestTab: React.FunctionComponent<{
128140
startTimeOffset: number;
129141
requestBody: RequestBody,
130142
}> = ({ resource, startTimeOffset, requestBody }) => {
131-
return <div className='vbox network-request-details-tab'>
132-
<ExpandableSection title='General'>
133-
<div className='network-request-details-url'>{`URL: ${resource.request.url}`}</div>
134-
<div className='network-request-details-general'>{`Method: ${resource.request.method}`}</div>
135-
{resource.response.status !== -1 && <div className='network-request-details-general' style={{ display: 'flex' }}>
136-
Status Code: <span className={statusClass(resource.response.status)} style={{ display: 'inline-flex' }}>
137-
{`${resource.response.status} ${resource.response.statusText}`}
138-
</span></div>}
139-
</ExpandableSection>
140-
141-
{resource.request.queryString.length ?
142-
<ExpandableSection title='Query String Parameters'>
143-
<div className='network-request-details-headers'>
144-
{resource.request.queryString.map(param => `${param.name}: ${param.value}`).join('\n')}
145-
</div>
146-
</ExpandableSection>
147-
: null}
143+
const generalData = React.useMemo(() =>
144+
Object.entries({
145+
'URL': resource.request.url,
146+
'Method': resource.request.method,
147+
'Status Code': resource.response.status !== -1 && <span className={statusClass(resource.response.status)}> {resource.response.status} {resource.response.statusText}</span>,
148+
}).map(([name, value]) => ({ name, value })),
149+
[resource]);
148150

149-
<ExpandableSection title='Request Headers'>
150-
<div className='network-request-details-headers'>{resource.request.headers.map(pair => `${pair.name}: ${pair.value}`).join('\n')}</div>
151-
</ExpandableSection>
152-
153-
<ExpandableSection title='Time'>
154-
<div className='network-request-details-general'>{`Start: ${msToString(startTimeOffset)}`}</div>
155-
<div className='network-request-details-general'>{`Duration: ${msToString(resource.time)}`}</div>
156-
</ExpandableSection>
151+
const timeData = React.useMemo(() =>
152+
Object.entries({
153+
'Start': msToString(startTimeOffset),
154+
'Duration': msToString(resource.time),
155+
}).map(([name, value]) => ({ name, value })),
156+
[startTimeOffset, resource]);
157157

158+
return <div className='vbox network-request-details-tab'>
159+
<ExpandableSection title='General' data={generalData}/>
160+
{resource.request.queryString.length > 0 && <ExpandableSection title='Query String Parameters' data={resource.request.queryString}/>}
161+
<ExpandableSection title='Request Headers' data={resource.request.headers}/>
162+
<ExpandableSection title='Time' data={timeData}/>
158163
{requestBody && <ExpandableSection title='Request Body' className='network-request-request-body'>
159164
<CodeMirrorWrapper text={requestBody.text} mimeType={requestBody.mimeType} readOnly lineNumbers={true}/>
160165
</ExpandableSection>}
@@ -165,9 +170,7 @@ const ResponseTab: React.FunctionComponent<{
165170
resource: ResourceSnapshot;
166171
}> = ({ resource }) => {
167172
return <div className='vbox network-request-details-tab'>
168-
<ExpandableSection title='Response Headers'>
169-
<div className='network-request-details-headers'>{resource.response.headers.map(pair => `${pair.name}: ${pair.value}`).join('\n')}</div>
170-
</ExpandableSection>
173+
<ExpandableSection title='Response Headers' data={resource.response.headers} />
171174
</div>;
172175
};
173176

tests/playwright-test/ui-mode-test-network-tab.spec.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,14 @@ test('should display list of query parameters (only if present)', async ({ runUI
197197
await page.getByText('call-with-query-params').click();
198198

199199
const region = page.getByRole('region', { name: 'Query String Parameters' });
200-
await expect(region.getByText('param1: value1')).toBeVisible();
201-
await expect(region.getByText('param1: value2')).toBeVisible();
202-
await expect(region.getByText('param2: value2')).toBeVisible();
200+
await expect(region).toMatchAriaSnapshot(
201+
`- table:
202+
- rowgroup:
203+
- 'row "param1 value1"'
204+
- 'row "param1 value2"'
205+
- 'row "param2 value2"'
206+
`
207+
);
203208

204209
await page.getByText('endpoint').click();
205210

@@ -260,19 +265,19 @@ test('should toggle sections inside network details', async ({ runUITest, server
260265

261266
await requestPanel.getByRole('button', { name: 'Request Headers' }).click();
262267
await expect(requestPanel.getByRole('region', { name: 'Request Headers' })).toBeHidden();
263-
await expect(requestPanel.getByRole('region', { name: 'Time' })).toHaveText(/Start: .+Duration: \d+ms/);
268+
await expect(requestPanel.getByRole('region', { name: 'Time' })).toHaveText(/Start.+Duration\d+ms/);
264269

265270
await requestPanel.getByRole('button', { name: 'Time' }).click();
266271
await expect(requestPanel.getByRole('region', { name: 'Request Headers' })).toBeHidden();
267272
await expect(requestPanel.getByRole('region', { name: 'Time' })).toBeHidden();
268273

269274
await requestPanel.getByRole('button', { name: 'Time' }).click();
270275
await expect(requestPanel.getByRole('region', { name: 'Request Headers' })).toBeHidden();
271-
await expect(requestPanel.getByRole('region', { name: 'Time' })).toHaveText(/Start: .+Duration: \d+ms/);
276+
await expect(requestPanel.getByRole('region', { name: 'Time' })).toHaveText(/Start.+Duration\d+ms/);
272277

273278
// Re-opening should preserve open state
274279
await page.getByRole('tabpanel', { name: 'Network' }).getByRole('button', { name: 'Close' }).click();
275280
await page.getByRole('listitem').filter({ hasText: 'post-data-1' }).click();
276281
await expect(requestPanel.getByRole('region', { name: 'Request Headers' })).toBeHidden();
277-
await expect(requestPanel.getByRole('region', { name: 'Time' })).toHaveText(/Start: .+Duration: \d+ms/);
282+
await expect(requestPanel.getByRole('region', { name: 'Time' })).toHaveText(/Start.+Duration\d+ms/);
278283
});

0 commit comments

Comments
 (0)