author | Mike Conley <mconley@mozilla.com> |
Thu, 07 Jul 2016 15:04:52 -0400 | |
changeset 304246 | 51efc2643b800dc65e759ba97e70f585392e413e |
parent 304245 | 09595a7eabf2948a11a5fa15ded540b708e827b9 |
child 304247 | 4287a45df22d86765e15561a8834f6f3d00c24ec |
push id | 30525 |
push user | mconley@mozilla.com |
push date | Fri, 08 Jul 2016 22:26:02 +0000 |
treeherder | autoland@51efc2643b80 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | billm |
bugs | 1284687 |
milestone | 50.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/browser/components/sessionstore/SessionStore.jsm +++ b/browser/components/sessionstore/SessionStore.jsm @@ -1483,32 +1483,43 @@ var SessionStoreInternal = { * total (int): * The total number of windows to be flushed. * current (int): * The current window that we're waiting for a flush on. * * @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 // return null by the time quit-application occurs. var activeWindow = this._getMostRecentBrowserWindow(); if (activeWindow) this.activeWindowSSiCache = activeWindow.__SSi || ""; DirtyWindows.clear();