| Index: chrome/installer/setup/install.cc | 
| diff --git a/chrome/installer/setup/install.cc b/chrome/installer/setup/install.cc | 
| index 709b372a401464d91166b4057a2fdedaa2913ad6..341bbfd8af3bf6ff60932130e36a60f1e5729b1b 100644 | 
| --- a/chrome/installer/setup/install.cc | 
| +++ b/chrome/installer/setup/install.cc | 
| @@ -23,6 +23,7 @@ | 
| #include "base/win/shortcut.h" | 
| #include "base/win/windows_version.h" | 
| #include "chrome/common/chrome_constants.h" | 
| +#include "chrome/common/chrome_switches.h" | 
| #include "chrome/installer/setup/install_worker.h" | 
| #include "chrome/installer/setup/setup_constants.h" | 
| #include "chrome/installer/util/auto_launch_util.h" | 
| @@ -132,7 +133,7 @@ void AddChromeToMediaPlayerList() { | 
| LOG(ERROR) << "Could not add Chrome to media player inclusion list."; | 
| } | 
|  | 
| -// Copy master preferences file provided to installer, in the same folder | 
| +// Copy master_preferences file provided to installer, in the same folder | 
| // as chrome.exe so Chrome first run can find it. This function will be called | 
| // only on the first install of Chrome. | 
| void CopyPreferenceFileForFirstRun(const InstallerState& installer_state, | 
| @@ -285,6 +286,23 @@ void CleanupLegacyShortcuts(const InstallerState& installer_state, | 
| } | 
| } | 
|  | 
| +// Returns the appropriate shortcut operations for App Launcher, | 
| +// based on state of installation and master_preferences. | 
| +installer::InstallShortcutOperation GetAppLauncherShortcutOperation( | 
| +    const InstallationState& original_state, | 
| +    const InstallerState& installer_state) { | 
| +  const installer::ProductState* original_app_host_state = | 
| +      original_state.GetProductState(installer_state.system_install(), | 
| +                                     BrowserDistribution::CHROME_APP_HOST); | 
| +  bool app_launcher_exists = original_app_host_state && | 
| +      CommandLine(original_app_host_state->uninstall_command()) | 
| +          .HasSwitch(installer::switches::kChromeAppLauncher); | 
| +  if (!app_launcher_exists) | 
| +    return installer::INSTALL_SHORTCUT_CREATE_ALL; | 
| + | 
| +  return installer::INSTALL_SHORTCUT_REPLACE_EXISTING; | 
| +} | 
| + | 
| }  // end namespace | 
|  | 
| namespace installer { | 
| @@ -356,15 +374,13 @@ bool CreateVisualElementsManifest(const FilePath& src_path, | 
| } | 
| } | 
|  | 
| +// TODO(tommi): Change this function to use WorkItemList. | 
| void CreateOrUpdateShortcuts( | 
| -    const FilePath& chrome_exe, | 
| +    const FilePath& target, | 
| const Product& product, | 
| const MasterPreferences& prefs, | 
| InstallShortcutLevel install_level, | 
| InstallShortcutOperation install_operation) { | 
| -  // TODO(tommi): Change this function to use WorkItemList. | 
| -  DCHECK(product.is_chrome()); | 
| - | 
| // Extract shortcut preferences from |prefs|. | 
| bool do_not_create_desktop_shortcut = false; | 
| bool do_not_create_quick_launch_shortcut = false; | 
| @@ -377,9 +393,6 @@ void CreateOrUpdateShortcuts( | 
| &alternate_desktop_shortcut); | 
|  | 
| BrowserDistribution* dist = product.distribution(); | 
| -  // Shortcuts are always installed per-user unless specified. | 
| -  ShellUtil::ShellChange shortcut_level = (install_level == ALL_USERS ? | 
| -      ShellUtil::SYSTEM_LEVEL : ShellUtil::CURRENT_USER); | 
|  | 
| // The default operation on update is to overwrite shortcuts with the | 
| // currently desired properties, but do so only for shortcuts that still | 
| @@ -398,10 +411,14 @@ void CreateOrUpdateShortcuts( | 
| break; | 
| } | 
|  | 
| +  // Shortcuts are always installed per-user unless specified. | 
| +  ShellUtil::ShellChange shortcut_level = (install_level == ALL_USERS ? | 
| +      ShellUtil::SYSTEM_LEVEL : ShellUtil::CURRENT_USER); | 
| + | 
| // |base_properties|: The basic properties to set on every shortcut installed | 
| // (to be refined on a per-shortcut basis). | 
| ShellUtil::ShortcutProperties base_properties(shortcut_level); | 
| -  product.AddDefaultShortcutProperties(chrome_exe, &base_properties); | 
| +  product.AddDefaultShortcutProperties(target, &base_properties); | 
|  | 
| if (!do_not_create_desktop_shortcut || | 
| shortcut_operation == ShellUtil::SHELL_SHORTCUT_REPLACE_EXISTING) { | 
| @@ -529,14 +546,30 @@ InstallStatus InstallOrUpdateProduct( | 
| if (result == FIRST_INSTALL_SUCCESS && !prefs_path.empty()) | 
| CopyPreferenceFileForFirstRun(installer_state, prefs_path); | 
|  | 
| -    // Currently this only creates shortcuts for Chrome, but for other products | 
| -    // we might want to create shortcuts. | 
| -    const Product* chrome_install = | 
| -        installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER); | 
| -    if (chrome_install) { | 
| -      installer_state.UpdateStage(installer::CREATING_SHORTCUTS); | 
| +    installer_state.UpdateStage(installer::CREATING_SHORTCUTS); | 
| + | 
| +    const Product* app_launcher_product = | 
| +        installer_state.FindProduct(BrowserDistribution::CHROME_APP_HOST); | 
| +    // Creates shortcuts for App Launcher. | 
| +    if (app_launcher_product && | 
| +        app_launcher_product->HasOption(kOptionAppHostIsLauncher)) { | 
| +      // TODO(huangs): Remove this check once we have system-level App Host. | 
| +      DCHECK(!installer_state.system_install()); | 
| +      const FilePath app_host_exe( | 
| +          installer_state.target_path().Append(kChromeAppHostExe)); | 
| +      InstallShortcutOperation app_launcher_shortcut_operation = | 
| +          GetAppLauncherShortcutOperation(original_state, installer_state); | 
| + | 
| +      // Always install per-user shortcuts for App Launcher. | 
| +      CreateOrUpdateShortcuts(app_host_exe, *app_launcher_product, prefs, | 
| +                              CURRENT_USER, app_launcher_shortcut_operation); | 
| +    } | 
|  | 
| -      BrowserDistribution* dist = chrome_install->distribution(); | 
| +    const Product* chrome_product = | 
| +        installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER); | 
| +    // Creates shortcuts for Chrome. | 
| +    if (chrome_product) { | 
| +      BrowserDistribution* dist = chrome_product->distribution(); | 
| const FilePath chrome_exe( | 
| installer_state.target_path().Append(kChromeExe)); | 
| CleanupLegacyShortcuts(installer_state, dist, chrome_exe); | 
| @@ -550,13 +583,18 @@ InstallStatus InstallOrUpdateProduct( | 
|  | 
| if (installer_state.system_install()) { | 
| // Update existing all-users shortcuts for legacy installs. | 
| -        CreateOrUpdateShortcuts(chrome_exe, *chrome_install, prefs, ALL_USERS, | 
| +        CreateOrUpdateShortcuts(chrome_exe, *chrome_product, prefs, ALL_USERS, | 
| INSTALL_SHORTCUT_REPLACE_EXISTING); | 
| } | 
| // Always install per-user shortcuts (even on system-level installs where | 
| // we do so for the installing user instead of waiting for Active Setup). | 
| -      CreateOrUpdateShortcuts(chrome_exe, *chrome_install, prefs, CURRENT_USER, | 
| +      CreateOrUpdateShortcuts(chrome_exe, *chrome_product, prefs, CURRENT_USER, | 
| install_operation); | 
| +    } | 
| + | 
| +    if (chrome_product) { | 
| +      // Register Chrome and, if requested, make Chrome the default browser. | 
| +      installer_state.UpdateStage(installer::REGISTERING_CHROME); | 
|  | 
| bool make_chrome_default = false; | 
| prefs.GetBool(master_preferences::kMakeChromeDefault, | 
| @@ -573,15 +611,14 @@ InstallStatus InstallOrUpdateProduct( | 
| &force_chrome_default_for_user); | 
| } | 
|  | 
| -      installer_state.UpdateStage(installer::REGISTERING_CHROME); | 
| - | 
| -      RegisterChromeOnMachine(installer_state, *chrome_install, | 
| +      RegisterChromeOnMachine(installer_state, *chrome_product, | 
| make_chrome_default || force_chrome_default_for_user); | 
|  | 
| +      // Configure auto-launch. | 
| if (result == FIRST_INSTALL_SUCCESS) { | 
| installer_state.UpdateStage(installer::CONFIGURE_AUTO_LAUNCH); | 
|  | 
| -        // Add auto-launch key if specified in master preferences. | 
| +        // Add auto-launch key if specified in master_preferences. | 
| bool auto_launch_chrome = false; | 
| prefs.GetBool( | 
| installer::master_preferences::kAutoLaunchChrome, | 
|  |