;Copyright 2004-2008 John T. Haller, Slightly modified by Dan Bugglin ;Website: http://mzzt.net/ ;This software is OSI Certified Open Source Software. ;OSI Certified is a certification mark of the Open Source Initiative. ;This program is free software; you can redistribute it and/or ;modify it under the terms of the GNU General Public License ;as published by the Free Software Foundation; either version 2 ;of the License, or (at your option) any later version. ;This program is distributed in the hope that it will be useful, ;but WITHOUT ANY WARRANTY; without even the implied warranty of ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;GNU General Public License for more details. ;You should have received a copy of the GNU General Public License ;along with this program; if not, write to the Free Software ;Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. !define PORTABLEAPPNAME "Google Chrome, Portable Edition" !define APPNAME "Google Chrome" !define NAME "GoogleChromePortable" !define VER "0.2.153.1" !define WEBSITE "mzzt.net" !define DEFAULTEXE "chrome.exe" !define DEFAULTAPPDIR "Chrome" ;=== Program Details Name "${PORTABLEAPPNAME}" OutFile "..\..\${NAME}.exe" Caption "${PORTABLEAPPNAME} | mzzt.net" VIProductVersion "${VER}" VIAddVersionKey ProductName "${PORTABLEAPPNAME}" VIAddVersionKey Comments "Allows ${APPNAME} to be run from a removable drive. For additional details, visit ${WEBSITE}" VIAddVersionKey CompanyName "mzzt.net" VIAddVersionKey LegalCopyright "Dan Bugglin, based off of works of John T. Haller" VIAddVersionKey FileDescription "${PORTABLEAPPNAME}" VIAddVersionKey FileVersion "${VER}" VIAddVersionKey ProductVersion "${VER}" VIAddVersionKey InternalName "${PORTABLEAPPNAME}" VIAddVersionKey LegalTrademarks "Google Chrome is a product of Google, Inc. Google is a trademark of Google, Inc." VIAddVersionKey OriginalFilename "${NAME}.exe" ;VIAddVersionKey PrivateBuild "" ;VIAddVersionKey SpecialBuild "" ;=== Runtime Switches CRCCheck On WindowIcon Off SilentInstall Silent AutoCloseWindow True RequestExecutionLevel user ; Best Compression SetCompress Auto SetCompressor /SOLID lzma SetCompressorDictSize 32 SetDatablockOptimize On ;=== Include !include "Attrib.nsh" !include "GetParameters.nsh" ;!include "MUI.nsh" ;!include "GetParent.nsh" !include "Registry.nsh" ;!include "ReplaceInFile.nsh" ;!include "StrRep.nsh" ;!include "TextFunc.nsh" ;!insertmacro ConfigRead ;!insertmacro ConfigWrite ;=== Program Icon Icon "..\..\App\AppInfo\appicon.ico" ;=== Icon & Stye === ;!define MUI_ICON "..\..\App\AppInfo\appicon.ico" ;BrandingText "mzzt.net" ;MiscButtonText "" "" "" "Continue" ;InstallButtonText "Continue" ;=== Pages ;!define MUI_LICENSEPAGE_RADIOBUTTONS ;!insertmacro MUI_PAGE_LICENSE "EULA.rtf" ;!insertmacro MUI_PAGE_INSTFILES ;=== Languages ;!insertmacro MUI_LANGUAGE "English" LangString LauncherFileNotFound ${LANG_ENGLISH} "${PORTABLEAPPNAME} cannot be started. You may wish to re-install to fix this issue. (ERROR: $MISSINGFILEORPATH could not be found)" LangString LauncherAlreadyRunning ${LANG_ENGLISH} "Another instance of ${APPNAME} is already running. Please close other instances of ${APPNAME} before launching ${PORTABLEAPPNAME}." LangString LauncherAskCopyLocal ${LANG_ENGLISH} "${PORTABLEAPPNAME} appears to be running from a location that is read-only. Would you like to temporarily copy it to the local hard drive and run it from there?$\n$\nPrivacy Note: If you say Yes, your personal data within ${PORTABLEAPPNAME} will be temporarily copied to a local drive. Although this copy of your data will be deleted when you close ${PORTABLEAPPNAME}, it may be possible for someone else to access your data later." LangString LauncherNoReadOnly ${LANG_ENGLISH} "${PORTABLEAPPNAME} can not run directly from a read-only location and will now close." ;=== Variables Var PROGRAMDIRECTORY Var PROFILEDIRECTORY Var SETTINGSDIRECTORY ;Var PLUGINSDIRECTORY Var ADDITIONALPARAMETERS Var ALLOWMULTIPLEINSTANCES ;Var SKIPCHROMEFIX ;Var SKIPCOMPREGFIX Var EXECSTRING Var PROGRAMEXECUTABLE Var INIPATH ;Var ISFILELINE Var DISABLESPLASHSCREEN Var DISABLEINTELLIGENTSTART ;Var LOCALHOMEPAGE Var ISDEFAULTDIRECTORY Var RUNLOCALLY Var WAITFORPROGRAM ;Var LASTPROFILEDIRECTORY ;Var APPDATAPATH Var SECONDARYLAUNCH ;Var SHOWLICENSE ;Var STEAMKEYEXISTS Var MISSINGFILEORPATH ;Var CRASHREPORTSDIREXISTS ;Var REGISTRYDIRECTORY ;Var FAILEDTORESTOREKEY Var /global ChromeVer Var /global OldChromeVer Var /global ProfileTempDir ;Function .onInit ; Call GetParameters ; Pop $0 ; StrCmp "$0" "SHOWLICENSE" ShowLicense LicenseDone ; ; ShowLicense: ; StrCpy $SHOWLICENSE "true" ; Goto onInitDone ; ; LicenseDone: ; SetSilent silent ; Goto onInitDone ; ; onInitDone: ;FunctionEnd Section "Main" ;=== Setup variables ; ReadEnvStr $APPDATAPATH "APPDATA" ;=== Find the INI file, if there is one IfFileExists "$EXEDIR\${NAME}.ini" "" NoINI StrCpy "$INIPATH" "$EXEDIR" ;=== Read the parameters from the INI file ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "${APPNAME}Directory" StrCpy $PROGRAMDIRECTORY "$EXEDIR\$0" ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "ProfileDirectory" StrCpy $PROFILEDIRECTORY "$EXEDIR\$0" ;=== Check that the above required parameters are present IfErrors NoINI ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "SettingsDirectory" StrCpy $SETTINGSDIRECTORY "$EXEDIR\$0" ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "AdditionalParameters" StrCpy $ADDITIONALPARAMETERS $0 StrCpy $ALLOWMULTIPLEINSTANCES "false" ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "${APPNAME}Executable" StrCpy $PROGRAMEXECUTABLE $0 StrCpy $WAITFORPROGRAM "true" ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "DisableSplashScreen" StrCpy $DISABLESPLASHSCREEN $0 ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "DisableIntelligentStart" StrCpy $DISABLEINTELLIGENTSTART $0 ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "RunLocally" StrCpy $RUNLOCALLY $0 StrCmp $RUNLOCALLY "true" "" CleanUpAnyErrors StrCpy $WAITFORPROGRAM "true" CleanUpAnyErrors: ;=== Any missing unrequired INI entries will be an empty string, ignore associated errors ClearErrors ;=== Check if default directories StrCmp $PROGRAMDIRECTORY "$EXEDIR\App\${DEFAULTAPPDIR}" "" EndINI StrCmp $PROFILEDIRECTORY "$EXEDIR\Data\profile" "" EndINI StrCpy $SETTINGSDIRECTORY "$EXEDIR\Data\settings" StrCpy $ISDEFAULTDIRECTORY "true" EndINI: IfFileExists "$PROGRAMDIRECTORY\$PROGRAMEXECUTABLE" FoundProgramEXE NoProgramEXE NoINI: ;=== No INI file, so we'll use the defaults StrCpy $ADDITIONALPARAMETERS "" StrCpy $ALLOWMULTIPLEINSTANCES "true" StrCpy $WAITFORPROGRAM "true" StrCpy $PROGRAMEXECUTABLE "${DEFAULTEXE}" StrCpy $DISABLESPLASHSCREEN "false" StrCpy $DISABLEINTELLIGENTSTART "false" IfFileExists "$EXEDIR\App\${DEFAULTAPPDIR}\${DEFAULTEXE}" "" CheckPortableProgramDIR StrCpy $PROGRAMDIRECTORY "$EXEDIR\App\${DEFAULTAPPDIR}" StrCpy $PROFILEDIRECTORY "$EXEDIR\Data\profile" StrCpy $SETTINGSDIRECTORY "$EXEDIR\Data\settings" StrCpy $ISDEFAULTDIRECTORY "true" Goto FoundProgramEXE CheckPortableProgramDIR: IfFileExists "$EXEDIR\${NAME}\App\${DEFAULTAPPDIR}\${DEFAULTEXE}" "" NoProgramEXE StrCpy $PROGRAMDIRECTORY "$EXEDIR\${NAME}\App\${DEFAULTAPPDIR}" StrCpy $PROFILEDIRECTORY "$EXEDIR\Data\profile" StrCpy $SETTINGSDIRECTORY "$EXEDIR\Data\settings" Goto FoundProgramEXE NoProgramEXE: ;=== Program executable not where expected StrCpy $MISSINGFILEORPATH $PROGRAMEXECUTABLE MessageBox MB_OK|MB_ICONEXCLAMATION `$(LauncherFileNotFound)` Abort FoundProgramEXE: ; IfFileExists "$APPDATA\Mozilla\Firefox\*.*" CheckForCrashReports ; StrCpy $WAITFORPROGRAM "true" ; ${registry::KeyExists} "HKEY_CURRENT_USER\Software\Valve" $R0 ; StrCmp $R0 "-1" CheckForCrashReports ;=== If it doesn't exist, skip the next line ; StrCpy $STEAMKEYEXISTS "true" ; CheckForCrashReports: ; IfFileExists "$APPDATA\Mozilla\Firefox\Crash Reports\*.*" "" CheckIfRunning ; StrCpy $CRASHREPORTSDIREXISTS "true" ; CheckIfRunning: ;=== Check if running StrCmp $ALLOWMULTIPLEINSTANCES "true" ProfileWork FindProcDLL::FindProc "chrome.exe" StrCmp $R0 "1" "" ProfileWork ;=== Already running, check if it is using the portable profile ; IfFileExists "$PROFILEDIRECTORY\parent.lock" "" WarnAnotherInstance StrCpy $SECONDARYLAUNCH "true" Goto RunProgram ; Goto WarnAnotherInstance ; WarnAnotherInstance: ; MessageBox MB_OK|MB_ICONINFORMATION `$(LauncherAlreadyRunning)` ; Abort ProfileWork: ;=== Check for an existing profile ; IfFileExists "$PROFILEDIRECTORY\ClentRegistry.blob" ProfileFound ; ;=== No profile was found ; StrCmp $ISDEFAULTDIRECTORY "true" CopyDefaultProfile CreateProfile ; CopyDefaultProfile: ; CreateDirectory "$EXEDIR\Data" ; CreateDirectory "$EXEDIR\Data\profile" ; Goto ProfileFound ; CreateProfile: ; IfFileExists "$PROFILEDIRECTORY\*.*" ProfileFound ; CreateDirectory "$PROFILEDIRECTORY" ; ProfileFound: ; IfFileExists "$SETTINGSDIRECTORY\GoogleChromePortableSettings.ini" SettingsFound ; CreateDirectory "$SETTINGSDIRECTORY" ; FileOpen $R0 "$SETTINGSDIRECTORY\GoogleChromePortableSettings.ini" w ; FileClose $R0 ; WriteINIStr "$SETTINGSDIRECTORY\GoogleChromePortableSettings.ini" "GoogleChromePortableSettings" "LastProfileDirectory" "NONE" ; SettingsFound: ;=== Figure out the temp registry store ; StrCpy "$REGISTRYDIRECTORY" "$TEMP\${NAME}\registry" ; StrCmp $SHOWLICENSE "true" "" CheckForLicense ; WriteINIStr "$SETTINGSDIRECTORY\SteamPortableSettings.ini" "SteamPortableSettings" "AgreedToLicense" "YES" ; Goto TheEnd ; ; CheckForLicense: ; ReadINIStr $0 "$SETTINGSDIRECTORY\SteamPortableSettings.ini" "SteamPortableSettings" "AgreedToLicense" ; StrCmp $0 "YES" LicenseAgreedTo RelaunchWithLicense ; ; RelaunchWithLicense: ; System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1' ; ExecWait `$R0 SHOWLICENSE` ; ReadINIStr $0 "$SETTINGSDIRECTORY\SteamPortableSettings.ini" "SteamPortableSettings" "AgreedToLicense" ; StrCmp $0 "YES" LicenseAgreedTo TheEnd ; ; LicenseAgreedTo: ;=== Check for read/write StrCmp $RUNLOCALLY "true" DisplaySplash ClearErrors FileOpen $R0 "$PROGRAMDIRECTORY\writetest.temp" w IfErrors "" WriteSuccessful ;== Write failed, so we're read-only MessageBox MB_YESNO|MB_ICONQUESTION `$(LauncherAskCopyLocal)` IDYES SwitchToRunLocally MessageBox MB_OK|MB_ICONINFORMATION `$(LauncherNoReadOnly)` Abort SwitchToRunLocally: StrCpy $RUNLOCALLY "true" Goto DisplaySplash WriteSuccessful: FileClose $R0 Delete "$PROGRAMDIRECTORY\writetest.temp" DisplaySplash: StrCmp $DISABLESPLASHSCREEN "true" SkipSplashScreen ;=== Show the splash screen before processing the files ; InitPluginsDir ; File /oname=$PLUGINSDIR\splash.jpg "${NAME}.jpg" ; No splash screen yet... but it loads so fast... maybe there shouldn't be one? :) ; newadvsplash::show /NOUNLOAD 2000 200 0 0xFF00FF /L $PLUGINSDIR\splash.jpg SkipSplashScreen: ;=== Run locally if needed (aka Portable Firefox Live) StrCmp $RUNLOCALLY "true" "" CompareProfilePath RMDir /r "$TEMP\${NAME}\" CreateDirectory $TEMP\${NAME}\profile CopyFiles /SILENT $PROGRAMDIRECTORY\*.* $TEMP\${NAME} StrCpy $PROGRAMDIRECTORY $TEMP\${NAME} CopyFiles /SILENT $PROFILEDIRECTORY\*.* $TEMP\${NAME}\profile StrCpy $PROFILEDIRECTORY $TEMP\${NAME}\profile Push $TEMP\${NAME} Call Attrib CompareProfilePath: ; ReadINIStr $LASTPROFILEDIRECTORY "$SETTINGSDIRECTORY\${NAME}Settings.ini" "${NAME}Settings" "LastProfileDirectory" ; StrCmp $DISABLEINTELLIGENTSTART "true" AdjustChrome ; StrCmp $PROGRAMDIRECTORY $LASTPROFILEDIRECTORY RunProgram AdjustChrome ; AdjustChrome: ; WriteINIStr "$SETTINGSDIRECTORY\${NAME}Settings.ini" "${NAME}Settings" "LastProfileDirectory" "$PROGRAMDIRECTORY" ; Delete "$PROGRAMDIRECTORY\ClientRegistry.blob" FileOpen $2 $SETTINGSDIRECTORY\version.txt r FileRead $2 $ChromeVer FileClose $2 ReadRegStr $OldChromeVer HKCU Software\Google\Update\Clients\{8A69D345-D564-463c-AFF1-A69D9E530F96} "pv" WriteRegStr HKCU Software\Google\Update\Clients\{8A69D345-D564-463c-AFF1-A69D9E530F96} "pv" $ChromeVer RunProgram: ; StrCmp $SKIPCOMPREGFIX "true" GetPassedParameters ; ; ;=== Delete component registry to ensure compatibility with all extensions ; Delete $PROFILEDIRECTORY\compreg.dat ; CopyProfile: StrCpy $ProfileTempDir "$TEMP\GoogleChromePortable" StrCmp $SECONDARYLAUNCH "true" RunProgram2 ;=== Copy profile to local system for faster operation CreateDirectory $ProfileTempDir CopyFiles /SILENT $PROFILEDIRECTORY\*.* $ProfileTempDir RunProgram2: ; GetPassedParameters: ;=== Get any passed parameters Call GetParameters Pop $0 StrCmp "'$0'" "''" "" LaunchProgramParameters ;=== No parameters StrCpy $EXECSTRING `"$PROGRAMDIRECTORY\$PROGRAMEXECUTABLE" -user-data-dir="$ProfileTempDir"` Goto CheckMultipleInstances LaunchProgramParameters: StrCpy $EXECSTRING `"$PROGRAMDIRECTORY\$PROGRAMEXECUTABLE" -user-data-dir="$ProfileTempDir" $0` CheckMultipleInstances: StrCmp $ALLOWMULTIPLEINSTANCES "true" "" AdditionalParameters ; System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("MOZ_NO_REMOTE", "1").r0' AdditionalParameters: StrCmp $ADDITIONALPARAMETERS "" PluginsEnvironment ;=== Additional Parameters StrCpy $EXECSTRING `$EXECSTRING $ADDITIONALPARAMETERS` PluginsEnvironment: ; ;=== Set the plugins directory if we have a path ; StrCmp $PLUGINSDIRECTORY "" LaunchNow ; IfFileExists "$PLUGINSDIRECTORY\*.*" "" LaunchNow ; System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("MOZ_PLUGIN_PATH", "$PLUGINSDIRECTORY").r0' ; LaunchNow: StrCmp $SECONDARYLAUNCH "true" StartProgramAndExit StrCmp $WAITFORPROGRAM "true" "" StartProgramAndExit ; StartProgramNow: ExecWait $EXECSTRING CheckRunning: Sleep 2000 StrCmp $ALLOWMULTIPLEINSTANCES "true" CheckIfRemoveLocalFiles FindProcDLL::FindProc "chrome.exe" StrCmp $R0 "1" CheckRunning CleanupRunLocally StartProgramAndExit: Exec $EXECSTRING Goto TheEnd CleanupRunLocally: StrCmp $RUNLOCALLY "true" "" CheckIfRemoveLocalFiles RMDir /r "$TEMP\${NAME}\" CheckIfRemoveLocalFiles: FindProcDLL::FindProc "chrome.exe" Pop $R0 StrCmp $R0 "1" TheEnd RemoveLocalFiles RemoveLocalFiles: ; StrCmp $CRASHREPORTSDIREXISTS "true" RemoveLocalFiles2 ; RMDir /r "$APPDATA\Mozilla\Firefox\Crash Reports\" ; RemoveLocalFiles2: ; Delete "$APPDATA\Mozilla\Firefox\pluginreg.dat" ; RMDir "$APPDATA\Mozilla\Firefox\" ;=== Will only delete if empty (no /r switch) ; RMDir "$APPDATA\Mozilla\" ;=== Will only delete if empty (no /r switch) RMDir /r $ProfileTempDir\Default\Cache CopyFiles /SILENT $ProfileTempDir\*.* $PROFILEDIRECTORY RMDir /r $ProfileTempDir StrCmp $OldChromeVer "" 0 +3 DeleteRegKey HKCU Software\Google\Update\Clients\{8A69D345-D564-463c-AFF1-A69D9E530F96} Goto theEnd WriteRegStr HKCU Software\Google\Update\Clients\{8A69D345-D564-463c-AFF1-A69D9E530F96} "pv" $OldChromeVer TheEnd: ${registry::Unload} newadvsplash::stop /WAIT SectionEnd