Bug 1338843 - Use the install path to distinguish between multiple installations when checking default browser status. r=emk

MozReview-Commit-ID: DIcyAs92dm0
This commit is contained in:
Matt Howell
2017-02-13 15:36:28 -08:00
parent ce5080992f
commit f416eeabe1

View File

@@ -209,8 +209,8 @@ nsWindowsShellService::ShortcutMaintenance()
} }
static bool static bool
IsAARDefault(const RefPtr<IApplicationAssociationRegistration>& pAAR, IsPathDefaultForClass(const RefPtr<IApplicationAssociationRegistration>& pAAR,
LPCWSTR aClassName) wchar_t *exePath, LPCWSTR aClassName)
{ {
// Make sure the Prog ID matches what we have // Make sure the Prog ID matches what we have
LPWSTR registeredApp; LPWSTR registeredApp;
@@ -224,8 +224,34 @@ IsAARDefault(const RefPtr<IApplicationAssociationRegistration>& pAAR,
LPCWSTR progID = isProtocol ? L"FirefoxURL" : L"FirefoxHTML"; LPCWSTR progID = isProtocol ? L"FirefoxURL" : L"FirefoxHTML";
bool isDefault = !wcsnicmp(registeredApp, progID, wcslen(progID)); bool isDefault = !wcsnicmp(registeredApp, progID, wcslen(progID));
nsAutoString regAppName(registeredApp);
CoTaskMemFree(registeredApp); CoTaskMemFree(registeredApp);
if (isDefault) {
// Make sure the application path for this progID is this installation.
regAppName.AppendLiteral("\\shell\\open\\command");
HKEY theKey;
nsresult rv = OpenKeyForReading(HKEY_CLASSES_ROOT, regAppName, &theKey);
if (NS_FAILED(rv)) {
return false;
}
wchar_t cmdFromReg[MAX_BUF] = L"";
DWORD len = sizeof(cmdFromReg);
DWORD res = ::RegQueryValueExW(theKey, nullptr, nullptr, nullptr,
(LPBYTE)cmdFromReg, &len);
::RegCloseKey(theKey);
if (REG_FAILED(res)) {
return false;
}
wchar_t fullCmd[MAX_BUF] = L"";
_snwprintf(fullCmd, MAX_BUF, L"\"%s\" -osint -url \"%%1\"", exePath);
isDefault = _wcsicmp(fullCmd, cmdFromReg) == 0;
}
return isDefault; return isDefault;
} }
@@ -279,9 +305,19 @@ nsWindowsShellService::IsDefaultBrowser(bool aStartupCheck,
return NS_OK; return NS_OK;
} }
*aIsDefaultBrowser = IsAARDefault(pAAR, L"http"); wchar_t exePath[MAX_BUF] = L"";
if (!::GetModuleFileNameW(0, exePath, MAX_BUF)) {
return NS_OK;
}
// 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_OK;
}
*aIsDefaultBrowser = IsPathDefaultForClass(pAAR, exePath, L"http");
if (*aIsDefaultBrowser && aForAllTypes) { if (*aIsDefaultBrowser && aForAllTypes) {
*aIsDefaultBrowser = IsAARDefault(pAAR, L".html"); *aIsDefaultBrowser = IsPathDefaultForClass(pAAR, exePath, L".html");
} }
return NS_OK; return NS_OK;
} }