feat(acceptDownload): revert acceptDownload (#10709)

This commit is contained in:
Pavel Feldman 2021-12-06 09:25:24 -08:00 committed by GitHub
parent 518d67add5
commit 7765131a14
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 57 additions and 95 deletions

View File

@ -56,12 +56,6 @@ var download = await page.RunAndWaitForDownloadAsync(async () =>
Console.WriteLine(await download.PathAsync()); Console.WriteLine(await download.PathAsync());
``` ```
:::note
Browser context **must** be created with the [`option: acceptDownloads`] set to `true` when user needs access to the
downloaded content. If [`option: acceptDownloads`] is not set, download events are emitted, but the actual download is
not performed and user has no access to the downloaded files.
:::
## async method: Download.cancel ## async method: Download.cancel
Cancels a download. Will not fail if the download is already finished or canceled. Cancels a download. Will not fail if the download is already finished or canceled.

View File

@ -297,12 +297,6 @@ event is dispatched.
Emitted when attachment download started. User can access basic file operations on downloaded content via the passed Emitted when attachment download started. User can access basic file operations on downloaded content via the passed
[Download] instance. [Download] instance.
:::note
Browser context **must** be created with the [`option: acceptDownloads`] set to `true` when user needs access to the
downloaded content. If [`option: acceptDownloads`] is not set, download events are emitted, but the actual download is
not performed and user has no access to the downloaded files.
:::
## event: Page.fileChooser ## event: Page.fileChooser
- argument: <[FileChooser]> - argument: <[FileChooser]>

View File

@ -250,7 +250,7 @@ state is still returned, but won't be saved to the disk.
## context-option-acceptdownloads ## context-option-acceptdownloads
- `acceptDownloads` <[boolean]> - `acceptDownloads` <[boolean]>
Whether to automatically download all the attachments. Defaults to `false` where all the downloads are canceled. Whether to automatically download all the attachments. Defaults to `true` where all the downloads are accepted.
## context-option-ignorehttpserrors ## context-option-ignorehttpserrors
- `ignoreHTTPSErrors` <[boolean]> - `ignoreHTTPSErrors` <[boolean]>

View File

@ -7,9 +7,9 @@ title: "Downloads"
For uploading files, see the [uploading files](./input.md#upload-files) section. For uploading files, see the [uploading files](./input.md#upload-files) section.
::: :::
For every attachment downloaded by the page, [`event: Page.download`] event is emitted. If you create a browser context For every attachment downloaded by the page, [`event: Page.download`] event is emitted. All these attachments are going
with the [`option: acceptDownloads`] set, all these attachments are going to be downloaded into a temporary folder. You to be downloaded into a temporary folder. You can obtain the download url, file system path and payload stream using
can obtain the download url, file system path and payload stream using the [Download] object from the event. the [Download] object from the event.
You can specify where to persist downloaded files using the [`option: downloadsPath`] option in [`method: BrowserType.launch`]. You can specify where to persist downloaded files using the [`option: downloadsPath`] option in [`method: BrowserType.launch`].

View File

@ -342,7 +342,7 @@ export default config;
Available options to configure networking: Available options to configure networking:
- `acceptDownloads` - Whether to automatically download all the attachments. [Learn more](./downloads.md) about working with downloads. - `acceptDownloads` - Whether to automatically download all the attachments, defaults to `true`. [Learn more](./downloads.md) about working with downloads.
- `extraHTTPHeaders` - An object containing additional HTTP headers to be sent with every request. All header values must be strings. - `extraHTTPHeaders` - An object containing additional HTTP headers to be sent with every request. All header values must be strings.
- `httpCredentials` - Credentials for [HTTP authentication](./network.md#http-authentication). - `httpCredentials` - Credentials for [HTTP authentication](./network.md#http-authentication).
- `ignoreHTTPSErrors` - Whether to ignore HTTPS errors during navigation. - `ignoreHTTPSErrors` - Whether to ignore HTTPS errors during navigation.

View File

@ -332,8 +332,6 @@ async function launchContext(options: Options, headless: boolean, executablePath
if (contextOptions.isMobile && browserType.name() === 'firefox') if (contextOptions.isMobile && browserType.name() === 'firefox')
contextOptions.isMobile = undefined; contextOptions.isMobile = undefined;
contextOptions.acceptDownloads = true;
// Proxy // Proxy
if (options.proxyServer) { if (options.proxyServer) {
@ -441,7 +439,6 @@ async function launchContext(options: Options, headless: boolean, executablePath
delete launchOptions.headless; delete launchOptions.headless;
delete launchOptions.executablePath; delete launchOptions.executablePath;
delete contextOptions.deviceScaleFactor; delete contextOptions.deviceScaleFactor;
delete contextOptions.acceptDownloads;
return { browser, browserName: browserType.name(), context, contextOptions, launchOptions }; return { browser, browserName: browserType.name(), context, contextOptions, launchOptions };
} }

View File

@ -402,6 +402,8 @@ export function validateBrowserContextOptions(options: types.BrowserContextOptio
throw new Error(`"deviceScaleFactor" option is not supported with null "viewport"`); throw new Error(`"deviceScaleFactor" option is not supported with null "viewport"`);
if (options.noDefaultViewport && options.isMobile !== undefined) if (options.noDefaultViewport && options.isMobile !== undefined)
throw new Error(`"isMobile" option is not supported with null "viewport"`); throw new Error(`"isMobile" option is not supported with null "viewport"`);
if (options.acceptDownloads === undefined)
options.acceptDownloads = true;
if (!options.viewport && !options.noDefaultViewport) if (!options.viewport && !options.noDefaultViewport)
options.viewport = { width: 1280, height: 720 }; options.viewport = { width: 1280, height: 720 };
if (options.recordVideo) { if (options.recordVideo) {

View File

@ -129,10 +129,6 @@ export class CodeGenerator extends EventEmitter {
if (!this._enabled) if (!this._enabled)
return; return;
// We'll need to pass acceptDownloads for any generated downloads code to work.
if (signal.name === 'download')
this._options.contextOptions.acceptDownloads = true;
// Signal either arrives while action is being performed or shortly after. // Signal either arrives while action is being performed or shortly after.
if (this._currentAction) { if (this._currentAction) {
this._currentAction.action.signals.push(signal); this._currentAction.action.signals.push(signal);

View File

@ -902,10 +902,6 @@ export interface Page {
/** /**
* Emitted when attachment download started. User can access basic file operations on downloaded content via the passed * Emitted when attachment download started. User can access basic file operations on downloaded content via the passed
* [Download] instance. * [Download] instance.
*
* > NOTE: Browser context **must** be created with the `acceptDownloads` set to `true` when user needs access to the
* downloaded content. If `acceptDownloads` is not set, download events are emitted, but the actual download is not
* performed and user has no access to the downloaded files.
*/ */
on(event: 'download', listener: (download: Download) => void): this; on(event: 'download', listener: (download: Download) => void): this;
@ -1175,10 +1171,6 @@ export interface Page {
/** /**
* Emitted when attachment download started. User can access basic file operations on downloaded content via the passed * Emitted when attachment download started. User can access basic file operations on downloaded content via the passed
* [Download] instance. * [Download] instance.
*
* > NOTE: Browser context **must** be created with the `acceptDownloads` set to `true` when user needs access to the
* downloaded content. If `acceptDownloads` is not set, download events are emitted, but the actual download is not
* performed and user has no access to the downloaded files.
*/ */
addListener(event: 'download', listener: (download: Download) => void): this; addListener(event: 'download', listener: (download: Download) => void): this;
@ -3525,10 +3517,6 @@ export interface Page {
/** /**
* Emitted when attachment download started. User can access basic file operations on downloaded content via the passed * Emitted when attachment download started. User can access basic file operations on downloaded content via the passed
* [Download] instance. * [Download] instance.
*
* > NOTE: Browser context **must** be created with the `acceptDownloads` set to `true` when user needs access to the
* downloaded content. If `acceptDownloads` is not set, download events are emitted, but the actual download is not
* performed and user has no access to the downloaded files.
*/ */
waitForEvent(event: 'download', optionsOrPredicate?: { predicate?: (download: Download) => boolean | Promise<boolean>, timeout?: number } | ((download: Download) => boolean | Promise<boolean>)): Promise<Download>; waitForEvent(event: 'download', optionsOrPredicate?: { predicate?: (download: Download) => boolean | Promise<boolean>, timeout?: number } | ((download: Download) => boolean | Promise<boolean>)): Promise<Download>;
@ -9948,7 +9936,7 @@ export interface BrowserType<Unused = {}> {
*/ */
launchPersistentContext(userDataDir: string, options?: { launchPersistentContext(userDataDir: string, options?: {
/** /**
* Whether to automatically download all the attachments. Defaults to `false` where all the downloads are canceled. * Whether to automatically download all the attachments. Defaults to `true` where all the downloads are accepted.
*/ */
acceptDownloads?: boolean; acceptDownloads?: boolean;
@ -11176,7 +11164,7 @@ export interface AndroidDevice {
*/ */
launchBrowser(options?: { launchBrowser(options?: {
/** /**
* Whether to automatically download all the attachments. Defaults to `false` where all the downloads are canceled. * Whether to automatically download all the attachments. Defaults to `true` where all the downloads are accepted.
*/ */
acceptDownloads?: boolean; acceptDownloads?: boolean;
@ -12643,7 +12631,7 @@ export interface Browser extends EventEmitter {
*/ */
newPage(options?: { newPage(options?: {
/** /**
* Whether to automatically download all the attachments. Defaults to `false` where all the downloads are canceled. * Whether to automatically download all the attachments. Defaults to `true` where all the downloads are accepted.
*/ */
acceptDownloads?: boolean; acceptDownloads?: boolean;
@ -13319,9 +13307,6 @@ export interface Dialog {
* const path = await download.path(); * const path = await download.path();
* ``` * ```
* *
* > NOTE: Browser context **must** be created with the `acceptDownloads` set to `true` when user needs access to the
* downloaded content. If `acceptDownloads` is not set, download events are emitted, but the actual download is not
* performed and user has no access to the downloaded files.
*/ */
export interface Download { export interface Download {
/** /**
@ -13435,7 +13420,7 @@ export interface Electron {
*/ */
launch(options?: { launch(options?: {
/** /**
* Whether to automatically download all the attachments. Defaults to `false` where all the downloads are canceled. * Whether to automatically download all the attachments. Defaults to `true` where all the downloads are accepted.
*/ */
acceptDownloads?: boolean; acceptDownloads?: boolean;
@ -15037,7 +15022,7 @@ export interface WebSocket {
export interface BrowserContextOptions { export interface BrowserContextOptions {
/** /**
* Whether to automatically download all the attachments. Defaults to `false` where all the downloads are canceled. * Whether to automatically download all the attachments. Defaults to `true` where all the downloads are accepted.
*/ */
acceptDownloads?: boolean; acceptDownloads?: boolean;

View File

@ -2776,7 +2776,7 @@ export type VideoMode = 'off' | 'on' | 'retain-on-failure' | 'on-first-retry';
*/ */
export interface PlaywrightTestOptions { export interface PlaywrightTestOptions {
/** /**
* Whether to automatically download all the attachments. Defaults to `false` where all the downloads are canceled. * Whether to automatically download all the attachments. Defaults to `true` where all the downloads are accepted.
*/ */
acceptDownloads: boolean | undefined; acceptDownloads: boolean | undefined;
/** /**

View File

@ -417,7 +417,7 @@ test('should save download', async ({ server, browserType, startRemoteServer },
const remoteServer = await startRemoteServer(); const remoteServer = await startRemoteServer();
const browser = await browserType.connect({ wsEndpoint: remoteServer.wsEndpoint() }); const browser = await browserType.connect({ wsEndpoint: remoteServer.wsEndpoint() });
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -441,7 +441,7 @@ test('should error when saving download after deletion', async ({ server, browse
const remoteServer = await startRemoteServer(); const remoteServer = await startRemoteServer();
const browser = await browserType.connect({ wsEndpoint: remoteServer.wsEndpoint() }); const browser = await browserType.connect({ wsEndpoint: remoteServer.wsEndpoint() });
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),

View File

@ -174,7 +174,7 @@ it('should support offline option', async ({ server, launchPersistent }) => {
it('should support acceptDownloads option', async ({ server, launchPersistent, mode }) => { it('should support acceptDownloads option', async ({ server, launchPersistent, mode }) => {
it.skip(mode === 'service', 'download.path() is not avaialble in remote mode'); it.skip(mode === 'service', 'download.path() is not avaialble in remote mode');
const { page } = await launchPersistent({ acceptDownloads: true }); const { page } = await launchPersistent();
server.setRoute('/download', (req, res) => { server.setRoute('/download', (req, res) => {
res.setHeader('Content-Type', 'application/octet-stream'); res.setHeader('Content-Type', 'application/octet-stream');
res.setHeader('Content-Disposition', 'attachment'); res.setHeader('Content-Disposition', 'attachment');

View File

@ -51,7 +51,7 @@ it.describe('download event', () => {
}); });
it('should report download when navigation turns into download', async ({ browser, server, browserName }) => { it('should report download when navigation turns into download', async ({ browser, server, browserName }) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
const [ download, responseOrError ] = await Promise.all([ const [ download, responseOrError ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
page.goto(server.PREFIX + '/download').catch(e => e) page.goto(server.PREFIX + '/download').catch(e => e)
@ -77,7 +77,7 @@ it.describe('download event', () => {
}); });
it('should work with Cross-Origin-Opener-Policy', async ({ browser, server, browserName }) => { it('should work with Cross-Origin-Opener-Policy', async ({ browser, server, browserName }) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
const [ download, responseOrError ] = await Promise.all([ const [ download, responseOrError ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
page.goto(server.PREFIX + '/downloadWithCOOP').catch(e => e) page.goto(server.PREFIX + '/downloadWithCOOP').catch(e => e)
@ -103,7 +103,7 @@ it.describe('download event', () => {
}); });
it('should report downloads with acceptDownloads: false', async ({ browser, server }) => { it('should report downloads with acceptDownloads: false', async ({ browser, server }) => {
const page = await browser.newPage(); const page = await browser.newPage({ acceptDownloads: false });
await page.setContent(`<a href="${server.PREFIX}/downloadWithFilename">download</a>`); await page.setContent(`<a href="${server.PREFIX}/downloadWithFilename">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -120,7 +120,7 @@ it.describe('download event', () => {
}); });
it('should report downloads with acceptDownloads: true', async ({ browser, server }) => { it('should report downloads with acceptDownloads: true', async ({ browser, server }) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -133,7 +133,7 @@ it.describe('download event', () => {
}); });
it('should report proper download url when download is from download attribute', async ({ browser, server, browserName }) => { it('should report proper download url when download is from download attribute', async ({ browser, server, browserName }) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.goto(server.PREFIX + '/empty.html'); await page.goto(server.PREFIX + '/empty.html');
await page.setContent(`<a href="${server.PREFIX}/chromium-linux.zip" download="foo.zip">download</a>`); await page.setContent(`<a href="${server.PREFIX}/chromium-linux.zip" download="foo.zip">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
@ -145,7 +145,7 @@ it.describe('download event', () => {
}); });
it('should report downloads for download attribute', async ({ browser, server }) => { it('should report downloads for download attribute', async ({ browser, server }) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.goto(server.PREFIX + '/empty.html'); await page.goto(server.PREFIX + '/empty.html');
await page.setContent(`<a href="${server.PREFIX}/chromium-linux.zip" download="foo.zip">download</a>`); await page.setContent(`<a href="${server.PREFIX}/chromium-linux.zip" download="foo.zip">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
@ -159,7 +159,7 @@ it.describe('download event', () => {
}); });
it('should save to user-specified path without updating original path', async ({ browser, server }, testInfo) => { it('should save to user-specified path without updating original path', async ({ browser, server }, testInfo) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -177,7 +177,7 @@ it.describe('download event', () => {
}); });
it('should save to two different paths with multiple saveAs calls', async ({ browser, server }, testInfo) => { it('should save to two different paths with multiple saveAs calls', async ({ browser, server }, testInfo) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -196,7 +196,7 @@ it.describe('download event', () => {
}); });
it('should save to overwritten filepath', async ({ browser, server }, testInfo) => { it('should save to overwritten filepath', async ({ browser, server }, testInfo) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -214,7 +214,7 @@ it.describe('download event', () => {
}); });
it('should create subdirectories when saving to non-existent user-specified path', async ({ browser, server }, testInfo) => { it('should create subdirectories when saving to non-existent user-specified path', async ({ browser, server }, testInfo) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -241,7 +241,7 @@ it.describe('download event', () => {
}); });
it('should error when saving after deletion', async ({ browser, server }, testInfo) => { it('should error when saving after deletion', async ({ browser, server }, testInfo) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -261,7 +261,7 @@ it.describe('download event', () => {
res.end(`Hello world`); res.end(`Hello world`);
}); });
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.goto(server.EMPTY_PAGE); await page.goto(server.EMPTY_PAGE);
await page.setContent(`<a download="file.txt" href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a download="file.txt" href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
@ -276,7 +276,7 @@ it.describe('download event', () => {
}); });
it(`should report download path within page.on('download', …) handler for Files`, async ({ browser, server }) => { it(`should report download path within page.on('download', …) handler for Files`, async ({ browser, server }) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
const onDownloadPath = new Promise<string>(res => { const onDownloadPath = new Promise<string>(res => {
page.on('download', dl => { page.on('download', dl => {
dl.path().then(res); dl.path().then(res);
@ -290,7 +290,7 @@ it.describe('download event', () => {
}); });
it(`should report download path within page.on('download', …) handler for Blobs`, async ({ browser, server }) => { it(`should report download path within page.on('download', …) handler for Blobs`, async ({ browser, server }) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
const onDownloadPath = new Promise<string>(res => { const onDownloadPath = new Promise<string>(res => {
page.on('download', dl => { page.on('download', dl => {
dl.path().then(res); dl.path().then(res);
@ -313,7 +313,7 @@ it.describe('download event', () => {
res.end(`Hello world`); res.end(`Hello world`);
}); });
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.goto(server.EMPTY_PAGE); await page.goto(server.EMPTY_PAGE);
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
@ -327,7 +327,7 @@ it.describe('download event', () => {
}); });
it('should report new window downloads', async ({ browser, server }) => { it('should report new window downloads', async ({ browser, server }) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a target=_blank href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a target=_blank href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -339,7 +339,7 @@ it.describe('download event', () => {
}); });
it('should delete file', async ({ browser, server }) => { it('should delete file', async ({ browser, server }) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -353,7 +353,7 @@ it.describe('download event', () => {
}); });
it('should expose stream', async ({ browser, server }) => { it('should expose stream', async ({ browser, server }) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -368,7 +368,7 @@ it.describe('download event', () => {
}); });
it('should delete downloads on context destruction', async ({ browser, server }) => { it('should delete downloads on context destruction', async ({ browser, server }) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download1 ] = await Promise.all([ const [ download1 ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -389,7 +389,7 @@ it.describe('download event', () => {
it('should delete downloads on browser gone', async ({ server, browserType }) => { it('should delete downloads on browser gone', async ({ server, browserType }) => {
const browser = await browserType.launch(); const browser = await browserType.launch();
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download1 ] = await Promise.all([ const [ download1 ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -412,7 +412,7 @@ it.describe('download event', () => {
it('should close the context without awaiting the failed download', async ({ browser, server, httpsServer, browserName, headless }, testInfo) => { it('should close the context without awaiting the failed download', async ({ browser, server, httpsServer, browserName, headless }, testInfo) => {
it.skip(browserName !== 'chromium', 'Only Chromium downloads on alt-click'); it.skip(browserName !== 'chromium', 'Only Chromium downloads on alt-click');
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.goto(server.EMPTY_PAGE); await page.goto(server.EMPTY_PAGE);
await page.setContent(`<a href="${httpsServer.PREFIX}/downloadWithFilename" download="file.txt">click me</a>`); await page.setContent(`<a href="${httpsServer.PREFIX}/downloadWithFilename" download="file.txt">click me</a>`);
const [download] = await Promise.all([ const [download] = await Promise.all([
@ -444,7 +444,7 @@ it.describe('download event', () => {
res.write(`Hello world`); res.write(`Hello world`);
}); });
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.goto(server.EMPTY_PAGE); await page.goto(server.EMPTY_PAGE);
await page.setContent(`<a href="${server.PREFIX}/downloadStall" download="file.txt">click me</a>`); await page.setContent(`<a href="${server.PREFIX}/downloadStall" download="file.txt">click me</a>`);
const [download] = await Promise.all([ const [download] = await Promise.all([
@ -476,7 +476,7 @@ it.describe('download event', () => {
}); });
const browser = await browserType.launch(); const browser = await browserType.launch();
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/downloadStall">click me</a>`); await page.setContent(`<a href="${server.PREFIX}/downloadStall">click me</a>`);
const [download] = await Promise.all([ const [download] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -498,7 +498,7 @@ it.describe('download event', () => {
fs.writeFileSync(zipFile, content); fs.writeFileSync(zipFile, content);
server.setRoute('/binary.zip', (req, res) => server.serveFile(req, res, zipFile)); server.setRoute('/binary.zip', (req, res) => server.serveFile(req, res, zipFile));
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.goto(server.PREFIX + '/empty.html'); await page.goto(server.PREFIX + '/empty.html');
await page.setContent(`<a href="${server.PREFIX}/binary.zip" download="binary.zip">download</a>`); await page.setContent(`<a href="${server.PREFIX}/binary.zip" download="binary.zip">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
@ -525,7 +525,7 @@ it.describe('download event', () => {
it('should be able to cancel pending downloads', async ({ browser, server, browserName, browserVersion }) => { it('should be able to cancel pending downloads', async ({ browser, server, browserName, browserVersion }) => {
// The exact upstream change is in b449b5c, which still does not appear in the first few 91.* tags until 91.0.4437.0. // The exact upstream change is in b449b5c, which still does not appear in the first few 91.* tags until 91.0.4437.0.
it.fixme(browserName === 'chromium' && Number(browserVersion.split('.')[0]) < 91, 'The upstream Browser.cancelDownload command is not available before Chrome 91'); it.fixme(browserName === 'chromium' && Number(browserVersion.split('.')[0]) < 91, 'The upstream Browser.cancelDownload command is not available before Chrome 91');
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/downloadWithDelay">download</a>`); await page.setContent(`<a href="${server.PREFIX}/downloadWithDelay">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -540,7 +540,7 @@ it.describe('download event', () => {
it('should not fail explicitly to cancel a download even if that is already finished', async ({ browser, server, browserName, browserVersion }) => { it('should not fail explicitly to cancel a download even if that is already finished', async ({ browser, server, browserName, browserVersion }) => {
// The exact upstream change is in b449b5c, which still does not appear in the first few 91.* tags until 91.0.4437.0. // The exact upstream change is in b449b5c, which still does not appear in the first few 91.* tags until 91.0.4437.0.
it.fixme(browserName === 'chromium' && Number(browserVersion.split('.')[0]) < 91, 'The upstream Browser.cancelDownload command is not available before Chrome 91'); it.fixme(browserName === 'chromium' && Number(browserVersion.split('.')[0]) < 91, 'The upstream Browser.cancelDownload command is not available before Chrome 91');
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -556,7 +556,7 @@ it.describe('download event', () => {
}); });
it('should report downloads with interception', async ({ browser, server }) => { it('should report downloads with interception', async ({ browser, server }) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.route(/.*/, r => r.continue()); await page.route(/.*/, r => r.continue());
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
@ -570,7 +570,7 @@ it.describe('download event', () => {
}); });
it('should emit download event from nested iframes', async ({ server, browser, browserName }, testInfo) => { it('should emit download event from nested iframes', async ({ server, browser, browserName }, testInfo) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
server.setRoute('/1', (req, res) => { server.setRoute('/1', (req, res) => {
res.setHeader('Content-Type', 'text/html'); res.setHeader('Content-Type', 'text/html');
res.end(`<iframe src="${server.PREFIX}/2"></iframe>`); res.end(`<iframe src="${server.PREFIX}/2"></iframe>`);
@ -600,7 +600,7 @@ it.describe('download event', () => {
}); });
it('should be able to download a PDF file', async ({ browser, server, asset }) => { it('should be able to download a PDF file', async ({ browser, server, asset }) => {
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.goto(server.EMPTY_PAGE); await page.goto(server.EMPTY_PAGE);
await page.setContent(` await page.setContent(`
<a href="/empty.pdf" download>download</a> <a href="/empty.pdf" download>download</a>
@ -615,7 +615,7 @@ it('should be able to download a PDF file', async ({ browser, server, asset }) =
it('should be able to download a inline PDF file', async ({ browser, server, asset, browserName }) => { it('should be able to download a inline PDF file', async ({ browser, server, asset, browserName }) => {
it.fixme(browserName === 'webkit'); it.fixme(browserName === 'webkit');
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.goto(server.EMPTY_PAGE); await page.goto(server.EMPTY_PAGE);
await page.route('**/empty.pdf', async route => { await page.route('**/empty.pdf', async route => {
const response = await page.context().request.fetch(route.request()); const response = await page.context().request.fetch(route.request());
@ -645,7 +645,7 @@ it('should save to user-specified path', async ({ browser, server, mode }, testI
res.end(`Hello world`); res.end(`Hello world`);
}); });
const page = await browser.newPage({ acceptDownloads: true }); const page = await browser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),

View File

@ -47,7 +47,7 @@ it.describe('downloads path', () => {
it('should delete downloads when context closes', async ({ browserType, server }, testInfo) => { it('should delete downloads when context closes', async ({ browserType, server }, testInfo) => {
const downloadsBrowser = await browserType.launch({ downloadsPath: testInfo.outputPath('') }); const downloadsBrowser = await browserType.launch({ downloadsPath: testInfo.outputPath('') });
const page = await downloadsBrowser.newPage({ acceptDownloads: true }); const page = await downloadsBrowser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -62,7 +62,7 @@ it.describe('downloads path', () => {
it('should report downloads in downloadsPath folder', async ({ browserType, server }, testInfo) => { it('should report downloads in downloadsPath folder', async ({ browserType, server }, testInfo) => {
const downloadsBrowser = await browserType.launch({ downloadsPath: testInfo.outputPath('') }); const downloadsBrowser = await browserType.launch({ downloadsPath: testInfo.outputPath('') });
const page = await downloadsBrowser.newPage({ acceptDownloads: true }); const page = await downloadsBrowser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -76,7 +76,7 @@ it.describe('downloads path', () => {
it('should report downloads in downloadsPath folder with a relative path', async ({ browserType, server }, testInfo) => { it('should report downloads in downloadsPath folder with a relative path', async ({ browserType, server }, testInfo) => {
const downloadsBrowser = await browserType.launch({ downloadsPath: path.relative(process.cwd(), testInfo.outputPath('')) }); const downloadsBrowser = await browserType.launch({ downloadsPath: path.relative(process.cwd(), testInfo.outputPath('')) });
const page = await downloadsBrowser.newPage({ acceptDownloads: true }); const page = await downloadsBrowser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -89,7 +89,7 @@ it.describe('downloads path', () => {
}); });
it('should accept downloads in persistent context', async ({ launchPersistent, server }, testInfo) => { it('should accept downloads in persistent context', async ({ launchPersistent, server }, testInfo) => {
const { context, page } = await launchPersistent({ acceptDownloads: true, downloadsPath: testInfo.outputPath('') }); const { context, page } = await launchPersistent({ downloadsPath: testInfo.outputPath('') });
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),
@ -103,7 +103,7 @@ it.describe('downloads path', () => {
}); });
it('should delete downloads when persistent context closes', async ({ launchPersistent, server }, testInfo) => { it('should delete downloads when persistent context closes', async ({ launchPersistent, server }, testInfo) => {
const { context, page } = await launchPersistent({ acceptDownloads: true, downloadsPath: testInfo.outputPath('') }); const { context, page } = await launchPersistent({ downloadsPath: testInfo.outputPath('') });
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([ const [ download ] = await Promise.all([
page.waitForEvent('download'), page.waitForEvent('download'),

View File

@ -252,9 +252,7 @@ test.describe('cli codegen', () => {
const sources = await recorder.waitForOutput('JavaScript', 'waitForEvent'); const sources = await recorder.waitForOutput('JavaScript', 'waitForEvent');
expect(sources.get('JavaScript').text).toContain(` expect(sources.get('JavaScript').text).toContain(`
const context = await browser.newContext({ const context = await browser.newContext();`);
acceptDownloads: true
});`);
expect(sources.get('JavaScript').text).toContain(` expect(sources.get('JavaScript').text).toContain(`
// Click text=Download // Click text=Download
const [download] = await Promise.all([ const [download] = await Promise.all([
@ -263,8 +261,7 @@ test.describe('cli codegen', () => {
]);`); ]);`);
expect(sources.get('Java').text).toContain(` expect(sources.get('Java').text).toContain(`
BrowserContext context = browser.newContext(new Browser.NewContextOptions() BrowserContext context = browser.newContext();`);
.setAcceptDownloads(true));`);
expect(sources.get('Java').text).toContain(` expect(sources.get('Java').text).toContain(`
// Click text=Download // Click text=Download
Download download = page.waitForDownload(() -> { Download download = page.waitForDownload(() -> {
@ -272,7 +269,7 @@ test.describe('cli codegen', () => {
});`); });`);
expect(sources.get('Python').text).toContain(` expect(sources.get('Python').text).toContain(`
context = browser.new_context(accept_downloads=True)`); context = browser.new_context()`);
expect(sources.get('Python').text).toContain(` expect(sources.get('Python').text).toContain(`
# Click text=Download # Click text=Download
with page.expect_download() as download_info: with page.expect_download() as download_info:
@ -280,7 +277,7 @@ test.describe('cli codegen', () => {
download = download_info.value`); download = download_info.value`);
expect(sources.get('Python Async').text).toContain(` expect(sources.get('Python Async').text).toContain(`
context = await browser.new_context(accept_downloads=True)`); context = await browser.new_context()`);
expect(sources.get('Python Async').text).toContain(` expect(sources.get('Python Async').text).toContain(`
# Click text=Download # Click text=Download
async with page.expect_download() as download_info: async with page.expect_download() as download_info:
@ -288,10 +285,7 @@ test.describe('cli codegen', () => {
download = await download_info.value`); download = await download_info.value`);
expect(sources.get('C#').text).toContain(` expect(sources.get('C#').text).toContain(`
var context = await browser.NewContextAsync(new BrowserNewContextOptions var context = await browser.NewContextAsync();`);
{
AcceptDownloads = true,
});`);
expect(sources.get('C#').text).toContain(` expect(sources.get('C#').text).toContain(`
// Click text=Download // Click text=Download
var download1 = await page.RunAndWaitForDownloadAsync(async () => var download1 = await page.RunAndWaitForDownloadAsync(async () =>