diff --git a/toolkit/content/tests/chrome/chrome.ini b/toolkit/content/tests/chrome/chrome.ini index 62c23e816bfe..64d4eb76dafb 100644 --- a/toolkit/content/tests/chrome/chrome.ini +++ b/toolkit/content/tests/chrome/chrome.ini @@ -13,6 +13,7 @@ support-files = bug429723_window.xul bug624329_window.xul dialog_dialogfocus.xul + dialog_dialogfocus2.xul file_about_networking_wsh.py file_autocomplete_with_composition.js findbar_entireword_window.xul diff --git a/toolkit/content/tests/chrome/dialog_dialogfocus2.xul b/toolkit/content/tests/chrome/dialog_dialogfocus2.xul new file mode 100644 index 000000000000..760015472162 --- /dev/null +++ b/toolkit/content/tests/chrome/dialog_dialogfocus2.xul @@ -0,0 +1,6 @@ + + + + + diff --git a/toolkit/content/tests/chrome/test_dialogfocus.xul b/toolkit/content/tests/chrome/test_dialogfocus.xul index 80474e2b91a3..0a224a38614c 100644 --- a/toolkit/content/tests/chrome/test_dialogfocus.xul +++ b/toolkit/content/tests/chrome/test_dialogfocus.xul @@ -26,12 +26,16 @@ SimpleTest.waitForExplicitFinish(); SimpleTest.requestCompleteLog(); -var expected = [ "one", "_extra2", "tab", "one", "tabbutton2", "tabbutton", "two", "textbox-yes", "one" ]; +var expected = [ "one", "_extra2", "tab", "one", "tabbutton2", "tabbutton", "two", "textbox-yes", "one", "root" ]; // non-Mac will always focus the default button if any of the dialog buttons // would be focused if (navigator.platform.indexOf("Mac") == -1) expected[1] = "_accept"; +let extraDialog = "data:application/vnd.mozilla.xul+xml," + + ""; + var step = 0; var fullKeyboardAccess = false; @@ -55,7 +59,8 @@ function runTest() } var expectedFocus = expected[step - 1]; - var win = window.openDialog("dialog_dialogfocus.xul", "_new", "chrome,dialog", step); + let filename = expectedFocus == "root" ? "dialog_dialogfocus2.xul" : "dialog_dialogfocus.xul"; + var win = window.openDialog(filename, "_new", "chrome,dialog", step); function checkDialogFocus(event) { @@ -83,14 +88,30 @@ function runTest() info("match = " + match); } - win.removeEventListener("focus", checkDialogFocus, true); + win.removeEventListener("focus", checkDialogFocusEvent, true); ok(match, "focus step " + step); win.close(); SimpleTest.waitForFocus(runTest, window); } - win.addEventListener("focus", checkDialogFocus, true); + function checkDialogFocusRoot(event) { + if (event.target == win) { + is(win.document.activeElement, win.document.documentElement, "No other focus but root"); + win.close(); + SimpleTest.waitForFocus(runTest, window); + } + } + + function checkDialogFocusEvent(event) { + // Delay to have time for focus/blur to occur. + if (expectedFocus == "root") { + setTimeout(checkDialogFocusRoot, 0, event); + } else { + checkDialogFocus(event); + } + } + win.addEventListener("focus", checkDialogFocusEvent, true); } SimpleTest.waitForFocus(startTest, window); diff --git a/toolkit/content/widgets/dialog.xml b/toolkit/content/widgets/dialog.xml index dfbbae136508..bbe2971e6686 100644 --- a/toolkit/content/widgets/dialog.xml +++ b/toolkit/content/widgets/dialog.xml @@ -176,8 +176,12 @@ focusedElt.getAttribute("noinitialfocus") == "true") { document.commandDispatcher.advanceFocusIntoSubtree(focusedElt); focusedElt = document.commandDispatcher.focusedElement; - if (focusedElt == initialFocusedElt) + if (focusedElt == initialFocusedElt) { + if (focusedElt.getAttribute("noinitialfocus") == "true") { + focusedElt.blur(); + } break; + } } if (initialFocusedElt.localName == "tab") {