mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
fix(trace-viewer): encode attachment filenames as UTF-8 (#29993)
Fixes https://github.com/microsoft/playwright/issues/29967 Tested in Firefox, Chromium, and Safari. This now leads to "good attachment names" in Chromium and Safari, for Firefox, it won't produce attachments, it will open them inline, but this is not a regression, was before like that already. See here for the spec: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition#filename_2 --------- Signed-off-by: Max Schmitt <max@schmitt.mx>
This commit is contained in:
parent
35db70ea1d
commit
a6d1fb93de
@ -159,7 +159,7 @@ function downloadHeadersForAttachment(traceModel: TraceModel, sha1: string): Hea
|
||||
if (!attachment)
|
||||
return;
|
||||
const headers = new Headers();
|
||||
headers.set('Content-Disposition', `attachment; filename="${attachment.name}"`);
|
||||
headers.set('Content-Disposition', `attachment; filename="attachment"; filename*=UTF-8''${encodeURIComponent(attachment.name)}`);
|
||||
if (attachment.contentType)
|
||||
headers.set('Content-Type', attachment.contentType);
|
||||
return headers;
|
||||
|
||||
@ -24,6 +24,7 @@ test('should contain text attachment', async ({ runUITest }) => {
|
||||
import { test } from '@playwright/test';
|
||||
test('attach test', async () => {
|
||||
await test.info().attach('note', { path: __filename });
|
||||
await test.info().attach('🎭', { body: 'hi tester!', contentType: 'text/plain' });
|
||||
});
|
||||
`,
|
||||
});
|
||||
@ -31,12 +32,17 @@ test('should contain text attachment', async ({ runUITest }) => {
|
||||
await page.getByTitle('Run all').click();
|
||||
await expect(page.getByTestId('status-line')).toHaveText('1/1 passed (100%)');
|
||||
await page.getByText('Attachments').click();
|
||||
await page.getByText('attach "note"', { exact: true }).click();
|
||||
const downloadPromise = page.waitForEvent('download');
|
||||
await page.getByRole('link', { name: 'note' }).click();
|
||||
const download = await downloadPromise;
|
||||
expect(download.suggestedFilename()).toBe('note');
|
||||
expect((await readAllFromStream(await download.createReadStream())).toString()).toContain('attach test');
|
||||
for (const { name, content } of [
|
||||
{ name: 'note', content: 'attach test' },
|
||||
{ name: '🎭', content: 'hi tester!' }
|
||||
]) {
|
||||
await page.getByText(`attach "${name}"`, { exact: true }).click();
|
||||
const downloadPromise = page.waitForEvent('download');
|
||||
await page.getByRole('link', { name: name }).click();
|
||||
const download = await downloadPromise;
|
||||
expect(download.suggestedFilename()).toBe(name);
|
||||
expect((await readAllFromStream(await download.createReadStream())).toString()).toContain(content);
|
||||
}
|
||||
});
|
||||
|
||||
test('should contain binary attachment', async ({ runUITest }) => {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user