blob: 424371db3af7f46a6f6909222a8b3b21b6a83d90 [file] [log] [blame]
(async function(testRunner) {
const {page, session, dp} = await testRunner.startBlank('Tests we properly emit Page.downloadWillBegin.');
await dp.Page.enable();
await session.evaluateAsync(`
const frame = document.createElement('iframe');
frame.src = location.href;
document.body.appendChild(frame);
new Promise(resolve => frame.onload = resolve);
`);
const frameTree = (await dp.Page.getFrameTree()).result.frameTree;
const frameNames = new Map([
[frameTree.frame.id, 'top'],
[frameTree.childFrames[0].frame.id, 'child']
]);
dp.Page.onDownloadWillBegin(event => {
const frame = frameNames.get(event.params.frameId) || 'unknown';
testRunner.log(event, `downloadWillBegin from ${frame} frame: `);
});
async function waitForDownloadAndDump() {
const visitedStates = new Set();
await new Promise(resolve => {
dp.Page.onDownloadProgress(event => {
if (visitedStates.has(event.params.state))
return;
visitedStates.add(event.params.state);
testRunner.log(event);
if (event.params.state === 'completed')
resolve();
});
});
}
async function waitForDownloadCompleted() {
await dp.Page.onceDownloadProgress(event => event.params.state === 'completed');
}
testRunner.log('Downloading via a navigation: ');
session.evaluate('location.href = "/devtools/network/resources/resource.php?download=1"');
await waitForDownloadAndDump();
testRunner.log('Downloading via a navigation of subframe: ');
session.evaluate(`frames[0].frameElement.src = '/devtools/network/resources/resource.php?download=1'`);
await waitForDownloadAndDump();
function createLinkAndClick(doc) {
const a = doc.createElement('a');
a.href = '/devtools/network/resources/resource.php';
a.download = 'hello.text';
doc.body.appendChild(a);
a.click();
}
testRunner.log('Downloading by clicking a link: ');
session.evaluate(`(${createLinkAndClick})(document)`);
await waitForDownloadAndDump();
testRunner.log('Downloading by clicking a link in subframe: ');
session.evaluate(`(${createLinkAndClick})(frames[0].document)`);
await waitForDownloadAndDump();
testRunner.log(
'Downloading by clicking a link (no HTTP Content-Disposition header, a[download=""]): ');
session.evaluate(`
const blankDownloadAttr = document.createElement('a');
blankDownloadAttr.href = '/devtools/network/resources/download.zzz';
blankDownloadAttr.download = ''; // Intentionally left blank to trigger unamed download
document.body.appendChild(blankDownloadAttr);
blankDownloadAttr.click();
`);
await waitForDownloadCompleted();
testRunner.log(
'Downloading by clicking a link (HTTP Content-Disposition header with filename=foo.txt, no a[download]): ');
session.evaluate(`
const headerButNoDownloadAttr = document.createElement('a');
headerButNoDownloadAttr.href = '/devtools/network/resources/resource.php?named_download=foo.txt';
document.body.appendChild(headerButNoDownloadAttr);
headerButNoDownloadAttr.click();
`);
await waitForDownloadCompleted();
testRunner.log(
'Downloading by clicking a link (HTTP Content-Disposition header with filename=override.txt, a[download="foo.txt"]): ');
session.evaluate(`
const headerAndConflictingDownloadAttr = document.createElement('a');
headerAndConflictingDownloadAttr.href = '/devtools/network/resources/resource.php?named_download=override.txt';
headerAndConflictingDownloadAttr.download = 'foo.txt';
document.body.appendChild(headerAndConflictingDownloadAttr);
headerAndConflictingDownloadAttr.click();
`);
await waitForDownloadCompleted();
testRunner.log(
'Downloading by clicking a link (HTTP Content-Disposition header without filename, no a[download]): ');
session.evaluate(`
const unnamedDownload = document.createElement('a');
unnamedDownload.href = '/devtools/network/resources/resource.php?named_download';
document.body.appendChild(unnamedDownload);
unnamedDownload.click();
`);
await waitForDownloadCompleted();
testRunner.log(
'Downloading by clicking a link (HTTP Content-Disposition header without filename, no a[download], js): ');
session.evaluate(`
const jsDownload = document.createElement('a');
jsDownload.href = '/devtools/network/resources/resource.php?named_download&type=js';
document.body.appendChild(jsDownload);
jsDownload.click();
`);
await waitForDownloadCompleted();
testRunner.log(
'Downloading by clicking a link (HTTP Content-Disposition header without filename, no a[download], image): ');
session.evaluate(`
const imageDownload = document.createElement('a');
imageDownload.href = '/devtools/network/resources/resource.php?named_download&type=image';
document.body.appendChild(imageDownload);
imageDownload.click();
`);
await waitForDownloadCompleted();
testRunner.completeTest();
})