/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";

// Load lazy so we create the app info first.
ChromeUtils.defineModuleGetter(
  this,
  "PageActions",
  "resource:///modules/PageActions.jsm"
);

const { AddonTestUtils } = ChromeUtils.importESModule(
  "resource://testing-common/AddonTestUtils.sys.mjs"
);

const { createAppInfo, promiseShutdownManager, promiseStartupManager } =
  AddonTestUtils;

AddonTestUtils.init(this);
AddonTestUtils.overrideCertDB();

createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "58");

// This is copied and pasted from ext-browser.js and used in ext-pageAction.js.
// It's used as the PageActions action ID.
function makeWidgetId(id) {
  id = id.toLowerCase();
  // FIXME: This allows for collisions.
  return id.replace(/[^a-z0-9_-]/g, "_");
}

// Tests that the pinnedToUrlbar property of the PageActions.Action object
// backing the extension's page action persists across app restarts.
add_task(async function testAppShutdown() {
  let extensionData = {
    useAddonManager: "permanent",
    manifest: {
      page_action: {
        default_title: "test_ext_pageAction_shutdown.js",
        browser_style: false,
      },
    },
  };

  // Simulate starting up the app.
  PageActions.init();
  await promiseStartupManager();

  let extension = ExtensionTestUtils.loadExtension(extensionData);
  await extension.startup();

  // Get the PageAction.Action object.  Its pinnedToUrlbar should have been
  // initialized to true in ext-pageAction.js, when it's created.
  let actionID = makeWidgetId(extension.id);
  let action = PageActions.actionForID(actionID);
  Assert.equal(action.pinnedToUrlbar, true);

  // Simulate restarting the app without first unloading the extension.
  await promiseShutdownManager();
  PageActions._reset();
  await promiseStartupManager();
  await extension.awaitStartup();

  // Get the action.  Its pinnedToUrlbar should remain true.
  action = PageActions.actionForID(actionID);
  Assert.equal(action.pinnedToUrlbar, true);

  // Now set its pinnedToUrlbar to false.
  action.pinnedToUrlbar = false;

  // Simulate restarting the app again without first unloading the extension.
  await promiseShutdownManager();
  PageActions._reset();
  await promiseStartupManager();
  await extension.awaitStartup();

  action = PageActions.actionForID(actionID);
  Assert.equal(action.pinnedToUrlbar, true);

  // Now unload the extension and quit the app.
  await extension.unload();
  await promiseShutdownManager();
});
