From 4eecf48114f65ab83621389ab54ceb9838cf508d Mon Sep 17 00:00:00 2001 From: John Morkel Date: Fri, 4 Sep 2009 16:37:17 +0200 Subject: [PATCH] Bug 465673 - Open related tabs next to the current one. r=dao, ui-r=beltzner --- browser/app/profile/firefox.js | 1 + browser/base/content/tabbrowser.xml | 20 +++++ browser/base/content/test/Makefile.in | 1 + .../base/content/test/browser_relatedTabs.js | 84 +++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 browser/base/content/test/browser_relatedTabs.js diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index d93cb7b6e665..b7e7a2ad96ce 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -329,6 +329,7 @@ pref("browser.tabs.autoHide", false); pref("browser.tabs.autoHide", true); #endif pref("browser.tabs.closeWindowWithLastTab", true); +pref("browser.tabs.insertRelatedAfterCurrent", true); pref("browser.tabs.warnOnClose", true); pref("browser.tabs.warnOnOpen", true); pref("browser.tabs.maxOpenBeforeWarn", 15); diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml index 0a65e751af71..79a9c14fe708 100644 --- a/browser/base/content/tabbrowser.xml +++ b/browser/base/content/tabbrowser.xml @@ -188,6 +188,9 @@ null + + null + null @@ -804,6 +807,8 @@ if (this.mCurrentTab != this.selectedTab) this.mCurrentTab.owner = null; + this._lastRelatedTab = null; + var fm = Components.classes["@mozilla.org/focus-manager;1"]. getService(Components.interfaces.nsIFocusManager); var focusedChromeElement = fm.getFocusedElementForWindow(window, false, {}); @@ -1288,6 +1293,18 @@ evt.initEvent("TabOpen", true, false); t.dispatchEvent(evt); + // Check if we're opening a tab related to the current tab and + // move it to after the current tab. + // aReferrerURI is null or undefined if the tab is opened from + // an external application or bookmark, i.e. somewhere other + // than the current tab. + if (aReferrerURI && this.mPrefs.getBoolPref("browser.tabs.insertRelatedAfterCurrent")) { + let newTabPos = (this._lastRelatedTab || + this.selectedTab)._tPos + 1; + this.moveTabTo(t, newTabPos); + this._lastRelatedTab = t; + } + return t; ]]> @@ -1473,6 +1490,8 @@ return; var [aTab, aCloseWindow, aNewTab] = args; + this._lastRelatedTab = null; + // update the UI early for responsiveness aTab.collapsed = true; if (aNewTab) @@ -2205,6 +2224,7 @@ . + * Portions created by the Initial Developer are Copyright (C) 2008 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * John Morkel + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +function test() { + // Add several new tabs in sequence, interrupted by selecting a + // different tab, moving a tab around and closing a tab, + // returning a list of opened tabs for verifying the expected order. + // The new tab behaviour is documented in bug 465673 + function tabOpenDance() { + let tabs = []; + function addTab(aURL,aReferrer) + tabs.push(gBrowser.addTab(aURL, aReferrer)); + + addTab("http://localhost:8888/#0"); + gBrowser.selectedTab = tabs[0]; + addTab("http://localhost:8888/#1"); + addTab("http://localhost:8888/#2",gBrowser.currentURI); + addTab("http://localhost:8888/#3",gBrowser.currentURI); + gBrowser.selectedTab = tabs[tabs.length - 1]; + gBrowser.selectedTab = tabs[0]; + addTab("http://localhost:8888/#4",gBrowser.currentURI); + gBrowser.selectedTab = tabs[3]; + addTab("http://localhost:8888/#5",gBrowser.currentURI); + gBrowser.removeTab(tabs.pop()); + addTab("about:blank",gBrowser.currentURI); + gBrowser.moveTabTo(gBrowser.selectedTab, 1); + addTab("http://localhost:8888/#6",gBrowser.currentURI); + addTab(); + addTab("http://localhost:8888/#7"); + + return tabs; + } + + function cleanUp(aTabs) + aTabs.forEach(gBrowser.removeTab, gBrowser); + + let tabs = tabOpenDance(); + + is(tabs[0], gBrowser.mTabs[3], "tab without referrer was opened to the far right"); + is(tabs[1], gBrowser.mTabs[7], "tab without referrer was opened to the far right"); + is(tabs[2], gBrowser.mTabs[5], "tab with referrer opened immediately to the right"); + is(tabs[3], gBrowser.mTabs[1], "next tab with referrer opened further to the right"); + is(tabs[4], gBrowser.mTabs[4], "tab selection changed, tab opens immediately to the right"); + is(tabs[5], gBrowser.mTabs[6], "blank tab with referrer opens to the right of 3rd original tab where removed tab was"); + is(tabs[6], gBrowser.mTabs[2], "tab has moved, new tab opens immediately to the right"); + is(tabs[7], gBrowser.mTabs[8], "blank tab without referrer opens at the end"); + is(tabs[8], gBrowser.mTabs[9], "tab without referrer opens at the end"); + + cleanUp(tabs); +}