113 const TEST_URLS = [
"about:mozilla",
"about:buildconfig"];
117 const NOTIFICATIONS_EXPECTED = 6;
120 const POPUP_FEATURES =
"toolbar=no,resizable=no,status=no";
123 const CHROME_FEATURES =
"chrome,all,dialog=no";
129 let oldWarnTabsOnClose =
gPrefService.getBoolPref(
"browser.tabs.warnOnClose");
133 "browser-lastwindow-close-requested": 0,
134 "browser-lastwindow-close-granted": 0
148 if (++this.hitCount == 1) {
150 aCancel.QueryInterface(
Ci.nsISupportsPRBool).data =
true;
161 function setPrefs() {
164 "browser.privatebrowsing.keep_current_session",
167 gPrefService.setBoolPref(
"browser.tabs.warnOnClose",
false);
173 function setupTestsuite(testFn) {
175 for (let o in observing) {
176 observerService.addObserver(observer, o,
false);
180 oldWinType = document.documentElement.getAttribute(
"windowtype");
181 document.documentElement.setAttribute(
"windowtype",
"navigator:testrunner");
187 function cleanupTestsuite(
callback) {
189 for (let o in observing) {
190 observerService.removeObserver(observer, o,
false);
193 for each (let
pref in [
194 "browser.startup.page",
195 "browser.privatebrowsing.keep_current_session"
201 gPrefService.setBoolPref(
"browser.tabs.warnOnClose", oldWarnTabsOnClose);
204 document.documentElement.setAttribute(
"windowtype", oldWinType);
210 function setupTestAndRun(testFn) {
215 let newWin = openDialog(location,
"_blank", CHROME_FEATURES,
"about:config");
216 newWin.addEventListener(
"load",
function(aEvent) {
217 newWin.removeEventListener(
"load",
arguments.callee,
false);
218 newWin.gBrowser.addEventListener(
"load",
function(aEvent) {
219 newWin.gBrowser.removeEventListener(
"load",
arguments.callee,
true);
220 for each (let
url in TEST_URLS) {
221 newWin.gBrowser.addTab(url);
224 executeSoon(
function() testFn(newWin));
233 function testOpenCloseNormal(nextFn) {
234 setupTestAndRun(
function(newWin) {
238 newWin.BrowserTryToCloseWindow();
241 ok(!newWin.closed,
"First close request was denied");
242 if (!newWin.closed) {
243 newWin.BrowserTryToCloseWindow();
244 ok(newWin.closed,
"Second close request was granted");
249 newWin = openDialog(location,
"_blank", CHROME_FEATURES);
250 newWin.addEventListener(
"load",
function() {
251 executeSoon(
function() {
252 is(newWin.gBrowser.browsers.length, TEST_URLS.length + 1,
253 "Restored window in-session with otherpopup windows around");
269 function testOpenClosePrivateBrowsing(nextFn) {
270 setupTestAndRun(
function(newWin) {
271 let
pb =
Cc[
"@mozilla.org/privatebrowsing;1"].
275 newWin.BrowserTryToCloseWindow();
278 pb.privateBrowsingEnabled =
true;
282 newWin = openDialog(location,
"_blank", CHROME_FEATURES);
283 newWin.addEventListener(
"load",
function() {
284 executeSoon(
function() {
285 is(newWin.gBrowser.browsers.length, 1,
286 "Did not restore in private browing mode");
289 newWin.BrowserTryToCloseWindow();
292 pb.privateBrowsingEnabled =
false;
294 newWin = openDialog(location,
"_blank", CHROME_FEATURES);
295 newWin.addEventListener(
"load",
function() {
296 executeSoon(
function() {
297 is(newWin.gBrowser.browsers.length, TEST_URLS.length + 1,
298 "Restored after leaving private browsing again");
316 function testOpenCloseWindowAndPopup(nextFn) {
317 setupTestAndRun(
function(newWin) {
319 let popup = openDialog(location,
"popup", POPUP_FEATURES, TEST_URLS[0]);
320 let popup2 = openDialog(location,
"popup2", POPUP_FEATURES, TEST_URLS[1]);
321 popup2.addEventListener(
"load",
function() {
322 popup2.removeEventListener(
"load",
arguments.callee,
false);
323 popup2.gBrowser.addEventListener(
"load",
function() {
324 popup2.gBrowser.removeEventListener(
"load",
arguments.callee,
true);
325 popup2.gBrowser.addTab(TEST_URLS[0]);
327 newWin.BrowserTryToCloseWindow();
335 newWin = openDialog(location,
"_blank", CHROME_FEATURES);
336 newWin.addEventListener(
"load",
function() {
337 executeSoon(
function() {
338 is(newWin.gBrowser.browsers.length, TEST_URLS.length + 1,
339 "Restored window and associated tabs in session");
359 function testOpenCloseOnlyPopup(nextFn) {
365 let popup = openDialog(location,
"popup", POPUP_FEATURES, TEST_URLS[1]);
366 popup.addEventListener(
"load",
function() {
367 is(popup.gBrowser.browsers.length, 1,
368 "Did not restore the popup window (1)");
369 popup.BrowserTryToCloseWindow();
372 popup = openDialog(location,
"popup", POPUP_FEATURES, TEST_URLS[1]);
373 popup.addEventListener(
"load",
function() {
374 popup.removeEventListener(
"load",
arguments.callee,
false);
375 popup.gBrowser.addEventListener(
"load",
function() {
376 popup.gBrowser.removeEventListener(
"load",
arguments.callee,
true);
377 popup.gBrowser.addTab(TEST_URLS[0]);
379 is(popup.gBrowser.browsers.length, 2,
380 "Did not restore to the popup window (2)");
387 let newWin = openDialog(location,
"_blank", CHROME_FEATURES,
"about:blank");
388 newWin.addEventListener(
"load",
function() {
389 newWin.removeEventListener(
"load",
arguments.callee,
true);
390 executeSoon(
function() {
391 isnot(newWin.gBrowser.browsers.length, 2,
392 "Did not restore the popup window");
393 is(TEST_URLS.indexOf(newWin.gBrowser.browsers[0].currentURI.spec), -1,
394 "Did not restore the popup window (2)");
413 function testOpenCloseRestoreFromPopup(nextFn) {
414 setupTestAndRun(
function(newWin) {
415 setupTestAndRun(
function(newWin2) {
416 newWin.BrowserTryToCloseWindow();
417 newWin2.BrowserTryToCloseWindow();
421 newWin2 = openDialog(location,
"_blank", CHROME_FEATURES);
422 newWin2.addEventListener(
"load",
function() {
423 newWin2.removeEventListener(
"load",
arguments.callee,
true);
424 executeSoon(
function() {
425 is(newWin2.gBrowser.browsers.length, 1,
426 "Did not restore, as undoCloseWindow() was last called");
427 is(TEST_URLS.indexOf(newWin2.gBrowser.browsers[0].currentURI.spec), -1,
428 "Did not restore, as undoCloseWindow() was last called (2)");
446 function testNotificationCount(nextFn) {
447 is(observing[
"browser-lastwindow-close-requested"], NOTIFICATIONS_EXPECTED,
448 "browser-lastwindow-close-requested notifications observed");
453 is(observing[
"browser-lastwindow-close-requested"],
454 observing[
"browser-lastwindow-close-granted"] + 1,
455 "Notification count for -request and -grant matches");
465 function testMacNotifications(nextFn, iteration) {
466 iteration = iteration || 1;
467 setupTestAndRun(
function(newWin) {
471 newWin.BrowserTryToCloseWindow();
472 if (iteration == 1) {
473 ok(!newWin.closed,
"First close attempt denied");
474 if (!newWin.closed) {
475 newWin.BrowserTryToCloseWindow();
476 ok(newWin.closed,
"Second close attempt granted");
480 if (iteration < NOTIFICATIONS_EXPECTED - 1) {
481 executeSoon(
function() testMacNotifications(nextFn, ++iteration));
492 if (navigator.platform.match(/Mac/)) {
494 testMacNotifications(
495 function() testNotificationCount(
496 function() cleanupTestsuite() + finish()
503 function() testOpenClosePrivateBrowsing(
504 function() testOpenCloseWindowAndPopup(
505 function() testOpenCloseOnlyPopup(
506 function() testOpenCloseRestoreFromPopup (
507 function() testNotificationCount(
508 function() cleanupTestsuite() + finish()
static nsCOMPtr< nsIObserverService > observerService
function undoCloseWindow(aIndex)
getService(Ci.sbIFaceplateManager)
return!aWindow arguments!aWindow arguments[0]
_updateTextAndScrollDataForFrame aData
sbDeviceFirmwareAutoCheckForUpdate prototype observe