mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 20:35:50 +00:00
Bug 354953 Undo-close-tab-related cleanup/enhancements
r+sr=neil
This commit is contained in:
parent
b4c88ddbc6
commit
a030a53727
@ -1389,6 +1389,33 @@ function updateCloseItems()
|
||||
document.getElementById('menu_closeWindow').hidden = true;
|
||||
document.getElementById('menu_closeOtherTabs').hidden = true;
|
||||
}
|
||||
var recentTabsItem = document.getElementById("menu_recentTabs");
|
||||
recentTabsItem.setAttribute("disabled", browser.getUndoList().length == 0);
|
||||
}
|
||||
|
||||
function updateRecentTabs(menupopup)
|
||||
{
|
||||
var browser = getBrowser();
|
||||
|
||||
while (menupopup.hasChildNodes())
|
||||
menupopup.removeChild(menupopup.lastChild);
|
||||
|
||||
var list = browser.getUndoList();
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
var menuitem = document.createElement("menuitem");
|
||||
var label = list[i];
|
||||
if (i < 9) {
|
||||
label = gNavigatorBundle.getFormattedString("tabs.recentlyClosed.format", [i + 1, label]);
|
||||
menuitem.setAttribute("accesskey", i + 1);
|
||||
}
|
||||
|
||||
if (i == 0)
|
||||
menuitem.setAttribute("key", "key_restoreTab");
|
||||
|
||||
menuitem.setAttribute("label", label);
|
||||
menuitem.setAttribute("value", i);
|
||||
menupopup.appendChild(menuitem);
|
||||
}
|
||||
}
|
||||
|
||||
function BrowserCloseOtherTabs()
|
||||
|
@ -66,6 +66,7 @@
|
||||
<!-- File Menu -->
|
||||
<key id="key_newNavigator"/>
|
||||
<key id="key_newNavigatorTab" key="&tabCmd.commandkey;" modifiers="accel" command="cmd_newNavigatorTab"/>
|
||||
<key id="key_restoreTab" key="&recentTabs.commandkey;" modifiers="accel,shift" oncommand="gBrowser.restoreTab(0);"/>
|
||||
<key id="key_newBlankPage"/>
|
||||
<key id="focusURLBar" key="&openCmd.commandkey;" oncommand="ShowAndSelectContentsOfURLBar();"
|
||||
modifiers="accel"/>
|
||||
@ -343,6 +344,9 @@
|
||||
</menu>
|
||||
<menuitem label="&openCmd.label;" accesskey="&openCmd.accesskey;" key="openLocationKb" command="Browser:Open"/>
|
||||
<menuitem label="&openFileCmd.label;" accesskey="&openFileCmd.accesskey;" key="openFileKb" command="Browser:OpenFile"/>
|
||||
<menu label="&recentTabs.label;" accesskey="&recentTabs.accesskey;" id="menu_recentTabs">
|
||||
<menupopup id="menu_recentTabsPopup" onpopupshowing="updateRecentTabs(this);" oncommand="gBrowser.restoreTab(event.target.value);"/>
|
||||
</menu>
|
||||
<menuitem id="menu_close"/>
|
||||
<menuitem id="menu_closeOtherTabs" command="cmd_closeOtherTabs" label="&closeOtherTabs.label;"/>
|
||||
<menuitem id="menu_closeWindow" hidden="true" command="cmd_closeWindow" key="key_closeWindow" label="&closeWindow.label;"/>
|
||||
|
@ -23,6 +23,9 @@
|
||||
<!ENTITY openFileCmd.label "Open File...">
|
||||
<!ENTITY openFileCmd.accesskey "o">
|
||||
<!ENTITY openFileCmd.commandkey "o">
|
||||
<!ENTITY recentTabs.label "Recently Closed Tabs">
|
||||
<!ENTITY recentTabs.accesskey "R">
|
||||
<!ENTITY recentTabs.commandkey "t">
|
||||
<!ENTITY editPageCmd.label "Edit Page">
|
||||
<!ENTITY editPageCmd.accesskey "E">
|
||||
<!ENTITY editPageCmd.commandkey "e">
|
||||
|
@ -79,6 +79,8 @@ showskinsdescription=true
|
||||
tabs.closeTab=Close Tab
|
||||
tabs.close=Close
|
||||
|
||||
tabs.recentlyClosed.format=%1$S %2$S
|
||||
|
||||
tabs.closeWarningTitle=Confirm close
|
||||
tabs.closeWarning=This Navigator window has %S tabs open. Do you want to close it and all its tabs?
|
||||
tabs.closeButton=Close all tabs
|
||||
|
@ -85,7 +85,7 @@
|
||||
xbl:inherits="oncommand=onnewtab"/>
|
||||
<xul:menuitem label="&undoCloseTab.label;" accesskey="&undoCloseTab.accesskey;" tbattr="tabbrowser-undoclosetab"
|
||||
oncommand="var tabbrowser = this.parentNode.parentNode.parentNode.parentNode;
|
||||
tabbrowser.restoreTab();"/>
|
||||
tabbrowser.restoreTab(0);"/>
|
||||
<xul:menuseparator/>
|
||||
<xul:menuitem label="&bookmarkGroup.label;" accesskey="&bookmarkGroup.accesskey;"
|
||||
tbattr="tabbrowser-multiple"
|
||||
@ -653,7 +653,7 @@
|
||||
<body>
|
||||
<![CDATA[
|
||||
this.mContextTab = document.popupNode;
|
||||
var disabled = this.mPanelContainer.childNodes.length == 1;
|
||||
var disabled = this.mTabs.length == 1;
|
||||
var menuItems = aPopupMenu.getElementsByAttribute("tbattr", "tabbrowser-multiple");
|
||||
for (var i = 0; i < menuItems.length; i++)
|
||||
menuItems[i].setAttribute("disabled", disabled);
|
||||
@ -1094,19 +1094,30 @@
|
||||
</body>
|
||||
</method>
|
||||
|
||||
<method name="restoreTab">
|
||||
<method name="getUndoList">
|
||||
<body>
|
||||
<![CDATA[
|
||||
if (this.savedBrowsers.length == 0)
|
||||
var list = [];
|
||||
for (var i = 0; i < this.savedBrowsers.length; i++) {
|
||||
var hist = this.savedBrowsers[i].history;
|
||||
list.push(hist.getEntryAtIndex(hist.index, false).title);
|
||||
}
|
||||
return list;
|
||||
]]>
|
||||
</body>
|
||||
</method>
|
||||
|
||||
<method name="restoreTab">
|
||||
<parameter name="aIndex"/>
|
||||
<body>
|
||||
<![CDATA[
|
||||
if (aIndex >= this.savedBrowsers.length || aIndex < 0)
|
||||
return;
|
||||
|
||||
this._browsers = null;
|
||||
// since we don't focus the tab, updateCurrentBrowser is not called
|
||||
this.mPreviousTab = null;
|
||||
|
||||
var t = this.referenceTab.cloneNode(true);
|
||||
|
||||
var savedData = this.savedBrowsers.pop();
|
||||
var savedData = this.savedBrowsers.splice(aIndex, 1)[0];
|
||||
var b = savedData.browser;
|
||||
var hist = savedData.history;
|
||||
|
||||
@ -1129,19 +1140,26 @@
|
||||
|
||||
// add back the filters
|
||||
var position = this.mTabs.length - 1;
|
||||
var tabListener = this.mTabProgressListener(t, b, true);
|
||||
var tabListener = this.mTabProgressListener(t, b, false);
|
||||
const filter = Components.classes["@mozilla.org/appshell/component/browser-status-filter;1"]
|
||||
.createInstance(Components.interfaces.nsIWebProgress);
|
||||
filter.addProgressListener(tabListener, Components.interfaces.nsIWebProgress.NOTIFY_ALL);
|
||||
b.webProgress.addProgressListener(filter, Components.interfaces.nsIWebProgress.NOTIFY_ALL);
|
||||
this.mTabListeners[position] = tabListener;
|
||||
this.mTabFilters[position] = filter;
|
||||
|
||||
if (this.mTabs.length == 2 &&
|
||||
!this.mTabs[0].linkedBrowser.webNavigation.sessionHistory.count)
|
||||
this.removeTab(this.mTabs[0]);
|
||||
else // if there's only one tab, it's selected anyway
|
||||
this.selectedTab = t;
|
||||
]]>
|
||||
</body>
|
||||
</method>
|
||||
|
||||
<method name="removeTab">
|
||||
<parameter name="aTab"/>
|
||||
<parameter name="aDisableUndo"/>
|
||||
<body>
|
||||
<![CDATA[
|
||||
this._browsers = null; // invalidate cache
|
||||
@ -1220,7 +1238,7 @@
|
||||
// really closing the tab. The pref controls how far you can undo
|
||||
var maxUndoDepth = this.mPrefs.getIntPref("browser.tabs.undoclose.depth");
|
||||
var oldSH = oldBrowser.webNavigation.sessionHistory;
|
||||
if (maxUndoDepth <= 0 || oldSH.count == 0) {
|
||||
if (maxUndoDepth <= 0 || oldSH.count == 0 || aDisableUndo) {
|
||||
// Undo is disabled/tab is blank. Kill the browser for real.
|
||||
// Because of the way XBL works (fields just set JS
|
||||
// properties on the element) and the code we have in place
|
||||
@ -1246,7 +1264,7 @@
|
||||
// into bfcache - allows for saving of JS modifications
|
||||
// and also saves RAM by allowing bfcache to evict the full page
|
||||
|
||||
this.savedBrowsers.push({browser: oldBrowser, history: oldSH});
|
||||
this.savedBrowsers.unshift({browser: oldBrowser, history: oldSH});
|
||||
|
||||
var newSH = Components.classes["@mozilla.org/browser/shistory;1"]
|
||||
.createInstance(Components.interfaces.nsISHistoryInternal);
|
||||
@ -1276,10 +1294,10 @@
|
||||
<method name="reloadAllTabs">
|
||||
<body>
|
||||
<![CDATA[
|
||||
var l = this.mPanelContainer.childNodes.length;
|
||||
var l = this.mTabs.length;
|
||||
for (var i = 0; i < l; i++) {
|
||||
try {
|
||||
this.mPanelContainer.childNodes[i].reload();
|
||||
this.mTabs[i].linkedBrowser.reload();
|
||||
} catch (e) {
|
||||
// ignore failure to reload so others will be reloaded
|
||||
}
|
||||
@ -1713,7 +1731,7 @@
|
||||
<body>
|
||||
<![CDATA[
|
||||
var oldBrowserGroup = [];
|
||||
var oldCount = this.mPanelContainer.childNodes.length;
|
||||
var oldCount = this.mTabs.length;
|
||||
var newCount = aGroup.length;
|
||||
var n = Math.max(oldCount, newCount);
|
||||
for (var i = 0; i < n; ++i) {
|
||||
@ -1721,7 +1739,7 @@
|
||||
var data = aGroup[i];
|
||||
if ("sessionHistory" in data) {
|
||||
this.addTab("about:blank", null);
|
||||
var browser = this.mPanelContainer.lastChild;
|
||||
var browser = this.mTabContainer.lastChild.linkedBrowser;
|
||||
// need to hold on to the listener so it won't go away
|
||||
// addProgressListener only has a weak pointer to it
|
||||
browser._SHListener =
|
||||
@ -1738,7 +1756,7 @@
|
||||
sessionHistory : firstTab.linkedBrowser.sessionHistory
|
||||
}
|
||||
oldBrowserGroup.push(browserData);
|
||||
this.removeTab(firstTab);
|
||||
this.removeTab(firstTab, true);
|
||||
}
|
||||
}
|
||||
return oldBrowserGroup;
|
||||
|
Loading…
Reference in New Issue
Block a user