diff --git a/mozilla/modules/libpref/src/init/all.js b/mozilla/modules/libpref/src/init/all.js index b4480b4f583..c424d08b039 100644 --- a/mozilla/modules/libpref/src/init/all.js +++ b/mozilla/modules/libpref/src/init/all.js @@ -64,6 +64,7 @@ pref("backups.number_of_prefs_copies", 1); // 0 = blank, 1 = home (browser.startup.homepage), 2 = last pref("browser.startup.page", 1); pref("browser.startup.homepage", "chrome://navigator-region/locale/region.properties"); +pref("browser.startup.homepage.count", 1); // "browser.startup.homepage_override" was for 4.x pref("browser.startup.homepage_override.1", true); pref("browser.startup.autoload_homepage", true); diff --git a/mozilla/xpfe/browser/resources/content/navigator.js b/mozilla/xpfe/browser/resources/content/navigator.js index 30660228afe..79d2459d3fc 100644 --- a/mozilla/xpfe/browser/resources/content/navigator.js +++ b/mozilla/xpfe/browser/resources/content/navigator.js @@ -124,9 +124,7 @@ const gHomepagePrefListener = if (topic != "nsPref:changed") return; - var homePage = getHomePage(); - if (homePage) - setTooltipText("home-button", homePage); + updateHomeButtonTooltip(); } }; @@ -227,6 +225,22 @@ function contentAreaFrameFocus() } } +function updateHomeButtonTooltip() +{ + const XUL_NAMESPACE = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; + var homePage = getHomePage(); + var tooltip = document.getElementById("home-button-tooltip-inner"); + + while (tooltip.firstChild) + tooltip.removeChild(tooltip.firstChild); + + for (var i in homePage) { + var label = document.createElementNS(XUL_NAMESPACE, "label"); + label.setAttribute("value", homePage[i]); + tooltip.appendChild(label); + } +} + //////////////////////////////// BOOKMARKS //////////////////////////////////// function UpdateBookmarksLastVisitedDate(event) @@ -290,18 +304,19 @@ function getBrowser() function getHomePage() { - var url; + var URIs = []; try { - url = pref.getComplexValue("browser.startup.homepage", - Components.interfaces.nsIPrefLocalizedString).data; - } catch (e) { + URIs[0] = pref.getComplexValue("browser.startup.homepage", + Components.interfaces.nsIPrefLocalizedString).data; + var count = pref.getIntPref("browser.startup.homepage.count"); + for (var i = 1; i < count; ++i) { + URIs[i] = pref.getComplexValue("browser.startup.homepage."+i, + Components.interfaces.nsIPrefLocalizedString).data; + } + } catch(e) { } - // use this if we can't find the pref - if (!url) - url = gNavigatorRegionBundle.getString("homePageDefault"); - - return url; + return URIs; } function UpdateBackForwardButtons() @@ -401,9 +416,7 @@ function Startup() // Do all UI building here: // set home button tooltip text - var homePage = getHomePage(); - if (homePage) - document.getElementById("home-button").setAttribute("tooltiptext", homePage); + updateHomeButtonTooltip(); // initialize observers and listeners window.XULBrowserWindow = new nsBrowserStatusHandler(); @@ -483,8 +496,12 @@ function Startup() var uriToLoad; // Check for window.arguments[0]. If present, use that for uriToLoad. - if ("arguments" in window && window.arguments.length >= 1 && window.arguments[0]) - uriToLoad = window.arguments[0]; + if ("arguments" in window && window.arguments.length >= 1 && window.arguments[0]) { + var uriArray = window.arguments[0].split('\n'); + uriToLoad = uriArray.splice(0, 1); + if (uriArray.length > 0) + window.setTimeout(function(arg) { for (var i in arg) gBrowser.addTab(arg[i]); }, 0, uriArray); + } if (uriToLoad && uriToLoad != "about:blank") { gURLBar.value = uriToLoad; @@ -701,7 +718,12 @@ function BrowserReloadSkipCache() function BrowserHome() { var homePage = getHomePage(); - loadURI(homePage); + if (homePage.length == 1) { + loadURI(homePage[0]); + } else { + for (var i in homePage) + gBrowser.addTab(homePage[i]); + } } function OpenBookmarkGroup(element, datasource) diff --git a/mozilla/xpfe/browser/resources/content/navigator.xul b/mozilla/xpfe/browser/resources/content/navigator.xul index 85083d999ce..52bb85b776c 100644 --- a/mozilla/xpfe/browser/resources/content/navigator.xul +++ b/mozilla/xpfe/browser/resources/content/navigator.xul @@ -245,9 +245,13 @@ Contributor(s): ondragexit="nsDragAndDrop.dragExit(event, personalToolbarDNDObserver); event.preventBubble()" ondragover="nsDragAndDrop.dragOver(event, personalToolbarDNDObserver); event.preventBubble()"> + + + GetLocalizedUnicharPref(PREF_BROWSER_STARTUP_HOMEPAGE, getter_Copies(uri)); + if (NS_FAILED(rv)) + return rv; + + PRInt32 count = 0; + rv = aPref->GetIntPref("browser.startup.homepage.count", &count); + + // if we couldn't get the pref (unlikely) or only have one homepage + if (NS_FAILED(rv) || count <= 1) { + *aResult = ToNewUnicode(uri); + return NS_OK; + } + + // The "homepage" is a group of pages, put them in uriList separated by '\n' + nsAutoString uriList(uri); + + for (PRInt32 i = 1; i < count; ++i) { + nsCAutoString pref(NS_LITERAL_CSTRING("browser.startup.homepage.")); + pref.AppendInt(i); + + rv = aPref->GetLocalizedUnicharPref(pref.get(), getter_Copies(uri)); + if (NS_FAILED(rv)) + return rv; + + uriList.Append(PRUnichar('\n')); + uriList.Append(uri); + } + + *aResult = ToNewUnicode(uriList); + return NS_OK; +} + NS_IMETHODIMP nsBrowserContentHandler::GetDefaultArgs(PRUnichar **aDefaultArgs) { if (!aDefaultArgs) @@ -769,10 +806,8 @@ NS_IMETHODIMP nsBrowserContentHandler::GetDefaultArgs(PRUnichar **aDefaultArgs) if (NS_SUCCEEDED(rv)) { switch (choice) { case 1: { - nsXPIDLString url; - rv = prefs->GetLocalizedUnicharPref(PREF_BROWSER_STARTUP_HOMEPAGE, getter_Copies(url)); - args = url; - break; + // skip the code below + return GetHomePageGroup(prefs, aDefaultArgs); } case 2: { nsCOMPtr history(do_GetService(kCGlobalHistoryCID)); diff --git a/mozilla/xpfe/components/prefwindow/resources/content/pref-navigator.js b/mozilla/xpfe/components/prefwindow/resources/content/pref-navigator.js index db1040347eb..f9bf02d1dfd 100644 --- a/mozilla/xpfe/components/prefwindow/resources/content/pref-navigator.js +++ b/mozilla/xpfe/components/prefwindow/resources/content/pref-navigator.js @@ -49,6 +49,120 @@ const WINDOWMEDIATOR_CONTRACTID = "@mozilla.org/appshell/window-mediator;1"; const PREFSERVICE_CONTRACTID = "@mozilla.org/preferences-service;1"; var gDefaultPage; +var gData; + +function setHomePageValue(value) +{ + var homePageField = document.getElementById("browserStartupHomepage"); + homePageField.value = value; +} + +function getGroupIsSetMessage() +{ + var prefUtilitiesBundle = document.getElementById("bundle_prefutilities"); + return prefUtilitiesBundle.getString("groupIsSet"); +} + +function getMostRecentBrowser() +{ + var windowManager = Components.classes[WINDOWMEDIATOR_CONTRACTID] + .getService(nsIWindowMediator); + + var browserWindow = windowManager.getMostRecentWindow("navigator:browser"); + if (browserWindow) + return browserWindow.document.getElementById("content"); + + return null; +} + +function getCurrentPage() +{ + var url; + var tabbrowser = getMostRecentBrowser(); + if (tabbrowser) + url = tabbrowser.currentURI.spec; + + return url; +} + +function getCurrentPageGroup() +{ + var URIs = []; + var tabbrowser = getMostRecentBrowser(); + if (tabbrowser) { + var browsers = tabbrowser.browsers; + for (var i = 0; i < browsers.length; ++i) + URIs[i] = browsers[i].currentURI.spec; + } + + return URIs; +} + +function getDefaultPage() +{ + var prefService = Components.classes[PREFSERVICE_CONTRACTID] + .getService(nsIPrefService); + var pref = prefService.getDefaultBranch(null); + return pref.getComplexValue("browser.startup.homepage", + nsIPrefLocalizedString).data; +} + +function updateHomePageButtons() +{ + var homepage = document.getElementById("browserStartupHomepage").value; + + // disable the "current page" button if the current page + // is already the homepage + var currentPageButton = document.getElementById("browserUseCurrent"); + currentPageButton.disabled = homepage == getCurrentPage(); + + // disable the "default page" button if the default page + // is already the homepage + var defaultPageButton = document.getElementById("browserUseDefault"); + defaultPageButton.disabled = (homepage == gDefaultPage); + + // homePages.length == 1 if: + // - we're called from startup and there's one homepage + // - we're called from "current page" or "choose file" + // - the user typed something in the location field + // in those cases we only want to enable the button if: + // - there's more than one tab in the most recent browser + // otherwise we have a group of homepages: + // - we're called from startup and there's a group of homepages + // - we're called from "current group" + // in those cases we only want to enable the button if: + // - there's more than one tab in the most recent browser and + // the current group doesn't match the group of homepages + + var enabled = false; + + var homePages = gData.navigatorData.homePages; + if (homePages.length == 1) { + var browser = getMostRecentBrowser(); + enabled = browser && browser.browsers.length > 1; + } else { + var currentURIs = getCurrentPageGroup(); + if (currentURIs.length == homePages.length) { + for (var i = 0; !enabled && i < homePages.length; ++i) { + if (homePages[i] != currentURIs[i]) + enabled = true; + } + } else if (currentURIs.length > 1) { + enabled = true; + } + } + + var currentPageGroupButton = document.getElementById("browserUseCurrentGroup"); + currentPageGroupButton.disabled = !enabled; +} + +function locationInputHandler() +{ + var navigatorData = gData.navigatorData; + var homePage = document.getElementById("browserStartupHomepage"); + navigatorData.homePages = [ homePage.value ]; + updateHomePageButtons(); +} function selectFile() { @@ -66,6 +180,10 @@ function selectFile() if (ret == nsIFilePicker.returnOK) { var folderField = document.getElementById("browserStartupHomepage"); folderField.value = fp.fileURL.spec; + var url = fp.fileURL.spec; + setHomePageValue(url); + gData.navigatorData.homePages = [ url ]; + updateHomePageButtons(); } } @@ -73,62 +191,105 @@ function setHomePageToCurrentPage() { var url = getCurrentPage(); if (url) { - var homePageField = document.getElementById("browserStartupHomepage"); - homePageField.value = url; + setHomePageValue(url); + gData.navigatorData.homePages = [ url ]; + updateHomePageButtons(); + } +} + +function setHomePageToCurrentGroup() +{ + var URIs = getCurrentPageGroup(); + if (URIs.length > 0) { + setHomePageValue(gData.navigatorData.groupIsSet); + gData.navigatorData.homePages = URIs; + updateHomePageButtons(); } - updateHomePageButtons(); } function setHomePageToDefaultPage() { - var homePageField = document.getElementById("browserStartupHomepage"); - homePageField.value = gDefaultPage; + setHomePageValue(gDefaultPage); + gData.navigatorData.homePages = [ gDefaultPage ]; updateHomePageButtons(); } -function getCurrentPage() +function init() { - var windowManager = Components.classes[WINDOWMEDIATOR_CONTRACTID] - .getService(nsIWindowMediator); - var browser, url; - var browserWindow = windowManager.getMostRecentWindow("navigator:browser"); - if (browserWindow) { - browser = browserWindow.document.getElementById("content"); - if (browser) { - url = browser.webNavigation.currentURI.spec; + var prefWindow = parent.hPrefWindow; + + gData = prefWindow.wsm.dataManager + .pageData["chrome://communicator/content/pref/pref-navigator.xul"] + + gDefaultPage = getDefaultPage(); + + if ("navigatorData" in gData) + return; + + var navigatorData = {}; + + navigatorData.groupIsSet = getGroupIsSetMessage(); + + var URIs = []; + try { + URIs[0] = prefWindow.getPref("localizedstring", + "browser.startup.homepage"); + + var count = prefWindow.getPref("int", + "browser.startup.homepage.count"); + + for (var i = 1; i < count; ++i) { + URIs[i] = prefWindow.getPref("localizedstring", + "browser.startup.homepage."+i); } + navigatorData.homePages = URIs; + } catch(e) { } - return url; -} + gData.navigatorData = navigatorData; -function getDefaultPage() -{ - var prefService = Components.classes[PREFSERVICE_CONTRACTID] - .getService(nsIPrefService); - var pref = prefService.getDefaultBranch(null); - return pref.getComplexValue("browser.startup.homepage", - nsIPrefLocalizedString).data; -} - -function locationInputHandler() -{ - updateHomePageButtons(); + prefWindow.registerOKCallbackFunc(doOnOk); } function Startup() { + init(); + + var navigatorData = gData.navigatorData; + + var homePages = navigatorData.homePages; + if (homePages.length == 1) + setHomePageValue(homePages[0]); + else + setHomePageValue(navigatorData.groupIsSet); + updateHomePageButtons(); - - gDefaultPage = getDefaultPage(); } -function updateHomePageButtons() +function doOnOk() { - var homepage = document.getElementById("browserStartupHomepage").value; - var currentPageButton = document.getElementById("browserUseCurrent"); - var defaultPageButton = document.getElementById("browserUseDefault"); - currentPageButton.disabled = (homepage == getCurrentPage()); - defaultPageButton.disabled = (homepage == gDefaultPage); + var prefWindow = parent.hPrefWindow; + // OK could have been hit from another panel, so we need to + // get at navigatorData the long but safer way + var navigatorData = prefWindow.wsm.dataManager + .pageData["chrome://communicator/content/pref/pref-navigator.xul"] + .navigatorData; + + var URIs = navigatorData.homePages; + + prefWindow.setPref("string", "browser.startup.homepage", URIs[0]); + + var i = 1; + for (; i < URIs.length; ++i) + prefWindow.setPref("string", "browser.startup.homepage."+i, URIs[i]); + + const countPref = "browser.startup.homepage.count"; + + // remove the old user prefs values that we didn't overwrite + var oldCount = prefWindow.getPref("int", countPref); + for (; i < oldCount; ++i) + prefWindow.pref.ClearUserPref("browser.startup.homepage."+i); + + prefWindow.setPref("int", countPref, URIs.length); } diff --git a/mozilla/xpfe/components/prefwindow/resources/content/pref-navigator.xul b/mozilla/xpfe/components/prefwindow/resources/content/pref-navigator.xul index a7b5b7b4de8..c23a78f091d 100644 --- a/mozilla/xpfe/components/prefwindow/resources/content/pref-navigator.xul +++ b/mozilla/xpfe/components/prefwindow/resources/content/pref-navigator.xul @@ -37,10 +37,9 @@ @@ -66,19 +65,21 @@