forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			99 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* 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;
 | |
| const STATE_CLOSING = 3;
 | |
| const STATE_CLOSED = 4;
 | |
| 
 | |
| // We're initially stopped.
 | |
| var 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;
 | |
|   },
 | |
| 
 | |
|   // We will enter STATE_CLOSING as soon as SessionStore is uninitialized.
 | |
|   // The SessionFile module will know that a last write will happen in this
 | |
|   // state and it can do some necessary cleanup.
 | |
|   get isClosing() {
 | |
|     return state == STATE_CLOSING;
 | |
|   },
 | |
| 
 | |
|   // We will enter STATE_CLOSED as soon as SessionFile has written to disk for
 | |
|   // the last time before shutdown and will not accept any further writes.
 | |
|   get isClosed() {
 | |
|     return state == STATE_CLOSED;
 | |
|   },
 | |
| 
 | |
|   // 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;
 | |
|     }
 | |
|   },
 | |
| 
 | |
|   // Switch the run state to STATE_CLOSING. This must be called *before* the
 | |
|   // last SessionFile.write() call so that SessionFile knows we're closing and
 | |
|   // can do some last cleanups and write a proper sessionstore.js file.
 | |
|   setClosing() {
 | |
|     if (this.isQuitting) {
 | |
|       state = STATE_CLOSING;
 | |
|     }
 | |
|   },
 | |
| 
 | |
|   // Switch the run state to STATE_CLOSED. This must be called by SessionFile
 | |
|   // after the last write to disk was accepted and no further writes will be
 | |
|   // allowed. Any writes after this stage will cause exceptions.
 | |
|   setClosed() {
 | |
|     if (this.isClosing) {
 | |
|       state = STATE_CLOSED;
 | |
|     }
 | |
|   }
 | |
| });
 | 
