Backed out changeset 5b0aa267bc53 (bug 1324617) for Windows build bustage (warning in CityHash.h). r=backout on a CLOSED TREE

This commit is contained in:
Sebastian Hengst 2017-01-30 23:20:01 +01:00
parent 6faf284bfb
commit f3c9a45af9
7 changed files with 217 additions and 239 deletions

View File

@ -30,12 +30,8 @@ XPIDL_MODULE = 'shellservice'
if CONFIG['OS_ARCH'] == 'WINNT':
SOURCES += [
'../../../other-licenses/nsis/Contrib/CityHash/cityhash/city.cpp',
'nsWindowsShellService.cpp',
]
LOCAL_INCLUDES += [
'../../../other-licenses/nsis/Contrib/CityHash/cityhash',
]
elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
SOURCES += [
'nsMacShellService.cpp',

View File

@ -5,7 +5,6 @@
#include "nsWindowsShellService.h"
#include "city.h"
#include "imgIContainer.h"
#include "imgIRequest.h"
#include "mozilla/gfx/2D.h"
@ -97,29 +96,24 @@ OpenKeyForReading(HKEY aKeyRoot, const nsAString& aKeyName, HKEY* aKey)
// The setting of these values are made by an external binary since writing
// these values may require elevation.
//
// To allow multiple installations to coexist, identifiers written to the
// registry include a hash of the installation path. This is referred to as
// <PathHash> in the tables below.
//
// - File Extension Mappings
// -----------------------
// The following file extensions:
// .htm .html .shtml .xht .xhtml
// .htm .html .shtml .xht .xhtml
// are mapped like so:
//
// HKCU\SOFTWARE\Classes\.<ext>\ (default) REG_SZ FirefoxHTML-<PathHash>
// HKCU\SOFTWARE\Classes\.<ext>\ (default) REG_SZ FirefoxHTML
//
// as aliases to the class:
//
// HKCU\SOFTWARE\Classes\FirefoxHTML-<PathHash>\
// HKCU\SOFTWARE\Classes\FirefoxHTML\
// DefaultIcon (default) REG_SZ <apppath>,1
// shell\open\command (default) REG_SZ <apppath> -osint -url "%1"
// shell\open\ddeexec (default) REG_SZ <empty string>
//
// - Windows Vista and above Protocol Handler
//
// HKCU\SOFTWARE\Classes\FirefoxURL-<PathHash>\
// (default) REG_SZ <appname> URL
// HKCU\SOFTWARE\Classes\FirefoxURL\ (default) REG_SZ <appname> URL
// EditFlags REG_DWORD 2
// FriendlyTypeName REG_SZ <appname> URL
// DefaultIcon (default) REG_SZ <apppath>,1
@ -141,8 +135,8 @@ OpenKeyForReading(HKEY aKeyRoot, const nsAString& aKeyName, HKEY* aKey)
// -------------------------------------------------
// The following keys are set to make Firefox appear in the Start Menu as the
// browser:
//
// HKCU\SOFTWARE\Clients\StartMenuInternet\<appname>-<PathHash>\
//
// HKCU\SOFTWARE\Clients\StartMenuInternet\FIREFOX.EXE\
// (default) REG_SZ <appname>
// DefaultIcon (default) REG_SZ <apppath>,0
// InstallInfo HideIconsCommand REG_SZ <uninstpath> /HideShortcuts
@ -155,26 +149,6 @@ OpenKeyForReading(HKEY aKeyRoot, const nsAString& aKeyName, HKEY* aKey)
// shell\safemode (default) REG_SZ <appname> &Safe Mode
// shell\safemode\command (default) REG_SZ <apppath> -safe-mode
//
// - RegisteredApplications
// -------------------------------------------------
// This entry creates the listing in Default Apps for Windows 8 and up and in
// Set Program Access and Defaults (SPAD) on older versions.
//
// HKCU\Software\RegisteredApplications\
// Firefox-<PathHash> REG_SZ "Software\Clients\StartMenuInternet\<appname>-<PathHash>\Capabilities"
// HKCU\Software\Clients\StartMenuInternet\<appname>-<PathHash>\Capabilities\
// ApplicationDescription REG_SZ <branding description>
// ApplicationIcon REG_SZ <apppath>,0
// ApplicationName REG_SZ <appname>
// FileAssociations .htm REG_SZ FirefoxHTML-<PathHash>
// FileAssociations .html REG_SZ FirefoxHTML-<PathHash>
// FileAssociations .shtml REG_SZ FirefoxHTML-<PathHash>
// FileAssociations .xht REG_SZ FirefoxHTML-<PathHash>
// FileAssociations .xhtml REG_SZ FirefoxHTML-<PathHash>
// StartMenu StartMenuInternet REG_SZ <appname>-<PathHash>
// URLAssociations ftp REG_SZ FirefoxURL-<PathHash>
// URLAssociations http REG_SZ FirefoxURL-<PathHash>
// URLAssociations https REG_SZ FirefoxURL-<PathHash>
// The values checked are all default values so the value name is not needed.
typedef struct {
@ -183,7 +157,7 @@ typedef struct {
const char* oldValueData;
} SETTING;
#define APP_REG_NAME_BASE L"Firefox-"
#define APP_REG_NAME L"Firefox"
#define VAL_FILE_ICON "%APPPATH%,1"
#define VAL_OPEN "\"%APPPATH%\" -osint -url \"%1\""
#define OLD_VAL_OPEN "\"%APPPATH%\" -requestPending -osint -url \"%1\""
@ -241,7 +215,7 @@ nsresult
GetHelperPath(nsAutoString& aPath)
{
nsresult rv;
nsCOMPtr<nsIProperties> directoryService =
nsCOMPtr<nsIProperties> directoryService =
do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
@ -367,7 +341,7 @@ IsAARDefault(const RefPtr<IApplicationAssociationRegistration>& pAAR,
}
LPCWSTR progID = isProtocol ? L"FirefoxURL" : L"FirefoxHTML";
bool isDefault = !wcsnicmp(registeredApp, progID, wcslen(progID));
bool isDefault = !wcsicmp(registeredApp, progID);
CoTaskMemFree(registeredApp);
return isDefault;
@ -396,38 +370,6 @@ IsDefaultBrowserWin8(bool aCheckAllTypes, bool* aIsDefaultBrowser)
}
}
static nsresult
GetAppRegName(nsAutoString &aAppRegName)
{
nsresult rv;
nsCOMPtr<nsIProperties> dirSvc =
do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIFile> exeFile;
rv = dirSvc->Get(XRE_EXECUTABLE_FILE,
NS_GET_IID(nsIFile),
getter_AddRefs(exeFile));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIFile> appDir;
rv = exeFile->GetParent(getter_AddRefs(appDir));
NS_ENSURE_SUCCESS(rv, rv);
nsAutoString path;
rv = appDir->GetPath(path);
NS_ENSURE_SUCCESS(rv, rv);
uint64_t hash = CityHash64(static_cast<const char *>(path.get()),
path.Length() * sizeof(nsAutoString::char_type));
aAppRegName = APP_REG_NAME_BASE;
aAppRegName.AppendInt((int)hash, 16);
aAppRegName.AppendInt((int)(hash >> 32), 16);
return rv;
}
/*
* Query's the AAR for the default status.
* This only checks for FirefoxURL and if aCheckAllTypes is set, then
@ -450,10 +392,8 @@ nsWindowsShellService::IsDefaultBrowserVista(bool aCheckAllTypes,
if (aCheckAllTypes) {
BOOL res;
nsAutoString appRegName;
GetAppRegName(appRegName);
hr = pAAR->QueryAppIsDefaultAll(AL_EFFECTIVE,
appRegName.get(),
APP_REG_NAME,
&res);
*aIsDefaultBrowser = res;
} else if (!IsWin8OrLater()) {
@ -697,9 +637,7 @@ nsWindowsShellService::LaunchControlPanelDefaultsSelectionUI()
IID_IApplicationAssociationRegistrationUI,
(void**)&pAARUI);
if (SUCCEEDED(hr)) {
nsAutoString appRegName;
GetAppRegName(appRegName);
hr = pAARUI->LaunchAdvancedAssociationUI(appRegName.get());
hr = pAARUI->LaunchAdvancedAssociationUI(APP_REG_NAME);
pAARUI->Release();
}
return SUCCEEDED(hr) ? NS_OK : NS_ERROR_FAILURE;
@ -721,17 +659,14 @@ nsWindowsShellService::LaunchControlPanelDefaultPrograms()
return NS_ERROR_FAILURE;
}
nsAutoString params(NS_LITERAL_STRING("control.exe /name Microsoft.DefaultPrograms "
"/page pageDefaultProgram\\pageAdvancedSettings?pszAppName="));
nsAutoString appRegName;
GetAppRegName(appRegName);
params.Append(appRegName);
WCHAR params[] = L"control.exe /name Microsoft.DefaultPrograms /page "
"pageDefaultProgram\\pageAdvancedSettings?pszAppName=" APP_REG_NAME;
STARTUPINFOW si = {sizeof(si), 0};
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWDEFAULT;
PROCESS_INFORMATION pi = {0};
if (!CreateProcessW(controlEXEPath, static_cast<LPWSTR>(params.get()), nullptr,
nullptr, FALSE, 0, nullptr, nullptr, &si, &pi)) {
if (!CreateProcessW(controlEXEPath, params, nullptr, nullptr, FALSE,
0, nullptr, nullptr, &si, &pi)) {
return NS_ERROR_FAILURE;
}
CloseHandle(pi.hProcess);
@ -860,7 +795,7 @@ nsWindowsShellService::LaunchHTTPHandlerPane()
OPENASINFO info;
info.pcszFile = L"http";
info.pcszClass = nullptr;
info.oaifInFlags = OAIF_FORCE_REGISTRATION |
info.oaifInFlags = OAIF_FORCE_REGISTRATION |
OAIF_URL_PROTOCOL |
OAIF_REGISTER_EXT;
return DynSHOpenWithDialog(nullptr, &info);
@ -1014,7 +949,7 @@ WriteBitmap(nsIFile* aFile, imgIContainer* aImage)
}
NS_IMETHODIMP
nsWindowsShellService::SetDesktopBackground(nsIDOMElement* aElement,
nsWindowsShellService::SetDesktopBackground(nsIDOMElement* aElement,
int32_t aPosition)
{
nsresult rv;
@ -1024,7 +959,7 @@ nsWindowsShellService::SetDesktopBackground(nsIDOMElement* aElement,
if (!imgElement) {
// XXX write background loading stuff!
return NS_ERROR_NOT_AVAILABLE;
}
}
else {
nsCOMPtr<nsIImageLoadingContent> imageContent =
do_QueryInterface(aElement, &rv);
@ -1051,7 +986,7 @@ nsWindowsShellService::SetDesktopBackground(nsIDOMElement* aElement,
rv = bundleService->CreateBundle(SHELLSERVICE_PROPERTIES,
getter_AddRefs(shellBundle));
NS_ENSURE_SUCCESS(rv, rv);
// e.g. "Desktop Background.bmp"
nsString fileLeafName;
rv = shellBundle->GetStringFromName
@ -1139,12 +1074,12 @@ nsWindowsShellService::OpenApplication(int32_t aApplication)
}
// The Default Client section of the Windows Registry looks like this:
//
//
// Clients\aClient\
// e.g. aClient = "Mail"...
// \Mail\(default) = Client Subkey Name
// \Client Subkey Name
// \Client Subkey Name\shell\open\command\
// \Client Subkey Name\shell\open\command\
// \Client Subkey Name\shell\open\command\(default) = path to exe
//
@ -1184,7 +1119,7 @@ nsWindowsShellService::OpenApplication(int32_t aApplication)
// Close the key we opened.
::RegCloseKey(theKey);
// Look for any embedded environment variables and substitute their
// Look for any embedded environment variables and substitute their
// values, as |::CreateProcessW| is unable to do this.
nsAutoString path(buf);
int32_t end = path.Length();
@ -1192,7 +1127,7 @@ nsWindowsShellService::OpenApplication(int32_t aApplication)
::ZeroMemory(buf, sizeof(buf));
do {
cursor = path.FindChar('%', cursor);
if (cursor < 0)
if (cursor < 0)
break;
temp = path.FindChar('%', cursor + 1);
@ -1202,7 +1137,7 @@ nsWindowsShellService::OpenApplication(int32_t aApplication)
::GetEnvironmentVariableW(nsAutoString(Substring(path, cursor, temp - cursor)).get(),
buf, sizeof(buf));
// "+ 2" is to subtract the extra characters used to delimit the environment
// variable ('%').
path.Replace((cursor - 1), temp - cursor + 2, nsDependentString(buf));
@ -1278,15 +1213,15 @@ nsWindowsShellService::OpenApplicationWithURI(nsIFile* aApplication,
const nsACString& aURI)
{
nsresult rv;
nsCOMPtr<nsIProcess> process =
nsCOMPtr<nsIProcess> process =
do_CreateInstance("@mozilla.org/process/util;1", &rv);
if (NS_FAILED(rv))
return rv;
rv = process->Init(aApplication);
if (NS_FAILED(rv))
return rv;
const nsCString spec(aURI);
const char* specStr = spec.get();
return process->Run(false, &specStr, 1);

View File

@ -382,28 +382,23 @@ Section "-Application" APP_IDX
; In Win8, the delegate execute handler picks up the value in FirefoxURL and
; FirefoxHTML to launch the desktop browser when it needs to.
${AddDisabledDDEHandlerValues} "FirefoxHTML-$AppUserModelID" "$2" "$8,1" \
${AddDisabledDDEHandlerValues} "FirefoxHTML" "$2" "$8,1" \
"${AppRegName} Document" ""
${AddDisabledDDEHandlerValues} "FirefoxURL-$AppUserModelID" "$2" "$8,1" \
"${AppRegName} URL" "true"
${AddDisabledDDEHandlerValues} "FirefoxURL" "$2" "$8,1" "${AppRegName} URL" \
"true"
; For pre win8, the following keys should only be set if we can write to HKLM.
; For post win8, the keys below can be set in HKCU if needed.
; For post win8, the keys below get set in both HKLM and HKCU.
${If} $TmpVal == "HKLM"
; Set the Start Menu Internet and Vista Registered App HKLM registry keys.
; If we're upgrading an existing install, replacing the old registry entries
; (without a path hash) would cause the default browser to be reset.
ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\FIREFOX.EXE\DefaultIcon" ""
StrCpy $0 $0 -2
${If} $0 != "$INSTDIR\${FileMainEXE}"
${SetStartMenuInternet} "HKLM"
${FixShellIconHandler} "HKLM"
${EndIf}
${SetStartMenuInternet} "HKLM"
${FixShellIconHandler} "HKLM"
; If we are writing to HKLM and create either the desktop or start menu
; shortcuts set IconsVisible to 1 otherwise to 0.
; Taskbar shortcuts imply having a start menu shortcut.
StrCpy $0 "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID\InstallInfo"
${StrFilter} "${FileMainEXE}" "+" "" "" $R9
StrCpy $0 "Software\Clients\StartMenuInternet\$R9\InstallInfo"
${If} $AddDesktopSC == 1
${OrIf} $AddStartMenuSC == 1
${OrIf} $AddTaskbarSC == 1
@ -411,21 +406,18 @@ Section "-Application" APP_IDX
${Else}
WriteRegDWORD HKLM "$0" "IconsVisible" 0
${EndIf}
${ElseIf} ${AtLeastWin8}
${EndIf}
${If} ${AtLeastWin8}
; Set the Start Menu Internet and Vista Registered App HKCU registry keys.
; If we're upgrading an existing install, replacing the old registry entries
; (without a path hash) would cause the default browser to be reset.
ReadRegStr $0 HKCU "Software\Clients\StartMenuInternet\FIREFOX.EXE\DefaultIcon" ""
StrCpy $0 $0 -2
${If} $0 != "$INSTDIR\${FileMainEXE}"
${SetStartMenuInternet} "HKCU"
${FixShellIconHandler} "HKCU"
${EndIf}
${SetStartMenuInternet} "HKCU"
${FixShellIconHandler} "HKCU"
; If we create either the desktop or start menu shortcuts, then
; set IconsVisible to 1 otherwise to 0.
; Taskbar shortcuts imply having a start menu shortcut.
StrCpy $0 "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID\InstallInfo"
${StrFilter} "${FileMainEXE}" "+" "" "" $R9
StrCpy $0 "Software\Clients\StartMenuInternet\$R9\InstallInfo"
${If} $AddDesktopSC == 1
${OrIf} $AddStartMenuSC == 1
${OrIf} $AddTaskbarSC == 1
@ -436,10 +428,10 @@ Section "-Application" APP_IDX
${EndIf}
!ifdef MOZ_MAINTENANCE_SERVICE
; If the maintenance service page was displayed then a value was already
; explicitly selected for installing the maintenance service and
; If the maintenance service page was displayed then a value was already
; explicitly selected for installing the maintenance service and
; and so InstallMaintenanceService will already be 0 or 1.
; If the maintenance service page was not displayed then
; If the maintenance service page was not displayed then
; InstallMaintenanceService will be equal to "".
${If} $InstallMaintenanceService == ""
Call IsUserAdmin
@ -463,7 +455,7 @@ Section "-Application" APP_IDX
${If} $InstallMaintenanceService == "1"
; The user wants to install the maintenance service, so execute
; the pre-packaged maintenance service installer.
; the pre-packaged maintenance service installer.
; This option can only be turned on if the user is an admin so there
; is no need to use ExecShell w/ verb runas to enforce elevated.
nsExec::Exec "$\"$INSTDIR\maintenanceservice_installer.exe$\""

View File

@ -13,7 +13,6 @@
; start menu tile. In case there are 2 Firefox installations, we only do
; this if the application being updated is the default.
ReadRegStr $0 HKCU "Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice" "ProgId"
${WordFind} "$0" "-" "+1{" $0
${If} $0 == "FirefoxURL"
${AndIf} $9 != 0 ; We're not running in session 0
ReadRegStr $0 HKCU "Software\Classes\FirefoxURL\shell\open\command" ""
@ -60,6 +59,35 @@
; Add the Firewall entries after an update
Call AddFirewallEntries
; Only update the Clients\StartMenuInternet registry key values in HKLM if
; they don't exist or this installation is the same as the one set in those
; keys.
${StrFilter} "${FileMainEXE}" "+" "" "" $1
ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\$1\DefaultIcon" ""
${GetPathFromString} "$0" $0
${GetParent} "$0" $0
${If} ${FileExists} "$0"
${GetLongPath} "$0" $0
${EndIf}
${If} "$0" == "$INSTDIR"
${SetStartMenuInternet} "HKLM"
${EndIf}
; Only update the Clients\StartMenuInternet registry key values in HKCU if
; they don't exist or this installation is the same as the one set in those
; keys. This is only done in Windows 8 to avoid a UAC prompt.
${If} ${AtLeastWin8}
ReadRegStr $0 HKCU "Software\Clients\StartMenuInternet\$1\DefaultIcon" ""
${GetPathFromString} "$0" $0
${GetParent} "$0" $0
${If} ${FileExists} "$0"
${GetLongPath} "$0" $0
${EndIf}
${If} "$0" == "$INSTDIR"
${SetStartMenuInternet} "HKCU"
${EndIf}
${EndIf}
ReadRegStr $0 HKLM "Software\mozilla.org\Mozilla" "CurrentVersion"
${If} "$0" != "${GREVersion}"
WriteRegStr HKLM "Software\mozilla.org\Mozilla" "CurrentVersion" "${GREVersion}"
@ -153,7 +181,7 @@
${FixShellIconHandler} "HKLM"
${ShowShortcuts}
${StrFilter} "${FileMainEXE}" "+" "" "" $R9
WriteRegStr HKLM "Software\Clients\StartMenuInternet" "" "$R9-$AppUserModelID"
WriteRegStr HKLM "Software\Clients\StartMenuInternet" "" "$R9"
!macroend
!define SetAsDefaultAppGlobal "!insertmacro SetAsDefaultAppGlobal"
@ -223,7 +251,8 @@
; Adds shortcuts for this installation. This should also add the application
; to Open With for the file types the application handles (bug 370480).
!macro ShowShortcuts
StrCpy $R1 "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID\InstallInfo"
${StrFilter} "${FileMainEXE}" "+" "" "" $0
StrCpy $R1 "Software\Clients\StartMenuInternet\$0\InstallInfo"
WriteRegDWORD HKLM "$R1" "IconsVisible" 1
${If} ${AtLeastWin8}
WriteRegDWORD HKCU "$R1" "IconsVisible" 1
@ -298,9 +327,9 @@
ClearErrors
EnumRegKey $7 HKCR "${FILE_TYPE}" 0
${If} ${Errors}
WriteRegStr SHCTX "SOFTWARE\Classes\${FILE_TYPE}" "" "FirefoxHTML-$AppUserModelID"
WriteRegStr SHCTX "SOFTWARE\Classes\${FILE_TYPE}" "" "FirefoxHTML"
${EndIf}
WriteRegStr SHCTX "SOFTWARE\Classes\${FILE_TYPE}\OpenWithProgids" "FirefoxHTML-$AppUserModelID" ""
WriteRegStr SHCTX "SOFTWARE\Classes\${FILE_TYPE}\OpenWithProgids" "FirefoxHTML" ""
!macroend
!define AddAssociationIfNoneExist "!insertmacro AddAssociationIfNoneExist"
@ -312,35 +341,30 @@
StrCpy $0 "SOFTWARE\Classes"
StrCpy $2 "$\"$8$\" -osint -url $\"%1$\""
; Associate the file handlers with FirefoxHTML, if they aren't already.
; Associate the file handlers with FirefoxHTML
ReadRegStr $6 SHCTX "$0\.htm" ""
${WordFind} "$6" "-" "+1{" $6
${If} "$6" != "FirefoxHTML"
WriteRegStr SHCTX "$0\.htm" "" "FirefoxHTML-$AppUserModelID"
WriteRegStr SHCTX "$0\.htm" "" "FirefoxHTML"
${EndIf}
ReadRegStr $6 SHCTX "$0\.html" ""
${WordFind} "$6" "-" "+1{" $6
${If} "$6" != "FirefoxHTML"
WriteRegStr SHCTX "$0\.html" "" "FirefoxHTML-$AppUserModelID"
WriteRegStr SHCTX "$0\.html" "" "FirefoxHTML"
${EndIf}
ReadRegStr $6 SHCTX "$0\.shtml" ""
${WordFind} "$6" "-" "+1{" $6
${If} "$6" != "FirefoxHTML"
WriteRegStr SHCTX "$0\.shtml" "" "FirefoxHTML-$AppUserModelID"
WriteRegStr SHCTX "$0\.shtml" "" "FirefoxHTML"
${EndIf}
ReadRegStr $6 SHCTX "$0\.xht" ""
${WordFind} "$6" "-" "+1{" $6
${If} "$6" != "FirefoxHTML"
WriteRegStr SHCTX "$0\.xht" "" "FirefoxHTML-$AppUserModelID"
WriteRegStr SHCTX "$0\.xht" "" "FirefoxHTML"
${EndIf}
ReadRegStr $6 SHCTX "$0\.xhtml" ""
${WordFind} "$6" "-" "+1{" $6
${If} "$6" != "FirefoxHTML"
WriteRegStr SHCTX "$0\.xhtml" "" "FirefoxHTML-$AppUserModelID"
WriteRegStr SHCTX "$0\.xhtml" "" "FirefoxHTML"
${EndIf}
${AddAssociationIfNoneExist} ".pdf"
@ -352,10 +376,10 @@
; An empty string is used for the 5th param because FirefoxHTML is not a
; protocol handler
${AddDisabledDDEHandlerValues} "FirefoxHTML-$AppUserModelID" "$2" "$8,1" \
${AddDisabledDDEHandlerValues} "FirefoxHTML" "$2" "$8,1" \
"${AppRegName} HTML Document" ""
${AddDisabledDDEHandlerValues} "FirefoxURL-$AppUserModelID" "$2" "$8,1" "${AppRegName} URL" \
${AddDisabledDDEHandlerValues} "FirefoxURL" "$2" "$8,1" "${AppRegName} URL" \
"true"
; An empty string is used for the 4th & 5th params because the following
; protocol handlers already have a display name and the additional keys
@ -366,29 +390,29 @@
!macroend
!define SetHandlers "!insertmacro SetHandlers"
; Adds the HKLM\Software\Clients\StartMenuInternet\Firefox-[pathhash] registry
; Adds the HKLM\Software\Clients\StartMenuInternet\FIREFOX.EXE registry
; entries (does not use SHCTX).
;
; The values for StartMenuInternet are only valid under HKLM and there can only
; be one installation registerred under StartMenuInternet per application since
; the key name is derived from the main application executable.
; http://support.microsoft.com/kb/297878
;
; In Windows 8 this changes slightly, you can store StartMenuInternet entries in
; HKCU. The icon in start menu for StartMenuInternet is deprecated as of Win7,
; but the subkeys are what's important. Control panel default programs looks
; for them only in HKLM pre win8.
;
; The StartMenuInternet key and friends are documented at
; https://msdn.microsoft.com/en-us/library/windows/desktop/cc144109(v=vs.85).aspx
;
; This function also writes our RegisteredApplications entry, which gets us
; listed in the Settings app's default browser options on Windows 8+, and in
; Set Program Access and Defaults on earlier versions.
; Note: we might be able to get away with using the full path to the
; application executable for the key name in order to support multiple
; installations.
!macro SetStartMenuInternet RegKey
${GetLongPath} "$INSTDIR\${FileMainEXE}" $8
${GetLongPath} "$INSTDIR\uninstall\helper.exe" $7
StrCpy $0 "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID"
${StrFilter} "${FileMainEXE}" "+" "" "" $R9
StrCpy $0 "Software\Clients\StartMenuInternet\$R9"
WriteRegStr ${RegKey} "$0" "" "${BrandFullName}"
@ -425,20 +449,20 @@
WriteRegStr ${RegKey} "$0\Capabilities" "ApplicationIcon" "$8,0"
WriteRegStr ${RegKey} "$0\Capabilities" "ApplicationName" "${BrandShortName}"
WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".htm" "FirefoxHTML-$AppUserModelID"
WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".html" "FirefoxHTML-$AppUserModelID"
WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".shtml" "FirefoxHTML-$AppUserModelID"
WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".xht" "FirefoxHTML-$AppUserModelID"
WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".xhtml" "FirefoxHTML-$AppUserModelID"
WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".htm" "FirefoxHTML"
WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".html" "FirefoxHTML"
WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".shtml" "FirefoxHTML"
WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".xht" "FirefoxHTML"
WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".xhtml" "FirefoxHTML"
WriteRegStr ${RegKey} "$0\Capabilities\StartMenu" "StartMenuInternet" "${AppRegName}-$AppUserModelID"
WriteRegStr ${RegKey} "$0\Capabilities\StartMenu" "StartMenuInternet" "$R9"
WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "ftp" "FirefoxURL-$AppUserModelID"
WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "http" "FirefoxURL-$AppUserModelID"
WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "https" "FirefoxURL-$AppUserModelID"
WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "ftp" "FirefoxURL"
WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "http" "FirefoxURL"
WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "https" "FirefoxURL"
; Vista Registered Application
WriteRegStr ${RegKey} "Software\RegisteredApplications" "${AppRegName}-$AppUserModelID" "$0\Capabilities"
WriteRegStr ${RegKey} "Software\RegisteredApplications" "${AppRegName}" "$0\Capabilities"
!macroend
!define SetStartMenuInternet "!insertmacro SetStartMenuInternet"
@ -448,12 +472,12 @@
; icon being displayed for files associated with Firefox (does not use SHCTX).
!macro FixShellIconHandler RegKey
ClearErrors
ReadRegStr $1 ${RegKey} "Software\Classes\FirefoxHTML-$AppUserModelID\ShellEx\IconHandler" ""
ReadRegStr $1 ${RegKey} "Software\Classes\FirefoxHTML\ShellEx\IconHandler" ""
${Unless} ${Errors}
ReadRegStr $1 ${RegKey} "Software\Classes\FirefoxHTML-$AppUserModelID\DefaultIcon" ""
ReadRegStr $1 ${RegKey} "Software\Classes\FirefoxHTML\DefaultIcon" ""
${GetLongPath} "$INSTDIR\${FileMainEXE}" $2
${If} "$1" != "$2,1"
WriteRegStr ${RegKey} "Software\Classes\FirefoxHTML-$AppUserModelID\DefaultIcon" "" "$2,1"
WriteRegStr ${RegKey} "Software\Classes\FirefoxHTML\DefaultIcon" "" "$2,1"
${EndIf}
${EndUnless}
!macroend
@ -594,9 +618,7 @@
; Only delete the default value in case the key has values for OpenWithList,
; OpenWithProgids, PersistentHandler, etc.
ReadRegStr $0 HKCU "Software\Classes\${FILE_TYPE}" ""
${WordFind} "$0" "-" "+1{" $0
ReadRegStr $1 HKLM "Software\Classes\${FILE_TYPE}" ""
${WordFind} "$1" "-" "+1{" $1
ReadRegStr $2 HKCR "${FILE_TYPE}\PersistentHandler" ""
${If} "$2" != ""
; Since there is a persistent handler remove FirefoxHTML as the default
@ -664,17 +686,17 @@
; Only set the file and protocol handlers if the existing one under HKCR is
; for this install location.
${IsHandlerForInstallDir} "FirefoxHTML-$AppUserModelID" $R9
${IsHandlerForInstallDir} "FirefoxHTML" $R9
${If} "$R9" == "true"
; An empty string is used for the 5th param because FirefoxHTML is not a
; protocol handler.
${AddDisabledDDEHandlerValues} "FirefoxHTML-$AppUserModelID" "$2" "$8,1" \
${AddDisabledDDEHandlerValues} "FirefoxHTML" "$2" "$8,1" \
"${AppRegName} HTML Document" ""
${EndIf}
${IsHandlerForInstallDir} "FirefoxURL-$AppUserModelID" $R9
${IsHandlerForInstallDir} "FirefoxURL" $R9
${If} "$R9" == "true"
${AddDisabledDDEHandlerValues} "FirefoxURL-$AppUserModelID" "$2" "$8,1" \
${AddDisabledDDEHandlerValues} "FirefoxURL" "$2" "$8,1" \
"${AppRegName} URL" "true"
${EndIf}
@ -749,6 +771,10 @@
; Removes various registry entries for reasons noted below (does not use SHCTX).
!macro RemoveDeprecatedKeys
StrCpy $0 "SOFTWARE\Classes"
; Remove support for launching gopher urls from the shell during install or
; update if the DefaultIcon is from firefox.exe.
${RegCleanAppHandler} "gopher"
; Remove support for launching chrome urls from the shell during install or
; update if the DefaultIcon is from firefox.exe (Bug 301073).
${RegCleanAppHandler} "chrome"
@ -756,6 +782,22 @@
; Remove protocol handler registry keys added by the MS shim
DeleteRegKey HKLM "Software\Classes\Firefox.URL"
DeleteRegKey HKCU "Software\Classes\Firefox.URL"
; Delete gopher from Capabilities\URLAssociations if it is present.
${StrFilter} "${FileMainEXE}" "+" "" "" $R9
StrCpy $0 "Software\Clients\StartMenuInternet\$R9"
ClearErrors
ReadRegStr $2 HKLM "$0\Capabilities\URLAssociations" "gopher"
${Unless} ${Errors}
DeleteRegValue HKLM "$0\Capabilities\URLAssociations" "gopher"
${EndUnless}
; Delete gopher from the user's UrlAssociations if it points to FirefoxURL.
StrCpy $0 "Software\Microsoft\Windows\Shell\Associations\UrlAssociations\gopher"
ReadRegStr $2 HKCU "$0\UserChoice" "Progid"
${If} "$2" == "FirefoxURL"
DeleteRegKey HKCU "$0"
${EndIf}
!macroend
!define RemoveDeprecatedKeys "!insertmacro RemoveDeprecatedKeys"
@ -1218,11 +1260,11 @@ Function SetAsDefaultAppUserHKCU
; registry keys are for this install.
${StrFilter} "${FileMainEXE}" "+" "" "" $R9
ClearErrors
ReadRegStr $0 HKCU "Software\Clients\StartMenuInternet\$R9-$AppUserModelID\DefaultIcon" ""
ReadRegStr $0 HKCU "Software\Clients\StartMenuInternet\$R9\DefaultIcon" ""
${If} ${Errors}
${OrIf} ${AtMostWin2008R2}
ClearErrors
ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\$R9-$AppUserModelID\DefaultIcon" ""
ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\$R9\DefaultIcon" ""
${EndIf}
${Unless} ${Errors}
${GetPathFromString} "$0" $0
@ -1230,7 +1272,7 @@ Function SetAsDefaultAppUserHKCU
${If} ${FileExists} "$0"
${GetLongPath} "$0" $0
${If} "$0" == "$INSTDIR"
WriteRegStr HKCU "Software\Clients\StartMenuInternet" "" "$R9-$AppUserModelID"
WriteRegStr HKCU "Software\Clients\StartMenuInternet" "" "$R9"
${EndIf}
${EndIf}
${EndUnless}
@ -1251,11 +1293,11 @@ Function SetAsDefaultAppUserHKCU
; file handlers set previously at the user level will associate this install
; as the default browser.
ClearErrors
ReadRegStr $0 HKLM "Software\RegisteredApplications" "${AppRegName}-$AppUserModelID"
ReadRegStr $0 HKLM "Software\RegisteredApplications" "${AppRegName}"
${Unless} ${Errors}
; This is all protected by a user choice hash in Windows 8 so it won't
; help, but it also won't hurt.
AppAssocReg::SetAppAsDefaultAll "${AppRegName}-$AppUserModelID"
AppAssocReg::SetAppAsDefaultAll "${AppRegName}"
${EndUnless}
${EndIf}
${RemoveDeprecatedKeys}
@ -1309,12 +1351,13 @@ Function SetAsDefaultAppUser
; http://support.microsoft.com/kb/297878
; Check if this install location registered as the StartMenuInternet client
${StrFilter} "${FileMainEXE}" "+" "" "" $R9
ClearErrors
ReadRegStr $0 HKCU "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID\DefaultIcon" ""
ReadRegStr $0 HKCU "Software\Clients\StartMenuInternet\$R9\DefaultIcon" ""
${If} ${Errors}
${OrIf} ${AtMostWin2008R2}
ClearErrors
ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID\DefaultIcon" ""
ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\$R9\DefaultIcon" ""
${EndIf}
${Unless} ${Errors}

View File

@ -685,25 +685,36 @@ Function SendPing
${EndIf}
${If} "$R2" == "0"
StrCpy $R3 ""
ReadRegStr $R2 HKLM "Software\Classes\http\shell\open\command" ""
${If} $R2 != ""
${GetPathFromString} "$R2" $R2
${GetParent} "$R2" $R3
${GetLongPath} "$R3" $R3
${If} $R3 == $INSTDIR
StrCpy $R2 "1" ; This Firefox install is set as default.
${Else}
StrCpy $R2 "$R2" "" -11 # length of firefox.exe
${If} "$R2" == "${FileMainEXE}"
StrCpy $R2 "2" ; Another Firefox install is set as default.
${AndIf} ${AtLeastWinVista}
; Check to see if this install location is currently set as the default
; browser by Default Programs which is only available on Vista and above.
ClearErrors
ReadRegStr $R3 HKLM "Software\RegisteredApplications" "${AppRegName}"
${Unless} ${Errors}
AppAssocReg::QueryAppIsDefaultAll "${AppRegName}" "effective"
Pop $R3
${If} $R3 == "1"
StrCpy $R3 ""
ReadRegStr $R2 HKLM "Software\Classes\http\shell\open\command" ""
${If} $R2 != ""
${GetPathFromString} "$R2" $R2
${GetParent} "$R2" $R3
${GetLongPath} "$R3" $R3
${If} $R3 == $INSTDIR
StrCpy $R2 "1" ; This Firefox install is set as default.
${Else}
StrCpy $R2 "$R2" "" -11 # length of firefox.exe
${If} "$R2" == "${FileMainEXE}"
StrCpy $R2 "2" ; Another Firefox install is set as default.
${Else}
StrCpy $R2 "0"
${EndIf}
${EndIf}
${Else}
StrCpy $R2 "0"
StrCpy $R2 "0" ; Firefox is not set as default.
${EndIf}
${EndIf}
${Else}
StrCpy $R2 "0" ; Firefox is not set as default.
${EndIf}
${EndUnless}
${EndIf}
${If} $CanSetAsDefault == "true"

View File

@ -171,7 +171,7 @@ ChangeUI IDD_VERIFY "${NSISDIR}\Contrib\UIs\default.exe"
# Helper Functions
; This function is used to uninstall the maintenance service if the
; application currently being uninstalled is the last application to use the
; application currently being uninstalled is the last application to use the
; maintenance service.
Function un.UninstallServiceIfNotUsed
; $0 will store if a subkey exists
@ -199,7 +199,6 @@ Function un.UninstallServiceIfNotUsed
${If} ${RunningX64}
SetRegView lastUsed
${EndIf}
${If} $0 == 0
; Get the path of the maintenance service uninstaller
ReadRegStr $1 HKLM ${MaintUninstallKey} "UninstallString"
@ -279,21 +278,28 @@ Section "Uninstall"
${un.SetAppLSPCategories}
${EndIf}
${un.RegCleanAppHandler} "FirefoxURL-$AppUserModelID"
${un.RegCleanAppHandler} "FirefoxHTML-$AppUserModelID"
${un.RegCleanAppHandler} "FirefoxURL"
${un.RegCleanAppHandler} "FirefoxHTML"
${un.RegCleanProtocolHandler} "ftp"
${un.RegCleanProtocolHandler} "http"
${un.RegCleanProtocolHandler} "https"
${un.RegCleanFileHandler} ".htm" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".html" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".shtml" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".xht" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".xhtml" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".oga" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".ogg" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".ogv" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".pdf" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".webm" "FirefoxHTML-$AppUserModelID"
ClearErrors
ReadRegStr $R9 HKCR "FirefoxHTML" ""
; Don't clean up the file handlers if the FirefoxHTML key still exists since
; there should be a second installation that may be the default file handler
${If} ${Errors}
${un.RegCleanFileHandler} ".htm" "FirefoxHTML"
${un.RegCleanFileHandler} ".html" "FirefoxHTML"
${un.RegCleanFileHandler} ".shtml" "FirefoxHTML"
${un.RegCleanFileHandler} ".xht" "FirefoxHTML"
${un.RegCleanFileHandler} ".xhtml" "FirefoxHTML"
${un.RegCleanFileHandler} ".oga" "FirefoxHTML"
${un.RegCleanFileHandler} ".ogg" "FirefoxHTML"
${un.RegCleanFileHandler} ".ogv" "FirefoxHTML"
${un.RegCleanFileHandler} ".pdf" "FirefoxHTML"
${un.RegCleanFileHandler} ".webm" "FirefoxHTML"
${EndIf}
SetShellVarContext all ; Set SHCTX to HKLM
${un.GetSecondInstallPath} "Software\Mozilla" $R9
@ -302,30 +308,36 @@ Section "Uninstall"
${un.GetSecondInstallPath} "Software\Mozilla" $R9
${EndIf}
DeleteRegKey HKLM "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID"
DeleteRegValue HKLM "Software\RegisteredApplications" "${AppRegName}-$AppUserModelID"
StrCpy $0 "Software\Clients\StartMenuInternet\${FileMainEXE}\shell\open\command"
ReadRegStr $R1 HKLM "$0" ""
${un.RemoveQuotesFromPath} "$R1" $R1
${un.GetParent} "$R1" $R1
DeleteRegKey HKCU "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID"
DeleteRegValue HKCU "Software\RegisteredApplications" "${AppRegName}-$AppUserModelID"
; Remove old protocol handler and StartMenuInternet keys without install path
; hashes, but only if they're for this installation.
ReadRegStr $0 HKLM "Software\Classes\FirefoxHTML\DefaultIcon" ""
StrCpy $0 $0 -2
${If} $0 == "$INSTDIR\${FileMainEXE}"
DeleteRegKey HKLM "Software\Classes\FirefoxHTML"
DeleteRegKey HKLM "Software\Classes\FirefoxURL"
${StrFilter} "${FileMainEXE}" "+" "" "" $R9
DeleteRegKey HKLM "Software\Clients\StartMenuInternet\$R9"
; Only remove the StartMenuInternet key if it refers to this install location.
; The StartMenuInternet registry key is independent of the default browser
; settings. The XPInstall base un-installer always removes this key if it is
; uninstalling the default browser and it will always replace the keys when
; installing even if there is another install of Firefox that is set as the
; default browser. Now the key is always updated on install but it is only
; removed if it refers to this install location.
${If} "$INSTDIR" == "$R1"
DeleteRegKey HKLM "Software\Clients\StartMenuInternet\${FileMainEXE}"
DeleteRegValue HKLM "Software\RegisteredApplications" "${AppRegName}"
${EndIf}
ReadRegStr $0 HKCU "Software\Classes\FirefoxHTML\DefaultIcon" ""
StrCpy $0 $0 -2
${If} $0 == "$INSTDIR\${FileMainEXE}"
DeleteRegKey HKCU "Software\Classes\FirefoxHTML"
DeleteRegKey HKCU "Software\Classes\FirefoxURL"
${StrFilter} "${FileMainEXE}" "+" "" "" $R9
DeleteRegKey HKCU "Software\Clients\StartMenuInternet\$R9"
ReadRegStr $R1 HKCU "$0" ""
${un.RemoveQuotesFromPath} "$R1" $R1
${un.GetParent} "$R1" $R1
; Only remove the StartMenuInternet key if it refers to this install location.
; The StartMenuInternet registry key is independent of the default browser
; settings. The XPInstall base un-installer always removes this key if it is
; uninstalling the default browser and it will always replace the keys when
; installing even if there is another install of Firefox that is set as the
; default browser. Now the key is always updated on install but it is only
; removed if it refers to this install location.
${If} "$INSTDIR" == "$R1"
DeleteRegKey HKCU "Software\Clients\StartMenuInternet\${FileMainEXE}"
DeleteRegValue HKCU "Software\RegisteredApplications" "${AppRegName}"
${EndIf}

View File

@ -46,26 +46,15 @@
#include "../CityHash.h" // added by moz, specific to nsis project
#include <stdlib.h> // for size_t.
#include <utility>
typedef unsigned __int8 uint8;
typedef unsigned __int32 uint32;
typedef unsigned __int64 uint64;
// The standard <utility> header doesn't compile, apparently it conflicts
// with... some Mozilla something or other. But all that's used from it
// is std::pair, so we can just replace that with mozilla::Pair.
#ifndef MOZILLA_CLIENT
#include <utility>
typedef std::pair<uint64, uint64> uint128;
inline uint64 Uint128Low64(const uint128& x) { return x.first; }
inline uint64 Uint128High64(const uint128& x) { return x.second; }
#else
#include "mozilla/Pair.h"
typedef mozilla::Pair<uint64, uint64> uint128;
inline uint64 Uint128Low64(const uint128& x) { return x.first(); }
inline uint64 Uint128High64(const uint128& x) { return x.second(); }
#endif
// Hash function for a byte array.
uint64 CityHash64(const char *buf, size_t len);