| 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 // This file contains the definitions of the installer functions that build | 5 // This file contains the definitions of the installer functions that build |
| 6 // the WorkItemList used to install the application. | 6 // the WorkItemList used to install the application. |
| 7 | 7 |
| 8 #include "chrome/installer/setup/install_worker.h" | 8 #include "chrome/installer/setup/install_worker.h" |
| 9 | 9 |
| 10 #include <oaidl.h> | 10 #include <oaidl.h> |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 if (installer_state.system_install()) { | 431 if (installer_state.system_install()) { |
| 432 PathService::Get(base::DIR_COMMON_START_MENU, &uninstall_link); | 432 PathService::Get(base::DIR_COMMON_START_MENU, &uninstall_link); |
| 433 } else { | 433 } else { |
| 434 PathService::Get(base::DIR_START_MENU, &uninstall_link); | 434 PathService::Get(base::DIR_START_MENU, &uninstall_link); |
| 435 } | 435 } |
| 436 | 436 |
| 437 if (uninstall_link.empty()) { | 437 if (uninstall_link.empty()) { |
| 438 LOG(ERROR) << "Failed to get location for shortcut."; | 438 LOG(ERROR) << "Failed to get location for shortcut."; |
| 439 } else { | 439 } else { |
| 440 uninstall_link = uninstall_link.Append( | 440 uninstall_link = uninstall_link.Append( |
| 441 product.distribution()->GetAppShortCutName()); | 441 product.distribution()->GetStartMenuShortcutSubfolder( |
| 442 BrowserDistribution::SUBFOLDER_CHROME)); |
| 442 uninstall_link = uninstall_link.Append( | 443 uninstall_link = uninstall_link.Append( |
| 443 product.distribution()->GetUninstallLinkName() + installer::kLnkExt); | 444 product.distribution()->GetUninstallLinkName() + installer::kLnkExt); |
| 444 VLOG(1) << "Deleting old uninstall shortcut (if present): " | 445 VLOG(1) << "Deleting old uninstall shortcut (if present): " |
| 445 << uninstall_link.value(); | 446 << uninstall_link.value(); |
| 446 WorkItem* delete_link = work_item_list->AddDeleteTreeWorkItem( | 447 WorkItem* delete_link = work_item_list->AddDeleteTreeWorkItem( |
| 447 uninstall_link, temp_path); | 448 uninstall_link, temp_path); |
| 448 delete_link->set_ignore_failure(true); | 449 delete_link->set_ignore_failure(true); |
| 449 delete_link->set_log_message( | 450 delete_link->set_log_message( |
| 450 "Failed to delete old uninstall shortcut."); | 451 "Failed to delete old uninstall shortcut."); |
| 451 } | 452 } |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 // MSI installations will manage their own uninstall shortcuts. | 716 // MSI installations will manage their own uninstall shortcuts. |
| 716 if (!installer_state.is_msi() && product.ShouldCreateUninstallEntry()) { | 717 if (!installer_state.is_msi() && product.ShouldCreateUninstallEntry()) { |
| 717 // We need to quote the command line for the Add/Remove Programs dialog. | 718 // We need to quote the command line for the Add/Remove Programs dialog. |
| 718 CommandLine quoted_uninstall_cmd(installer_path); | 719 CommandLine quoted_uninstall_cmd(installer_path); |
| 719 DCHECK_EQ(quoted_uninstall_cmd.GetCommandLineString()[0], '"'); | 720 DCHECK_EQ(quoted_uninstall_cmd.GetCommandLineString()[0], '"'); |
| 720 quoted_uninstall_cmd.AppendArguments(uninstall_arguments, false); | 721 quoted_uninstall_cmd.AppendArguments(uninstall_arguments, false); |
| 721 | 722 |
| 722 string16 uninstall_reg = browser_dist->GetUninstallRegPath(); | 723 string16 uninstall_reg = browser_dist->GetUninstallRegPath(); |
| 723 install_list->AddCreateRegKeyWorkItem(reg_root, uninstall_reg); | 724 install_list->AddCreateRegKeyWorkItem(reg_root, uninstall_reg); |
| 724 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, | 725 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, |
| 725 installer::kUninstallDisplayNameField, | 726 installer::kUninstallDisplayNameField, browser_dist->GetDisplayName(), |
| 726 browser_dist->GetAppShortCutName(), true); | 727 true); |
| 727 install_list->AddSetRegValueWorkItem(reg_root, | 728 install_list->AddSetRegValueWorkItem(reg_root, |
| 728 uninstall_reg, installer::kUninstallStringField, | 729 uninstall_reg, installer::kUninstallStringField, |
| 729 quoted_uninstall_cmd.GetCommandLineString(), true); | 730 quoted_uninstall_cmd.GetCommandLineString(), true); |
| 730 install_list->AddSetRegValueWorkItem(reg_root, | 731 install_list->AddSetRegValueWorkItem(reg_root, |
| 731 uninstall_reg, | 732 uninstall_reg, |
| 732 L"InstallLocation", | 733 L"InstallLocation", |
| 733 install_path.value(), | 734 install_path.value(), |
| 734 true); | 735 true); |
| 735 | 736 |
| 736 BrowserDistribution* dist = product.distribution(); | 737 BrowserDistribution* dist = product.distribution(); |
| 737 string16 chrome_icon = ShellUtil::FormatIconLocation( | 738 string16 chrome_icon = ShellUtil::FormatIconLocation( |
| 738 install_path.Append(dist->GetIconFilename()).value(), | 739 install_path.Append(dist->GetIconFilename()).value(), |
| 739 dist->GetIconIndex()); | 740 dist->GetIconIndex(BrowserDistribution::SHORTCUT_CHROME)); |
| 740 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, | 741 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, |
| 741 L"DisplayIcon", chrome_icon, true); | 742 L"DisplayIcon", chrome_icon, true); |
| 742 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, | 743 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, |
| 743 L"NoModify", static_cast<DWORD>(1), | 744 L"NoModify", static_cast<DWORD>(1), |
| 744 true); | 745 true); |
| 745 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, | 746 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, |
| 746 L"NoRepair", static_cast<DWORD>(1), | 747 L"NoRepair", static_cast<DWORD>(1), |
| 747 true); | 748 true); |
| 748 | 749 |
| 749 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, | 750 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 779 void AddVersionKeyWorkItems(HKEY root, | 780 void AddVersionKeyWorkItems(HKEY root, |
| 780 BrowserDistribution* dist, | 781 BrowserDistribution* dist, |
| 781 const Version& new_version, | 782 const Version& new_version, |
| 782 bool add_language_identifier, | 783 bool add_language_identifier, |
| 783 WorkItemList* list) { | 784 WorkItemList* list) { |
| 784 // Create Version key for each distribution (if not already present) and set | 785 // Create Version key for each distribution (if not already present) and set |
| 785 // the new product version as the last step. | 786 // the new product version as the last step. |
| 786 string16 version_key(dist->GetVersionKey()); | 787 string16 version_key(dist->GetVersionKey()); |
| 787 list->AddCreateRegKeyWorkItem(root, version_key); | 788 list->AddCreateRegKeyWorkItem(root, version_key); |
| 788 | 789 |
| 789 string16 product_name(dist->GetAppShortCutName()); | 790 string16 product_name(dist->GetDisplayName()); |
| 790 list->AddSetRegValueWorkItem(root, version_key, google_update::kRegNameField, | 791 list->AddSetRegValueWorkItem(root, version_key, google_update::kRegNameField, |
| 791 product_name, true); // overwrite name also | 792 product_name, true); // overwrite name also |
| 792 list->AddSetRegValueWorkItem(root, version_key, | 793 list->AddSetRegValueWorkItem(root, version_key, |
| 793 google_update::kRegOopcrashesField, | 794 google_update::kRegOopcrashesField, |
| 794 static_cast<DWORD>(1), | 795 static_cast<DWORD>(1), |
| 795 false); // set during first install | 796 false); // set during first install |
| 796 if (add_language_identifier) { | 797 if (add_language_identifier) { |
| 797 // Write the language identifier of the current translation. Omaha's set of | 798 // Write the language identifier of the current translation. Omaha's set of |
| 798 // languages is a superset of Chrome's set of translations with this one | 799 // languages is a superset of Chrome's set of translations with this one |
| 799 // exception: what Chrome calls "en-us", Omaha calls "en". sigh. | 800 // exception: what Chrome calls "en-us", Omaha calls "en". sigh. |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 LOG(ERROR) << "No products found in AddOemInstallWorkItems"; | 839 LOG(ERROR) << "No products found in AddOemInstallWorkItems"; |
| 839 return; | 840 return; |
| 840 } | 841 } |
| 841 const ProductState* source_product = | 842 const ProductState* source_product = |
| 842 original_state.GetNonVersionedProductState(system_install, source_type); | 843 original_state.GetNonVersionedProductState(system_install, source_type); |
| 843 | 844 |
| 844 string16 oem_install; | 845 string16 oem_install; |
| 845 if (source_product->GetOemInstall(&oem_install)) { | 846 if (source_product->GetOemInstall(&oem_install)) { |
| 846 VLOG(1) << "Mirroring oeminstall=\"" << oem_install << "\" from " | 847 VLOG(1) << "Mirroring oeminstall=\"" << oem_install << "\" from " |
| 847 << BrowserDistribution::GetSpecificDistribution(source_type)-> | 848 << BrowserDistribution::GetSpecificDistribution(source_type)-> |
| 848 GetAppShortCutName(); | 849 GetDisplayName(); |
| 849 install_list->AddCreateRegKeyWorkItem(root_key, multi_key); | 850 install_list->AddCreateRegKeyWorkItem(root_key, multi_key); |
| 850 // Always overwrite an old value. | 851 // Always overwrite an old value. |
| 851 install_list->AddSetRegValueWorkItem(root_key, multi_key, | 852 install_list->AddSetRegValueWorkItem(root_key, multi_key, |
| 852 google_update::kRegOemInstallField, | 853 google_update::kRegOemInstallField, |
| 853 oem_install, true); | 854 oem_install, true); |
| 854 } else { | 855 } else { |
| 855 // Clear any old value. | 856 // Clear any old value. |
| 856 install_list->AddDeleteRegValueWorkItem( | 857 install_list->AddDeleteRegValueWorkItem( |
| 857 root_key, multi_key, google_update::kRegOemInstallField); | 858 root_key, multi_key, google_update::kRegOemInstallField); |
| 858 } | 859 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 893 (!have_eula_accepted || dword_value > eula_accepted)) { | 894 (!have_eula_accepted || dword_value > eula_accepted)) { |
| 894 have_eula_accepted = true; | 895 have_eula_accepted = true; |
| 895 eula_accepted = dword_value; | 896 eula_accepted = dword_value; |
| 896 product_type = this_type; | 897 product_type = this_type; |
| 897 } | 898 } |
| 898 } | 899 } |
| 899 | 900 |
| 900 if (have_eula_accepted) { | 901 if (have_eula_accepted) { |
| 901 VLOG(1) << "Mirroring eulaaccepted=" << eula_accepted << " from " | 902 VLOG(1) << "Mirroring eulaaccepted=" << eula_accepted << " from " |
| 902 << BrowserDistribution::GetSpecificDistribution(product_type)-> | 903 << BrowserDistribution::GetSpecificDistribution(product_type)-> |
| 903 GetAppShortCutName(); | 904 GetDisplayName(); |
| 904 install_list->AddCreateRegKeyWorkItem(root_key, multi_key); | 905 install_list->AddCreateRegKeyWorkItem(root_key, multi_key); |
| 905 install_list->AddSetRegValueWorkItem( | 906 install_list->AddSetRegValueWorkItem( |
| 906 root_key, multi_key, google_update::kRegEULAAceptedField, | 907 root_key, multi_key, google_update::kRegEULAAceptedField, |
| 907 eula_accepted, true); | 908 eula_accepted, true); |
| 908 } else { | 909 } else { |
| 909 // Clear any old value. | 910 // Clear any old value. |
| 910 install_list->AddDeleteRegValueWorkItem( | 911 install_list->AddDeleteRegValueWorkItem( |
| 911 root_key, multi_key, google_update::kRegEULAAceptedField); | 912 root_key, multi_key, google_update::kRegEULAAceptedField); |
| 912 } | 913 } |
| 913 } | 914 } |
| (...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1426 } | 1427 } |
| 1427 } | 1428 } |
| 1428 } | 1429 } |
| 1429 | 1430 |
| 1430 void AddDelegateExecuteWorkItems(const InstallerState& installer_state, | 1431 void AddDelegateExecuteWorkItems(const InstallerState& installer_state, |
| 1431 const base::FilePath& target_path, | 1432 const base::FilePath& target_path, |
| 1432 const Version& new_version, | 1433 const Version& new_version, |
| 1433 const Product& product, | 1434 const Product& product, |
| 1434 WorkItemList* list) { | 1435 WorkItemList* list) { |
| 1435 string16 handler_class_uuid; | 1436 string16 handler_class_uuid; |
| 1436 BrowserDistribution* distribution = product.distribution(); | 1437 BrowserDistribution* dist = product.distribution(); |
| 1437 if (!distribution->GetCommandExecuteImplClsid(&handler_class_uuid)) { | 1438 if (!dist->GetCommandExecuteImplClsid(&handler_class_uuid)) { |
| 1438 if (InstallUtil::IsChromeSxSProcess()) { | 1439 if (InstallUtil::IsChromeSxSProcess()) { |
| 1439 CleanupBadCanaryDelegateExecuteRegistration(target_path, list); | 1440 CleanupBadCanaryDelegateExecuteRegistration(target_path, list); |
| 1440 } else { | 1441 } else { |
| 1441 VLOG(1) << "No DelegateExecute verb handler processing to do for " | 1442 VLOG(1) << "No DelegateExecute verb handler processing to do for " |
| 1442 << distribution->GetAppShortCutName(); | 1443 << dist->GetDisplayName(); |
| 1443 } | 1444 } |
| 1444 return; | 1445 return; |
| 1445 } | 1446 } |
| 1446 | 1447 |
| 1447 HKEY root = installer_state.root_key(); | 1448 HKEY root = installer_state.root_key(); |
| 1448 string16 delegate_execute_path(L"Software\\Classes\\CLSID\\"); | 1449 string16 delegate_execute_path(L"Software\\Classes\\CLSID\\"); |
| 1449 delegate_execute_path.append(handler_class_uuid); | 1450 delegate_execute_path.append(handler_class_uuid); |
| 1450 | 1451 |
| 1451 // Unconditionally remove registration regardless of whether or not it is | 1452 // Unconditionally remove registration regardless of whether or not it is |
| 1452 // needed since builds after r132190 included it when it wasn't strictly | 1453 // needed since builds after r132190 included it when it wasn't strictly |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1488 list->AddCreateRegKeyWorkItem(root, subkey); | 1489 list->AddCreateRegKeyWorkItem(root, subkey); |
| 1489 } | 1490 } |
| 1490 } | 1491 } |
| 1491 | 1492 |
| 1492 void AddActiveSetupWorkItems(const InstallerState& installer_state, | 1493 void AddActiveSetupWorkItems(const InstallerState& installer_state, |
| 1493 const base::FilePath& setup_path, | 1494 const base::FilePath& setup_path, |
| 1494 const Version& new_version, | 1495 const Version& new_version, |
| 1495 const Product& product, | 1496 const Product& product, |
| 1496 WorkItemList* list) { | 1497 WorkItemList* list) { |
| 1497 DCHECK(installer_state.operation() != InstallerState::UNINSTALL); | 1498 DCHECK(installer_state.operation() != InstallerState::UNINSTALL); |
| 1498 BrowserDistribution* distribution = product.distribution(); | 1499 BrowserDistribution* dist = product.distribution(); |
| 1499 | 1500 |
| 1500 if (!product.is_chrome() || !installer_state.system_install()) { | 1501 if (!product.is_chrome() || !installer_state.system_install()) { |
| 1501 const char* install_level = | 1502 const char* install_level = |
| 1502 installer_state.system_install() ? "system" : "user"; | 1503 installer_state.system_install() ? "system" : "user"; |
| 1503 VLOG(1) << "No Active Setup processing to do for " << install_level | 1504 VLOG(1) << "No Active Setup processing to do for " << install_level |
| 1504 << "-level " << distribution->GetAppShortCutName(); | 1505 << "-level " << dist->GetDisplayName(); |
| 1505 return; | 1506 return; |
| 1506 } | 1507 } |
| 1507 DCHECK(installer_state.RequiresActiveSetup()); | 1508 DCHECK(installer_state.RequiresActiveSetup()); |
| 1508 | 1509 |
| 1509 const HKEY root = HKEY_LOCAL_MACHINE; | 1510 const HKEY root = HKEY_LOCAL_MACHINE; |
| 1510 const string16 active_setup_path( | 1511 const string16 active_setup_path(InstallUtil::GetActiveSetupPath(dist)); |
| 1511 InstallUtil::GetActiveSetupPath(distribution)); | |
| 1512 | 1512 |
| 1513 VLOG(1) << "Adding registration items for Active Setup."; | 1513 VLOG(1) << "Adding registration items for Active Setup."; |
| 1514 list->AddCreateRegKeyWorkItem(root, active_setup_path); | 1514 list->AddCreateRegKeyWorkItem(root, active_setup_path); |
| 1515 list->AddSetRegValueWorkItem(root, active_setup_path, L"", | 1515 list->AddSetRegValueWorkItem(root, active_setup_path, L"", |
| 1516 distribution->GetAppShortCutName(), true); | 1516 dist->GetDisplayName(), true); |
| 1517 | 1517 |
| 1518 base::FilePath active_setup_exe(installer_state.GetInstallerDirectory( | 1518 base::FilePath active_setup_exe(installer_state.GetInstallerDirectory( |
| 1519 new_version).Append(kActiveSetupExe)); | 1519 new_version).Append(kActiveSetupExe)); |
| 1520 CommandLine cmd(active_setup_exe); | 1520 CommandLine cmd(active_setup_exe); |
| 1521 cmd.AppendSwitch(installer::switches::kConfigureUserSettings); | 1521 cmd.AppendSwitch(installer::switches::kConfigureUserSettings); |
| 1522 cmd.AppendSwitch(installer::switches::kVerboseLogging); | 1522 cmd.AppendSwitch(installer::switches::kVerboseLogging); |
| 1523 cmd.AppendSwitch(installer::switches::kSystemLevel); | 1523 cmd.AppendSwitch(installer::switches::kSystemLevel); |
| 1524 product.AppendProductFlags(&cmd); | 1524 product.AppendProductFlags(&cmd); |
| 1525 list->AddSetRegValueWorkItem(root, active_setup_path, L"StubPath", | 1525 list->AddSetRegValueWorkItem(root, active_setup_path, L"StubPath", |
| 1526 cmd.GetCommandLineString(), true); | 1526 cmd.GetCommandLineString(), true); |
| 1527 | 1527 |
| 1528 // TODO(grt): http://crbug.com/75152 Write a reference to a localized | 1528 // TODO(grt): http://crbug.com/75152 Write a reference to a localized |
| 1529 // resource. | 1529 // resource. |
| 1530 list->AddSetRegValueWorkItem(root, active_setup_path, L"Localized Name", | 1530 list->AddSetRegValueWorkItem(root, active_setup_path, L"Localized Name", |
| 1531 distribution->GetAppShortCutName(), true); | 1531 dist->GetDisplayName(), true); |
| 1532 | 1532 |
| 1533 list->AddSetRegValueWorkItem(root, active_setup_path, L"IsInstalled", | 1533 list->AddSetRegValueWorkItem(root, active_setup_path, L"IsInstalled", |
| 1534 static_cast<DWORD>(1U), true); | 1534 static_cast<DWORD>(1U), true); |
| 1535 | 1535 |
| 1536 list->AddSetRegValueWorkItem(root, active_setup_path, L"Version", | 1536 list->AddSetRegValueWorkItem(root, active_setup_path, L"Version", |
| 1537 kActiveSetupVersion, true); | 1537 kActiveSetupVersion, true); |
| 1538 } | 1538 } |
| 1539 | 1539 |
| 1540 void AddDeleteOldIELowRightsPolicyWorkItems( | 1540 void AddDeleteOldIELowRightsPolicyWorkItems( |
| 1541 const InstallerState& installer_state, | 1541 const InstallerState& installer_state, |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1712 if (installer_state.system_install()) | 1712 if (installer_state.system_install()) |
| 1713 cmd_line.AppendSwitch(switches::kSystemLevel); | 1713 cmd_line.AppendSwitch(switches::kSystemLevel); |
| 1714 AppCommand cmd(cmd_line.GetCommandLineString()); | 1714 AppCommand cmd(cmd_line.GetCommandLineString()); |
| 1715 cmd.set_sends_pings(true); | 1715 cmd.set_sends_pings(true); |
| 1716 cmd.set_is_web_accessible(true); | 1716 cmd.set_is_web_accessible(true); |
| 1717 cmd.AddWorkItems(installer_state.root_key(), cmd_key, work_item_list); | 1717 cmd.AddWorkItems(installer_state.root_key(), cmd_key, work_item_list); |
| 1718 } | 1718 } |
| 1719 } | 1719 } |
| 1720 | 1720 |
| 1721 } // namespace installer | 1721 } // namespace installer |
| OLD | NEW |