summaryrefslogtreecommitdiffstats
path: root/dom/tests/browser/browser_test_focus_after_modal_state.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/tests/browser/browser_test_focus_after_modal_state.js')
-rw-r--r--dom/tests/browser/browser_test_focus_after_modal_state.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/dom/tests/browser/browser_test_focus_after_modal_state.js b/dom/tests/browser/browser_test_focus_after_modal_state.js
new file mode 100644
index 0000000000..2193d8fdc4
--- /dev/null
+++ b/dom/tests/browser/browser_test_focus_after_modal_state.js
@@ -0,0 +1,71 @@
+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_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 (event) {
+ focusOccurred = true;
+ if (blurOccurred) {
+ resolve(true);
+ }
+ });
+
+ doc.addEventListener("blur", function (event) {
+ 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);
+});