(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();
})
