const TEST_URL =
  "https://example.com/browser/dom/tests/browser/focus_after_prompt.html";

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

function awaitAndClosePrompt(browser) {
  return PromptTestUtils.handleNextPrompt(
    browser,
    { modalType: Services.prompt.MODAL_TYPE_CONTENT, promptType: "prompt" },
    { buttonNumClick: 0 }
  );
}

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

add_task(async function () {
  let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);
  let browser = tab.linkedBrowser;

  // Focus on editable iframe.
  await BrowserTestUtils.synthesizeMouseAtCenter("#edit", {}, browser);
  await SpecialPowers.spawn(browser, [], async function () {
    is(
      content.document.activeElement,
      content.document.getElementById("edit"),
      "Focus should be on iframe element"
    );
  });

  let focusBlurPromise = SpecialPowers.spawn(browser, [], async function () {
    let focusOccurred = false;
    let blurOccurred = false;

    return new Promise(resolve => {
      let doc = content.document.getElementById("edit").contentDocument;
      doc.addEventListener("focus", function () {
        focusOccurred = true;
        if (blurOccurred) {
          resolve(true);
        }
      });

      doc.addEventListener("blur", function () {
        blurOccurred = true;
        if (focusOccurred) {
          resolve(false);
        }
      });
    });
  });

  // Click on div that triggers a prompt, and then check that focus is back on
  // the editable iframe.
  let dialogShown = awaitAndClosePrompt(browser);
  await SpecialPowers.spawn(browser, [], async function () {
    let div = content.document.getElementById("clickMeDiv");
    div.click();
  });
  await dialogShown;
  let blurCameFirst = await focusBlurPromise;
  await SpecialPowers.spawn(browser, [], async function () {
    is(
      content.document.activeElement,
      content.document.getElementById("edit"),
      "Focus should be back on iframe element"
    );
  });
  ok(blurCameFirst, "Should receive blur and then focus event");

  BrowserTestUtils.removeTab(tab);
});
