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") {