Bug 456895 - Error: Uncaught Exception [@ nsIShellService.isDefaultBrowser][@ delayedStartup] (GetShortPathNameW fails due to permissions). r=mconnor
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user