browser_beforeunload_duplicate_dialogs.js (3966B)
1 const TEST_PAGE = 2 "http://mochi.test:8888/browser/browser/components/tabbrowser/test/browser/tabs/file_double_close_tab.html"; 3 4 var expectingDialog = false; 5 var wantToClose = true; 6 var resolveDialogPromise; 7 8 function promiseOpenAndLoadWindow(aOptions, aWaitForDelayedStartup = false) { 9 return new Promise(resolve => { 10 let win = OpenBrowserWindow(aOptions); 11 if (aWaitForDelayedStartup) { 12 Services.obs.addObserver(function onDS(aSubject) { 13 if (aSubject != win) { 14 return; 15 } 16 Services.obs.removeObserver(onDS, "browser-delayed-startup-finished"); 17 resolve(win); 18 }, "browser-delayed-startup-finished"); 19 } else { 20 win.addEventListener( 21 "load", 22 function () { 23 resolve(win); 24 }, 25 { once: true } 26 ); 27 } 28 }); 29 } 30 31 function onCommonDialogLoaded(promptWindow) { 32 ok(expectingDialog, "Should be expecting this dialog."); 33 expectingDialog = false; 34 let dialog = promptWindow.Dialog; 35 if (wantToClose) { 36 // This accepts the dialog, closing it. 37 dialog.ui.button0.click(); 38 } else { 39 // This keeps the page open 40 dialog.ui.button1.click(); 41 } 42 if (resolveDialogPromise) { 43 resolveDialogPromise(); 44 } 45 } 46 47 SpecialPowers.pushPrefEnv({ 48 set: [["dom.require_user_interaction_for_beforeunload", false]], 49 }); 50 51 // Listen for the dialog being created 52 Services.obs.addObserver(onCommonDialogLoaded, "common-dialog-loaded"); 53 registerCleanupFunction(() => { 54 Services.prefs.clearUserPref("browser.tabs.warnOnClose"); 55 Services.obs.removeObserver(onCommonDialogLoaded, "common-dialog-loaded"); 56 }); 57 58 add_task(async function closeLastTabInWindow() { 59 let newWin = await promiseOpenAndLoadWindow({}, true); 60 let firstTab = newWin.gBrowser.selectedTab; 61 await BrowserTestUtils.loadURIString({ 62 browser: firstTab.linkedBrowser, 63 uriString: TEST_PAGE, 64 }); 65 let windowClosedPromise = BrowserTestUtils.domWindowClosed(newWin); 66 expectingDialog = true; 67 // close tab: 68 firstTab.closeButton.click(); 69 await windowClosedPromise; 70 ok(!expectingDialog, "There should have been a dialog."); 71 ok(newWin.closed, "Window should be closed."); 72 }); 73 74 add_task(async function closeWindowWithMultipleTabsIncludingOneBeforeUnload() { 75 Services.prefs.setBoolPref("browser.tabs.warnOnClose", false); 76 let newWin = await promiseOpenAndLoadWindow({}, true); 77 let firstTab = newWin.gBrowser.selectedTab; 78 await BrowserTestUtils.loadURIString({ 79 browser: firstTab.linkedBrowser, 80 uriString: TEST_PAGE, 81 }); 82 let secondTab = BrowserTestUtils.addTab(newWin.gBrowser); 83 await BrowserTestUtils.loadURIString({ 84 browser: secondTab.linkedBrowser, 85 // eslint-disable-next-line @microsoft/sdl/no-insecure-url 86 uriString: "http://example.com/", 87 }); 88 let windowClosedPromise = BrowserTestUtils.domWindowClosed(newWin); 89 expectingDialog = true; 90 newWin.BrowserCommands.tryToCloseWindow(); 91 await windowClosedPromise; 92 ok(!expectingDialog, "There should have been a dialog."); 93 ok(newWin.closed, "Window should be closed."); 94 Services.prefs.clearUserPref("browser.tabs.warnOnClose"); 95 }); 96 97 add_task(async function closeWindoWithSingleTabTwice() { 98 let newWin = await promiseOpenAndLoadWindow({}, true); 99 let firstTab = newWin.gBrowser.selectedTab; 100 await BrowserTestUtils.loadURIString({ 101 browser: firstTab.linkedBrowser, 102 uriString: TEST_PAGE, 103 }); 104 let windowClosedPromise = BrowserTestUtils.domWindowClosed(newWin); 105 expectingDialog = true; 106 wantToClose = false; 107 let firstDialogShownPromise = new Promise(resolve => { 108 resolveDialogPromise = resolve; 109 }); 110 firstTab.closeButton.click(); 111 await firstDialogShownPromise; 112 info("Got initial dialog, now trying again"); 113 expectingDialog = true; 114 wantToClose = true; 115 resolveDialogPromise = null; 116 firstTab.closeButton.click(); 117 await windowClosedPromise; 118 ok(!expectingDialog, "There should have been a dialog."); 119 ok(newWin.closed, "Window should be closed."); 120 });