mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-14 10:43:24 +00:00
da44ab0e02
--HG-- rename : browser/components/sessionstore/src/ContentRestore.jsm => browser/components/sessionstore/ContentRestore.jsm rename : browser/components/sessionstore/src/DocShellCapabilities.jsm => browser/components/sessionstore/DocShellCapabilities.jsm rename : browser/components/sessionstore/src/FrameTree.jsm => browser/components/sessionstore/FrameTree.jsm rename : browser/components/sessionstore/src/GlobalState.jsm => browser/components/sessionstore/GlobalState.jsm rename : browser/components/sessionstore/src/PageStyle.jsm => browser/components/sessionstore/PageStyle.jsm rename : browser/components/sessionstore/src/PrivacyFilter.jsm => browser/components/sessionstore/PrivacyFilter.jsm rename : browser/components/sessionstore/src/PrivacyLevel.jsm => browser/components/sessionstore/PrivacyLevel.jsm rename : browser/components/sessionstore/src/RecentlyClosedTabsAndWindowsMenuUtils.jsm => browser/components/sessionstore/RecentlyClosedTabsAndWindowsMenuUtils.jsm rename : browser/components/sessionstore/src/SessionCookies.jsm => browser/components/sessionstore/SessionCookies.jsm rename : browser/components/sessionstore/src/SessionFile.jsm => browser/components/sessionstore/SessionFile.jsm rename : browser/components/sessionstore/src/SessionHistory.jsm => browser/components/sessionstore/SessionHistory.jsm rename : browser/components/sessionstore/src/SessionMigration.jsm => browser/components/sessionstore/SessionMigration.jsm rename : browser/components/sessionstore/src/SessionSaver.jsm => browser/components/sessionstore/SessionSaver.jsm rename : browser/components/sessionstore/src/SessionStorage.jsm => browser/components/sessionstore/SessionStorage.jsm rename : browser/components/sessionstore/src/SessionStore.jsm => browser/components/sessionstore/SessionStore.jsm rename : browser/components/sessionstore/src/SessionWorker.js => browser/components/sessionstore/SessionWorker.js rename : browser/components/sessionstore/src/SessionWorker.jsm => browser/components/sessionstore/SessionWorker.jsm rename : browser/components/sessionstore/src/TabAttributes.jsm => browser/components/sessionstore/TabAttributes.jsm rename : browser/components/sessionstore/src/TabState.jsm => browser/components/sessionstore/TabState.jsm rename : browser/components/sessionstore/src/TabStateCache.jsm => browser/components/sessionstore/TabStateCache.jsm rename : browser/components/sessionstore/src/Utils.jsm => browser/components/sessionstore/Utils.jsm rename : browser/components/sessionstore/src/nsSessionStartup.js => browser/components/sessionstore/nsSessionStartup.js rename : browser/components/sessionstore/src/nsSessionStore.js => browser/components/sessionstore/nsSessionStore.js rename : browser/components/sessionstore/src/nsSessionStore.manifest => browser/components/sessionstore/nsSessionStore.manifest
120 lines
3.9 KiB
JavaScript
120 lines
3.9 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 = ["SessionMigration"];
|
|
|
|
const Cu = Components.utils;
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
|
|
Cu.import("resource://gre/modules/Task.jsm", this);
|
|
Cu.import("resource://gre/modules/osfile.jsm", this);
|
|
|
|
// An encoder to UTF-8.
|
|
XPCOMUtils.defineLazyGetter(this, "gEncoder", function () {
|
|
return new TextEncoder();
|
|
});
|
|
|
|
// A decoder.
|
|
XPCOMUtils.defineLazyGetter(this, "gDecoder", function () {
|
|
return new TextDecoder();
|
|
});
|
|
|
|
let 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
|
|
* - with pinned state
|
|
* - with tab group info (hidden + group id)
|
|
* - with selected tab info
|
|
* - with selected window info
|
|
* - with tabgroups info
|
|
*
|
|
* The complete state is then wrapped into the "about:welcomeback" page as
|
|
* form field info to be restored when restoring the state.
|
|
*/
|
|
convertState: function(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 and urls for history entries
|
|
tab.entries = oldTab.entries.map(function(entry) {
|
|
return {url: entry.url, title: entry.title};
|
|
});
|
|
tab.index = oldTab.index;
|
|
tab.hidden = oldTab.hidden;
|
|
tab.pinned = oldTab.pinned;
|
|
// The tabgroup info is in the extData, so we need to get it out.
|
|
if (oldTab.extData && "tabview-tab" in oldTab.extData) {
|
|
tab.extData = {"tabview-tab": oldTab.extData["tabview-tab"]};
|
|
}
|
|
return tab;
|
|
});
|
|
// There are various tabgroup-related attributes that we need to get out
|
|
// of the session restore data for the window, too.
|
|
if (oldWin.extData) {
|
|
for (let k of Object.keys(oldWin.extData)) {
|
|
if (k.startsWith("tabview-")) {
|
|
win.extData[k] = oldWin.extData[k];
|
|
}
|
|
}
|
|
}
|
|
win.selected = oldWin.selected;
|
|
win._closedTabs = [];
|
|
return win;
|
|
});
|
|
let wrappedState = {
|
|
url: "about:welcomeback",
|
|
formdata: {
|
|
id: {"sessionData": state},
|
|
xpath: {}
|
|
}
|
|
};
|
|
return {windows: [{tabs: [{entries: [wrappedState]}]}]};
|
|
},
|
|
/**
|
|
* Asynchronously read session restore state (JSON) from a path
|
|
*/
|
|
readState: function(aPath) {
|
|
return Task.spawn(function() {
|
|
let bytes = yield OS.File.read(aPath);
|
|
let text = gDecoder.decode(bytes);
|
|
let state = JSON.parse(text);
|
|
throw new Task.Result(state);
|
|
});
|
|
},
|
|
/**
|
|
* Asynchronously write session restore state as JSON to a path
|
|
*/
|
|
writeState: function(aPath, aState) {
|
|
let bytes = gEncoder.encode(JSON.stringify(aState));
|
|
return OS.File.writeAtomic(aPath, bytes, {tmpPath: aPath + ".tmp"});
|
|
}
|
|
}
|
|
|
|
let SessionMigration = {
|
|
/**
|
|
* Migrate a limited set of session data from one path to another.
|
|
*/
|
|
migrate: function(aFromPath, aToPath) {
|
|
return Task.spawn(function() {
|
|
let inState = yield 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.
|
|
yield SessionMigrationInternal.writeState(aToPath, outState);
|
|
});
|
|
}
|
|
};
|