| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/installer/setup/install.h" | 5 #include "chrome/installer/setup/install.h" |
| 6 | 6 |
| 7 #include <windows.h> | 7 #include <windows.h> |
| 8 #include <shlobj.h> | 8 #include <shlobj.h> |
| 9 #include <time.h> | 9 #include <time.h> |
| 10 | 10 |
| 11 #include <memory> | 11 #include <memory> |
| 12 #include <string> | 12 #include <string> |
| 13 | 13 |
| 14 #include "base/command_line.h" | 14 #include "base/command_line.h" |
| 15 #include "base/files/file_path.h" | 15 #include "base/files/file_path.h" |
| 16 #include "base/files/file_util.h" | 16 #include "base/files/file_util.h" |
| 17 #include "base/logging.h" | 17 #include "base/logging.h" |
| 18 #include "base/numerics/safe_conversions.h" | 18 #include "base/numerics/safe_conversions.h" |
| 19 #include "base/process/launch.h" | 19 #include "base/process/launch.h" |
| 20 #include "base/strings/string_util.h" | 20 #include "base/strings/string_util.h" |
| 21 #include "base/strings/stringprintf.h" | 21 #include "base/strings/stringprintf.h" |
| 22 #include "base/strings/utf_string_conversions.h" | 22 #include "base/strings/utf_string_conversions.h" |
| 23 #include "base/win/shortcut.h" | 23 #include "base/win/shortcut.h" |
| 24 #include "base/win/windows_version.h" | |
| 25 #include "chrome/common/chrome_constants.h" | |
| 26 #include "chrome/common/chrome_switches.h" | |
| 27 #include "chrome/installer/setup/install_worker.h" | 24 #include "chrome/installer/setup/install_worker.h" |
| 28 #include "chrome/installer/setup/installer_crash_reporting.h" | 25 #include "chrome/installer/setup/installer_crash_reporting.h" |
| 26 #include "chrome/installer/setup/installer_state.h" |
| 29 #include "chrome/installer/setup/setup_constants.h" | 27 #include "chrome/installer/setup/setup_constants.h" |
| 30 #include "chrome/installer/setup/setup_util.h" | 28 #include "chrome/installer/setup/setup_util.h" |
| 31 #include "chrome/installer/setup/update_active_setup_version_work_item.h" | 29 #include "chrome/installer/setup/update_active_setup_version_work_item.h" |
| 32 #include "chrome/installer/util/beacons.h" | 30 #include "chrome/installer/util/beacons.h" |
| 33 #include "chrome/installer/util/browser_distribution.h" | 31 #include "chrome/installer/util/browser_distribution.h" |
| 34 #include "chrome/installer/util/create_reg_key_work_item.h" | 32 #include "chrome/installer/util/create_reg_key_work_item.h" |
| 35 #include "chrome/installer/util/delete_after_reboot_helper.h" | 33 #include "chrome/installer/util/delete_after_reboot_helper.h" |
| 36 #include "chrome/installer/util/delete_old_versions.h" | 34 #include "chrome/installer/util/delete_old_versions.h" |
| 37 #include "chrome/installer/util/google_update_constants.h" | |
| 38 #include "chrome/installer/util/helper.h" | |
| 39 #include "chrome/installer/util/install_util.h" | 35 #include "chrome/installer/util/install_util.h" |
| 36 #include "chrome/installer/util/installation_state.h" |
| 40 #include "chrome/installer/util/master_preferences.h" | 37 #include "chrome/installer/util/master_preferences.h" |
| 41 #include "chrome/installer/util/master_preferences_constants.h" | 38 #include "chrome/installer/util/master_preferences_constants.h" |
| 42 #include "chrome/installer/util/set_reg_value_work_item.h" | |
| 43 #include "chrome/installer/util/util_constants.h" | 39 #include "chrome/installer/util/util_constants.h" |
| 44 #include "chrome/installer/util/work_item.h" | 40 #include "chrome/installer/util/work_item.h" |
| 45 #include "chrome/installer/util/work_item_list.h" | 41 #include "chrome/installer/util/work_item_list.h" |
| 46 | 42 |
| 47 namespace { | 43 namespace { |
| 48 | 44 |
| 49 void LogShortcutOperation(ShellUtil::ShortcutLocation location, | 45 void LogShortcutOperation(ShellUtil::ShortcutLocation location, |
| 50 BrowserDistribution* dist, | 46 BrowserDistribution* dist, |
| 51 const ShellUtil::ShortcutProperties& properties, | 47 const ShellUtil::ShortcutProperties& properties, |
| 52 ShellUtil::ShortcutOperation operation, | 48 ShellUtil::ShortcutOperation operation, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 message.append(base::UTF16ToUTF8(properties.shortcut_name)); | 92 message.append(base::UTF16ToUTF8(properties.shortcut_name)); |
| 97 else | 93 else |
| 98 message.append(base::UTF16ToUTF8(dist->GetDisplayName())); | 94 message.append(base::UTF16ToUTF8(dist->GetDisplayName())); |
| 99 message.push_back('"'); | 95 message.push_back('"'); |
| 100 | 96 |
| 101 message.append(" shortcut to "); | 97 message.append(" shortcut to "); |
| 102 message.append(base::UTF16ToUTF8(properties.target.value())); | 98 message.append(base::UTF16ToUTF8(properties.target.value())); |
| 103 if (properties.has_arguments()) | 99 if (properties.has_arguments()) |
| 104 message.append(base::UTF16ToUTF8(properties.arguments)); | 100 message.append(base::UTF16ToUTF8(properties.arguments)); |
| 105 | 101 |
| 106 if (properties.pin_to_taskbar && | 102 if (properties.pin_to_taskbar && base::win::CanPinShortcutToTaskbar()) |
| 107 base::win::GetVersion() >= base::win::VERSION_WIN7) { | |
| 108 message.append(" and pinning to the taskbar"); | 103 message.append(" and pinning to the taskbar"); |
| 109 } | |
| 110 | 104 |
| 111 message.push_back('.'); | 105 message.push_back('.'); |
| 112 | 106 |
| 113 if (failed) | 107 if (failed) |
| 114 LOG(WARNING) << message; | 108 LOG(WARNING) << message; |
| 115 else | 109 else |
| 116 VLOG(1) << message; | 110 VLOG(1) << message; |
| 117 } | 111 } |
| 118 | 112 |
| 119 void ExecuteAndLogShortcutOperation( | 113 void ExecuteAndLogShortcutOperation( |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 base::PathExists(new_chrome_exe) && current_version->get() && | 210 base::PathExists(new_chrome_exe) && current_version->get() && |
| 217 new_version == *current_version->get() ? | 211 new_version == *current_version->get() ? |
| 218 installer::SAME_VERSION_REPAIR_FAILED : | 212 installer::SAME_VERSION_REPAIR_FAILED : |
| 219 installer::INSTALL_FAILED; | 213 installer::INSTALL_FAILED; |
| 220 LOG(ERROR) << "Install failed, rolling back... result: " << result; | 214 LOG(ERROR) << "Install failed, rolling back... result: " << result; |
| 221 install_list->Rollback(); | 215 install_list->Rollback(); |
| 222 LOG(ERROR) << "Rollback complete. "; | 216 LOG(ERROR) << "Rollback complete. "; |
| 223 return result; | 217 return result; |
| 224 } | 218 } |
| 225 | 219 |
| 226 installer_state.SetStage(installer::REFRESHING_POLICY); | |
| 227 | |
| 228 installer::RefreshElevationPolicy(); | |
| 229 | |
| 230 if (!current_version->get()) { | 220 if (!current_version->get()) { |
| 231 VLOG(1) << "First install of version " << new_version; | 221 VLOG(1) << "First install of version " << new_version; |
| 232 return installer::FIRST_INSTALL_SUCCESS; | 222 return installer::FIRST_INSTALL_SUCCESS; |
| 233 } | 223 } |
| 234 | 224 |
| 235 if (new_version == **current_version) { | 225 if (new_version == **current_version) { |
| 236 VLOG(1) << "Install repaired of version " << new_version; | 226 VLOG(1) << "Install repaired of version " << new_version; |
| 237 return installer::INSTALL_REPAIRED; | 227 return installer::INSTALL_REPAIRED; |
| 238 } | 228 } |
| 239 | 229 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 258 return installer::OLD_VERSION_DOWNGRADE; | 248 return installer::OLD_VERSION_DOWNGRADE; |
| 259 } | 249 } |
| 260 | 250 |
| 261 LOG(ERROR) << "Not sure how we got here while updating" | 251 LOG(ERROR) << "Not sure how we got here while updating" |
| 262 << ", new version: " << new_version | 252 << ", new version: " << new_version |
| 263 << ", old version: " << **current_version; | 253 << ", old version: " << **current_version; |
| 264 | 254 |
| 265 return installer::INSTALL_FAILED; | 255 return installer::INSTALL_FAILED; |
| 266 } | 256 } |
| 267 | 257 |
| 268 } // end namespace | 258 } // namespace |
| 269 | 259 |
| 270 namespace installer { | 260 namespace installer { |
| 271 | 261 |
| 272 void EscapeXmlAttributeValueInSingleQuotes(base::string16* att_value) { | 262 void EscapeXmlAttributeValueInSingleQuotes(base::string16* att_value) { |
| 273 base::ReplaceChars(*att_value, base::ASCIIToUTF16("&"), | 263 base::ReplaceChars(*att_value, base::ASCIIToUTF16("&"), |
| 274 base::ASCIIToUTF16("&"), att_value); | 264 base::ASCIIToUTF16("&"), att_value); |
| 275 base::ReplaceChars(*att_value, base::ASCIIToUTF16("'"), | 265 base::ReplaceChars(*att_value, base::ASCIIToUTF16("'"), |
| 276 base::ASCIIToUTF16("'"), att_value); | 266 base::ASCIIToUTF16("'"), att_value); |
| 277 base::ReplaceChars(*att_value, base::ASCIIToUTF16("<"), | 267 base::ReplaceChars(*att_value, base::ASCIIToUTF16("<"), |
| 278 base::ASCIIToUTF16("<"), att_value); | 268 base::ASCIIToUTF16("<"), att_value); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 InstallStatus InstallOrUpdateProduct( | 463 InstallStatus InstallOrUpdateProduct( |
| 474 const installer::InstallationState& original_state, | 464 const installer::InstallationState& original_state, |
| 475 const installer::InstallerState& installer_state, | 465 const installer::InstallerState& installer_state, |
| 476 const base::FilePath& setup_path, | 466 const base::FilePath& setup_path, |
| 477 const base::FilePath& archive_path, | 467 const base::FilePath& archive_path, |
| 478 const base::FilePath& install_temp_path, | 468 const base::FilePath& install_temp_path, |
| 479 const base::FilePath& src_path, | 469 const base::FilePath& src_path, |
| 480 const base::FilePath& prefs_path, | 470 const base::FilePath& prefs_path, |
| 481 const MasterPreferences& prefs, | 471 const MasterPreferences& prefs, |
| 482 const base::Version& new_version) { | 472 const base::Version& new_version) { |
| 483 DCHECK(!installer_state.products().empty()); | |
| 484 | |
| 485 // TODO(robertshield): Removing the pending on-reboot moves should be done | 473 // TODO(robertshield): Removing the pending on-reboot moves should be done |
| 486 // elsewhere. | 474 // elsewhere. |
| 487 // Remove any scheduled MOVEFILE_DELAY_UNTIL_REBOOT entries in the target of | 475 // Remove any scheduled MOVEFILE_DELAY_UNTIL_REBOOT entries in the target of |
| 488 // this installation. These may have been added during a previous uninstall of | 476 // this installation. These may have been added during a previous uninstall of |
| 489 // the same version. | 477 // the same version. |
| 490 LOG_IF(ERROR, !RemoveFromMovesPendingReboot(installer_state.target_path())) | 478 LOG_IF(ERROR, !RemoveFromMovesPendingReboot(installer_state.target_path())) |
| 491 << "Error accessing pending moves value."; | 479 << "Error accessing pending moves value."; |
| 492 | 480 |
| 493 // Create VisualElementManifest.xml in |src_path| (if required) so that it | 481 // Create VisualElementManifest.xml in |src_path| (if required) so that it |
| 494 // looks as if it had been extracted from the archive when calling | 482 // looks as if it had been extracted from the archive when calling |
| 495 // InstallNewVersion() below. | 483 // InstallNewVersion() below. |
| 496 installer_state.SetStage(CREATING_VISUAL_MANIFEST); | 484 installer_state.SetStage(CREATING_VISUAL_MANIFEST); |
| 497 CreateVisualElementsManifest(src_path, new_version); | 485 CreateVisualElementsManifest(src_path, new_version); |
| 498 | 486 |
| 499 std::unique_ptr<base::Version> existing_version; | 487 std::unique_ptr<base::Version> existing_version; |
| 500 InstallStatus result = | 488 InstallStatus result = |
| 501 InstallNewVersion(original_state, installer_state, setup_path, | 489 InstallNewVersion(original_state, installer_state, setup_path, |
| 502 archive_path, src_path, install_temp_path, new_version, | 490 archive_path, src_path, install_temp_path, new_version, |
| 503 &existing_version, IsDowngradeAllowed(prefs)); | 491 &existing_version, IsDowngradeAllowed(prefs)); |
| 504 | 492 |
| 505 // TODO(robertshield): Everything below this line should instead be captured | 493 // TODO(robertshield): Everything below this line should instead be captured |
| 506 // by WorkItems. | 494 // by WorkItems. |
| 507 if (!InstallUtil::GetInstallReturnCode(result)) { | 495 if (!InstallUtil::GetInstallReturnCode(result)) { |
| 508 installer_state.SetStage(UPDATING_CHANNELS); | 496 installer_state.SetStage(UPDATING_CHANNELS); |
| 509 | 497 |
| 510 // Update the modifiers on the channel values for the product(s) being | 498 // Strip evidence of multi-install from the "ap" value. |
| 511 // installed and for the binaries in case of multi-install. | 499 // TODO(grt): Consider doing this earlier, prior to any other work, so that |
| 500 // failed updates benefit from the stripping. |
| 512 installer_state.UpdateChannels(); | 501 installer_state.UpdateChannels(); |
| 513 | 502 |
| 514 installer_state.SetStage(COPYING_PREFERENCES_FILE); | 503 installer_state.SetStage(COPYING_PREFERENCES_FILE); |
| 515 | 504 |
| 516 if (result == FIRST_INSTALL_SUCCESS && !prefs_path.empty()) | 505 if (result == FIRST_INSTALL_SUCCESS && !prefs_path.empty()) |
| 517 CopyPreferenceFileForFirstRun(installer_state, prefs_path); | 506 CopyPreferenceFileForFirstRun(installer_state, prefs_path); |
| 518 | 507 |
| 519 installer_state.SetStage(CREATING_SHORTCUTS); | 508 installer_state.SetStage(CREATING_SHORTCUTS); |
| 520 | 509 |
| 521 const installer::Product* chrome_product = | |
| 522 installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER); | |
| 523 // Creates shortcuts for Chrome. | 510 // Creates shortcuts for Chrome. |
| 524 if (chrome_product) { | 511 const Product& chrome_product = installer_state.product(); |
| 525 BrowserDistribution* chrome_dist = chrome_product->distribution(); | 512 BrowserDistribution* chrome_dist = chrome_product.distribution(); |
| 526 const base::FilePath chrome_exe( | 513 const base::FilePath chrome_exe( |
| 527 installer_state.target_path().Append(kChromeExe)); | 514 installer_state.target_path().Append(kChromeExe)); |
| 528 | 515 |
| 529 // Install per-user shortcuts on user-level installs and all-users | 516 // Install per-user shortcuts on user-level installs and all-users shortcuts |
| 530 // shortcuts on system-level installs. Note that Active Setup will take | 517 // on system-level installs. Note that Active Setup will take care of |
| 531 // care of installing missing per-user shortcuts on system-level install | 518 // installing missing per-user shortcuts on system-level install (i.e., |
| 532 // (i.e., quick launch, taskbar pin, and possibly deleted all-users | 519 // quick launch, taskbar pin, and possibly deleted all-users shortcuts). |
| 533 // shortcuts). | 520 InstallShortcutLevel install_level = |
| 534 InstallShortcutLevel install_level = installer_state.system_install() ? | 521 installer_state.system_install() ? ALL_USERS : CURRENT_USER; |
| 535 ALL_USERS : CURRENT_USER; | |
| 536 | 522 |
| 537 InstallShortcutOperation install_operation = | 523 InstallShortcutOperation install_operation = |
| 538 INSTALL_SHORTCUT_REPLACE_EXISTING; | 524 INSTALL_SHORTCUT_REPLACE_EXISTING; |
| 539 if (result == installer::FIRST_INSTALL_SUCCESS || | 525 if (result == installer::FIRST_INSTALL_SUCCESS || |
| 540 result == installer::INSTALL_REPAIRED || | 526 result == installer::INSTALL_REPAIRED || |
| 541 !original_state.GetProductState(installer_state.system_install(), | 527 !original_state.GetProductState(installer_state.system_install(), |
| 542 chrome_dist->GetType())) { | 528 chrome_dist->GetType())) { |
| 543 // Always create the shortcuts on a new install, a repair install, and | 529 // Always create the shortcuts on a new install, a repair install, and |
| 544 // when the Chrome product is being added to the current install. | 530 // when the Chrome product is being added to the current install. |
| 545 install_operation = INSTALL_SHORTCUT_CREATE_ALL; | 531 install_operation = INSTALL_SHORTCUT_CREATE_ALL; |
| 546 } | |
| 547 | |
| 548 CreateOrUpdateShortcuts(chrome_exe, *chrome_product, prefs, install_level, | |
| 549 install_operation); | |
| 550 } | 532 } |
| 551 | 533 |
| 552 if (chrome_product) { | 534 CreateOrUpdateShortcuts(chrome_exe, chrome_product, prefs, install_level, |
| 553 // Register Chrome and, if requested, make Chrome the default browser. | 535 install_operation); |
| 554 installer_state.SetStage(REGISTERING_CHROME); | |
| 555 | 536 |
| 556 bool make_chrome_default = false; | 537 // Register Chrome and, if requested, make Chrome the default browser. |
| 557 prefs.GetBool(master_preferences::kMakeChromeDefault, | 538 installer_state.SetStage(REGISTERING_CHROME); |
| 558 &make_chrome_default); | |
| 559 | 539 |
| 560 // If this is not the user's first Chrome install, but they have chosen | 540 bool make_chrome_default = false; |
| 561 // Chrome to become their default browser on the download page, we must | 541 prefs.GetBool(master_preferences::kMakeChromeDefault, &make_chrome_default); |
| 562 // force it here because the master_preferences file will not get copied | |
| 563 // into the build. | |
| 564 bool force_chrome_default_for_user = false; | |
| 565 if (result == NEW_VERSION_UPDATED || result == INSTALL_REPAIRED || | |
| 566 result == OLD_VERSION_DOWNGRADE || result == IN_USE_DOWNGRADE) { | |
| 567 prefs.GetBool(master_preferences::kMakeChromeDefaultForUser, | |
| 568 &force_chrome_default_for_user); | |
| 569 } | |
| 570 | 542 |
| 571 RegisterChromeOnMachine( | 543 // If this is not the user's first Chrome install, but they have chosen |
| 572 installer_state, *chrome_product, | 544 // Chrome to become their default browser on the download page, we must |
| 573 make_chrome_default || force_chrome_default_for_user, new_version); | 545 // force it here because the master_preferences file will not get copied |
| 546 // into the build. |
| 547 bool force_chrome_default_for_user = false; |
| 548 if (result == NEW_VERSION_UPDATED || result == INSTALL_REPAIRED || |
| 549 result == OLD_VERSION_DOWNGRADE || result == IN_USE_DOWNGRADE) { |
| 550 prefs.GetBool(master_preferences::kMakeChromeDefaultForUser, |
| 551 &force_chrome_default_for_user); |
| 552 } |
| 574 | 553 |
| 575 if (!installer_state.system_install()) { | 554 RegisterChromeOnMachine( |
| 576 DCHECK_EQ(chrome_product->distribution(), | 555 installer_state, chrome_product, |
| 577 BrowserDistribution::GetDistribution()); | 556 make_chrome_default || force_chrome_default_for_user, new_version); |
| 578 UpdateDefaultBrowserBeaconForPath( | 557 |
| 579 installer_state.target_path().Append(installer::kChromeExe)); | 558 if (!installer_state.system_install()) { |
| 580 } | 559 DCHECK_EQ(chrome_product.distribution(), |
| 560 BrowserDistribution::GetDistribution()); |
| 561 UpdateDefaultBrowserBeaconForPath( |
| 562 installer_state.target_path().Append(installer::kChromeExe)); |
| 581 } | 563 } |
| 582 | 564 |
| 583 // Delete files that belong to old versions of Chrome. If that fails during | 565 // Delete files that belong to old versions of Chrome. If that fails during |
| 584 // a not-in-use update, launch a --delete-old-version process. If this is an | 566 // a not-in-use update, launch a --delete-old-version process. If this is an |
| 585 // in-use update, a --delete-old-versions process will be launched when | 567 // in-use update, a --delete-old-versions process will be launched when |
| 586 // executables are renamed. | 568 // executables are renamed. |
| 587 installer_state.SetStage(REMOVING_OLD_VERSIONS); | 569 installer_state.SetStage(REMOVING_OLD_VERSIONS); |
| 588 const bool is_in_use = | 570 const bool is_in_use = |
| 589 (result == IN_USE_UPDATED || result == IN_USE_DOWNGRADE); | 571 (result == IN_USE_UPDATED || result == IN_USE_DOWNGRADE); |
| 590 if (!DeleteOldVersions(installer_state.target_path()) && !is_in_use) { | 572 if (!DeleteOldVersions(installer_state.target_path()) && !is_in_use) { |
| 591 const base::FilePath new_version_setup_path = | 573 const base::FilePath new_version_setup_path = |
| 592 installer_state.GetInstallerDirectory(new_version) | 574 installer_state.GetInstallerDirectory(new_version) |
| 593 .Append(setup_path.BaseName()); | 575 .Append(setup_path.BaseName()); |
| 594 LaunchDeleteOldVersionsProcess(new_version_setup_path, installer_state); | 576 LaunchDeleteOldVersionsProcess(new_version_setup_path, installer_state); |
| 595 } | 577 } |
| 596 } | 578 } |
| 597 | 579 |
| 598 return result; | 580 return result; |
| 599 } | 581 } |
| 600 | 582 |
| 601 void LaunchDeleteOldVersionsProcess(const base::FilePath& setup_path, | 583 void LaunchDeleteOldVersionsProcess(const base::FilePath& setup_path, |
| 602 const InstallerState& installer_state) { | 584 const InstallerState& installer_state) { |
| 603 // Deleting old versions is relevant if multi-install binaries are being | |
| 604 // updated or if single-install Chrome is. | |
| 605 const Product* product = | |
| 606 installer_state.FindProduct(BrowserDistribution::CHROME_BINARIES); | |
| 607 if (!product) | |
| 608 product = installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER); | |
| 609 if (!product) | |
| 610 return; | |
| 611 | |
| 612 base::CommandLine command_line(setup_path); | 585 base::CommandLine command_line(setup_path); |
| 613 product->AppendProductFlags(&command_line); | 586 installer_state.product().AppendProductFlags(&command_line); |
| 614 command_line.AppendSwitch(switches::kDeleteOldVersions); | 587 command_line.AppendSwitch(switches::kDeleteOldVersions); |
| 615 | 588 |
| 616 if (installer_state.system_install()) | 589 if (installer_state.system_install()) |
| 617 command_line.AppendSwitch(switches::kSystemLevel); | 590 command_line.AppendSwitch(switches::kSystemLevel); |
| 618 // Unconditionally enable verbose logging for now to make diagnosing potential | 591 // Unconditionally enable verbose logging for now to make diagnosing potential |
| 619 // failures possible. | 592 // failures possible. |
| 620 command_line.AppendSwitch(switches::kVerboseLogging); | 593 command_line.AppendSwitch(switches::kVerboseLogging); |
| 621 | 594 |
| 622 base::LaunchOptions launch_options; | 595 base::LaunchOptions launch_options; |
| 623 launch_options.start_hidden = true; | 596 launch_options.start_hidden = true; |
| 624 // Make sure not to launch from a version directory. Otherwise, it wouldn't be | 597 // Make sure not to launch from a version directory. Otherwise, it wouldn't be |
| 625 // possible to delete it. | 598 // possible to delete it. |
| 626 launch_options.current_directory = setup_path.DirName(); | 599 launch_options.current_directory = setup_path.DirName(); |
| 627 launch_options.force_breakaway_from_job_ = true; | 600 launch_options.force_breakaway_from_job_ = true; |
| 628 | 601 |
| 629 VLOG(1) << "Launching \"" << command_line.GetCommandLineString() | 602 VLOG(1) << "Launching \"" << command_line.GetCommandLineString() |
| 630 << "\" to delete old versions."; | 603 << "\" to delete old versions."; |
| 631 base::Process process = base::LaunchProcess(command_line, launch_options); | 604 base::Process process = base::LaunchProcess(command_line, launch_options); |
| 632 PLOG_IF(ERROR, !process.IsValid()) | 605 PLOG_IF(ERROR, !process.IsValid()) |
| 633 << "Failed to launch \"" << command_line.GetCommandLineString() << "\""; | 606 << "Failed to launch \"" << command_line.GetCommandLineString() << "\""; |
| 634 } | 607 } |
| 635 | 608 |
| 636 void HandleOsUpgradeForBrowser(const installer::InstallerState& installer_state, | 609 void HandleOsUpgradeForBrowser(const installer::InstallerState& installer_state, |
| 637 const installer::Product& chrome, | 610 const installer::Product& chrome, |
| 638 const base::Version& installed_version) { | 611 const base::Version& installed_version) { |
| 639 DCHECK(chrome.is_chrome()); | |
| 640 | |
| 641 VLOG(1) << "Updating and registering shortcuts for --on-os-upgrade."; | 612 VLOG(1) << "Updating and registering shortcuts for --on-os-upgrade."; |
| 642 | 613 |
| 643 // Read master_preferences copied beside chrome.exe at install. | 614 // Read master_preferences copied beside chrome.exe at install. |
| 644 const MasterPreferences prefs( | 615 const MasterPreferences prefs( |
| 645 installer_state.target_path().AppendASCII(kDefaultMasterPrefs)); | 616 installer_state.target_path().AppendASCII(kDefaultMasterPrefs)); |
| 646 | 617 |
| 647 // Update shortcuts at this install level (per-user shortcuts on system-level | 618 // Update shortcuts at this install level (per-user shortcuts on system-level |
| 648 // installs will be updated through Active Setup). | 619 // installs will be updated through Active Setup). |
| 649 const InstallShortcutLevel level = | 620 const InstallShortcutLevel level = |
| 650 installer_state.system_install() ? ALL_USERS : CURRENT_USER; | 621 installer_state.system_install() ? ALL_USERS : CURRENT_USER; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 693 } | 664 } |
| 694 | 665 |
| 695 // NOTE: Should the work done here, on Active Setup, change: | 666 // NOTE: Should the work done here, on Active Setup, change: |
| 696 // kActiveSetupMajorVersion in update_active_setup_version_work_item.cc needs to | 667 // kActiveSetupMajorVersion in update_active_setup_version_work_item.cc needs to |
| 697 // be increased for Active Setup to invoke this again for all users of this | 668 // be increased for Active Setup to invoke this again for all users of this |
| 698 // install. It may also be invoked again when a system-level chrome install goes | 669 // install. It may also be invoked again when a system-level chrome install goes |
| 699 // through an OS upgrade. | 670 // through an OS upgrade. |
| 700 void HandleActiveSetupForBrowser(const base::FilePath& installation_root, | 671 void HandleActiveSetupForBrowser(const base::FilePath& installation_root, |
| 701 const installer::Product& chrome, | 672 const installer::Product& chrome, |
| 702 bool force) { | 673 bool force) { |
| 703 DCHECK(chrome.is_chrome()); | |
| 704 | |
| 705 std::unique_ptr<WorkItemList> cleanup_list(WorkItem::CreateWorkItemList()); | 674 std::unique_ptr<WorkItemList> cleanup_list(WorkItem::CreateWorkItemList()); |
| 706 cleanup_list->set_log_message("Cleanup deprecated per-user registrations"); | 675 cleanup_list->set_log_message("Cleanup deprecated per-user registrations"); |
| 707 cleanup_list->set_rollback_enabled(false); | 676 cleanup_list->set_rollback_enabled(false); |
| 708 cleanup_list->set_best_effort(true); | 677 cleanup_list->set_best_effort(true); |
| 709 AddCleanupDeprecatedPerUserRegistrationsWorkItems(chrome, cleanup_list.get()); | 678 AddCleanupDeprecatedPerUserRegistrationsWorkItems(chrome, cleanup_list.get()); |
| 710 cleanup_list->Do(); | 679 cleanup_list->Do(); |
| 711 | 680 |
| 712 // Only create shortcuts on Active Setup if the first run sentinel is not | 681 // Only create shortcuts on Active Setup if the first run sentinel is not |
| 713 // present for this user (as some shortcuts used to be installed on first | 682 // present for this user (as some shortcuts used to be installed on first |
| 714 // run and this could otherwise re-install shortcuts for users that have | 683 // run and this could otherwise re-install shortcuts for users that have |
| 715 // already deleted them in the past). | 684 // already deleted them in the past). |
| 716 // Decide whether to create the shortcuts or simply replace existing | 685 // Decide whether to create the shortcuts or simply replace existing |
| 717 // shortcuts; if the decision is to create them, only shortcuts whose matching | 686 // shortcuts; if the decision is to create them, only shortcuts whose matching |
| 718 // all-users shortcut isn't present on the system will be created. | 687 // all-users shortcut isn't present on the system will be created. |
| 719 InstallShortcutOperation install_operation = | 688 InstallShortcutOperation install_operation = |
| 720 (!force && InstallUtil::IsFirstRunSentinelPresent()) | 689 (!force && InstallUtil::IsFirstRunSentinelPresent()) |
| 721 ? INSTALL_SHORTCUT_REPLACE_EXISTING | 690 ? INSTALL_SHORTCUT_REPLACE_EXISTING |
| 722 : INSTALL_SHORTCUT_CREATE_EACH_IF_NO_SYSTEM_LEVEL; | 691 : INSTALL_SHORTCUT_CREATE_EACH_IF_NO_SYSTEM_LEVEL; |
| 723 | 692 |
| 724 // Read master_preferences copied beside chrome.exe at install. | 693 // Read master_preferences copied beside chrome.exe at install. |
| 725 MasterPreferences prefs(installation_root.AppendASCII(kDefaultMasterPrefs)); | 694 MasterPreferences prefs(installation_root.AppendASCII(kDefaultMasterPrefs)); |
| 726 base::FilePath chrome_exe(installation_root.Append(kChromeExe)); | 695 base::FilePath chrome_exe(installation_root.Append(kChromeExe)); |
| 727 CreateOrUpdateShortcuts( | 696 CreateOrUpdateShortcuts( |
| 728 chrome_exe, chrome, prefs, CURRENT_USER, install_operation); | 697 chrome_exe, chrome, prefs, CURRENT_USER, install_operation); |
| 729 | 698 |
| 730 UpdateDefaultBrowserBeaconForPath(chrome_exe); | 699 UpdateDefaultBrowserBeaconForPath(chrome_exe); |
| 731 } | 700 } |
| 732 | 701 |
| 733 } // namespace installer | 702 } // namespace installer |
| OLD | NEW |