Bug 1357154 - Cache Windows executable path after BinaryPath::Get is called in main. r=ehsan

MozReview-Commit-ID: Qby9b4ngz2
This commit is contained in:
Perry Jiang 2017-06-22 10:56:04 -07:00
Родитель f80ffdab06
Коммит 45ea222ca2
3 изменённых файлов: 53 добавлений и 10 удалений

Просмотреть файл

@ -4,6 +4,11 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# For BinaryPath::GetLong for Windows
LOCAL_INCLUDES += [
'/xpcom/build'
]
XPCSHELL_TESTS_MANIFESTS += ['test/unit/xpcshell.ini']
BROWSER_CHROME_MANIFESTS += ['test/browser.ini']

Просмотреть файл

@ -5,6 +5,7 @@
#include "nsWindowsShellService.h"
#include "BinaryPath.h"
#include "city.h"
#include "imgIContainer.h"
#include "imgIRequest.h"
@ -228,13 +229,10 @@ nsWindowsShellService::IsDefaultBrowser(bool aStartupCheck,
return NS_OK;
}
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)) {
wchar_t exePath[MAXPATHLEN] = L"";
nsresult rv = BinaryPath::GetLong(exePath);
if (NS_FAILED(rv)) {
return NS_OK;
}

Просмотреть файл

@ -20,6 +20,8 @@
#include "mozilla/UniquePtrExtensions.h"
#ifdef MOZILLA_INTERNAL_API
#include "nsCOMPtr.h"
#include "nsIFile.h"
#include "nsString.h"
#endif
@ -41,13 +43,51 @@ public:
return NS_OK;
}
static nsresult GetLong(wchar_t aResult[MAXPATHLEN])
{
static bool cached = false;
static wchar_t exeLongPath[MAXPATHLEN] = L"";
if (!cached) {
nsresult rv = GetW(nullptr, exeLongPath);
if (NS_FAILED(rv)) {
return rv;
}
if (!::GetLongPathNameW(exeLongPath, exeLongPath, MAXPATHLEN)) {
return NS_ERROR_FAILURE;
}
cached = true;
}
if (wcscpy_s(aResult, MAXPATHLEN, exeLongPath)) {
return NS_ERROR_FAILURE;
}
return NS_OK;
}
private:
static nsresult GetW(const char* argv0, wchar_t aResult[MAXPATHLEN])
{
if (::GetModuleFileNameW(0, aResult, MAXPATHLEN)) {
return NS_OK;
static bool cached = false;
static wchar_t moduleFileName[MAXPATHLEN] = L"";
if (!cached) {
if (!::GetModuleFileNameW(0, moduleFileName, MAXPATHLEN)) {
return NS_ERROR_FAILURE;
}
cached = true;
}
return NS_ERROR_FAILURE;
if (wcscpy_s(aResult, MAXPATHLEN, moduleFileName)) {
return NS_ERROR_FAILURE;
}
return NS_OK;
}
#elif defined(XP_MACOSX)