Bug 1222490 - part 2: remove traces of tabview from XUL/XBL/JS in other parts of browser/, r=ttaubert

This commit is contained in:
Gijs Kruitbosch 2015-12-01 10:48:11 +00:00
parent 84c88f298f
commit 08741b2ce2
11 changed files with 15 additions and 602 deletions

View File

@ -82,7 +82,6 @@
<command id="Browser:NextTab" oncommand="gBrowser.tabContainer.advanceSelectedTab(1, true);" reserved="true"/>
<command id="Browser:PrevTab" oncommand="gBrowser.tabContainer.advanceSelectedTab(-1, true);" reserved="true"/>
<command id="Browser:ShowAllTabs" oncommand="allTabs.open();"/>
<command id="Browser:ToggleTabView" oncommand="TabView.toggle();"/>
<command id="cmd_fullZoomReduce" oncommand="FullZoom.reduce()"/>
<command id="cmd_fullZoomEnlarge" oncommand="FullZoom.enlarge()"/>
<command id="cmd_fullZoomReset" oncommand="FullZoom.reset()"/>
@ -178,7 +177,6 @@
<broadcaster id="isFrameImage"/>
<broadcaster id="singleFeedMenuitemState" disabled="true"/>
<broadcaster id="multipleFeedsMenuState" hidden="true"/>
<broadcaster id="tabviewGroupsNumber" groups="1"/>
<broadcaster id="sync-setup-state"/>
<broadcaster id="sync-syncnow-state" hidden="true"/>
<broadcaster id="sync-reauth-state" hidden="true"/>
@ -428,8 +426,6 @@
<key id="key_switchTextDirection" key="&bidiSwitchTextDirectionItem.commandkey;" command="cmd_switchTextDirection" modifiers="accel,shift" />
<key id="key_tabview" key="&tabView.commandkey;" command="Browser:ToggleTabView" modifiers="accel,shift"/>
<key id="key_privatebrowsing" command="Tools:PrivateBrowsing" key="&privateBrowsingCmd.commandkey;" modifiers="accel,shift"/>
<key id="key_sanitize" command="Tools:Sanitize" keycode="VK_DELETE" modifiers="accel,shift"/>
#ifdef XP_MACOSX

View File

@ -1,490 +0,0 @@
/* 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/. */
var TabView = {
_deck: null,
_iframe: null,
_window: null,
_initialized: false,
_browserKeyHandlerInitialized: false,
_closedLastVisibleTabBeforeFrameInitialized: false,
_isFrameLoading: false,
_initFrameCallbacks: [],
PREF_BRANCH: "browser.panorama.",
PREF_FIRST_RUN: "browser.panorama.experienced_first_run",
PREF_STARTUP_PAGE: "browser.startup.page",
PREF_RESTORE_ENABLED_ONCE: "browser.panorama.session_restore_enabled_once",
GROUPS_IDENTIFIER: "tabview-groups",
VISIBILITY_IDENTIFIER: "tabview-visibility",
// ----------
get windowTitle() {
delete this.windowTitle;
let brandBundle = document.getElementById("bundle_brand");
let brandShortName = brandBundle.getString("brandShortName");
let title = gNavigatorBundle.getFormattedString("tabview.title", [brandShortName]);
return this.windowTitle = title;
},
// ----------
get firstUseExperienced() {
let pref = this.PREF_FIRST_RUN;
if (Services.prefs.prefHasUserValue(pref))
return Services.prefs.getBoolPref(pref);
return false;
},
// ----------
set firstUseExperienced(val) {
Services.prefs.setBoolPref(this.PREF_FIRST_RUN, val);
},
// ----------
get sessionRestoreEnabledOnce() {
let pref = this.PREF_RESTORE_ENABLED_ONCE;
if (Services.prefs.prefHasUserValue(pref))
return Services.prefs.getBoolPref(pref);
return false;
},
// ----------
set sessionRestoreEnabledOnce(val) {
Services.prefs.setBoolPref(this.PREF_RESTORE_ENABLED_ONCE, val);
},
// ----------
init: function TabView_init() {
// disable the ToggleTabView command for popup windows
goSetCommandEnabled("Browser:ToggleTabView", window.toolbar.visible);
if (!window.toolbar.visible)
return;
if (this._initialized)
return;
if (this.firstUseExperienced) {
// ___ visibility
let data = SessionStore.getWindowValue(window, this.VISIBILITY_IDENTIFIER);
if (data && data == "true") {
this.show();
} else {
try {
data = SessionStore.getWindowValue(window, this.GROUPS_IDENTIFIER);
if (data) {
let parsedData = JSON.parse(data);
this.updateGroupNumberBroadcaster(parsedData.totalNumber || 1);
}
} catch (e) { }
let self = this;
// if a tab is changed from hidden to unhidden and the iframe is not
// initialized, load the iframe and setup the tab.
this._tabShowEventListener = function(event) {
if (!self._window)
self._initFrame(function() {
self._window.UI.onTabSelect(gBrowser.selectedTab);
if (self._closedLastVisibleTabBeforeFrameInitialized) {
self._closedLastVisibleTabBeforeFrameInitialized = false;
self._window.UI.showTabView(false);
}
});
};
this._tabCloseEventListener = function(event) {
if (!self._window && gBrowser.visibleTabs.length == 0)
self._closedLastVisibleTabBeforeFrameInitialized = true;
};
gBrowser.tabContainer.addEventListener(
"TabShow", this._tabShowEventListener, false);
gBrowser.tabContainer.addEventListener(
"TabClose", this._tabCloseEventListener, false);
if (this._tabBrowserHasHiddenTabs()) {
this._setBrowserKeyHandlers();
} else {
// for restoring last session and undoing recently closed window
this._SSWindowStateReadyListener = function (event) {
if (this._tabBrowserHasHiddenTabs())
this._setBrowserKeyHandlers();
}.bind(this);
window.addEventListener(
"SSWindowStateReady", this._SSWindowStateReadyListener, false);
}
}
}
Services.prefs.addObserver(this.PREF_BRANCH, this, false);
this._initialized = true;
},
// ----------
// Observes topic changes.
observe: function TabView_observe(subject, topic, data) {
if (data == this.PREF_FIRST_RUN && this.firstUseExperienced) {
this._addToolbarButton();
this.enableSessionRestore();
}
},
// ----------
// Uninitializes TabView.
uninit: function TabView_uninit() {
if (!this._initialized)
return;
Services.prefs.removeObserver(this.PREF_BRANCH, this);
if (this._tabShowEventListener)
gBrowser.tabContainer.removeEventListener(
"TabShow", this._tabShowEventListener, false);
if (this._tabCloseEventListener)
gBrowser.tabContainer.removeEventListener(
"TabClose", this._tabCloseEventListener, false);
if (this._SSWindowStateReadyListener)
window.removeEventListener(
"SSWindowStateReady", this._SSWindowStateReadyListener, false);
this._initialized = false;
if (this._window) {
this._window = null;
}
if (this._iframe) {
this._iframe.remove();
this._iframe = null;
}
},
// ----------
// Creates the frame and calls the callback once it's loaded.
// If the frame already exists, calls the callback immediately.
_initFrame: function TabView__initFrame(callback) {
let hasCallback = typeof callback == "function";
// prevent frame to be initialized for popup windows
if (!window.toolbar.visible)
return;
if (this._window) {
if (hasCallback)
callback();
return;
}
if (hasCallback)
this._initFrameCallbacks.push(callback);
if (this._isFrameLoading)
return;
this._isFrameLoading = true;
TelemetryStopwatch.start("PANORAMA_INITIALIZATION_TIME_MS");
// ___ find the deck
this._deck = document.getElementById("tab-view-deck");
// ___ create the frame
this._iframe = document.createElement("iframe");
this._iframe.id = "tab-view";
this._iframe.setAttribute("transparent", "true");
this._iframe.setAttribute("tooltip", "tab-view-tooltip");
this._iframe.flex = 1;
let self = this;
window.addEventListener("tabviewframeinitialized", function onInit() {
window.removeEventListener("tabviewframeinitialized", onInit, false);
TelemetryStopwatch.finish("PANORAMA_INITIALIZATION_TIME_MS");
self._isFrameLoading = false;
self._window = self._iframe.contentWindow;
self._setBrowserKeyHandlers();
if (self._tabShowEventListener) {
gBrowser.tabContainer.removeEventListener(
"TabShow", self._tabShowEventListener, false);
self._tabShowEventListener = null;
}
if (self._tabCloseEventListener) {
gBrowser.tabContainer.removeEventListener(
"TabClose", self._tabCloseEventListener, false);
self._tabCloseEventListener = null;
}
if (self._SSWindowStateReadyListener) {
window.removeEventListener(
"SSWindowStateReady", self._SSWindowStateReadyListener, false);
self._SSWindowStateReadyListener = null;
}
self._initFrameCallbacks.forEach(cb => cb());
self._initFrameCallbacks = [];
}, false);
this._iframe.setAttribute("src", "chrome://browser/content/tabview.html");
this._deck.appendChild(this._iframe);
// ___ create tooltip
let tooltip = document.createElement("tooltip");
tooltip.id = "tab-view-tooltip";
tooltip.setAttribute("onpopupshowing", "return TabView.fillInTooltip(document.tooltipNode);");
document.getElementById("mainPopupSet").appendChild(tooltip);
},
// ----------
getContentWindow: function TabView_getContentWindow() {
return this._window;
},
// ----------
isVisible: function TabView_isVisible() {
return (this._deck ? this._deck.selectedPanel == this._iframe : false);
},
// ----------
show: function TabView_show() {
if (this.isVisible())
return;
let self = this;
this._initFrame(function() {
self._window.UI.showTabView(true);
});
},
// ----------
hide: function TabView_hide() {
if (this.isVisible() && this._window) {
this._window.UI.exit();
}
},
// ----------
toggle: function TabView_toggle() {
if (this.isVisible())
this.hide();
else
this.show();
},
// ----------
_tabBrowserHasHiddenTabs: function TabView_tabBrowserHasHiddenTabs() {
return (gBrowser.tabs.length - gBrowser.visibleTabs.length) > 0;
},
// ----------
updateContextMenu: function TabView_updateContextMenu(tab, popup) {
let separator = document.getElementById("context_tabViewNamedGroups");
let isEmpty = true;
while (popup.firstChild && popup.firstChild != separator)
popup.removeChild(popup.firstChild);
let self = this;
this._initFrame(function() {
let activeGroup = tab._tabViewTabItem.parent;
let groupItems = self._window.GroupItems.groupItems;
groupItems.forEach(function(groupItem) {
// if group has title, it's not hidden and there is no active group or
// the active group id doesn't match the group id, a group menu item
// would be added.
if (!groupItem.hidden &&
(groupItem.getTitle().trim() || groupItem.getChildren().length) &&
(!activeGroup || activeGroup.id != groupItem.id)) {
let menuItem = self._createGroupMenuItem(groupItem);
popup.insertBefore(menuItem, separator);
isEmpty = false;
}
});
separator.hidden = isEmpty;
});
},
// ----------
_createGroupMenuItem: function TabView__createGroupMenuItem(groupItem) {
let menuItem = document.createElement("menuitem");
let title = groupItem.getTitle();
if (!title.trim()) {
let topChildLabel = groupItem.getTopChild().tab.label;
let childNum = groupItem.getChildren().length;
if (childNum > 1) {
let num = childNum - 1;
title =
gNavigatorBundle.getString("tabview.moveToUnnamedGroup.label");
title = PluralForm.get(num, title).replace("#1", topChildLabel).replace("#2", num);
} else {
title = topChildLabel;
}
}
menuItem.setAttribute("label", title);
menuItem.setAttribute("tooltiptext", title);
menuItem.setAttribute("crop", "center");
menuItem.setAttribute("class", "tabview-menuitem");
menuItem.setAttribute(
"oncommand",
"TabView.moveTabTo(TabContextMenu.contextTab,'" + groupItem.id + "')");
return menuItem;
},
// ----------
moveTabTo: function TabView_moveTabTo(tab, groupItemId) {
if (this._window) {
this._window.GroupItems.moveTabToGroupItem(tab, groupItemId);
} else {
let self = this;
this._initFrame(function() {
self._window.GroupItems.moveTabToGroupItem(tab, groupItemId);
});
}
},
// ----------
// Adds new key commands to the browser, for invoking the Tab Candy UI
// and for switching between groups of tabs when outside of the Tab Candy UI.
_setBrowserKeyHandlers: function TabView__setBrowserKeyHandlers() {
if (this._browserKeyHandlerInitialized)
return;
this._browserKeyHandlerInitialized = true;
let self = this;
window.addEventListener("keypress", function(event) {
if (self.isVisible() || !self._tabBrowserHasHiddenTabs())
return;
let charCode = event.charCode;
// Control (+ Shift) + `
if (event.ctrlKey && !event.metaKey && !event.altKey &&
(charCode == 96 || charCode == 126)) {
event.stopPropagation();
event.preventDefault();
self._initFrame(function() {
let groupItems = self._window.GroupItems;
let tabItem = groupItems.getNextGroupItemTab(event.shiftKey);
if (!tabItem)
return;
if (gBrowser.selectedTab.pinned)
groupItems.updateActiveGroupItemAndTabBar(tabItem, {dontSetActiveTabInGroup: true});
else
gBrowser.selectedTab = tabItem.tab;
});
}
}, true);
},
// ----------
// Prepares the tab view for undo close tab.
prepareUndoCloseTab: function TabView_prepareUndoCloseTab(blankTabToRemove) {
if (this._window) {
this._window.UI.restoredClosedTab = true;
if (blankTabToRemove && blankTabToRemove._tabViewTabItem)
blankTabToRemove._tabViewTabItem.isRemovedAfterRestore = true;
}
},
// ----------
// Cleans up the tab view after undo close tab.
afterUndoCloseTab: function TabView_afterUndoCloseTab() {
if (this._window)
this._window.UI.restoredClosedTab = false;
},
// ----------
// On move to group pop showing.
moveToGroupPopupShowing: function TabView_moveToGroupPopupShowing(event) {
// Update the context menu only if Panorama was already initialized or if
// there are hidden tabs.
let numHiddenTabs = gBrowser.tabs.length - gBrowser.visibleTabs.length;
if (this._window || numHiddenTabs > 0)
this.updateContextMenu(TabContextMenu.contextTab, event.target);
},
// ----------
// Function: _addToolbarButton
// Adds the TabView button to the TabsToolbar.
_addToolbarButton: function TabView__addToolbarButton() {
let buttonId = "tabview-button";
if (CustomizableUI.getPlacementOfWidget(buttonId))
return;
let allTabsBtnPlacement = CustomizableUI.getPlacementOfWidget("alltabs-button");
// allTabsBtnPlacement can never be null because the button isn't removable
let desiredPosition = allTabsBtnPlacement.position + 1;
CustomizableUI.addWidgetToArea(buttonId, "TabsToolbar", desiredPosition);
// NB: this is for backwards compatibility, and should be removed by
// https://bugzilla.mozilla.org/show_bug.cgi?id=976041
document.persist("TabsToolbar", "currentset");
},
// ----------
// Function: updateGroupNumberBroadcaster
// Updates the group number broadcaster.
updateGroupNumberBroadcaster: function TabView_updateGroupNumberBroadcaster(number) {
let groupsNumber = document.getElementById("tabviewGroupsNumber");
groupsNumber.setAttribute("groups", number);
},
// ----------
// Function: enableSessionRestore
// Enables automatic session restore when the browser is started. Does
// nothing if we already did that once in the past.
enableSessionRestore: function TabView_enableSessionRestore() {
if (!this._window || !this.firstUseExperienced)
return;
// do nothing if we already enabled session restore once
if (this.sessionRestoreEnabledOnce)
return;
this.sessionRestoreEnabledOnce = true;
// enable session restore if necessary
if (Services.prefs.getIntPref(this.PREF_STARTUP_PAGE) != 3) {
Services.prefs.setIntPref(this.PREF_STARTUP_PAGE, 3);
// show banner
this._window.UI.notifySessionRestoreEnabled();
}
},
// ----------
// Function: fillInTooltip
// Fills in the tooltip text.
fillInTooltip: function fillInTooltip(tipElement) {
let retVal = false;
let titleText = null;
let direction = tipElement.ownerDocument.dir;
while (!titleText && tipElement) {
if (tipElement.nodeType == Node.ELEMENT_NODE)
titleText = tipElement.getAttribute("title");
tipElement = tipElement.parentNode;
}
let tipNode = document.getElementById("tab-view-tooltip");
tipNode.style.direction = direction;
if (titleText) {
tipNode.setAttribute("label", titleText);
retVal = true;
}
return retVal;
}
};

View File

@ -1388,7 +1388,6 @@ var gBrowserInit = {
RestoreLastSessionObserver.init();
SocialUI.init();
TabView.init();
// Telemetry for master-password - we do this after 5 seconds as it
// can cause IO if NSS/PSM has not already initialized.
@ -1509,7 +1508,6 @@ var gBrowserInit = {
gPrefService.removeObserver(ctrlTab.prefName, ctrlTab);
ctrlTab.uninit();
TabView.uninit();
SocialUI.uninit();
gBrowserThumbnails.uninit();
FullZoom.destroy();
@ -1564,7 +1562,7 @@ var gBrowserInit = {
'viewToolbarsMenu', 'viewSidebarMenuMenu', 'Browser:Reload',
'viewFullZoomMenu', 'pageStyleMenu', 'charsetMenu', 'View:PageSource', 'View:FullScreen',
'viewHistorySidebar', 'Browser:AddBookmarkAs', 'Browser:BookmarkAllTabs',
'View:PageInfo', 'Browser:ToggleTabView'];
'View:PageInfo'];
var element;
for (let disabledItem of disabledItems) {
@ -5521,7 +5519,6 @@ const nodeToTooltipMap = {
"new-tab-button": "newTabButton.tooltip",
"tabs-newtab-button": "newTabButton.tooltip",
"fullscreen-button": "fullscreenButton.tooltip",
"tabview-button": "tabviewButton.tooltip",
"downloads-button": "downloads.tooltip",
};
const nodeToShortcutMap = {
@ -5533,7 +5530,6 @@ const nodeToShortcutMap = {
"new-tab-button": "key_newNavigatorTab",
"tabs-newtab-button": "key_newNavigatorTab",
"fullscreen-button": "key_fullScreen",
"tabview-button": "key_tabview",
"downloads-button": "key_openDownloads"
};
const gDynamicTooltipCache = new Map();
@ -6534,11 +6530,6 @@ function CanCloseWindow()
function WindowIsClosing()
{
if (TabView.isVisible()) {
TabView.hide();
return false;
}
if (!closeWindow(false, warnAboutClosingWindow))
return false;
@ -6758,9 +6749,7 @@ function undoCloseTab(aIndex) {
var tab = null;
if (SessionStore.getClosedTabCount(window) > (aIndex || 0)) {
TabView.prepareUndoCloseTab(blankTabToRemove);
tab = SessionStore.undoCloseTab(window, aIndex || 0);
TabView.afterUndoCloseTab();
if (blankTabToRemove)
gBrowser.removeTab(blankTabToRemove);
@ -7854,10 +7843,6 @@ var TabContextMenu = {
if (!bookmarkAllTabs.hidden)
PlacesCommandHook.updateBookmarkAllTabsCommand();
// Hide "Move to Group" if it's a pinned tab.
document.getElementById("context_tabViewMenu").hidden =
(this.contextTab.pinned || !TabView.firstUseExperienced);
// Adjust the state of the toggle mute menu item.
let toggleMute = document.getElementById("context_toggleMuteTab");
if (this.contextTab.hasAttribute("muted")) {

View File

@ -91,15 +91,6 @@
<menuitem id="context_unpinTab" label="&unpinTab.label;" hidden="true"
accesskey="&unpinTab.accesskey;"
oncommand="gBrowser.unpinTab(TabContextMenu.contextTab);"/>
<menu id="context_tabViewMenu" label="&moveToGroup.label;"
accesskey="&moveToGroup.accesskey;">
<menupopup id="context_tabViewMenuPopup"
onpopupshowing="if (event.target == this) TabView.moveToGroupPopupShowing(event);">
<menuseparator id="context_tabViewNamedGroups" hidden="true"/>
<menuitem id="context_tabViewNewGroup" label="&moveToNewGroup.label;"
oncommand="TabView.moveTabTo(TabContextMenu.contextTab, null);"/>
</menupopup>
</menu>
<menuitem id="context_openTabInWindow" label="&moveToNewWindow.label;"
accesskey="&moveToNewWindow.accesskey;"
tbattr="tabbrowser-multiple"
@ -590,12 +581,6 @@
removable="false">
<menupopup id="alltabs-popup"
position="after_end">
<menuitem id="menu_tabview"
class="menuitem-iconic"
key="key_tabview"
label="&viewTabGroups.label;"
command="Browser:ToggleTabView"
observes="tabviewGroupsNumber"/>
<menuitem id="alltabs_undoCloseTab"
class="menuitem-iconic"
key="key_undoCloseTab"
@ -1058,12 +1043,6 @@
class="toolbarbutton-1 chromeclass-toolbar-additional"
label="&syncToolbarButton.label;"
oncommand="gSyncUI.handleToolbarButton()"/>
<toolbarbutton id="tabview-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
label="&tabGroupsButton.label;"
command="Browser:ToggleTabView"
tooltip="dynamic-shortcut-tooltip"
observes="tabviewGroupsNumber"/>
</toolbarpalette>
</toolbox>

View File

@ -56,8 +56,7 @@ var gChatWindow = {
'key_selectTab4', 'key_selectTab5', 'key_selectTab6',
'key_selectTab7', 'key_selectTab8', 'key_selectLastTab',
'viewHistorySidebar', 'viewBookmarksSidebar',
'Browser:AddBookmarkAs', 'Browser:BookmarkAllTabs',
'Browser:ToggleTabView'];
'Browser:AddBookmarkAs', 'Browser:BookmarkAllTabs'];
for (let disabledItem of disabledItems) {
document.getElementById(disabledItem).setAttribute("disabled", "true");

View File

@ -1007,14 +1007,7 @@
<method name="updateTitlebar">
<body>
<![CDATA[
if ("TabView" in window && TabView.isVisible()) {
// ToDo: this will be removed when we gain ability to draw to the menu bar.
// Bug 586175
this.ownerDocument.title = TabView.windowTitle;
}
else {
this.ownerDocument.title = this.getWindowTitleForBrowser(this.mCurrentBrowser);
}
this.ownerDocument.title = this.getWindowTitleForBrowser(this.mCurrentBrowser);
]]>
</body>
</method>
@ -4374,11 +4367,9 @@
if (tabForEvent.selected)
return;
// If this is a tabprompt, and we're not in tabview/panorama with
// the prompt being a beforeunload one, we won't switch tabs
// (unless this behaviour has been disabled entirely using the pref).
// If this is a tabprompt, we won't switch tabs
// (unless this behaviour has been disabled entirely using the pref)
if (event.detail && event.detail.tabPrompt &&
!(event.detail.inPermitUnload && ("TabView" in window) && TabView.isVisible()) &&
Services.prefs.getBoolPref("browser.tabs.dontfocusfordialogs")) {
let docPrincipal = targetIsWindow ? event.target.document.nodePrincipal : null;
// At least one of these should/will be non-null:
@ -6224,7 +6215,7 @@
var tabstripBO = tabContainer.mTabstrip.scrollBoxObject;
for (var i = 0; i < this.childNodes.length; i++) {
let curTab = this.childNodes[i].tab;
if (!curTab) // "Tab Groups" menuitem and its menuseparator
if (!curTab) // "Undo close tab", menuseparator, or entries put here by addons.
continue;
let curTabBO = curTab.boxObject;
if (curTabBO.screenX >= tabstripBO.screenX &&

View File

@ -95,7 +95,6 @@ browser.jar:
content/browser/browser-social.js (content/browser-social.js)
* content/browser/browser-syncui.js (content/browser-syncui.js)
* content/browser/browser-tabPreviews.xml (content/browser-tabPreviews.xml)
content/browser/browser-tabview.js (content/browser-tabview.js)
content/browser/browser-thumbnails.js (content/browser-thumbnails.js)
content/browser/browser-trackingprotection.js (content/browser-trackingprotection.js)
* content/browser/chatWindow.xul (content/chatWindow.xul)

View File

@ -32,7 +32,6 @@ var SessionMigrationInternal = {
* - 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.
@ -53,21 +52,8 @@ var SessionMigrationInternal = {
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;

View File

@ -1770,7 +1770,8 @@ var SessionStoreInternal = {
}
// Default delay of 2 seconds gives enough time to catch multiple TabShow
// events due to changing groups in Panorama.
// events. This used to be due to changing groups in 'tab groups'. We
// might be able to get rid of this now?
this.saveStateDelayed(aWindow);
},
@ -1782,7 +1783,8 @@ var SessionStoreInternal = {
}
// Default delay of 2 seconds gives enough time to catch multiple TabHide
// events due to changing groups in Panorama.
// events. This used to be due to changing groups in 'tab groups'. We
// might be able to get rid of this now?
this.saveStateDelayed(aWindow);
},
@ -2290,10 +2292,7 @@ var SessionStoreInternal = {
// Restore into that window - pretend it's a followup since we'll already
// have a focused window.
//XXXzpao This is going to merge extData together (taking what was in
// winState over what is in the window already. The hack we have
// in _preWindowToRestoreInto will prevent most (all?) Panorama
// weirdness but we will still merge other extData.
// Bug 588217 should make this go away by merging the group data.
// winState over what is in the window already.
let options = {overwriteTabs: canOverwriteTabs, isFollowUp: true};
this.restoreWindow(windowToUse, winState, options);
}
@ -2501,25 +2500,10 @@ var SessionStoreInternal = {
// 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 groupsData = this.getWindowValue(aWindow, "tabview-groups");
if (groupsData) {
groupsData = JSON.parse(groupsData);
// If there are multiple groups, we don't want to use this window.
if (groupsData.totalNumber > 1)
return [false, false];
}
// 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. Tabs with the about:blank URI will always be
// overwritten.
// 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. Tabs with the about:blank
// URI will always be overwritten.
let homePages = ["about:blank"];
let removableTabs = [];
let tabbrowser = aWindow.gBrowser;

View File

@ -92,7 +92,6 @@ XPCOMUtils.defineLazyGetter(this, "PALETTE_ITEMS", function() {
"feed-button",
"email-link-button",
"sync-button",
"tabview-button",
"web-apps-button",
];

View File

@ -435,9 +435,6 @@ function TabWindow(win) {
this.tabbrowser.tabContainer.addEventListener(this.tabEvents[i], this, false);
this.tabbrowser.addTabsProgressListener(this);
for (let i = 0; i < this.winEvents.length; i++)
this.win.addEventListener(this.winEvents[i], this, false);
AeroPeek.windows.push(this);
let tabs = this.tabbrowser.tabs;
for (let i = 0; i < tabs.length; i++)
@ -450,7 +447,6 @@ function TabWindow(win) {
TabWindow.prototype = {
_enabled: false,
tabEvents: ["TabOpen", "TabClose", "TabSelect", "TabMove"],
winEvents: ["tabviewshown", "tabviewhidden"],
destroy: function () {
this._destroying = true;
@ -461,9 +457,6 @@ TabWindow.prototype = {
for (let i = 0; i < this.tabEvents.length; i++)
this.tabbrowser.tabContainer.removeEventListener(this.tabEvents[i], this, false);
for (let i = 0; i < this.winEvents.length; i++)
this.win.removeEventListener(this.winEvents[i], this, false);
for (let i = 0; i < tabs.length; i++)
this.removeTab(tabs[i]);
@ -579,14 +572,6 @@ TabWindow.prototype = {
case "TabMove":
this.updateTabOrdering();
break;
case "tabviewshown":
this.enabled = false;
break;
case "tabviewhidden":
if (!AeroPeek._prefenabled)
return;
this.enabled = true;
break;
}
},