forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			92 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			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/. */
 | |
| 
 | |
| const lazy = {};
 | |
| 
 | |
| ChromeUtils.defineESModuleGetters(lazy, {
 | |
|   E10SUtils: "resource://gre/modules/E10SUtils.sys.mjs",
 | |
| });
 | |
| 
 | |
| var SessionMigrationInternal = {
 | |
|   /**
 | |
|    * Convert the original session restore state into a minimal state. It will
 | |
|    * only contain:
 | |
|    * - open windows
 | |
|    *   - with tabs
 | |
|    *     - with history entries with only title, url, triggeringPrincipal
 | |
|    *     - with pinned state
 | |
|    *     - with tab group info (hidden + group id)
 | |
|    *     - with selected tab info
 | |
|    *   - with selected window info
 | |
|    *
 | |
|    * The complete state is then wrapped into the "about:welcomeback" page as
 | |
|    * form field info to be restored when restoring the state.
 | |
|    */
 | |
|   convertState(aStateObj) {
 | |
|     let state = {
 | |
|       selectedWindow: aStateObj.selectedWindow,
 | |
|       _closedWindows: [],
 | |
|     };
 | |
|     state.windows = aStateObj.windows.map(function (oldWin) {
 | |
|       var win = { extData: {} };
 | |
|       win.tabs = oldWin.tabs.map(function (oldTab) {
 | |
|         var tab = {};
 | |
|         // Keep only titles, urls and triggeringPrincipals for history entries
 | |
|         tab.entries = oldTab.entries.map(function (entry) {
 | |
|           return {
 | |
|             url: entry.url,
 | |
|             triggeringPrincipal_base64: entry.triggeringPrincipal_base64,
 | |
|             title: entry.title,
 | |
|           };
 | |
|         });
 | |
|         tab.index = oldTab.index;
 | |
|         tab.hidden = oldTab.hidden;
 | |
|         tab.pinned = oldTab.pinned;
 | |
|         return tab;
 | |
|       });
 | |
|       win.selected = oldWin.selected;
 | |
|       win._closedTabs = [];
 | |
|       return win;
 | |
|     });
 | |
|     let url = "about:welcomeback";
 | |
|     let formdata = { id: { sessionData: state }, url };
 | |
|     let entry = {
 | |
|       url,
 | |
|       triggeringPrincipal_base64: lazy.E10SUtils.SERIALIZED_SYSTEMPRINCIPAL,
 | |
|     };
 | |
|     return { windows: [{ tabs: [{ entries: [entry], formdata }] }] };
 | |
|   },
 | |
|   /**
 | |
|    * Asynchronously read session restore state (JSON) from a path
 | |
|    */
 | |
|   readState(aPath) {
 | |
|     return IOUtils.readJSON(aPath, { decompress: true });
 | |
|   },
 | |
|   /**
 | |
|    * Asynchronously write session restore state as JSON to a path
 | |
|    */
 | |
|   writeState(aPath, aState) {
 | |
|     return IOUtils.writeJSON(aPath, aState, {
 | |
|       compress: true,
 | |
|       tmpPath: `${aPath}.tmp`,
 | |
|     });
 | |
|   },
 | |
| };
 | |
| 
 | |
| export var SessionMigration = {
 | |
|   /**
 | |
|    * Migrate a limited set of session data from one path to another.
 | |
|    */
 | |
|   migrate(aFromPath, aToPath) {
 | |
|     return (async function () {
 | |
|       let inState = await SessionMigrationInternal.readState(aFromPath);
 | |
|       let outState = SessionMigrationInternal.convertState(inState);
 | |
|       // Unfortunately, we can't use SessionStore's own SessionFile to
 | |
|       // write out the data because it has a dependency on the profile dir
 | |
|       // being known. When the migration runs, there is no guarantee that
 | |
|       // that's true.
 | |
|       await SessionMigrationInternal.writeState(aToPath, outState);
 | |
|     })();
 | |
|   },
 | |
| };
 | 
