/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */
/* eslint-disable mozilla/no-arbitrary-setTimeout */

/**
 * Make sure the downloads panel only opens automatically on the first
 * download it notices. All subsequent downloads, even across sessions, should
 * not open the panel automatically.
 */
add_task(async function test_first_download_panel() {
  await SpecialPowers.pushPrefEnv({
    set: [["browser.download.autohideButton", false]],
  });
  await promiseButtonShown("downloads-button");
  // Clear the download panel has shown preference first as this test is used to
  // verify this preference's behaviour.
  let oldPrefValue = Services.prefs.getBoolPref("browser.download.panel.shown");
  Services.prefs.setBoolPref("browser.download.panel.shown", false);

  registerCleanupFunction(async function () {
    // Clean up when the test finishes.
    await task_resetState();

    // Set the preference instead of clearing it afterwards to ensure the
    // right value is used no matter what the default was. This ensures the
    // panel doesn't appear and affect other tests.
    Services.prefs.setBoolPref("browser.download.panel.shown", oldPrefValue);
  });

  // Ensure that state is reset in case previous tests didn't finish.
  await task_resetState();

  // With this set to false, we should automatically open the panel the first
  // time a download is started.
  DownloadsCommon.getData(window).panelHasShownBefore = false;

  info("waiting for panel open");
  let promise = promisePanelOpened();
  DownloadsCommon.getData(window)._notifyDownloadEvent("start");
  await promise;

  // If we got here, that means the panel opened.
  DownloadsPanel.hidePanel();

  ok(
    DownloadsCommon.getData(window).panelHasShownBefore,
    "Should have recorded that the panel was opened on a download."
  );

  await SpecialPowers.pushPrefEnv({
    set: [["browser.download.alwaysOpenPanel", false]],
  });
  // Next, make sure that if we start another download, we don't open the
  // panel automatically.
  let originalOnPopupShown = DownloadsPanel.onPopupShown;
  DownloadsPanel.onPopupShown = function () {
    originalOnPopupShown.apply(this, arguments);
    ok(false, "Should not have opened the downloads panel.");
  };

  DownloadsCommon.getData(window)._notifyDownloadEvent("start");

  // Wait 2 seconds to ensure that the panel does not open.
  await new Promise(resolve => setTimeout(resolve, 2000));
  DownloadsPanel.onPopupShown = originalOnPopupShown;
});
