зеркало из https://github.com/mozilla/gecko-dev.git
Back out bf5e32270935 (bug 627642) for tabview orange, a=bustage
This commit is contained in:
Родитель
2b11c79791
Коммит
c396cb1b15
|
@ -1404,38 +1404,18 @@ SessionStoreService.prototype = {
|
||||||
this._restoreCount = lastSessionState.windows.length;
|
this._restoreCount = lastSessionState.windows.length;
|
||||||
this._browserSetState = true;
|
this._browserSetState = true;
|
||||||
|
|
||||||
// We want to re-use the last opened window instead of opening a new one in
|
|
||||||
// the case where it's "empty" and not associated with a window in the session.
|
|
||||||
// We will do more processing via _prepWindowToRestoreInto if we need to use
|
|
||||||
// the lastWindow.
|
|
||||||
let lastWindow = this._getMostRecentBrowserWindow();
|
|
||||||
let canUseLastWindow = lastWindow &&
|
|
||||||
!lastWindow.__SS_lastSessionWindowID;
|
|
||||||
|
|
||||||
// Restore into windows or open new ones as needed.
|
// Restore into windows or open new ones as needed.
|
||||||
for (let i = 0; i < lastSessionState.windows.length; i++) {
|
for (let i = 0; i < lastSessionState.windows.length; i++) {
|
||||||
let winState = lastSessionState.windows[i];
|
let winState = lastSessionState.windows[i];
|
||||||
let lastSessionWindowID = winState.__lastSessionWindowID;
|
let lastSessionWindowID = winState.__lastSessionWindowID;
|
||||||
// delete lastSessionWindowID so we don't add that to the window again
|
// delete lastSessionWindowID so we don't add that to the window again
|
||||||
delete winState.__lastSessionWindowID;
|
delete winState.__lastSessionWindowID;
|
||||||
|
// Look to see if this window is already open...
|
||||||
// See if we can use an open window. First try one that is associated with
|
if (windows[lastSessionWindowID]) {
|
||||||
// the state we're trying to restore and then fallback to the last selected
|
|
||||||
// window.
|
|
||||||
let windowToUse = windows[lastSessionWindowID];
|
|
||||||
if (!windowToUse && canUseLastWindow) {
|
|
||||||
windowToUse = lastWindow;
|
|
||||||
canUseLastWindow = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
let [canUseWindow, canOverwriteTabs] = this._prepWindowToRestoreInto(windowToUse);
|
|
||||||
|
|
||||||
// If there's a window already open that we can restore into, use that
|
|
||||||
if (canUseWindow) {
|
|
||||||
// Since we're not overwriting existing tabs, we want to merge _closedTabs,
|
// Since we're not overwriting existing tabs, we want to merge _closedTabs,
|
||||||
// putting existing ones first. Then make sure we're respecting the max pref.
|
// putting existing ones first. Then make sure we're respecting the max pref.
|
||||||
if (winState._closedTabs && winState._closedTabs.length) {
|
if (winState._closedTabs && winState._closedTabs.length) {
|
||||||
let curWinState = this._windows[windowToUse.__SSi];
|
let curWinState = this._windows[windows[lastSessionWindowID].__SSi];
|
||||||
curWinState._closedTabs = curWinState._closedTabs.concat(winState._closedTabs);
|
curWinState._closedTabs = curWinState._closedTabs.concat(winState._closedTabs);
|
||||||
curWinState._closedTabs.splice(this._prefBranch.getIntPref("sessionstore.max_tabs_undo"));
|
curWinState._closedTabs.splice(this._prefBranch.getIntPref("sessionstore.max_tabs_undo"));
|
||||||
}
|
}
|
||||||
|
@ -1443,11 +1423,11 @@ SessionStoreService.prototype = {
|
||||||
// Restore into that window - pretend it's a followup since we'll already
|
// Restore into that window - pretend it's a followup since we'll already
|
||||||
// have a focused window.
|
// have a focused window.
|
||||||
//XXXzpao This is going to merge extData together (taking what was in
|
//XXXzpao This is going to merge extData together (taking what was in
|
||||||
// winState over what is in the window already. The hack we have
|
// winState over what is in the window already), so this is going
|
||||||
// in _preWindowToRestoreInto will prevent most (all?) Panorama
|
// to have an effect on Tab Candy.
|
||||||
// weirdness but we will still merge other extData.
|
|
||||||
// Bug 588217 should make this go away by merging the group data.
|
// Bug 588217 should make this go away by merging the group data.
|
||||||
this.restoreWindow(windowToUse, { windows: [winState] }, canOverwriteTabs, true);
|
this.restoreWindow(windows[lastSessionWindowID], { windows: [winState] },
|
||||||
|
false, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this._openWindowWithState({ windows: [winState] });
|
this._openWindowWithState({ windows: [winState] });
|
||||||
|
@ -1466,80 +1446,6 @@ SessionStoreService.prototype = {
|
||||||
this._lastSessionState = null;
|
this._lastSessionState = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See if aWindow is usable for use when restoring a previous session via
|
|
||||||
* restoreLastSession. If usable, prepare it for use.
|
|
||||||
*
|
|
||||||
* @param aWindow
|
|
||||||
* the window to inspect & prepare
|
|
||||||
* @returns [canUseWindow, canOverwriteTabs]
|
|
||||||
* canUseWindow: can the window be used to restore into
|
|
||||||
* canOverwriteTabs: all of the current tabs are home pages and we
|
|
||||||
* can overwrite them
|
|
||||||
*/
|
|
||||||
_prepWindowToRestoreInto: function sss__prepWindowToRestoreInto(aWindow) {
|
|
||||||
if (!aWindow)
|
|
||||||
return [false, false];
|
|
||||||
|
|
||||||
// We might be able to overwrite the existing tabs instead of just adding
|
|
||||||
// the previous session's tabs to the end. This will be set if possible.
|
|
||||||
let canOverwriteTabs = false;
|
|
||||||
|
|
||||||
// Step 1 of processing:
|
|
||||||
// Inspect extData for Panorama identifiers. If found, then we want to
|
|
||||||
// inspect further. If there is a single group, then we can use this
|
|
||||||
// window. If there are multiple groups then we won't use this window.
|
|
||||||
let data = this.getWindowValue(aWindow, "tabview-group");
|
|
||||||
if (data) {
|
|
||||||
data = JSON.parse(data);
|
|
||||||
|
|
||||||
// Multiple keys means multiple groups, which means we don't want to use this window.
|
|
||||||
if (Object.keys(data).length > 1) {
|
|
||||||
return [false, false];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// If there is only one group, then we want to ensure that its group id
|
|
||||||
// is 0. This is how Panorama forces group merging when new tabs are opened.
|
|
||||||
//XXXzpao This is a hack and the proper fix really belongs in Panorama.
|
|
||||||
let groupKey = Object.keys(data)[0];
|
|
||||||
if (groupKey !== "0") {
|
|
||||||
data["0"] = data[groupKey];
|
|
||||||
delete data[groupKey];
|
|
||||||
this.setWindowValue(aWindow, "tabview-groups", JSON.stringify(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Step 2 of processing:
|
|
||||||
// If we're still here, then the window is usable. Look at the open tabs in
|
|
||||||
// comparison to home pages. If all the tabs are home pages then we'll end
|
|
||||||
// up overwriting all of them. Otherwise we'll just close the tabs that
|
|
||||||
// match home pages.
|
|
||||||
let homePages = aWindow.gHomeButton.getHomePage().split("|");
|
|
||||||
let removableTabs = [];
|
|
||||||
let tabbrowser = aWindow.gBrowser;
|
|
||||||
let normalTabsLen = tabbrowser.tabs.length - tabbrowser._numPinnedTabs;
|
|
||||||
for (let i = tabbrowser._numPinnedTabs; i < tabbrowser.tabs.length; i++) {
|
|
||||||
let tab = tabbrowser.tabs[i];
|
|
||||||
if (homePages.indexOf(tab.linkedBrowser.currentURI.spec) != -1) {
|
|
||||||
removableTabs.push(tab);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tabbrowser.tabs.length == removableTabs.length) {
|
|
||||||
canOverwriteTabs = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// If we're not overwriting all of the tabs, then close the home tabs.
|
|
||||||
for (let i = removableTabs.length - 1; i >= 0; i--) {
|
|
||||||
tabbrowser.removeTab(removableTabs.pop(), { animate: false });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return [true, canOverwriteTabs];
|
|
||||||
},
|
|
||||||
|
|
||||||
/* ........ Saving Functionality .............. */
|
/* ........ Saving Functionality .............. */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2522,11 +2428,6 @@ SessionStoreService.prototype = {
|
||||||
this.restoreHistoryPrecursor(aWindow, tabs, winData.tabs,
|
this.restoreHistoryPrecursor(aWindow, tabs, winData.tabs,
|
||||||
(aOverwriteTabs ? (parseInt(winData.selected) || 1) : 0), 0, 0);
|
(aOverwriteTabs ? (parseInt(winData.selected) || 1) : 0), 0, 0);
|
||||||
|
|
||||||
// This will force the keypress listener that Panorama has to attach if it
|
|
||||||
// isn't already. This will be the case if tab view wasn't entered or there
|
|
||||||
// were only visible tabs when TabView.init was first called.
|
|
||||||
aWindow.TabView.init();
|
|
||||||
|
|
||||||
// set smoothScroll back to the original value
|
// set smoothScroll back to the original value
|
||||||
tabstrip.smoothScroll = smoothScroll;
|
tabstrip.smoothScroll = smoothScroll;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче