Bug 1284687 - Hide windows on shutdown while persisting session instead of closing them. r=billm

We were closing the windows before to improve perceived shutdown
performance, but we end up in a state where we're likely to miss
out on the last ~2 seconds of session activity for most tabs per
window. This is because we were removing the session update
message listeners and resolving the flush Promises once the
domwindowclosed notification fired for the window.

Hiding the window allows us to wait for the messages properly.

What's more, we weren't even collecting the window state after
we had flushed, so we have _always_ been missing (in the worst
case) about 2 seconds of session state per window. This addresses
that.

MozReview-Commit-ID: BEOIHV4EErf

--HG--
extra : rebase_source : a814098c0e3aa2224f5d38327c135aba986b4b80
This commit is contained in:
Mike Conley 2016-07-07 15:04:52 -04:00
parent b8f122617a
commit d23a632b4a

View File

@ -1488,22 +1488,33 @@ var SessionStoreInternal = {
* @return Promise
*/
flushAllWindowsAsync: Task.async(function*(progress={}) {
let windowPromises = [];
let windowPromises = new Map();
// We collect flush promises and close each window immediately so that
// the user can't start changing any window state while we're waiting
// for the flushes to finish.
this._forEachBrowserWindow((win) => {
windowPromises.push(TabStateFlusher.flushWindow(win));
win.close();
windowPromises.set(win, TabStateFlusher.flushWindow(win));
// We have to wait for these messages to come up from
// each window and each browser. In the meantime, hide
// the windows to improve perceived shutdown speed.
let baseWin = win.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDocShell)
.QueryInterface(Ci.nsIDocShellTreeItem)
.treeOwner
.QueryInterface(Ci.nsIBaseWindow);
baseWin.visibility = false;
});
progress.total = windowPromises.length;
progress.total = windowPromises.size;
progress.current = 0;
// We'll iterate through the Promise array, yielding each one, so as to
// provide useful progress information to AsyncShutdown.
for (let i = 0; i < windowPromises.length; ++i) {
progress.current = i;
yield windowPromises[i];
for (let [win, promise] of windowPromises) {
yield promise;
this._collectWindowData(win);
progress.current++;
};
// We must cache this because _getMostRecentBrowserWindow will always