forked from mirrors/gecko-dev
		
	 70fdad6676
			
		
	
	
		70fdad6676
		
	
	
	
	
		
			
			This should make a bit clearer that it is only starting the load, not waiting for its completion. Differential Revision: https://phabricator.services.mozilla.com/D188213
		
			
				
	
	
		
			208 lines
		
	
	
	
		
			7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
	
		
			7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| const PAGE = "http://example.com/";
 | |
| 
 | |
| /**
 | |
|  * Tests that if we initially discard a window as not interesting
 | |
|  * to save in the closed windows array, that we revisit that decision
 | |
|  * after a window flush has completed.
 | |
|  */
 | |
| add_task(async function test_add_interesting_window() {
 | |
|   // We want to suppress all non-final updates from the browser tabs
 | |
|   // so as to eliminate any racy-ness with this test.
 | |
|   await pushPrefs(["browser.sessionstore.debug.no_auto_updates", true]);
 | |
| 
 | |
|   // Depending on previous tests, we might already have some closed
 | |
|   // windows stored. We'll use its length to determine whether or not
 | |
|   // the window was added or not.
 | |
|   let initialClosedWindows = ss.getClosedWindowCount();
 | |
| 
 | |
|   // Make sure we can actually store another closed window
 | |
|   await pushPrefs([
 | |
|     "browser.sessionstore.max_windows_undo",
 | |
|     initialClosedWindows + 1,
 | |
|   ]);
 | |
| 
 | |
|   // Create a new browser window. Since the default window will start
 | |
|   // at about:blank, SessionStore should find this tab (and therefore the
 | |
|   // whole window) uninteresting, and should not initially put it into
 | |
|   // the closed windows array.
 | |
|   let newWin = await BrowserTestUtils.openNewBrowserWindow();
 | |
| 
 | |
|   let browser = newWin.gBrowser.selectedBrowser;
 | |
| 
 | |
|   // Send a message that will cause the content to change its location
 | |
|   // to someplace more interesting. We've disabled auto updates from
 | |
|   // the browser, so the parent won't know about this
 | |
|   await SpecialPowers.spawn(browser, [PAGE], async function (newPage) {
 | |
|     content.location = newPage;
 | |
|   });
 | |
| 
 | |
|   await promiseOnHistoryReplaceEntry(browser);
 | |
| 
 | |
|   // Clear out the userTypedValue so that the new window looks like
 | |
|   // it's really not worth restoring.
 | |
|   browser.userTypedValue = null;
 | |
| 
 | |
|   // Once this windowClosed Promise resolves, we should have finished
 | |
|   // the flush and revisited our decision to put this window into
 | |
|   // the closed windows array.
 | |
|   let windowClosed = BrowserTestUtils.windowClosed(newWin);
 | |
| 
 | |
|   let handled = false;
 | |
|   whenDomWindowClosedHandled(() => {
 | |
|     // SessionStore's onClose handler should have just run.
 | |
|     let currentClosedWindows = ss.getClosedWindowCount();
 | |
|     is(
 | |
|       currentClosedWindows,
 | |
|       initialClosedWindows,
 | |
|       "We should not have added the window to the closed windows array"
 | |
|     );
 | |
| 
 | |
|     handled = true;
 | |
|   });
 | |
| 
 | |
|   // Ok, let's close the window.
 | |
|   newWin.close();
 | |
| 
 | |
|   await windowClosed;
 | |
| 
 | |
|   ok(handled, "domwindowclosed should already be handled here");
 | |
| 
 | |
|   // The window flush has finished
 | |
|   let currentClosedWindows = ss.getClosedWindowCount();
 | |
|   is(
 | |
|     currentClosedWindows,
 | |
|     initialClosedWindows + 1,
 | |
|     "We should have added the window to the closed windows array"
 | |
|   );
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * Tests that if we initially store a closed window as interesting
 | |
|  * to save in the closed windows array, that we revisit that decision
 | |
|  * after a window flush has completed, and stop storing a window that
 | |
|  * we've deemed no longer interesting.
 | |
|  */
 | |
| add_task(async function test_remove_uninteresting_window() {
 | |
|   // We want to suppress all non-final updates from the browser tabs
 | |
|   // so as to eliminate any racy-ness with this test.
 | |
|   await pushPrefs(["browser.sessionstore.debug.no_auto_updates", true]);
 | |
| 
 | |
|   // Depending on previous tests, we might already have some closed
 | |
|   // windows stored. We'll use its length to determine whether or not
 | |
|   // the window was added or not.
 | |
|   let initialClosedWindows = ss.getClosedWindowCount();
 | |
| 
 | |
|   // Make sure we can actually store another closed window
 | |
|   await pushPrefs([
 | |
|     "browser.sessionstore.max_windows_undo",
 | |
|     initialClosedWindows + 1,
 | |
|   ]);
 | |
| 
 | |
|   let newWin = await BrowserTestUtils.openNewBrowserWindow();
 | |
| 
 | |
|   // Now browse the initial tab of that window to an interesting
 | |
|   // site.
 | |
|   let tab = newWin.gBrowser.selectedTab;
 | |
|   let browser = tab.linkedBrowser;
 | |
|   BrowserTestUtils.startLoadingURIString(browser, PAGE);
 | |
| 
 | |
|   await BrowserTestUtils.browserLoaded(browser, false, PAGE);
 | |
|   await TabStateFlusher.flush(browser);
 | |
| 
 | |
|   // Send a message that will cause the content to purge its
 | |
|   // history entries and make itself seem uninteresting.
 | |
|   await SpecialPowers.spawn(browser, [], async function () {
 | |
|     // Epic hackery to make this browser seem suddenly boring.
 | |
|     docShell.setCurrentURIForSessionStore(Services.io.newURI("about:blank"));
 | |
| 
 | |
|     if (!SpecialPowers.Services.appinfo.sessionHistoryInParent) {
 | |
|       let { sessionHistory } = docShell.QueryInterface(Ci.nsIWebNavigation);
 | |
|       sessionHistory.legacySHistory.purgeHistory(sessionHistory.count);
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   if (SpecialPowers.Services.appinfo.sessionHistoryInParent) {
 | |
|     let { sessionHistory } = browser.browsingContext;
 | |
|     sessionHistory.purgeHistory(sessionHistory.count);
 | |
|   }
 | |
| 
 | |
|   // Once this windowClosed Promise resolves, we should have finished
 | |
|   // the flush and revisited our decision to put this window into
 | |
|   // the closed windows array.
 | |
|   let windowClosed = BrowserTestUtils.windowClosed(newWin);
 | |
| 
 | |
|   let handled = false;
 | |
|   whenDomWindowClosedHandled(() => {
 | |
|     // SessionStore's onClose handler should have just run.
 | |
|     let currentClosedWindows = ss.getClosedWindowCount();
 | |
|     is(
 | |
|       currentClosedWindows,
 | |
|       initialClosedWindows + 1,
 | |
|       "We should have added the window to the closed windows array"
 | |
|     );
 | |
| 
 | |
|     handled = true;
 | |
|   });
 | |
| 
 | |
|   // Ok, let's close the window.
 | |
|   newWin.close();
 | |
| 
 | |
|   await windowClosed;
 | |
| 
 | |
|   ok(handled, "domwindowclosed should already be handled here");
 | |
| 
 | |
|   // The window flush has finished
 | |
|   let currentClosedWindows = ss.getClosedWindowCount();
 | |
|   is(
 | |
|     currentClosedWindows,
 | |
|     initialClosedWindows,
 | |
|     "We should have removed the window from the closed windows array"
 | |
|   );
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * Tests that when we close a window, it is immediately removed from the
 | |
|  * _windows array.
 | |
|  */
 | |
| add_task(async function test_synchronously_remove_window_state() {
 | |
|   // Depending on previous tests, we might already have some closed
 | |
|   // windows stored. We'll use its length to determine whether or not
 | |
|   // the window was added or not.
 | |
|   let state = JSON.parse(ss.getBrowserState());
 | |
|   ok(state, "Make sure we can get the state");
 | |
|   let initialWindows = state.windows.length;
 | |
| 
 | |
|   // Open a new window and send the first tab somewhere
 | |
|   // interesting.
 | |
|   let newWin = await BrowserTestUtils.openNewBrowserWindow();
 | |
|   let browser = newWin.gBrowser.selectedBrowser;
 | |
|   BrowserTestUtils.startLoadingURIString(browser, PAGE);
 | |
|   await BrowserTestUtils.browserLoaded(browser, false, PAGE);
 | |
|   await TabStateFlusher.flush(browser);
 | |
| 
 | |
|   state = JSON.parse(ss.getBrowserState());
 | |
|   is(
 | |
|     state.windows.length,
 | |
|     initialWindows + 1,
 | |
|     "The new window to be in the state"
 | |
|   );
 | |
| 
 | |
|   // Now close the window, and make sure that the window was removed
 | |
|   // from the windows list from the SessionState. We're specifically
 | |
|   // testing the case where the window is _not_ removed in between
 | |
|   // the close-initiated flush request and the flush response.
 | |
|   let windowClosed = BrowserTestUtils.windowClosed(newWin);
 | |
|   newWin.close();
 | |
| 
 | |
|   state = JSON.parse(ss.getBrowserState());
 | |
|   is(
 | |
|     state.windows.length,
 | |
|     initialWindows,
 | |
|     "The new window should have been removed from the state"
 | |
|   );
 | |
| 
 | |
|   // Wait for our window to go away
 | |
|   await windowClosed;
 | |
| });
 |