mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-29 03:44:37 +00:00
Bug 1020831 - Make SessionStore.jsm and SessionFile.jsm share the same run state r=yoric
This commit is contained in:
parent
0628f512eb
commit
f3504d9241
66
browser/components/sessionstore/RunState.jsm
Normal file
66
browser/components/sessionstore/RunState.jsm
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
this.EXPORTED_SYMBOLS = ["RunState"];
|
||||||
|
|
||||||
|
const Cu = Components.utils;
|
||||||
|
|
||||||
|
Cu.import("resource://gre/modules/Services.jsm", this);
|
||||||
|
|
||||||
|
const STATE_STOPPED = 0;
|
||||||
|
const STATE_RUNNING = 1;
|
||||||
|
const STATE_QUITTING = 2;
|
||||||
|
|
||||||
|
// We're initially stopped.
|
||||||
|
let state = STATE_STOPPED;
|
||||||
|
|
||||||
|
function observer(subj, topic) {
|
||||||
|
Services.obs.removeObserver(observer, topic);
|
||||||
|
state = STATE_QUITTING;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Listen for when the application is quitting.
|
||||||
|
Services.obs.addObserver(observer, "quit-application-granted", false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This module keeps track of SessionStore's current run state. We will
|
||||||
|
* always start out at STATE_STOPPED. After the sessionw as read from disk and
|
||||||
|
* the initial browser window has loaded we switch to STATE_RUNNING. On the
|
||||||
|
* first notice that a browser shutdown was granted we switch to STATE_QUITTING.
|
||||||
|
*/
|
||||||
|
this.RunState = Object.freeze({
|
||||||
|
// If we're stopped then SessionStore hasn't been initialized yet. As soon
|
||||||
|
// as the session is read from disk and the initial browser window has loaded
|
||||||
|
// the run state will change to STATE_RUNNING.
|
||||||
|
get isStopped() {
|
||||||
|
return state == STATE_STOPPED;
|
||||||
|
},
|
||||||
|
|
||||||
|
// STATE_RUNNING is our default mode of operation that we'll spend most of
|
||||||
|
// the time in. After the session was read from disk and the first browser
|
||||||
|
// window has loaded we remain running until the browser quits.
|
||||||
|
get isRunning() {
|
||||||
|
return state == STATE_RUNNING;
|
||||||
|
},
|
||||||
|
|
||||||
|
// We will enter STATE_QUITTING as soon as we receive notice that a browser
|
||||||
|
// shutdown was granted. SessionStore will use this information to prevent
|
||||||
|
// us from collecting partial information while the browser is shutting down
|
||||||
|
// as well as to allow a last single write to disk and block all writes after
|
||||||
|
// that.
|
||||||
|
get isQuitting() {
|
||||||
|
return state == STATE_QUITTING;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Switch the run state to STATE_RUNNING. This must be called after the
|
||||||
|
// session was read from, the initial browser window has loaded and we're
|
||||||
|
// now ready to restore session data.
|
||||||
|
setRunning() {
|
||||||
|
if (this.isStopped) {
|
||||||
|
state = STATE_RUNNING;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
@ -38,6 +38,8 @@ Cu.import("resource://gre/modules/AsyncShutdown.jsm");
|
|||||||
|
|
||||||
XPCOMUtils.defineLazyModuleGetter(this, "console",
|
XPCOMUtils.defineLazyModuleGetter(this, "console",
|
||||||
"resource://gre/modules/devtools/Console.jsm");
|
"resource://gre/modules/devtools/Console.jsm");
|
||||||
|
XPCOMUtils.defineLazyModuleGetter(this, "RunState",
|
||||||
|
"resource:///modules/sessionstore/RunState.jsm");
|
||||||
XPCOMUtils.defineLazyModuleGetter(this, "TelemetryStopwatch",
|
XPCOMUtils.defineLazyModuleGetter(this, "TelemetryStopwatch",
|
||||||
"resource://gre/modules/TelemetryStopwatch.jsm");
|
"resource://gre/modules/TelemetryStopwatch.jsm");
|
||||||
XPCOMUtils.defineLazyModuleGetter(this, "Task",
|
XPCOMUtils.defineLazyModuleGetter(this, "Task",
|
||||||
@ -267,7 +269,7 @@ let SessionFileInternal = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let isFinalWrite = false;
|
let isFinalWrite = false;
|
||||||
if (Services.startup.shuttingDown) {
|
if (RunState.isQuitting) {
|
||||||
// If shutdown has started, we will want to stop receiving
|
// If shutdown has started, we will want to stop receiving
|
||||||
// write instructions.
|
// write instructions.
|
||||||
isFinalWrite = this._isClosed = true;
|
isFinalWrite = this._isClosed = true;
|
||||||
|
@ -11,10 +11,6 @@ const Cc = Components.classes;
|
|||||||
const Ci = Components.interfaces;
|
const Ci = Components.interfaces;
|
||||||
const Cr = Components.results;
|
const Cr = Components.results;
|
||||||
|
|
||||||
const STATE_STOPPED = 0;
|
|
||||||
const STATE_RUNNING = 1;
|
|
||||||
const STATE_QUITTING = -1;
|
|
||||||
|
|
||||||
const TAB_STATE_NEEDS_RESTORE = 1;
|
const TAB_STATE_NEEDS_RESTORE = 1;
|
||||||
const TAB_STATE_RESTORING = 2;
|
const TAB_STATE_RESTORING = 2;
|
||||||
|
|
||||||
@ -31,8 +27,7 @@ const MAX_CONCURRENT_TAB_RESTORES = 3;
|
|||||||
// global notifications observed
|
// global notifications observed
|
||||||
const OBSERVING = [
|
const OBSERVING = [
|
||||||
"browser-window-before-show", "domwindowclosed",
|
"browser-window-before-show", "domwindowclosed",
|
||||||
"quit-application-requested", "quit-application-granted",
|
"quit-application-requested", "browser-lastwindow-close-granted",
|
||||||
"browser-lastwindow-close-granted",
|
|
||||||
"quit-application", "browser:purge-session-history",
|
"quit-application", "browser:purge-session-history",
|
||||||
"browser:purge-domain-data",
|
"browser:purge-domain-data",
|
||||||
"gather-telemetry",
|
"gather-telemetry",
|
||||||
@ -112,6 +107,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "GlobalState",
|
|||||||
"resource:///modules/sessionstore/GlobalState.jsm");
|
"resource:///modules/sessionstore/GlobalState.jsm");
|
||||||
XPCOMUtils.defineLazyModuleGetter(this, "PrivacyFilter",
|
XPCOMUtils.defineLazyModuleGetter(this, "PrivacyFilter",
|
||||||
"resource:///modules/sessionstore/PrivacyFilter.jsm");
|
"resource:///modules/sessionstore/PrivacyFilter.jsm");
|
||||||
|
XPCOMUtils.defineLazyModuleGetter(this, "RunState",
|
||||||
|
"resource:///modules/sessionstore/RunState.jsm");
|
||||||
XPCOMUtils.defineLazyModuleGetter(this, "ScratchpadManager",
|
XPCOMUtils.defineLazyModuleGetter(this, "ScratchpadManager",
|
||||||
"resource:///modules/devtools/scratchpad-manager.jsm");
|
"resource:///modules/devtools/scratchpad-manager.jsm");
|
||||||
XPCOMUtils.defineLazyModuleGetter(this, "SessionSaver",
|
XPCOMUtils.defineLazyModuleGetter(this, "SessionSaver",
|
||||||
@ -288,9 +285,6 @@ let SessionStoreInternal = {
|
|||||||
Ci.nsISupportsWeakReference
|
Ci.nsISupportsWeakReference
|
||||||
]),
|
]),
|
||||||
|
|
||||||
// set default load state
|
|
||||||
_loadState: STATE_STOPPED,
|
|
||||||
|
|
||||||
_globalState: new GlobalState(),
|
_globalState: new GlobalState(),
|
||||||
|
|
||||||
// During the initial restore and setBrowserState calls tracks the number of
|
// During the initial restore and setBrowserState calls tracks the number of
|
||||||
@ -472,7 +466,7 @@ let SessionStoreInternal = {
|
|||||||
|
|
||||||
// at this point, we've as good as resumed the session, so we can
|
// at this point, we've as good as resumed the session, so we can
|
||||||
// clear the resume_session_once flag, if it's set
|
// clear the resume_session_once flag, if it's set
|
||||||
if (this._loadState != STATE_QUITTING &&
|
if (!RunState.isQuitting &&
|
||||||
this._prefBranch.getBoolPref("sessionstore.resume_session_once"))
|
this._prefBranch.getBoolPref("sessionstore.resume_session_once"))
|
||||||
this._prefBranch.setBoolPref("sessionstore.resume_session_once", false);
|
this._prefBranch.setBoolPref("sessionstore.resume_session_once", false);
|
||||||
|
|
||||||
@ -531,9 +525,6 @@ let SessionStoreInternal = {
|
|||||||
case "quit-application-requested":
|
case "quit-application-requested":
|
||||||
this.onQuitApplicationRequested();
|
this.onQuitApplicationRequested();
|
||||||
break;
|
break;
|
||||||
case "quit-application-granted":
|
|
||||||
this.onQuitApplicationGranted();
|
|
||||||
break;
|
|
||||||
case "browser-lastwindow-close-granted":
|
case "browser-lastwindow-close-granted":
|
||||||
this.onLastWindowCloseGranted();
|
this.onLastWindowCloseGranted();
|
||||||
break;
|
break;
|
||||||
@ -739,7 +730,7 @@ let SessionStoreInternal = {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// ignore windows opened while shutting down
|
// ignore windows opened while shutting down
|
||||||
if (this._loadState == STATE_QUITTING)
|
if (RunState.isQuitting)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Assign the window a unique identifier we can use to reference
|
// Assign the window a unique identifier we can use to reference
|
||||||
@ -764,8 +755,8 @@ let SessionStoreInternal = {
|
|||||||
this._windows[aWindow.__SSi].isPopup = true;
|
this._windows[aWindow.__SSi].isPopup = true;
|
||||||
|
|
||||||
// perform additional initialization when the first window is loading
|
// perform additional initialization when the first window is loading
|
||||||
if (this._loadState == STATE_STOPPED) {
|
if (RunState.isStopped) {
|
||||||
this._loadState = STATE_RUNNING;
|
RunState.setRunning();
|
||||||
SessionSaver.updateLastSaveTime();
|
SessionSaver.updateLastSaveTime();
|
||||||
|
|
||||||
// restore a crashed session resp. resume the last session if requested
|
// restore a crashed session resp. resume the last session if requested
|
||||||
@ -1008,7 +999,7 @@ let SessionStoreInternal = {
|
|||||||
let winData = this._windows[aWindow.__SSi];
|
let winData = this._windows[aWindow.__SSi];
|
||||||
|
|
||||||
// Collect window data only when *not* closed during shutdown.
|
// Collect window data only when *not* closed during shutdown.
|
||||||
if (this._loadState == STATE_RUNNING) {
|
if (RunState.isRunning) {
|
||||||
// Flush all data queued in the content script before the window is gone.
|
// Flush all data queued in the content script before the window is gone.
|
||||||
TabState.flushWindow(aWindow);
|
TabState.flushWindow(aWindow);
|
||||||
|
|
||||||
@ -1100,14 +1091,6 @@ let SessionStoreInternal = {
|
|||||||
DirtyWindows.clear();
|
DirtyWindows.clear();
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* On quit application granted
|
|
||||||
*/
|
|
||||||
onQuitApplicationGranted: function ssi_onQuitApplicationGranted() {
|
|
||||||
// freeze the data at what we've got (ignoring closing windows)
|
|
||||||
this._loadState = STATE_QUITTING;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* On last browser window close
|
* On last browser window close
|
||||||
*/
|
*/
|
||||||
@ -1141,7 +1124,6 @@ let SessionStoreInternal = {
|
|||||||
LastSession.clear();
|
LastSession.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
this._loadState = STATE_QUITTING; // just to be sure
|
|
||||||
this._uninit();
|
this._uninit();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1153,7 +1135,7 @@ let SessionStoreInternal = {
|
|||||||
// If the browser is shutting down, simply return after clearing the
|
// If the browser is shutting down, simply return after clearing the
|
||||||
// session data on disk as this notification fires after the
|
// session data on disk as this notification fires after the
|
||||||
// quit-application notification so the browser is about to exit.
|
// quit-application notification so the browser is about to exit.
|
||||||
if (this._loadState == STATE_QUITTING)
|
if (RunState.isQuitting)
|
||||||
return;
|
return;
|
||||||
LastSession.clear();
|
LastSession.clear();
|
||||||
let openWindows = {};
|
let openWindows = {};
|
||||||
@ -1179,7 +1161,7 @@ let SessionStoreInternal = {
|
|||||||
var win = this._getMostRecentBrowserWindow();
|
var win = this._getMostRecentBrowserWindow();
|
||||||
if (win) {
|
if (win) {
|
||||||
win.setTimeout(() => SessionSaver.run(), 0);
|
win.setTimeout(() => SessionSaver.run(), 0);
|
||||||
} else if (this._loadState == STATE_RUNNING) {
|
} else if (RunState.isRunning) {
|
||||||
SessionSaver.run();
|
SessionSaver.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1237,7 +1219,7 @@ let SessionStoreInternal = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._loadState == STATE_RUNNING) {
|
if (RunState.isRunning) {
|
||||||
SessionSaver.run();
|
SessionSaver.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1368,7 +1350,7 @@ let SessionStoreInternal = {
|
|||||||
* Window reference
|
* Window reference
|
||||||
*/
|
*/
|
||||||
onTabSelect: function ssi_onTabSelect(aWindow) {
|
onTabSelect: function ssi_onTabSelect(aWindow) {
|
||||||
if (this._loadState == STATE_RUNNING) {
|
if (RunState.isRunning) {
|
||||||
this._windows[aWindow.__SSi].selected = aWindow.gBrowser.tabContainer.selectedIndex;
|
this._windows[aWindow.__SSi].selected = aWindow.gBrowser.tabContainer.selectedIndex;
|
||||||
|
|
||||||
let tab = aWindow.gBrowser.selectedTab;
|
let tab = aWindow.gBrowser.selectedTab;
|
||||||
@ -2033,7 +2015,7 @@ let SessionStoreInternal = {
|
|||||||
var activeWindow = this._getMostRecentBrowserWindow();
|
var activeWindow = this._getMostRecentBrowserWindow();
|
||||||
|
|
||||||
TelemetryStopwatch.start("FX_SESSION_RESTORE_COLLECT_ALL_WINDOWS_DATA_MS");
|
TelemetryStopwatch.start("FX_SESSION_RESTORE_COLLECT_ALL_WINDOWS_DATA_MS");
|
||||||
if (this._loadState == STATE_RUNNING) {
|
if (RunState.isRunning) {
|
||||||
// update the data for all windows with activities since the last save operation
|
// update the data for all windows with activities since the last save operation
|
||||||
this._forEachBrowserWindow(function(aWindow) {
|
this._forEachBrowserWindow(function(aWindow) {
|
||||||
if (!this._isWindowLoaded(aWindow)) // window data is still in _statesToRestore
|
if (!this._isWindowLoaded(aWindow)) // window data is still in _statesToRestore
|
||||||
@ -2090,7 +2072,7 @@ let SessionStoreInternal = {
|
|||||||
//XXXzpao We should do this for _restoreLastWindow == true, but that has
|
//XXXzpao We should do this for _restoreLastWindow == true, but that has
|
||||||
// its own check for popups. c.f. bug 597619
|
// its own check for popups. c.f. bug 597619
|
||||||
if (nonPopupCount == 0 && lastClosedWindowsCopy.length > 0 &&
|
if (nonPopupCount == 0 && lastClosedWindowsCopy.length > 0 &&
|
||||||
this._loadState == STATE_QUITTING) {
|
RunState.isQuitting) {
|
||||||
// prepend the last non-popup browser window, so that if the user loads more tabs
|
// prepend the last non-popup browser window, so that if the user loads more tabs
|
||||||
// at startup we don't accidentally add them to a popup window
|
// at startup we don't accidentally add them to a popup window
|
||||||
do {
|
do {
|
||||||
@ -2155,7 +2137,7 @@ let SessionStoreInternal = {
|
|||||||
if (!this._isWindowLoaded(aWindow))
|
if (!this._isWindowLoaded(aWindow))
|
||||||
return this._statesToRestore[aWindow.__SS_restoreID];
|
return this._statesToRestore[aWindow.__SS_restoreID];
|
||||||
|
|
||||||
if (this._loadState == STATE_RUNNING) {
|
if (RunState.isRunning) {
|
||||||
this._collectWindowData(aWindow);
|
this._collectWindowData(aWindow);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2637,7 +2619,7 @@ let SessionStoreInternal = {
|
|||||||
*/
|
*/
|
||||||
restoreNextTab: function ssi_restoreNextTab() {
|
restoreNextTab: function ssi_restoreNextTab() {
|
||||||
// If we call in here while quitting, we don't actually want to do anything
|
// If we call in here while quitting, we don't actually want to do anything
|
||||||
if (this._loadState == STATE_QUITTING)
|
if (RunState.isQuitting)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Don't exceed the maximum number of concurrent tab restores.
|
// Don't exceed the maximum number of concurrent tab restores.
|
||||||
|
@ -31,6 +31,7 @@ EXTRA_JS_MODULES.sessionstore = [
|
|||||||
'PrivacyFilter.jsm',
|
'PrivacyFilter.jsm',
|
||||||
'PrivacyLevel.jsm',
|
'PrivacyLevel.jsm',
|
||||||
'RecentlyClosedTabsAndWindowsMenuUtils.jsm',
|
'RecentlyClosedTabsAndWindowsMenuUtils.jsm',
|
||||||
|
'RunState.jsm',
|
||||||
'SessionCookies.jsm',
|
'SessionCookies.jsm',
|
||||||
'SessionFile.jsm',
|
'SessionFile.jsm',
|
||||||
'SessionHistory.jsm',
|
'SessionHistory.jsm',
|
||||||
|
Loading…
Reference in New Issue
Block a user