Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 11:00:39 -07:00
|
|
|
/*
|
|
|
|
* This test checks that focus is adjusted properly when switching tabs.
|
|
|
|
*/
|
|
|
|
|
|
|
|
let testPage1 = "data:text/html,<html id='tab1'><body><button id='button1'>Tab 1</button></body></html>";
|
|
|
|
let testPage2 = "data:text/html,<html id='tab2'><body><button id='button2'>Tab 2</button></body></html>";
|
2009-07-23 07:38:54 -07:00
|
|
|
let testPage3 = "data:text/html,<html id='tab3'><body><button id='button3'>Tab 3</button></body></html>";
|
|
|
|
|
|
|
|
var browser1;
|
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 11:00:39 -07:00
|
|
|
|
|
|
|
function test() {
|
|
|
|
waitForExplicitFinish();
|
|
|
|
|
|
|
|
var tab1 = gBrowser.addTab();
|
2009-07-23 07:38:54 -07:00
|
|
|
browser1 = gBrowser.getBrowserForTab(tab1);
|
|
|
|
|
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 11:00:39 -07:00
|
|
|
var tab2 = gBrowser.addTab();
|
|
|
|
var browser2 = gBrowser.getBrowserForTab(tab2);
|
|
|
|
|
|
|
|
gURLBar.focus();
|
|
|
|
|
|
|
|
var loadCount = 0;
|
|
|
|
function check()
|
|
|
|
{
|
|
|
|
// wait for both tabs to load
|
|
|
|
if (++loadCount != 2)
|
|
|
|
return;
|
|
|
|
|
|
|
|
window.focus();
|
|
|
|
|
|
|
|
_browser_tabfocus_test_lastfocus = gURLBar;
|
|
|
|
_browser_tabfocus_test_lastfocuswindow = window;
|
|
|
|
|
|
|
|
window.addEventListener("focus", _browser_tabfocus_test_eventOccured, true);
|
|
|
|
window.addEventListener("blur", _browser_tabfocus_test_eventOccured, true);
|
|
|
|
|
|
|
|
gBrowser.selectedTab = tab2;
|
|
|
|
|
|
|
|
var fm = Components.classes["@mozilla.org/focus-manager;1"].
|
|
|
|
getService(Components.interfaces.nsIFocusManager);
|
|
|
|
is(fm.focusedWindow, window, "focusedWindow after tab load");
|
|
|
|
is(fm.focusedElement, gURLBar.inputField, "focusedElement after tab load");
|
|
|
|
|
|
|
|
// make sure that the focus initially starts out blank
|
|
|
|
var focusedWindow = {};
|
|
|
|
is(fm.getFocusedElementForWindow(browser1.contentWindow, false, focusedWindow), null, "initial focus in tab 1");
|
|
|
|
is(focusedWindow.value, browser1.contentWindow, "initial frame focus in tab 1");
|
|
|
|
is(fm.getFocusedElementForWindow(browser2.contentWindow, false, focusedWindow), null, "initial focus in tab 2");
|
|
|
|
is(focusedWindow.value, browser2.contentWindow, "initial frame focus in tab 2");
|
|
|
|
|
|
|
|
// switching tabs when the urlbar is focused and nothing in the new tab is focused
|
|
|
|
// should keep focus in the urlbar
|
|
|
|
expectFocusShift(function () gBrowser.selectedTab = tab1,
|
|
|
|
window, gURLBar.inputField, false,
|
|
|
|
"focusedElement after tab change, focus in url field, no focus in new tab");
|
|
|
|
|
|
|
|
// focusing a button in the current tab should focus it
|
|
|
|
var button1 = browser1.contentWindow.document.getElementById("button1");
|
|
|
|
expectFocusShift(function () button1.focus(),
|
|
|
|
browser1.contentWindow, button1, true,
|
|
|
|
"focusedWindow after focus in focused tab");
|
|
|
|
|
|
|
|
// focusing a button in a background tab should not change the actual
|
|
|
|
// focus, but should set the focus that would be in that background tab to
|
|
|
|
// that button.
|
|
|
|
var button2 = browser2.contentWindow.document.getElementById("button2");
|
|
|
|
button2.focus();
|
|
|
|
|
|
|
|
expectFocusShift(function () button2.focus(),
|
|
|
|
browser1.contentWindow, button1, false,
|
|
|
|
"focusedWindow after focus in unfocused tab");
|
|
|
|
is(fm.getFocusedElementForWindow(browser2.contentWindow, false, {}), button2, "focus in unfocused tab");
|
|
|
|
|
|
|
|
// switching tabs should now make the button in the other tab focused
|
|
|
|
expectFocusShift(function () gBrowser.selectedTab = tab2,
|
|
|
|
browser2.contentWindow, button2, true,
|
|
|
|
"focusedWindow after tab change");
|
|
|
|
|
|
|
|
// blurring an element in a background tab should not change the active
|
|
|
|
// focus, but should clear the focus in that tab.
|
|
|
|
expectFocusShift(function () button1.blur(),
|
|
|
|
browser2.contentWindow, button2, false,
|
|
|
|
"focusedWindow after blur in unfocused tab");
|
|
|
|
is(fm.getFocusedElementForWindow(browser1.contentWindow, false, {}), null, "blur in unfocused tab");
|
|
|
|
|
|
|
|
// focusing the url field should switch active focus away from the tab but
|
|
|
|
// not clear what would be the focus in the tab
|
|
|
|
button1.focus();
|
|
|
|
expectFocusShift(function () gURLBar.focus(),
|
|
|
|
window, gURLBar.inputField, true,
|
|
|
|
"focusedWindow after url field focused");
|
|
|
|
is(fm.getFocusedElementForWindow(browser2.contentWindow, false, {}), button2, "url field focused, button in tab");
|
|
|
|
|
|
|
|
// when a chrome element is focused, switching tabs to a tab with a button
|
|
|
|
// with the current focus should focus the button
|
|
|
|
expectFocusShift(function () gBrowser.selectedTab = tab1,
|
|
|
|
browser1.contentWindow, button1, true,
|
|
|
|
"focusedWindow after tab change, focus in url field, button focused in new tab");
|
|
|
|
is(fm.getFocusedElementForWindow(browser2.contentWindow, false, {}), button2, "after switch tab, focus in unfocused tab");
|
|
|
|
|
|
|
|
// blurring an element in the current tab should clear the active focus
|
|
|
|
expectFocusShift(function () button1.blur(),
|
|
|
|
browser1.contentWindow, null, true,
|
|
|
|
"focusedWindow after blur in focused tab");
|
|
|
|
|
|
|
|
// blurring an non-focused url field should have no effect
|
|
|
|
expectFocusShift(function () gURLBar.blur(),
|
|
|
|
browser1.contentWindow, null, false,
|
|
|
|
"focusedWindow after blur in unfocused url field");
|
|
|
|
|
|
|
|
// switch focus to a tab with a currently focused element
|
|
|
|
expectFocusShift(function () gBrowser.selectedTab = tab2,
|
|
|
|
browser2.contentWindow, button2, true,
|
|
|
|
"focusedWindow after switch from unfocused to focused tab");
|
|
|
|
|
|
|
|
// clearing focus on the chrome window should switch the focus to the
|
|
|
|
// chrome window
|
|
|
|
expectFocusShift(function () fm.clearFocus(window),
|
|
|
|
window, null, true,
|
|
|
|
"focusedWindow after switch to chrome with no focused element");
|
|
|
|
|
|
|
|
// switch focus to another tab when neither have an active focus
|
|
|
|
expectFocusShift(function () gBrowser.selectedTab = tab1,
|
|
|
|
browser1.contentWindow, null, true,
|
|
|
|
"focusedWindow after tab switch from no focus to no focus");
|
2009-07-23 07:38:54 -07:00
|
|
|
|
|
|
|
window.addEventListener("focus", _browser_tabfocus_test_eventOccured, true);
|
|
|
|
window.addEventListener("blur", _browser_tabfocus_test_eventOccured, true);
|
|
|
|
|
|
|
|
// next, check whether navigating forward, focusing the urlbar and then
|
|
|
|
// navigating back maintains the focus in the urlbar.
|
|
|
|
browser1.addEventListener("pageshow", _browser_tabfocus_navigation_test_eventOccured, true);
|
|
|
|
button1.focus();
|
|
|
|
browser1.contentWindow.location = testPage3;
|
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 11:00:39 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
browser1.addEventListener("load", check, true);
|
|
|
|
browser2.addEventListener("load", check, true);
|
|
|
|
browser1.contentWindow.location = testPage1;
|
|
|
|
browser2.contentWindow.location = testPage2;
|
|
|
|
}
|
|
|
|
|
|
|
|
var _browser_tabfocus_test_lastfocus;
|
|
|
|
var _browser_tabfocus_test_lastfocuswindow = null;
|
|
|
|
var _browser_tabfocus_test_events = "";
|
|
|
|
|
|
|
|
function _browser_tabfocus_test_eventOccured(event)
|
|
|
|
{
|
|
|
|
var id;
|
|
|
|
if (event.target instanceof Window)
|
|
|
|
id = event.originalTarget.document.documentElement.id + "-window";
|
|
|
|
else if (event.target instanceof Document)
|
|
|
|
id = event.originalTarget.documentElement.id + "-document";
|
|
|
|
else if (event.target.id == "urlbar" && event.originalTarget.localName == "input")
|
|
|
|
id = "urlbar";
|
|
|
|
else
|
|
|
|
id = event.originalTarget.id;
|
|
|
|
|
|
|
|
if (_browser_tabfocus_test_events)
|
|
|
|
_browser_tabfocus_test_events += " ";
|
|
|
|
_browser_tabfocus_test_events += event.type + ": " + id;
|
|
|
|
}
|
|
|
|
|
2009-07-23 07:38:54 -07:00
|
|
|
function _browser_tabfocus_navigation_test_eventOccured(event)
|
|
|
|
{
|
|
|
|
if (event.target instanceof Document) {
|
|
|
|
var contentwin = event.target.defaultView;
|
|
|
|
if (contentwin.location.toString().indexOf("3") > 0) {
|
|
|
|
// just moved forward, so focus the urlbar and go back
|
|
|
|
gURLBar.focus();
|
|
|
|
setTimeout(function () contentwin.history.back(), 0);
|
|
|
|
}
|
|
|
|
else if (contentwin.location.toString().indexOf("2") > 0) {
|
|
|
|
is(window.document.activeElement, gURLBar.inputField, "urlbar still focused after navigating back");
|
|
|
|
gBrowser.removeCurrentTab();
|
|
|
|
gBrowser.removeCurrentTab();
|
|
|
|
finish();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 11:00:39 -07:00
|
|
|
function getId(element)
|
|
|
|
{
|
|
|
|
return (element.localName == "input") ? "urlbar" : element.id;
|
|
|
|
}
|
|
|
|
|
|
|
|
function expectFocusShift(callback, expectedWindow, expectedElement, focusChanged, testid)
|
|
|
|
{
|
|
|
|
var expectedEvents = "";
|
|
|
|
if (focusChanged) {
|
|
|
|
if (_browser_tabfocus_test_lastfocus)
|
|
|
|
expectedEvents += "blur: " + getId(_browser_tabfocus_test_lastfocus);
|
|
|
|
|
|
|
|
if (_browser_tabfocus_test_lastfocuswindow &&
|
|
|
|
_browser_tabfocus_test_lastfocuswindow != expectedWindow) {
|
|
|
|
if (expectedEvents)
|
|
|
|
expectedEvents += " ";
|
|
|
|
var windowid = _browser_tabfocus_test_lastfocuswindow.document.documentElement.id;
|
|
|
|
expectedEvents += "blur: " + windowid + "-document " +
|
|
|
|
"blur: " + windowid + "-window";
|
|
|
|
}
|
|
|
|
|
|
|
|
if (expectedWindow && _browser_tabfocus_test_lastfocuswindow != expectedWindow) {
|
|
|
|
if (expectedEvents)
|
|
|
|
expectedEvents += " ";
|
|
|
|
var windowid = expectedWindow.document.documentElement.id;
|
|
|
|
expectedEvents += "focus: " + windowid + "-document " +
|
|
|
|
"focus: " + windowid + "-window";
|
|
|
|
}
|
|
|
|
|
|
|
|
if (expectedElement) {
|
|
|
|
if (expectedEvents)
|
|
|
|
expectedEvents += " ";
|
|
|
|
expectedEvents += "focus: " + getId(expectedElement);
|
|
|
|
}
|
|
|
|
|
|
|
|
_browser_tabfocus_test_lastfocus = expectedElement;
|
|
|
|
_browser_tabfocus_test_lastfocuswindow = expectedWindow;
|
|
|
|
}
|
|
|
|
|
|
|
|
callback();
|
|
|
|
|
|
|
|
is(_browser_tabfocus_test_events, expectedEvents, testid + " events");
|
|
|
|
_browser_tabfocus_test_events = "";
|
|
|
|
|
|
|
|
var fm = Components.classes["@mozilla.org/focus-manager;1"].
|
|
|
|
getService(Components.interfaces.nsIFocusManager);
|
|
|
|
|
|
|
|
var focusedElement = fm.focusedElement;
|
|
|
|
is(focusedElement ? getId(focusedElement) : "none",
|
|
|
|
expectedElement ? getId(expectedElement) : "none", testid + " focusedElement");
|
|
|
|
is(fm.focusedWindow, expectedWindow, testid + " focusedWindow");
|
|
|
|
var focusedWindow = {};
|
|
|
|
is(fm.getFocusedElementForWindow(expectedWindow, false, focusedWindow),
|
|
|
|
expectedElement, testid + " getFocusedElementForWindow");
|
|
|
|
is(focusedWindow.value, expectedWindow, testid + " getFocusedElementForWindow frame");
|
|
|
|
is(expectedWindow.document.hasFocus(), true, testid + " hasFocus");
|
|
|
|
var expectedActive = expectedElement;
|
|
|
|
if (!expectedActive)
|
|
|
|
expectedActive = expectedWindow.document instanceof XULDocument ?
|
|
|
|
expectedWindow.document.documentElement : expectedWindow.document.body;
|
|
|
|
is(expectedWindow.document.activeElement, expectedActive, testid + " activeElement");
|
|
|
|
}
|