Bug 354953 Undo-close-tab-related cleanup/enhancements

r+sr=neil
This commit is contained in:
cst%yecc.com 2006-10-02 23:28:20 +00:00
parent b4c88ddbc6
commit a030a53727
5 changed files with 70 additions and 16 deletions

View File

@ -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()

View File

@ -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;"/>

View File

@ -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">

View File

@ -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

View File

@ -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;