diff --git a/mozilla/browser/app/splash.rc b/mozilla/browser/app/splash.rc index d314a65ed31..391d62d80bc 100644 --- a/mozilla/browser/app/splash.rc +++ b/mozilla/browser/app/splash.rc @@ -51,8 +51,8 @@ BEGIN ID_DDE_APPLICATION_NAME, "Firefox Debug" IDS_STARTMENU_APPNAME, "Firefox Debug" #else - ID_DDE_APPLICATION_NAME, "Firefox" - IDS_STARTMENU_APPNAME, "Firefox" + ID_DDE_APPLICATION_NAME, "Firefox Debug" + IDS_STARTMENU_APPNAME, "Firefox Debug" #endif END diff --git a/mozilla/browser/base/content/browser.js b/mozilla/browser/base/content/browser.js index 14e23593209..609df34cb73 100644 --- a/mozilla/browser/base/content/browser.js +++ b/mozilla/browser/base/content/browser.js @@ -535,7 +535,7 @@ function delayedStartup() (IPS.BUTTON_TITLE_NO * IPS.BUTTON_POS_1), null, null, null, checkboxLabel, checkEveryTime); if (rv == 0) - shell.setDefaultBrowser(true); + shell.setDefaultBrowser(true, false); shell.shouldCheckDefaultBrowser = checkEveryTime.value; } #endif diff --git a/mozilla/browser/components/prefwindow/content/pref-navigator.js b/mozilla/browser/components/prefwindow/content/pref-navigator.js index ddaa3db3edf..cb1a7586c21 100644 --- a/mozilla/browser/components/prefwindow/content/pref-navigator.js +++ b/mozilla/browser/components/prefwindow/content/pref-navigator.js @@ -102,7 +102,7 @@ function onOK() var shell = Components.classes["@mozilla.org/browser/shell-service;1"] .getService(Components.interfaces.nsIShellService); if ("shouldBeDefaultBrowser" in parent && parent.shouldBeDefautBrowser) - shell.setDefaultBrowser(true); + shell.setDefaultBrowser(true, false); } function Startup() @@ -230,7 +230,7 @@ function checkNow() (IPS.BUTTON_TITLE_NO * IPS.BUTTON_POS_1), null, null, null, null, { }); if (rv == 0) - shell.setDefaultBrowser(true); + shell.setDefaultBrowser(true, false); } else { promptMessage = shellBundle.getFormattedString("alreadyDefaultBrowser", diff --git a/mozilla/browser/components/shell/public/nsIShellService.idl b/mozilla/browser/components/shell/public/nsIShellService.idl index 0cc0c1ae41c..f752faf09d9 100644 --- a/mozilla/browser/components/shell/public/nsIShellService.idl +++ b/mozilla/browser/components/shell/public/nsIShellService.idl @@ -59,8 +59,11 @@ interface nsIShellService : nsISupports * @param aClaimAllTypes Register Firefox as the handler for * additional protocols (ftp, chrome etc) * and web documents (.html, .xhtml etc). + * @param aForAllUsers Whether or not Firefox should attempt + * to become the default browser for all + * users on a multi-user system. */ - void setDefaultBrowser(in boolean aClaimAllTypes); + void setDefaultBrowser(in boolean aClaimAllTypes, in boolean aForAllUsers); /** * Used to determine whether or not to show a "Set Default Browser" diff --git a/mozilla/browser/components/shell/public/nsIWindowsShellService.idl b/mozilla/browser/components/shell/public/nsIWindowsShellService.idl index b848dc8b2a6..6e82f7ed071 100644 --- a/mozilla/browser/components/shell/public/nsIWindowsShellService.idl +++ b/mozilla/browser/components/shell/public/nsIWindowsShellService.idl @@ -43,8 +43,12 @@ interface nsIWindowsShellService : nsIShellService /** * Restores system settings to what they were before Firefox * modified them. + * + * @param aForAllUsers Whether or not Firefox should restore + * settings for all users on a multi-user + * system. */ - void restoreFileSettings(); + void restoreFileSettings(in boolean aForAllUsers); /** * The desktop background color, visible when no background image is diff --git a/mozilla/browser/components/shell/src/nsGNOMEShellService.cpp b/mozilla/browser/components/shell/src/nsGNOMEShellService.cpp index c1ad6f684d4..3c32a194cf9 100644 --- a/mozilla/browser/components/shell/src/nsGNOMEShellService.cpp +++ b/mozilla/browser/components/shell/src/nsGNOMEShellService.cpp @@ -49,7 +49,7 @@ nsGNOMEShellService::IsDefaultBrowser(PRBool aStartupCheck, PRBool* aIsDefaultBr } NS_IMETHODIMP -nsGNOMEShellService::SetDefaultBrowser(PRBool aClaimAllTypes) +nsGNOMEShellService::SetDefaultBrowser(PRBool aClaimAllTypes, PRBool aForAllUsers) { return NS_OK; } diff --git a/mozilla/browser/components/shell/src/nsMacShellService.cpp b/mozilla/browser/components/shell/src/nsMacShellService.cpp index c6f4ebc5c6a..9b737bad6f7 100644 --- a/mozilla/browser/components/shell/src/nsMacShellService.cpp +++ b/mozilla/browser/components/shell/src/nsMacShellService.cpp @@ -49,7 +49,7 @@ nsMacShellService::IsDefaultBrowser(PRBool aStartupCheck, PRBool* aIsDefaultBrow } NS_IMETHODIMP -nsMacShellService::SetDefaultBrowser(PRBool aClaimAllTypes) +nsMacShellService::SetDefaultBrowser(PRBool aClaimAllTypes, PRBool aForAllUsers) { return NS_OK; } diff --git a/mozilla/browser/components/shell/src/nsSetDefaultBrowser.js b/mozilla/browser/components/shell/src/nsSetDefaultBrowser.js index 4af803bc72c..39ea2a47486 100644 --- a/mozilla/browser/components/shell/src/nsSetDefaultBrowser.js +++ b/mozilla/browser/components/shell/src/nsSetDefaultBrowser.js @@ -70,7 +70,7 @@ nsSetDefaultBrowser.prototype = { // First, get winhooks service. var shell = Components.classes["@mozilla.org/browser/shell-service;1"] .getService(Components.interfaces.nsIShellService); - shell.isDefaultBrowser = true; + shell.setDefaultBrowser(true, true); // Now, get the cmd line service. var cmdLineService = Components.classes[ "@mozilla.org/appshell/commandLineService;1" ] diff --git a/mozilla/browser/components/shell/src/nsWindowsShellService.cpp b/mozilla/browser/components/shell/src/nsWindowsShellService.cpp index 2f815276a2b..61ec5e405b3 100644 --- a/mozilla/browser/components/shell/src/nsWindowsShellService.cpp +++ b/mozilla/browser/components/shell/src/nsWindowsShellService.cpp @@ -71,6 +71,49 @@ NS_IMPL_ISUPPORTS2(nsWindowsShellService, nsIWindowsShellService, nsIShellService) +static nsresult +OpenUserKeyForReading(HKEY aStartKey, const char* aKeyName, HKEY* aKey) +{ + DWORD result = ::RegOpenKeyEx(aStartKey, aKeyName, 0, KEY_READ, aKey); + + switch (result) { + case ERROR_SUCCESS: + break; + case ERROR_ACCESS_DENIED: + return NS_ERROR_FILE_ACCESS_DENIED; + case ERROR_FILE_NOT_FOUND: + if (aStartKey == HKEY_LOCAL_MACHINE) { + // prevent infinite recursion on the second pass through here if + // ::RegOpenKeyEx fails in the all-users case. + return NS_ERROR_NOT_AVAILABLE; + } + return OpenUserKeyForReading(HKEY_LOCAL_MACHINE, aKeyName, aKey); + } + return NS_OK; +} + +static nsresult +OpenKeyForWriting(const char* aKeyName, HKEY* aKey, PRBool aForAllUsers, PRBool aCreate) +{ + nsresult rv = NS_OK; + + HKEY rootKey = aForAllUsers ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; + DWORD result = ::RegOpenKeyEx(rootKey, aKeyName, 0, KEY_READ | KEY_WRITE, aKey); + + switch (result) { + case ERROR_SUCCESS: + break; + case ERROR_ACCESS_DENIED: + return NS_ERROR_FILE_ACCESS_DENIED; + case ERROR_FILE_NOT_FOUND: + if (aCreate) + result = ::RegCreateKey(HKEY_LOCAL_MACHINE, aKeyName, aKey); + rv = NS_ERROR_FILE_NOT_FOUND; + break; + } + return rv; +} + /////////////////////////////////////////////////////////////////////////////// // Default Browser Registry Settings // @@ -80,11 +123,11 @@ NS_IMPL_ISUPPORTS2(nsWindowsShellService, nsIWindowsShellService, nsIShellServic // .htm .html .shtml .xht .xhtml // are mapped like so: // -// HKLM\SOFTWARE\Classes\.\ (default) REG_SZ FirefoxHTML +// HKCU\SOFTWARE\Classes\.\ (default) REG_SZ FirefoxHTML // // as aliases to the class: // -// HKLM\SOFTWARE\Classes\FirefoxHTML\ +// HKCU\SOFTWARE\Classes\FirefoxHTML\ // DefaultIcon (default) REG_SZ ,1 // shell\open\command (default) REG_SZ -url "%1" // @@ -94,7 +137,7 @@ NS_IMPL_ISUPPORTS2(nsWindowsShellService, nsIWindowsShellService, nsIShellServic // HTTP, HTTPS, FTP, GOPHER, CHROME // are mapped like so: // -// HKLM\SOFTWARE\Classes\\ +// HKCU\SOFTWARE\Classes\\ // DefaultIcon (default) REG_SZ ,1 // shell\open\command (default) REG_SZ -url "%1" // shell\open\ddeexec (default) REG_SZ "%1",,-1,0,,,, @@ -107,7 +150,7 @@ NS_IMPL_ISUPPORTS2(nsWindowsShellService, nsIWindowsShellService, nsIShellServic // The following keys are set to make Firefox appear in the Windows XP // Start Menu as the browser: // -// HKLM\SOFTWARE\Clients\StartMenuInternet +// HKCU\SOFTWARE\Clients\StartMenuInternet // firefox.exe\DefaultIcon (default) REG_SZ ,0 // firefox.exe\shell\open\command (default) REG_SZ // firefox.exe\shell\properties (default) REG_SZ Firefox &Options @@ -117,7 +160,7 @@ NS_IMPL_ISUPPORTS2(nsWindowsShellService, nsIWindowsShellService, nsIShellServic // --------------------- // Every key that is set has the previous value stored in: // -// HKLM\SOFTWARE\Mozilla\Desktop\ REG_SZ oldval +// HKCU\SOFTWARE\Mozilla\Desktop\ REG_SZ oldval // // If there is no previous value, an empty value is set to indicate that the // key should be removed completely. @@ -240,9 +283,8 @@ nsWindowsShellService::IsDefaultBrowser(PRBool aStartupCheck, PRBool* aIsDefault ::ZeroMemory(currValue, sizeof(currValue)); HKEY theKey; - DWORD result = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, - key.get(), 0, KEY_READ, &theKey); - if (REG_SUCCEEDED(result)) { + nsresult rv = OpenUserKeyForReading(HKEY_CURRENT_USER, key.get(), &theKey); + if (NS_SUCCEEDED(rv)) { DWORD len = sizeof currValue; DWORD result = ::RegQueryValueEx(theKey, settings->valueName, NULL, NULL, (LPBYTE)currValue, &len); if (REG_FAILED(result) || strcmp(data.get(), currValue) != 0) { @@ -263,13 +305,12 @@ nsWindowsShellService::IsDefaultBrowser(PRBool aStartupCheck, PRBool* aIsDefault } NS_IMETHODIMP -nsWindowsShellService::SetDefaultBrowser(PRBool aClaimAllTypes) +nsWindowsShellService::SetDefaultBrowser(PRBool aClaimAllTypes, PRBool aForAllUsers) { // Locate the Backup key HKEY backupKey; - DWORD result = ::RegOpenKey(HKEY_LOCAL_MACHINE, MOZ_BACKUP_REGISTRY, &backupKey); - if (result == ERROR_FILE_NOT_FOUND) - result = ::RegCreateKey(HKEY_LOCAL_MACHINE, MOZ_BACKUP_REGISTRY, &backupKey); + nsresult rv = OpenKeyForWriting(MOZ_BACKUP_REGISTRY, &backupKey, aForAllUsers, PR_TRUE); + if (NS_FAILED(rv) && rv != NS_ERROR_FILE_NOT_FOUND) return rv; SETTING* settings; SETTING* end = gSettings + sizeof(gSettings)/sizeof(SETTING); @@ -301,11 +342,12 @@ nsWindowsShellService::SetDefaultBrowser(PRBool aClaimAllTypes) PRBool replaceExisting = aClaimAllTypes ? PR_TRUE : !(settings->flags & NON_ESSENTIAL); SetRegKey(key.get(), settings->valueName, data.get(), - PR_TRUE, backupKey, replaceExisting); + PR_TRUE, backupKey, replaceExisting, aForAllUsers); } // Select the Default Browser for the Windows XP Start Menu - SetRegKey(NS_LITERAL_CSTRING(SMI).get(), "", exeName.get(), PR_TRUE, backupKey, aClaimAllTypes); + SetRegKey(NS_LITERAL_CSTRING(SMI).get(), "", exeName.get(), PR_TRUE, + backupKey, aClaimAllTypes, aForAllUsers); nsCOMPtr bundleService(do_GetService("@mozilla.org/intl/stringbundle;1")); nsCOMPtr bundle, brandBundle; @@ -319,7 +361,8 @@ nsWindowsShellService::SetDefaultBrowser(PRBool aClaimAllTypes) nsCAutoString key1(NS_LITERAL_CSTRING(SMI)); key1.Append(exeName); key1.Append("\\"); - SetRegKey(key1.get(), "", NS_ConvertUCS2toUTF8(brandFullName).get(), PR_TRUE, backupKey, aClaimAllTypes); + SetRegKey(key1.get(), "", NS_ConvertUCS2toUTF8(brandFullName).get(), PR_TRUE, + backupKey, aClaimAllTypes, aForAllUsers); // Set the Options menu item title nsXPIDLString brandShortName; @@ -334,7 +377,8 @@ nsWindowsShellService::SetDefaultBrowser(PRBool aClaimAllTypes) nsCAutoString key2(NS_LITERAL_CSTRING(SMI "%APPEXE%\\shell\\properties")); PRInt32 offset = key2.Find("%APPEXE%"); key2.Replace(offset, 8, exeName); - SetRegKey(key2.get(), "", NS_ConvertUCS2toUTF8(optionsTitle).get(), PR_TRUE, backupKey, aClaimAllTypes); + SetRegKey(key2.get(), "", NS_ConvertUCS2toUTF8(optionsTitle).get(), PR_TRUE, + backupKey, aClaimAllTypes, aForAllUsers); // Refresh the Shell ::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, @@ -345,19 +389,18 @@ nsWindowsShellService::SetDefaultBrowser(PRBool aClaimAllTypes) } NS_IMETHODIMP -nsWindowsShellService::RestoreFileSettings() +nsWindowsShellService::RestoreFileSettings(PRBool aForAllUsers) { // Locate the Backup key HKEY backupKey; - DWORD result = ::RegOpenKey(HKEY_LOCAL_MACHINE, MOZ_BACKUP_REGISTRY, &backupKey); - if (result == ERROR_FILE_NOT_FOUND) - result = ::RegCreateKey(HKEY_LOCAL_MACHINE, MOZ_BACKUP_REGISTRY, &backupKey); + nsresult rv = OpenKeyForWriting(MOZ_BACKUP_REGISTRY, &backupKey, aForAllUsers, PR_FALSE); + if (NS_FAILED(rv)) return rv; DWORD i = 0; do { char origKeyName[MAX_BUF]; DWORD len = sizeof origKeyName; - result = ::RegEnumValue(backupKey, i++, origKeyName, &len, 0, 0, 0, 0); + DWORD result = ::RegEnumValue(backupKey, i++, origKeyName, &len, 0, 0, 0, 0); if (REG_SUCCEEDED(result)) { char origValue[MAX_BUF]; DWORD len = sizeof origValue; @@ -385,25 +428,23 @@ nsWindowsShellService::RestoreFileSettings() void nsWindowsShellService::SetRegKey(const char* aKeyName, const char* aValueName, const char* aValue, PRBool aBackup, - HKEY aBackupKey, PRBool aReplaceExisting) + HKEY aBackupKey, PRBool aReplaceExisting, + PRBool aForAllUsers) { char buf[MAX_BUF]; DWORD len = sizeof buf; HKEY theKey; - DWORD result = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, aKeyName, 0, KEY_READ | KEY_WRITE, &theKey); - if (result == ERROR_FILE_NOT_FOUND) - result = ::RegCreateKey(HKEY_LOCAL_MACHINE, aKeyName, &theKey); - if (REG_FAILED(result)) - return; + nsresult rv = OpenKeyForWriting(aKeyName, &theKey, aForAllUsers, PR_TRUE); + if (NS_FAILED(rv) && rv != NS_ERROR_FILE_NOT_FOUND) return; // If we're not allowed to replace an existing key, and one exists (i.e. the // result isn't ERROR_FILE_NOT_FOUND, then just return now. - if (!aReplaceExisting) + if (!aReplaceExisting && rv != NS_ERROR_FILE_NOT_FOUND) return; // Get the old value - result = ::RegQueryValueEx(theKey, aValueName, NULL, NULL, (LPBYTE)buf, &len); + DWORD result = ::RegQueryValueEx(theKey, aValueName, NULL, NULL, (LPBYTE)buf, &len); // Back up the old value if (aBackup && REG_SUCCEEDED(result)) @@ -646,14 +687,12 @@ nsWindowsShellService::OpenPreferredApplication(PRInt32 aApplication) // Find the default application for this class. HKEY theKey; - DWORD result = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, clientKey.get(), - 0, KEY_READ, &theKey); - if (REG_FAILED(result)) - return NS_OK; + nsresult rv = OpenUserKeyForReading(HKEY_CURRENT_USER, clientKey.get(), &theKey); + if (NS_FAILED(rv)) return rv; char buf[MAX_BUF]; DWORD type, len = sizeof buf; - result = ::RegQueryValueEx(theKey, "", 0, &type, (LPBYTE)&buf, &len); + DWORD result = ::RegQueryValueEx(theKey, "", 0, &type, (LPBYTE)&buf, &len); if (REG_FAILED(result) || nsDependentCString(buf).IsEmpty()) return NS_OK; @@ -662,16 +701,14 @@ nsWindowsShellService::OpenPreferredApplication(PRInt32 aApplication) clientKey.Append(buf); clientKey.Append("\\shell\\open\\command"); - result = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, clientKey.get(), - 0, KEY_READ, &theKey); - if (REG_FAILED(result)) - return NS_OK; + rv = OpenUserKeyForReading(HKEY_CURRENT_USER, clientKey.get(), &theKey); + if (NS_FAILED(rv)) return rv; ::ZeroMemory(buf, sizeof(buf)); len = sizeof buf; result = ::RegQueryValueEx(theKey, "", 0, &type, (LPBYTE)&buf, &len); if (REG_FAILED(result) || nsDependentCString(buf).IsEmpty()) - return NS_OK; + return NS_ERROR_FAILURE; nsCAutoString path; path.Assign(buf); diff --git a/mozilla/browser/components/shell/src/nsWindowsShellService.h b/mozilla/browser/components/shell/src/nsWindowsShellService.h index 32fa506ba99..b1ee50b88b3 100644 --- a/mozilla/browser/components/shell/src/nsWindowsShellService.h +++ b/mozilla/browser/components/shell/src/nsWindowsShellService.h @@ -58,7 +58,7 @@ protected: PRBool GetMailAccountKey(HKEY* aResult); void SetRegKey(const char* aKeyName, const char* aValueName, const char* aValue, PRBool aBackup, HKEY aBackupKey, - PRBool aReplaceExisting); + PRBool aReplaceExisting, PRBool aForAllUsers); private: PRBool mCheckedThisSession; diff --git a/mozilla/browser/locales/jar.mn b/mozilla/browser/locales/jar.mn index 4aa569fdbb1..abd27d9ed45 100644 --- a/mozilla/browser/locales/jar.mn +++ b/mozilla/browser/locales/jar.mn @@ -11,12 +11,13 @@ locale/browser/metaData.properties (@AB_CD@/chrome/browser/metaData.properties) locale/browser/openLocation.dtd (@AB_CD@/chrome/browser/openLocation.dtd) locale/browser/openLocation.properties (@AB_CD@/chrome/browser/openLocation.properties) - locale/browser/page-drawer.dtd (@AB_CD@/chrome/browser/page-drawer.dtd) + locale/browser/page-drawer.dtd (@AB_CD@/chrome/browser/page-drawer.dtd) * locale/browser/pageInfo.dtd (@AB_CD@/chrome/browser/pageInfo.dtd) locale/browser/pageInfo.properties (@AB_CD@/chrome/browser/pageInfo.properties) locale/browser/pageReport.dtd (@AB_CD@/chrome/browser/pageReport.dtd) locale/browser/pageReportFirstTime.dtd (@AB_CD@/chrome/browser/pageReportFirstTime.dtd) locale/browser/setWallpaper.dtd (@AB_CD@/chrome/browser/setWallpaper.dtd) + locale/browser/shellservice.properties (@AB_CD@/chrome/browser/shellservice.properties) * locale/browser/bookmarks/bookmarks.dtd (@AB_CD@/chrome/browser/bookmarks/bookmarks.dtd) * locale/browser/bookmarks/addBookmark.dtd (@AB_CD@/chrome/browser/bookmarks/addBookmark.dtd) * locale/browser/bookmarks/bookmarks.properties (@AB_CD@/chrome/browser/bookmarks/bookmarks.properties)