| Index: chrome/installer/setup/install_worker.cc
|
| diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc
|
| index d89a71d0f3fd5c10dcae3f0043b7ae158d32651a..245abc4f53cf4e3b9ec25cfd5a03f91e822e88cc 100644
|
| --- a/chrome/installer/setup/install_worker.cc
|
| +++ b/chrome/installer/setup/install_worker.cc
|
| @@ -162,32 +162,42 @@ void AddInstallerCopyTasks(const InstallerState& installer_state,
|
| install_list->AddCreateDirWorkItem(installer_dir);
|
|
|
| FilePath exe_dst(installer_dir.Append(setup_path.BaseName()));
|
| - FilePath archive_dst(installer_dir.Append(archive_path.BaseName()));
|
|
|
| if (exe_dst != setup_path) {
|
| install_list->AddCopyTreeWorkItem(setup_path.value(), exe_dst.value(),
|
| temp_path.value(), WorkItem::ALWAYS);
|
| }
|
|
|
| - if (archive_path != archive_dst) {
|
| - // In the past, we copied rather than moved for system level installs so
|
| - // that the permissions of %ProgramFiles% would be picked up. Now that
|
| - // |temp_path| is in %ProgramFiles% for system level installs (and in
|
| - // %LOCALAPPDATA% otherwise), there is no need to do this for the archive.
|
| - // Setup.exe, on the other hand, is created elsewhere so it must always be
|
| - // copied.
|
| + // If only the App Host (not even the Chrome Binaries) is being installed,
|
| + // this must be a user-level App Host piggybacking on system-level Chrome
|
| + // Binaries. Only setup.exe is required, and only for uninstall.
|
| + if (installer_state.products().size() != 1 ||
|
| + !installer_state.FindProduct(BrowserDistribution::CHROME_APP_HOST)) {
|
| + FilePath archive_dst(installer_dir.Append(archive_path.BaseName()));
|
| + if (archive_path != archive_dst) {
|
| + // In the past, we copied rather than moved for system level installs so
|
| + // that the permissions of %ProgramFiles% would be picked up. Now that
|
| + // |temp_path| is in %ProgramFiles% for system level installs (and in
|
| + // %LOCALAPPDATA% otherwise), there is no need to do this for the archive.
|
| + // Setup.exe, on the other hand, is created elsewhere so it must always be
|
| + // copied.
|
| #if !defined(COMPONENT_BUILD)
|
| - install_list->AddMoveTreeWorkItem(archive_path.value(), archive_dst.value(),
|
| - temp_path.value(), WorkItem::ALWAYS_MOVE);
|
| + install_list->AddMoveTreeWorkItem(archive_path.value(),
|
| + archive_dst.value(),
|
| + temp_path.value(),
|
| + WorkItem::ALWAYS_MOVE);
|
| #else // COMPONENT_BUILD
|
| - // The archive is usually extracted in |temp_path| in which case we want to
|
| - // move it as mentioned above; however in the component build, setup.exe
|
| - // uses chrome.7z directly from the build output, moving it means that
|
| - // setup.exe cannot be run again without regenerating the archive, so copy
|
| - // it instead in this case to save developer time.
|
| - install_list->AddCopyTreeWorkItem(archive_path.value(), archive_dst.value(),
|
| - temp_path.value(), WorkItem::ALWAYS);
|
| + // The archive is usually extracted in |temp_path| in which case we want
|
| + // to move it as mentioned above; however in the component build,
|
| + // setup.exe uses chrome.7z directly from the build output, moving it
|
| + // means that setup.exe cannot be run again without regenerating the
|
| + // archive, so copy it instead in this case to save developer time.
|
| + install_list->AddCopyTreeWorkItem(archive_path.value(),
|
| + archive_dst.value(),
|
| + temp_path.value(),
|
| + WorkItem::ALWAYS);
|
| #endif // COMPONENT_BUILD
|
| + }
|
| }
|
| }
|
|
|
| @@ -409,11 +419,6 @@ void AddChromeWorkItems(const InstallationState& original_state,
|
| install_list->AddDeleteTreeWorkItem(
|
| target_path.Append(installer::kChromeOldExe), temp_path)->
|
| set_ignore_failure(true);
|
| -
|
| - // Copy installer in install directory and
|
| - // add shortcut in Control Panel->Add/Remove Programs.
|
| - AddInstallerCopyTasks(installer_state, setup_path, archive_path, temp_path,
|
| - new_version, install_list);
|
| }
|
|
|
| // Probes COM machinery to get an instance of delegate_execute.exe's
|
| @@ -1083,6 +1088,10 @@ void AddInstallWorkItems(const InstallationState& original_state,
|
| L"");
|
| }
|
|
|
| + // Copy installer in install directory
|
| + AddInstallerCopyTasks(installer_state, setup_path, archive_path, temp_path,
|
| + new_version, install_list);
|
| +
|
| const HKEY root = installer_state.root_key();
|
| // Only set "lang" for user-level installs since for system-level, the install
|
| // language may not be related to a given user's runtime language.
|
|
|