/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

"use strict";

add_setup(async function () {
  await SpecialPowers.pushPrefEnv({
    set: [["test.wait300msAfterTabSwitch", true]],
  });
});

// This test does verify that the menus API events are still emitted when
// there are extension context alive with subscribed listeners
// (See Bug 1602384).
add_task(async function test_subscribed_events_fired_after_context_destroy() {
  let extension = ExtensionTestUtils.loadExtension({
    manifest: {
      permissions: ["menus"],
    },
    files: {
      "page.html": `<!DOCTYPE html>
        <meta charset="utf-8"><script src="page.js"></script>
        Extension Page
      `,
      "page.js": async function () {
        browser.menus.onShown.addListener(() => {
          browser.test.sendMessage("menu-onShown");
        });
        browser.menus.onHidden.addListener(() => {
          browser.test.sendMessage("menu-onHidden");
        });
        // Call an API method implemented in the parent process
        // to ensure the menu listeners are subscribed in the
        // parent process.
        await browser.runtime.getBrowserInfo();
        browser.test.sendMessage("page-loaded");
      },
    },
  });

  await extension.startup();
  const pageURL = `moz-extension://${extension.uuid}/page.html`;

  info("Loading extension page in a tab");
  const tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser, pageURL);
  await extension.awaitMessage("page-loaded");

  info("Loading extension page in another tab");
  const tab2 = await BrowserTestUtils.openNewForegroundTab(gBrowser, pageURL);
  await extension.awaitMessage("page-loaded");

  info("Remove the first tab");
  BrowserTestUtils.removeTab(tab1);

  info("Open a context menu and expect menu.onShown to be fired");
  await openContextMenu("body");

  await extension.awaitMessage("menu-onShown");

  info("Close context menu and expect menu.onHidden to be fired");
  await closeExtensionContextMenu();
  await extension.awaitMessage("menu-onHidden");

  ok(true, "The expected menu events have been fired");

  BrowserTestUtils.removeTab(tab2);

  await extension.unload();
});
