Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(448)

Side by Side Diff: chrome/installer/setup/install.cc

Issue 2589753002: Remove multi-install from chrome/installer/setup. (Closed)
Patch Set: revert util/product changes for now Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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();
gab 2016/12/22 19:05:10 This is Chrome Frame stuff, separate CL?
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
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("&amp;"), att_value); 264 base::ASCIIToUTF16("&amp;"), att_value);
275 base::ReplaceChars(*att_value, base::ASCIIToUTF16("'"), 265 base::ReplaceChars(*att_value, base::ASCIIToUTF16("'"),
276 base::ASCIIToUTF16("&apos;"), att_value); 266 base::ASCIIToUTF16("&apos;"), att_value);
277 base::ReplaceChars(*att_value, base::ASCIIToUTF16("<"), 267 base::ReplaceChars(*att_value, base::ASCIIToUTF16("<"),
278 base::ASCIIToUTF16("&lt;"), att_value); 268 base::ASCIIToUTF16("&lt;"), att_value);
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 425
436 ExecuteAndLogShortcutOperation( 426 ExecuteAndLogShortcutOperation(
437 ShellUtil::SHORTCUT_LOCATION_START_MENU_ROOT, dist, 427 ShellUtil::SHORTCUT_LOCATION_START_MENU_ROOT, dist,
438 start_menu_properties, shortcut_operation); 428 start_menu_properties, shortcut_operation);
439 } 429 }
440 430
441 void RegisterChromeOnMachine(const installer::InstallerState& installer_state, 431 void RegisterChromeOnMachine(const installer::InstallerState& installer_state,
442 const installer::Product& product, 432 const installer::Product& product,
443 bool make_chrome_default, 433 bool make_chrome_default,
444 const base::Version& version) { 434 const base::Version& version) {
445 DCHECK(product.is_chrome());
gab 2016/12/22 19:05:10 I don't see a change to product.h in this CL? Leav
grt (UTC plus 2) 2017/01/02 10:45:03 While the change to product.h is in https://codere
gab 2017/01/05 22:08:01 I think we should leave the DCHECK while Product h
grt (UTC plus 2) 2017/01/06 10:25:53 Done.
446
447 // Try to add Chrome to Media Player shim inclusion list. We don't do any 435 // Try to add Chrome to Media Player shim inclusion list. We don't do any
448 // error checking here because this operation will fail if user doesn't 436 // error checking here because this operation will fail if user doesn't
449 // have admin rights and we want to ignore the error. 437 // have admin rights and we want to ignore the error.
450 AddChromeToMediaPlayerList(); 438 AddChromeToMediaPlayerList();
451 439
452 // Register the event log provider for system-level installs only, as it 440 // Register the event log provider for system-level installs only, as it
453 // requires admin privileges. 441 // requires admin privileges.
454 if (installer_state.system_install()) 442 if (installer_state.system_install())
455 RegisterEventLogProvider(installer_state.target_path(), version); 443 RegisterEventLogProvider(installer_state.target_path(), version);
456 444
(...skipping 16 matching lines...) Expand all
473 InstallStatus InstallOrUpdateProduct( 461 InstallStatus InstallOrUpdateProduct(
474 const installer::InstallationState& original_state, 462 const installer::InstallationState& original_state,
475 const installer::InstallerState& installer_state, 463 const installer::InstallerState& installer_state,
476 const base::FilePath& setup_path, 464 const base::FilePath& setup_path,
477 const base::FilePath& archive_path, 465 const base::FilePath& archive_path,
478 const base::FilePath& install_temp_path, 466 const base::FilePath& install_temp_path,
479 const base::FilePath& src_path, 467 const base::FilePath& src_path,
480 const base::FilePath& prefs_path, 468 const base::FilePath& prefs_path,
481 const MasterPreferences& prefs, 469 const MasterPreferences& prefs,
482 const base::Version& new_version) { 470 const base::Version& new_version) {
483 DCHECK(!installer_state.products().empty());
484
485 // TODO(robertshield): Removing the pending on-reboot moves should be done 471 // TODO(robertshield): Removing the pending on-reboot moves should be done
486 // elsewhere. 472 // elsewhere.
487 // Remove any scheduled MOVEFILE_DELAY_UNTIL_REBOOT entries in the target of 473 // 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 474 // this installation. These may have been added during a previous uninstall of
489 // the same version. 475 // the same version.
490 LOG_IF(ERROR, !RemoveFromMovesPendingReboot(installer_state.target_path())) 476 LOG_IF(ERROR, !RemoveFromMovesPendingReboot(installer_state.target_path()))
491 << "Error accessing pending moves value."; 477 << "Error accessing pending moves value.";
492 478
493 // Create VisualElementManifest.xml in |src_path| (if required) so that it 479 // Create VisualElementManifest.xml in |src_path| (if required) so that it
494 // looks as if it had been extracted from the archive when calling 480 // looks as if it had been extracted from the archive when calling
495 // InstallNewVersion() below. 481 // InstallNewVersion() below.
496 installer_state.SetStage(CREATING_VISUAL_MANIFEST); 482 installer_state.SetStage(CREATING_VISUAL_MANIFEST);
497 CreateVisualElementsManifest(src_path, new_version); 483 CreateVisualElementsManifest(src_path, new_version);
498 484
499 std::unique_ptr<base::Version> existing_version; 485 std::unique_ptr<base::Version> existing_version;
500 InstallStatus result = 486 InstallStatus result =
501 InstallNewVersion(original_state, installer_state, setup_path, 487 InstallNewVersion(original_state, installer_state, setup_path,
502 archive_path, src_path, install_temp_path, new_version, 488 archive_path, src_path, install_temp_path, new_version,
503 &existing_version, IsDowngradeAllowed(prefs)); 489 &existing_version, IsDowngradeAllowed(prefs));
504 490
505 // TODO(robertshield): Everything below this line should instead be captured 491 // TODO(robertshield): Everything below this line should instead be captured
506 // by WorkItems. 492 // by WorkItems.
507 if (!InstallUtil::GetInstallReturnCode(result)) { 493 if (!InstallUtil::GetInstallReturnCode(result)) {
508 installer_state.SetStage(UPDATING_CHANNELS); 494 installer_state.SetStage(UPDATING_CHANNELS);
509 495
510 // Update the modifiers on the channel values for the product(s) being 496 // Strip evidence of multi-install from the "ap" value.
511 // installed and for the binaries in case of multi-install. 497 // TODO(grt): Consider doing this earlier, prior to any other work, so that
498 // failed updates benefit from the stripping.
512 installer_state.UpdateChannels(); 499 installer_state.UpdateChannels();
513 500
514 installer_state.SetStage(COPYING_PREFERENCES_FILE); 501 installer_state.SetStage(COPYING_PREFERENCES_FILE);
515 502
516 if (result == FIRST_INSTALL_SUCCESS && !prefs_path.empty()) 503 if (result == FIRST_INSTALL_SUCCESS && !prefs_path.empty())
517 CopyPreferenceFileForFirstRun(installer_state, prefs_path); 504 CopyPreferenceFileForFirstRun(installer_state, prefs_path);
518 505
519 installer_state.SetStage(CREATING_SHORTCUTS); 506 installer_state.SetStage(CREATING_SHORTCUTS);
520 507
521 const installer::Product* chrome_product =
522 installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER);
523 // Creates shortcuts for Chrome. 508 // Creates shortcuts for Chrome.
524 if (chrome_product) { 509 const Product& chrome_product = installer_state.product();
gab 2016/12/22 19:05:10 I presume InstallerState and Product will eventual
grt (UTC plus 2) 2017/01/02 10:45:03 Yeah, there will be opportunities for further simp
525 BrowserDistribution* chrome_dist = chrome_product->distribution(); 510 BrowserDistribution* chrome_dist = chrome_product.distribution();
526 const base::FilePath chrome_exe( 511 const base::FilePath chrome_exe(
527 installer_state.target_path().Append(kChromeExe)); 512 installer_state.target_path().Append(kChromeExe));
528 513
529 // Install per-user shortcuts on user-level installs and all-users 514 // Install per-user shortcuts on user-level installs and all-users shortcuts
530 // shortcuts on system-level installs. Note that Active Setup will take 515 // on system-level installs. Note that Active Setup will take care of
531 // care of installing missing per-user shortcuts on system-level install 516 // installing missing per-user shortcuts on system-level install (i.e.,
532 // (i.e., quick launch, taskbar pin, and possibly deleted all-users 517 // quick launch, taskbar pin, and possibly deleted all-users shortcuts).
533 // shortcuts). 518 InstallShortcutLevel install_level =
534 InstallShortcutLevel install_level = installer_state.system_install() ? 519 installer_state.system_install() ? ALL_USERS : CURRENT_USER;
535 ALL_USERS : CURRENT_USER;
536 520
537 InstallShortcutOperation install_operation = 521 InstallShortcutOperation install_operation =
538 INSTALL_SHORTCUT_REPLACE_EXISTING; 522 INSTALL_SHORTCUT_REPLACE_EXISTING;
539 if (result == installer::FIRST_INSTALL_SUCCESS || 523 if (result == installer::FIRST_INSTALL_SUCCESS ||
540 result == installer::INSTALL_REPAIRED || 524 result == installer::INSTALL_REPAIRED ||
541 !original_state.GetProductState(installer_state.system_install(), 525 !original_state.GetProductState(installer_state.system_install(),
542 chrome_dist->GetType())) { 526 chrome_dist->GetType())) {
543 // Always create the shortcuts on a new install, a repair install, and 527 // Always create the shortcuts on a new install, a repair install, and
544 // when the Chrome product is being added to the current install. 528 // when the Chrome product is being added to the current install.
545 install_operation = INSTALL_SHORTCUT_CREATE_ALL; 529 install_operation = INSTALL_SHORTCUT_CREATE_ALL;
546 }
547
548 CreateOrUpdateShortcuts(chrome_exe, *chrome_product, prefs, install_level,
549 install_operation);
550 } 530 }
551 531
552 if (chrome_product) { 532 CreateOrUpdateShortcuts(chrome_exe, chrome_product, prefs, install_level,
gab 2016/12/22 19:05:10 Nice, we had two if (chrome_product) {} blocks in
grt (UTC plus 2) 2017/01/02 10:45:03 Indeed! I laughed at that one, too.
553 // Register Chrome and, if requested, make Chrome the default browser. 533 install_operation);
554 installer_state.SetStage(REGISTERING_CHROME);
555 534
556 bool make_chrome_default = false; 535 // Register Chrome and, if requested, make Chrome the default browser.
557 prefs.GetBool(master_preferences::kMakeChromeDefault, 536 installer_state.SetStage(REGISTERING_CHROME);
558 &make_chrome_default);
559 537
560 // If this is not the user's first Chrome install, but they have chosen 538 bool make_chrome_default = false;
561 // Chrome to become their default browser on the download page, we must 539 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 540
571 RegisterChromeOnMachine( 541 // If this is not the user's first Chrome install, but they have chosen
572 installer_state, *chrome_product, 542 // Chrome to become their default browser on the download page, we must
573 make_chrome_default || force_chrome_default_for_user, new_version); 543 // force it here because the master_preferences file will not get copied
544 // into the build.
545 bool force_chrome_default_for_user = false;
546 if (result == NEW_VERSION_UPDATED || result == INSTALL_REPAIRED ||
547 result == OLD_VERSION_DOWNGRADE || result == IN_USE_DOWNGRADE) {
548 prefs.GetBool(master_preferences::kMakeChromeDefaultForUser,
549 &force_chrome_default_for_user);
550 }
574 551
575 if (!installer_state.system_install()) { 552 RegisterChromeOnMachine(
576 DCHECK_EQ(chrome_product->distribution(), 553 installer_state, chrome_product,
577 BrowserDistribution::GetDistribution()); 554 make_chrome_default || force_chrome_default_for_user, new_version);
578 UpdateDefaultBrowserBeaconForPath( 555
579 installer_state.target_path().Append(installer::kChromeExe)); 556 if (!installer_state.system_install()) {
580 } 557 DCHECK_EQ(chrome_product.distribution(),
558 BrowserDistribution::GetDistribution());
559 UpdateDefaultBrowserBeaconForPath(
560 installer_state.target_path().Append(installer::kChromeExe));
581 } 561 }
582 562
583 // Delete files that belong to old versions of Chrome. If that fails during 563 // 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 564 // 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 565 // in-use update, a --delete-old-versions process will be launched when
586 // executables are renamed. 566 // executables are renamed.
587 installer_state.SetStage(REMOVING_OLD_VERSIONS); 567 installer_state.SetStage(REMOVING_OLD_VERSIONS);
588 const bool is_in_use = 568 const bool is_in_use =
589 (result == IN_USE_UPDATED || result == IN_USE_DOWNGRADE); 569 (result == IN_USE_UPDATED || result == IN_USE_DOWNGRADE);
590 if (!DeleteOldVersions(installer_state.target_path()) && !is_in_use) { 570 if (!DeleteOldVersions(installer_state.target_path()) && !is_in_use) {
591 const base::FilePath new_version_setup_path = 571 const base::FilePath new_version_setup_path =
592 installer_state.GetInstallerDirectory(new_version) 572 installer_state.GetInstallerDirectory(new_version)
593 .Append(setup_path.BaseName()); 573 .Append(setup_path.BaseName());
594 LaunchDeleteOldVersionsProcess(new_version_setup_path, installer_state); 574 LaunchDeleteOldVersionsProcess(new_version_setup_path, installer_state);
595 } 575 }
596 } 576 }
597 577
598 return result; 578 return result;
599 } 579 }
600 580
601 void LaunchDeleteOldVersionsProcess(const base::FilePath& setup_path, 581 void LaunchDeleteOldVersionsProcess(const base::FilePath& setup_path,
602 const InstallerState& installer_state) { 582 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); 583 base::CommandLine command_line(setup_path);
613 product->AppendProductFlags(&command_line); 584 installer_state.product().AppendProductFlags(&command_line);
614 command_line.AppendSwitch(switches::kDeleteOldVersions); 585 command_line.AppendSwitch(switches::kDeleteOldVersions);
615 586
616 if (installer_state.system_install()) 587 if (installer_state.system_install())
617 command_line.AppendSwitch(switches::kSystemLevel); 588 command_line.AppendSwitch(switches::kSystemLevel);
618 // Unconditionally enable verbose logging for now to make diagnosing potential 589 // Unconditionally enable verbose logging for now to make diagnosing potential
619 // failures possible. 590 // failures possible.
620 command_line.AppendSwitch(switches::kVerboseLogging); 591 command_line.AppendSwitch(switches::kVerboseLogging);
621 592
622 base::LaunchOptions launch_options; 593 base::LaunchOptions launch_options;
623 launch_options.start_hidden = true; 594 launch_options.start_hidden = true;
624 // Make sure not to launch from a version directory. Otherwise, it wouldn't be 595 // Make sure not to launch from a version directory. Otherwise, it wouldn't be
625 // possible to delete it. 596 // possible to delete it.
626 launch_options.current_directory = setup_path.DirName(); 597 launch_options.current_directory = setup_path.DirName();
627 launch_options.force_breakaway_from_job_ = true; 598 launch_options.force_breakaway_from_job_ = true;
628 599
629 VLOG(1) << "Launching \"" << command_line.GetCommandLineString() 600 VLOG(1) << "Launching \"" << command_line.GetCommandLineString()
630 << "\" to delete old versions."; 601 << "\" to delete old versions.";
631 base::Process process = base::LaunchProcess(command_line, launch_options); 602 base::Process process = base::LaunchProcess(command_line, launch_options);
632 PLOG_IF(ERROR, !process.IsValid()) 603 PLOG_IF(ERROR, !process.IsValid())
633 << "Failed to launch \"" << command_line.GetCommandLineString() << "\""; 604 << "Failed to launch \"" << command_line.GetCommandLineString() << "\"";
634 } 605 }
635 606
636 void HandleOsUpgradeForBrowser(const installer::InstallerState& installer_state, 607 void HandleOsUpgradeForBrowser(const installer::InstallerState& installer_state,
637 const installer::Product& chrome, 608 const installer::Product& chrome,
638 const base::Version& installed_version) { 609 const base::Version& installed_version) {
639 DCHECK(chrome.is_chrome());
640
641 VLOG(1) << "Updating and registering shortcuts for --on-os-upgrade."; 610 VLOG(1) << "Updating and registering shortcuts for --on-os-upgrade.";
642 611
643 // Read master_preferences copied beside chrome.exe at install. 612 // Read master_preferences copied beside chrome.exe at install.
644 const MasterPreferences prefs( 613 const MasterPreferences prefs(
645 installer_state.target_path().AppendASCII(kDefaultMasterPrefs)); 614 installer_state.target_path().AppendASCII(kDefaultMasterPrefs));
646 615
647 // Update shortcuts at this install level (per-user shortcuts on system-level 616 // Update shortcuts at this install level (per-user shortcuts on system-level
648 // installs will be updated through Active Setup). 617 // installs will be updated through Active Setup).
649 const InstallShortcutLevel level = 618 const InstallShortcutLevel level =
650 installer_state.system_install() ? ALL_USERS : CURRENT_USER; 619 installer_state.system_install() ? ALL_USERS : CURRENT_USER;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 } 662 }
694 663
695 // NOTE: Should the work done here, on Active Setup, change: 664 // NOTE: Should the work done here, on Active Setup, change:
696 // kActiveSetupMajorVersion in update_active_setup_version_work_item.cc needs to 665 // 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 666 // 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 667 // install. It may also be invoked again when a system-level chrome install goes
699 // through an OS upgrade. 668 // through an OS upgrade.
700 void HandleActiveSetupForBrowser(const base::FilePath& installation_root, 669 void HandleActiveSetupForBrowser(const base::FilePath& installation_root,
701 const installer::Product& chrome, 670 const installer::Product& chrome,
702 bool force) { 671 bool force) {
703 DCHECK(chrome.is_chrome());
704
705 std::unique_ptr<WorkItemList> cleanup_list(WorkItem::CreateWorkItemList()); 672 std::unique_ptr<WorkItemList> cleanup_list(WorkItem::CreateWorkItemList());
706 cleanup_list->set_log_message("Cleanup deprecated per-user registrations"); 673 cleanup_list->set_log_message("Cleanup deprecated per-user registrations");
707 cleanup_list->set_rollback_enabled(false); 674 cleanup_list->set_rollback_enabled(false);
708 cleanup_list->set_best_effort(true); 675 cleanup_list->set_best_effort(true);
709 AddCleanupDeprecatedPerUserRegistrationsWorkItems(chrome, cleanup_list.get()); 676 AddCleanupDeprecatedPerUserRegistrationsWorkItems(chrome, cleanup_list.get());
710 cleanup_list->Do(); 677 cleanup_list->Do();
711 678
712 // Only create shortcuts on Active Setup if the first run sentinel is not 679 // 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 680 // 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 681 // run and this could otherwise re-install shortcuts for users that have
715 // already deleted them in the past). 682 // already deleted them in the past).
716 // Decide whether to create the shortcuts or simply replace existing 683 // Decide whether to create the shortcuts or simply replace existing
717 // shortcuts; if the decision is to create them, only shortcuts whose matching 684 // 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. 685 // all-users shortcut isn't present on the system will be created.
719 InstallShortcutOperation install_operation = 686 InstallShortcutOperation install_operation =
720 (!force && InstallUtil::IsFirstRunSentinelPresent()) 687 (!force && InstallUtil::IsFirstRunSentinelPresent())
721 ? INSTALL_SHORTCUT_REPLACE_EXISTING 688 ? INSTALL_SHORTCUT_REPLACE_EXISTING
722 : INSTALL_SHORTCUT_CREATE_EACH_IF_NO_SYSTEM_LEVEL; 689 : INSTALL_SHORTCUT_CREATE_EACH_IF_NO_SYSTEM_LEVEL;
723 690
724 // Read master_preferences copied beside chrome.exe at install. 691 // Read master_preferences copied beside chrome.exe at install.
725 MasterPreferences prefs(installation_root.AppendASCII(kDefaultMasterPrefs)); 692 MasterPreferences prefs(installation_root.AppendASCII(kDefaultMasterPrefs));
726 base::FilePath chrome_exe(installation_root.Append(kChromeExe)); 693 base::FilePath chrome_exe(installation_root.Append(kChromeExe));
727 CreateOrUpdateShortcuts( 694 CreateOrUpdateShortcuts(
728 chrome_exe, chrome, prefs, CURRENT_USER, install_operation); 695 chrome_exe, chrome, prefs, CURRENT_USER, install_operation);
729 696
730 UpdateDefaultBrowserBeaconForPath(chrome_exe); 697 UpdateDefaultBrowserBeaconForPath(chrome_exe);
731 } 698 }
732 699
733 } // namespace installer 700 } // namespace installer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698