Reusing tabs for the same URL
From MozillaZine Knowledge Base
A common feature found in many extensions is to point the user to chrome://
URIs in a browser window (e.g., help or about information) or external (on-line http(s)://
) HTML documents when he clicks an extension's button or link.
Rather than open a new browser or new tab each and every time the same URI is needed, it is better practice to re-use an existing tab which already displays the desired URI, if one exists. Following this practice minimizes the proliferation of tabs and browsers created by your extension. The following code demonstrates how to do this.
function openAndReuseOneTabPerURL(url) { var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator); var browserEnumerator = wm.getEnumerator("navigator:browser"); // Check each browser instance for our URL var found = false; while (browserEnumerator.hasMoreElements() && !found) { var browserInstance = browserEnumerator.getNext(); browserInstance = browserInstance.getBrowser(); // Check each tab of this browser instance var index = 0, numTabs = browserInstance.mPanelContainer.childNodes.length; while (index < numTabs && !found) { var currentTab = browserInstance.getBrowserAtIndex(index); if (url == currentTab.currentURI.spec) { // The URL is already opened. Select its tab. browserInstance.selectedTab = currentTab; // Focus *this* browser browserInstance.focus(); found = true; } index++; } } // Our URL isn't open. Open it now. if (!found) { var recentWindow = wm.getMostRecentWindow("navigator:browser"); if (recentWindow) { // Use an existing browser window recentWindow.delayedOpenTab(url); } else { // No browser windows are open, so open a new one. window.open(url); } } }
This code uses techniques discussed in Enumerating tabbrowser tabs and Opening a new browser window.