Bug 456895 - Error: Uncaught Exception [@ nsIShellService.isDefaultBrowser][@ delayedStartup] (GetShortPathNameW fails due to permissions). r=mconnor

This commit is contained in:
Robert Strong
2009-02-15 15:03:59 -08:00
parent d7e2ffbee7
commit 5a37e12adf

View File

@@ -175,18 +175,10 @@ OpenKeyForReading(HKEY aKeyRoot, const nsAString& aKeyName, HKEY* aKey)
// shell\safemode\command (default) REG_SZ <apppath> -safe-mode
//
typedef enum {
NO_SUBSTITUTION = 0x00,
APP_PATH_SUBSTITUTION = 0x01,
EXE_NAME_SUBSTITUTION = 0x02
} SettingFlags;
typedef struct {
char* keyName;
char* valueName;
char* valueData;
PRInt32 flags;
} SETTING;
#define APP_REG_NAME L"Firefox"
@@ -209,16 +201,16 @@ static SETTING gSettings[] = {
// File Extension Class - as of 1.8.1.2 the value for VAL_OPEN is also checked
// for CLS_HTML since Firefox should also own opeing local files when set as
// the default browser.
{ MAKE_KEY_NAME1(CLS_HTML, SOP), "", VAL_OPEN, APP_PATH_SUBSTITUTION },
{ MAKE_KEY_NAME1(CLS_HTML, SOP), "", VAL_OPEN },
// Protocol Handler Class - for Vista and above
{ MAKE_KEY_NAME1(CLS_URL, SOP), "", VAL_OPEN, APP_PATH_SUBSTITUTION },
{ MAKE_KEY_NAME1(CLS_URL, SOP), "", VAL_OPEN },
// Protocol Handlers
{ MAKE_KEY_NAME1("HTTP", DI), "", VAL_FILE_ICON, APP_PATH_SUBSTITUTION },
{ MAKE_KEY_NAME1("HTTP", SOP), "", VAL_OPEN, APP_PATH_SUBSTITUTION },
{ MAKE_KEY_NAME1("HTTPS", DI), "", VAL_FILE_ICON, APP_PATH_SUBSTITUTION },
{ MAKE_KEY_NAME1("HTTPS", SOP), "", VAL_OPEN, APP_PATH_SUBSTITUTION }
{ MAKE_KEY_NAME1("HTTP", DI), "", VAL_FILE_ICON },
{ MAKE_KEY_NAME1("HTTP", SOP), "", VAL_OPEN },
{ MAKE_KEY_NAME1("HTTPS", DI), "", VAL_FILE_ICON },
{ MAKE_KEY_NAME1("HTTPS", SOP), "", VAL_OPEN }
};
PRBool
@@ -264,50 +256,23 @@ nsWindowsShellService::IsDefaultBrowser(PRBool aStartupCheck,
if (!::GetModuleFileNameW(0, exePath, MAX_BUF))
return NS_ERROR_FAILURE;
nsAutoString appLongPath(exePath);
#ifndef WINCE
// Support short path to the exe so if it is already set the user is not
// prompted to set the default browser again.
if (!::GetShortPathNameW(exePath, exePath, sizeof(exePath)))
// Convert the path to a long path since GetModuleFileNameW returns the path
// that was used to launch Firefox which is not necessarily a long path.
if (!::GetLongPathNameW(exePath, exePath, MAX_BUF))
return NS_ERROR_FAILURE;
#endif
nsAutoString appShortPath(exePath);
ToUpperCase(appShortPath);
nsCOMPtr<nsILocalFile> lf;
nsresult rv = NS_NewLocalFile(appShortPath, PR_TRUE,
getter_AddRefs(lf));
if (NS_FAILED(rv))
return rv;
nsAutoString exeName;
rv = lf->GetLeafName(exeName);
if (NS_FAILED(rv))
return rv;
ToUpperCase(exeName);
nsAutoString appLongPath(exePath);
nsresult rv;
PRUnichar currValue[MAX_BUF];
for (settings = gSettings; settings < end; ++settings) {
NS_ConvertUTF8toUTF16 dataLongPath(settings->valueData);
NS_ConvertUTF8toUTF16 dataShortPath(settings->valueData);
NS_ConvertUTF8toUTF16 key(settings->keyName);
NS_ConvertUTF8toUTF16 value(settings->valueName);
if (settings->flags & APP_PATH_SUBSTITUTION) {
PRInt32 offset = dataLongPath.Find("%APPPATH%");
dataLongPath.Replace(offset, 9, appLongPath);
// Remove the quotes around %APPPATH% in VAL_OPEN for short paths
PRInt32 offsetQuoted = dataShortPath.Find("\"%APPPATH%\"");
if (offsetQuoted != -1)
dataShortPath.Replace(offsetQuoted, 11, appShortPath);
else
dataShortPath.Replace(offset, 9, appShortPath);
}
if (settings->flags & EXE_NAME_SUBSTITUTION) {
PRInt32 offset = key.Find("%APPEXE%");
key.Replace(offset, 8, exeName);
}
PRInt32 offset = dataLongPath.Find("%APPPATH%");
dataLongPath.Replace(offset, 9, appLongPath);
::ZeroMemory(currValue, sizeof(currValue));
HKEY theKey;
@@ -323,8 +288,7 @@ nsWindowsShellService::IsDefaultBrowser(PRBool aStartupCheck,
// Close the key we opened.
::RegCloseKey(theKey);
if (REG_FAILED(res) ||
!dataLongPath.Equals(currValue, CaseInsensitiveCompare) &&
!dataShortPath.Equals(currValue, CaseInsensitiveCompare)) {
!dataLongPath.Equals(currValue, CaseInsensitiveCompare)) {
// Key wasn't set, or was set to something other than our registry entry
*aIsDefaultBrowser = PR_FALSE;
return NS_OK;