Skip to content

Commit 0d34f4a

Browse files
committed
chore: Fix Copilot's PR feedback
1 parent b0614dd commit 0d34f4a

File tree

4 files changed

+66
-8
lines changed

4 files changed

+66
-8
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
}
7777

7878
.network-response-body {
79-
height: calc(100% - 31px /* Height of bottom toolbar */);
79+
flex: 1;
8080
}
8181

8282
.network-request-request-body {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ const ResponseTab: React.FunctionComponent<{
239239
{!resource.response.content._sha1 && <div>Response body is not available for this request.</div>}
240240
{responseBody && responseBody.font && <FontPreview font={responseBody.font} />}
241241
{responseBody && responseBody.dataUrl && <div><img draggable='false' src={responseBody.dataUrl} /></div>}
242-
{responseBody && responseBody.text !== undefined && <div className='network-response-body'>
242+
{responseBody && responseBody.text !== undefined && <div className='vbox network-response-body'>
243243
<CodeMirrorWrapper text={formatResult.text} mimeType={responseBody.mimeType} readOnly lineNumbers={true}/>
244244
<Toolbar noShadow={true} noMinHeight={true} className='network-response-toolbar'>
245245
<div style={{ margin: 'auto' }}></div>
@@ -322,7 +322,7 @@ function formatXml(xml: string, indent = ' ') {
322322
}
323323

324324
function formatBody(body: string, contentType?: string): string {
325-
if (!contentType)
325+
if (!body.trim() || !contentType)
326326
return body;
327327

328328
if (isJsonMimeType(contentType))

packages/web/src/components/toolbarButton.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export const ToolbarButton = React.forwardRef<HTMLButtonElement, React.PropsWith
4545
ariaLabel,
4646
errorBadge,
4747
}, ref) {
48+
const errorId = React.useId();
4849
return <button
4950
ref={ref}
5051
className={clsx(className, 'toolbar-button', icon, toggled && 'toggled')}
@@ -56,10 +57,11 @@ export const ToolbarButton = React.forwardRef<HTMLButtonElement, React.PropsWith
5657
style={style}
5758
data-testid={testId}
5859
aria-label={ariaLabel || title}
60+
aria-describedby={errorBadge ? errorId : undefined}
5961
>
6062
{icon && <span className={`codicon codicon-${icon}`} style={children ? { marginRight: 5 } : {}}></span>}
6163
{children}
62-
{errorBadge && <span className='toolbar-button-error-badge' title={errorBadge}></span>}
64+
{errorBadge && <span id={errorId} className='toolbar-button-error-badge' title={errorBadge} aria-label={errorBadge}></span>}
6365
</button>;
6466
});
6567

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

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ test('should filter network requests by url', async ({ runUITest, server }) => {
143143
await expect(networkItems.getByText('font.woff2')).toBeVisible();
144144
});
145145

146-
test('should format JSON request body', async ({ runUITest, server }) => {
146+
test('should pretty-print JSON request body', async ({ runUITest, server }) => {
147147
const { page } = await runUITest({
148148
'network-tab.test.ts': `
149149
import { test, expect } from '@playwright/test';
@@ -188,14 +188,14 @@ test('should format JSON request body', async ({ runUITest, server }) => {
188188
'}',
189189
], { useInnerText: true });
190190

191-
// Untoggle pretty print to see original request body
191+
// Toggle off pretty print to see original request body
192192
await payloadPanel.getByRole('button', { name: 'Pretty print', exact: true }).click();
193193
await expect(payloadPanel.locator('.CodeMirror-code .CodeMirror-line')).toHaveText([
194194
'{"data":{"key":"value","array":["value-1","value-2"]}}'
195195
], { useInnerText: true });
196196
});
197197

198-
test('should format XML request body', async ({ runUITest, server }) => {
198+
test('should pretty-print XML request body', async ({ runUITest, server }) => {
199199
const { page } = await runUITest({
200200
'network-tab.test.ts': `
201201
import { test, expect } from '@playwright/test';
@@ -220,13 +220,69 @@ test('should format XML request body', async ({ runUITest, server }) => {
220220
'</note>'
221221
], { useInnerText: true });
222222

223-
// Untoggle pretty print to see original request body
223+
// Toggle off pretty print to see original request body
224224
await payloadPanel.getByRole('button', { name: 'Pretty print', exact: true }).click();
225225
await expect(payloadPanel.locator('.CodeMirror-code .CodeMirror-line')).toHaveText([
226226
'<?xml version="1.0"?><note to="Alice" from="Bob"><body>Hello &amp; welcome!</body></note>'
227227
], { useInnerText: true });
228228
});
229229

230+
test('should pretty-print response bodies and show formatting errors', async ({ runUITest, server }) => {
231+
server.setRoute('/response-json-good', (_, res) => res.setHeader('Content-Type', 'application/json').end('{"ok":true,"items":[1,2]}'));
232+
server.setRoute('/response-json-bad', (_, res) => res.setHeader('Content-Type', 'application/json').end('{"ok":true,,}'));
233+
234+
const { page } = await runUITest({
235+
'network-tab.test.ts': `
236+
import { test } from '@playwright/test';
237+
test('network response tab', async ({ request }) => {
238+
await Promise.all([
239+
request.get('${server.PREFIX}/response-json-good'),
240+
request.get('${server.PREFIX}/response-json-bad'),
241+
].map(r => r.then(res => res.text())));
242+
});
243+
`,
244+
});
245+
246+
await page.getByText('network response tab').dblclick();
247+
await expect(page.getByTestId('workbench-run-status')).toContainText('Passed');
248+
await page.getByRole('tab', { name: 'Network' }).click();
249+
250+
const networkList = page.getByRole('list', { name: 'Network requests' }).getByRole('listitem');
251+
const responsePanel = page.getByRole('tabpanel', { name: 'Response' });
252+
253+
// Pretty printed by default
254+
await networkList.filter({ hasText: 'response-json-good' }).click();
255+
await page.getByRole('tabpanel', { name: 'Network' }).getByRole('tab', { name: 'Response' }).click();
256+
await expect(responsePanel.locator('.CodeMirror-code .CodeMirror-line')).toHaveText([
257+
'{',
258+
' "ok": true,',
259+
' "items": [',
260+
' 1,',
261+
' 2',
262+
' ]',
263+
'}',
264+
], { useInnerText: true });
265+
266+
// Toggle off to see original body
267+
const prettyPrint = responsePanel.getByRole('button', { name: 'Pretty print', exact: true });
268+
const prettyPrintError = responsePanel.getByTitle('Formatting failed');
269+
await prettyPrint.click();
270+
await expect(responsePanel.locator('.CodeMirror-code .CodeMirror-line')).toHaveText([
271+
'{"ok":true,"items":[1,2]}',
272+
], { useInnerText: true });
273+
await expect(prettyPrintError).toBeHidden();
274+
275+
// Re-enable pretty print so errors are surfaced
276+
await prettyPrint.click();
277+
278+
// Malformed JSON shows badge and preserves original text
279+
await networkList.filter({ hasText: 'response-json-bad' }).click();
280+
await expect(responsePanel.locator('.CodeMirror-code .CodeMirror-line')).toHaveText([
281+
'{"ok":true,,}',
282+
], { useInnerText: true });
283+
await expect(prettyPrintError).toBeVisible();
284+
});
285+
230286
test('should display list of query parameters (only if present)', async ({ runUITest, server }) => {
231287
const { page } = await runUITest({
232288
'network-tab.test.ts': `

0 commit comments

Comments
 (0)