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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 // built. | 82 // built. |
83 // TODO(robertshield): Remove this when Chrome Frame works with Aura. | 83 // TODO(robertshield): Remove this when Chrome Frame works with Aura. |
84 const wchar_t kIELowRightsPolicyCurrentGuid[] = | 84 const wchar_t kIELowRightsPolicyCurrentGuid[] = |
85 L"{E0A900DF-9611-4446-86BD-4B1D47E7DB2A}"; | 85 L"{E0A900DF-9611-4446-86BD-4B1D47E7DB2A}"; |
86 #endif | 86 #endif |
87 | 87 |
88 const wchar_t kElevationPolicyKeyPath[] = | 88 const wchar_t kElevationPolicyKeyPath[] = |
89 L"SOFTWARE\\Microsoft\\Internet Explorer\\Low Rights\\ElevationPolicy\\"; | 89 L"SOFTWARE\\Microsoft\\Internet Explorer\\Low Rights\\ElevationPolicy\\"; |
90 | 90 |
91 void GetIELowRightsElevationPolicyKeyPath(ElevationPolicyId policy, | 91 void GetIELowRightsElevationPolicyKeyPath(ElevationPolicyId policy, |
92 string16* key_path) { | 92 base::string16* key_path) { |
93 DCHECK(policy == CURRENT_ELEVATION_POLICY || policy == OLD_ELEVATION_POLICY); | 93 DCHECK(policy == CURRENT_ELEVATION_POLICY || policy == OLD_ELEVATION_POLICY); |
94 key_path->assign(kElevationPolicyKeyPath, | 94 key_path->assign(kElevationPolicyKeyPath, |
95 arraysize(kElevationPolicyKeyPath) - 1); | 95 arraysize(kElevationPolicyKeyPath) - 1); |
96 if (policy == CURRENT_ELEVATION_POLICY) { | 96 if (policy == CURRENT_ELEVATION_POLICY) { |
97 #if defined(OMIT_CHROME_FRAME) | 97 #if defined(OMIT_CHROME_FRAME) |
98 key_path->append(kIELowRightsPolicyCurrentGuid, | 98 key_path->append(kIELowRightsPolicyCurrentGuid, |
99 arraysize(kIELowRightsPolicyCurrentGuid) - 1); | 99 arraysize(kIELowRightsPolicyCurrentGuid) - 1); |
100 #else | 100 #else |
101 wchar_t cf_clsid[64]; | 101 wchar_t cf_clsid[64]; |
102 int len = StringFromGUID2(__uuidof(ChromeFrame), &cf_clsid[0], | 102 int len = StringFromGUID2(__uuidof(ChromeFrame), &cf_clsid[0], |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 // system-level archive. | 204 // system-level archive. |
205 install_list->AddCopyTreeWorkItem(archive_path.value(), | 205 install_list->AddCopyTreeWorkItem(archive_path.value(), |
206 archive_dst.value(), | 206 archive_dst.value(), |
207 temp_path.value(), | 207 temp_path.value(), |
208 WorkItem::ALWAYS); | 208 WorkItem::ALWAYS); |
209 } | 209 } |
210 } | 210 } |
211 } | 211 } |
212 } | 212 } |
213 | 213 |
214 string16 GetRegCommandKey(BrowserDistribution* dist, | 214 base::string16 GetRegCommandKey(BrowserDistribution* dist, |
215 const wchar_t* name) { | 215 const wchar_t* name) { |
216 string16 cmd_key(dist->GetVersionKey()); | 216 base::string16 cmd_key(dist->GetVersionKey()); |
217 cmd_key.append(1, base::FilePath::kSeparators[0]) | 217 cmd_key.append(1, base::FilePath::kSeparators[0]) |
218 .append(google_update::kRegCommandsKey) | 218 .append(google_update::kRegCommandsKey) |
219 .append(1, base::FilePath::kSeparators[0]) | 219 .append(1, base::FilePath::kSeparators[0]) |
220 .append(name); | 220 .append(name); |
221 return cmd_key; | 221 return cmd_key; |
222 } | 222 } |
223 | 223 |
224 // Adds work items to create (or delete if uninstalling) app commands to launch | 224 // Adds work items to create (or delete if uninstalling) app commands to launch |
225 // the app with a switch. The following criteria should be true: | 225 // the app with a switch. The following criteria should be true: |
226 // 1. The switch takes one parameter. | 226 // 1. The switch takes one parameter. |
227 // 2. The command send pings. | 227 // 2. The command send pings. |
228 // 3. The command is web accessible. | 228 // 3. The command is web accessible. |
229 // 4. The command is run as the user. | 229 // 4. The command is run as the user. |
230 void AddCommandWithParameterWorkItems(const InstallerState& installer_state, | 230 void AddCommandWithParameterWorkItems(const InstallerState& installer_state, |
231 const InstallationState& machine_state, | 231 const InstallationState& machine_state, |
232 const Version& new_version, | 232 const Version& new_version, |
233 const Product& product, | 233 const Product& product, |
234 const wchar_t* command_key, | 234 const wchar_t* command_key, |
235 const wchar_t* app, | 235 const wchar_t* app, |
236 const char* command_with_parameter, | 236 const char* command_with_parameter, |
237 WorkItemList* work_item_list) { | 237 WorkItemList* work_item_list) { |
238 DCHECK(command_key); | 238 DCHECK(command_key); |
239 DCHECK(app); | 239 DCHECK(app); |
240 DCHECK(command_with_parameter); | 240 DCHECK(command_with_parameter); |
241 DCHECK(work_item_list); | 241 DCHECK(work_item_list); |
242 | 242 |
243 string16 full_cmd_key(GetRegCommandKey(product.distribution(), command_key)); | 243 base::string16 full_cmd_key( |
| 244 GetRegCommandKey(product.distribution(), command_key)); |
244 | 245 |
245 if (installer_state.operation() == InstallerState::UNINSTALL) { | 246 if (installer_state.operation() == InstallerState::UNINSTALL) { |
246 work_item_list->AddDeleteRegKeyWorkItem( | 247 work_item_list->AddDeleteRegKeyWorkItem( |
247 installer_state.root_key(), full_cmd_key)->set_log_message( | 248 installer_state.root_key(), full_cmd_key)->set_log_message( |
248 "removing " + WideToASCII(command_key) + " command"); | 249 "removing " + WideToASCII(command_key) + " command"); |
249 } else { | 250 } else { |
250 CommandLine cmd_line(installer_state.target_path().Append(app)); | 251 CommandLine cmd_line(installer_state.target_path().Append(app)); |
251 cmd_line.AppendSwitchASCII(command_with_parameter, "%1"); | 252 cmd_line.AppendSwitchASCII(command_with_parameter, "%1"); |
252 | 253 |
253 AppCommand cmd(cmd_line.GetCommandLineString()); | 254 AppCommand cmd(cmd_line.GetCommandLineString()); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 | 346 |
346 bool will_have_chrome_binaries = | 347 bool will_have_chrome_binaries = |
347 WillProductBePresentAfterSetup(installer_state, machine_state, | 348 WillProductBePresentAfterSetup(installer_state, machine_state, |
348 BrowserDistribution::CHROME_BINARIES); | 349 BrowserDistribution::CHROME_BINARIES); |
349 | 350 |
350 // For system-level binaries there is no way to keep the command state in sync | 351 // For system-level binaries there is no way to keep the command state in sync |
351 // with the installation/uninstallation of the Application Launcher (which is | 352 // with the installation/uninstallation of the Application Launcher (which is |
352 // always at user-level). So we do not try to remove the command, i.e., it | 353 // always at user-level). So we do not try to remove the command, i.e., it |
353 // will always be installed if the Chrome Binaries are installed. | 354 // will always be installed if the Chrome Binaries are installed. |
354 if (will_have_chrome_binaries) { | 355 if (will_have_chrome_binaries) { |
355 string16 cmd_key(GetRegCommandKey( | 356 base::string16 cmd_key( |
356 BrowserDistribution::GetSpecificDistribution( | 357 GetRegCommandKey(BrowserDistribution::GetSpecificDistribution( |
357 BrowserDistribution::CHROME_BINARIES), | 358 BrowserDistribution::CHROME_BINARIES), |
358 kCmdQuickEnableApplicationHost)); | 359 kCmdQuickEnableApplicationHost)); |
359 CommandLine cmd_line(GetGenericQuickEnableCommand(installer_state, | 360 CommandLine cmd_line(GetGenericQuickEnableCommand(installer_state, |
360 machine_state, | 361 machine_state, |
361 setup_path, | 362 setup_path, |
362 new_version)); | 363 new_version)); |
363 // kMultiInstall and kVerboseLogging were processed above. | 364 // kMultiInstall and kVerboseLogging were processed above. |
364 cmd_line.AppendSwitch(switches::kChromeAppLauncher); | 365 cmd_line.AppendSwitch(switches::kChromeAppLauncher); |
365 cmd_line.AppendSwitch(switches::kEnsureGoogleUpdatePresent); | 366 cmd_line.AppendSwitch(switches::kEnsureGoogleUpdatePresent); |
366 AppCommand cmd(cmd_line.GetCommandLineString()); | 367 AppCommand cmd(cmd_line.GetCommandLineString()); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 void AddDeleteUninstallShortcutsForMSIWorkItems( | 409 void AddDeleteUninstallShortcutsForMSIWorkItems( |
409 const InstallerState& installer_state, | 410 const InstallerState& installer_state, |
410 const Product& product, | 411 const Product& product, |
411 const base::FilePath& temp_path, | 412 const base::FilePath& temp_path, |
412 WorkItemList* work_item_list) { | 413 WorkItemList* work_item_list) { |
413 DCHECK(installer_state.is_msi()) | 414 DCHECK(installer_state.is_msi()) |
414 << "This must only be called for MSI installations!"; | 415 << "This must only be called for MSI installations!"; |
415 | 416 |
416 // First attempt to delete the old installation's ARP dialog entry. | 417 // First attempt to delete the old installation's ARP dialog entry. |
417 HKEY reg_root = installer_state.root_key(); | 418 HKEY reg_root = installer_state.root_key(); |
418 string16 uninstall_reg(product.distribution()->GetUninstallRegPath()); | 419 base::string16 uninstall_reg(product.distribution()->GetUninstallRegPath()); |
419 | 420 |
420 WorkItem* delete_reg_key = work_item_list->AddDeleteRegKeyWorkItem( | 421 WorkItem* delete_reg_key = work_item_list->AddDeleteRegKeyWorkItem( |
421 reg_root, uninstall_reg); | 422 reg_root, uninstall_reg); |
422 delete_reg_key->set_ignore_failure(true); | 423 delete_reg_key->set_ignore_failure(true); |
423 | 424 |
424 // Then attempt to delete the old installation's start menu shortcut. | 425 // Then attempt to delete the old installation's start menu shortcut. |
425 base::FilePath uninstall_link; | 426 base::FilePath uninstall_link; |
426 if (installer_state.system_install()) { | 427 if (installer_state.system_install()) { |
427 PathService::Get(base::DIR_COMMON_START_MENU, &uninstall_link); | 428 PathService::Get(base::DIR_COMMON_START_MENU, &uninstall_link); |
428 } else { | 429 } else { |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 install_list->AddDeleteTreeWorkItem( | 562 install_list->AddDeleteTreeWorkItem( |
562 target_path.Append(installer::kChromeOldExe), temp_path)-> | 563 target_path.Append(installer::kChromeOldExe), temp_path)-> |
563 set_ignore_failure(true); | 564 set_ignore_failure(true); |
564 } | 565 } |
565 | 566 |
566 // Probes COM machinery to get an instance of delegate_execute.exe's | 567 // Probes COM machinery to get an instance of delegate_execute.exe's |
567 // CommandExecuteImpl class. This is required so that COM purges its cache of | 568 // CommandExecuteImpl class. This is required so that COM purges its cache of |
568 // the path to the binary, which changes on updates. This callback | 569 // the path to the binary, which changes on updates. This callback |
569 // unconditionally returns true since an install should not be aborted if the | 570 // unconditionally returns true since an install should not be aborted if the |
570 // probe fails. | 571 // probe fails. |
571 bool ProbeCommandExecuteCallback(const string16& command_execute_id, | 572 bool ProbeCommandExecuteCallback(const base::string16& command_execute_id, |
572 const CallbackWorkItem& work_item) { | 573 const CallbackWorkItem& work_item) { |
573 // Noop on rollback. | 574 // Noop on rollback. |
574 if (work_item.IsRollback()) | 575 if (work_item.IsRollback()) |
575 return true; | 576 return true; |
576 | 577 |
577 CLSID class_id = {}; | 578 CLSID class_id = {}; |
578 | 579 |
579 HRESULT hr = CLSIDFromString(command_execute_id.c_str(), &class_id); | 580 HRESULT hr = CLSIDFromString(command_execute_id.c_str(), &class_id); |
580 if (FAILED(hr)) { | 581 if (FAILED(hr)) { |
581 LOG(DFATAL) << "Failed converting \"" << command_execute_id << "\" to " | 582 LOG(DFATAL) << "Failed converting \"" << command_execute_id << "\" to " |
582 "CLSID; hr=0x" << std::hex << hr; | 583 "CLSID; hr=0x" << std::hex << hr; |
583 } else { | 584 } else { |
584 base::win::ScopedComPtr<IUnknown> command_execute_impl; | 585 base::win::ScopedComPtr<IUnknown> command_execute_impl; |
585 hr = command_execute_impl.CreateInstance(class_id, NULL, | 586 hr = command_execute_impl.CreateInstance(class_id, NULL, |
586 CLSCTX_LOCAL_SERVER); | 587 CLSCTX_LOCAL_SERVER); |
587 if (hr != REGDB_E_CLASSNOTREG) { | 588 if (hr != REGDB_E_CLASSNOTREG) { |
588 LOG(ERROR) << "Unexpected result creating CommandExecuteImpl; hr=0x" | 589 LOG(ERROR) << "Unexpected result creating CommandExecuteImpl; hr=0x" |
589 << std::hex << hr; | 590 << std::hex << hr; |
590 } | 591 } |
591 } | 592 } |
592 | 593 |
593 return true; | 594 return true; |
594 } | 595 } |
595 | 596 |
596 void AddUninstallDelegateExecuteWorkItems(HKEY root, | 597 void AddUninstallDelegateExecuteWorkItems( |
597 const string16& delegate_execute_path, | 598 HKEY root, |
598 WorkItemList* list) { | 599 const base::string16& delegate_execute_path, |
| 600 WorkItemList* list) { |
599 VLOG(1) << "Adding unregistration items for DelegateExecute verb handler in " | 601 VLOG(1) << "Adding unregistration items for DelegateExecute verb handler in " |
600 << root; | 602 << root; |
601 list->AddDeleteRegKeyWorkItem(root, delegate_execute_path); | 603 list->AddDeleteRegKeyWorkItem(root, delegate_execute_path); |
602 | 604 |
603 // In the past, the ICommandExecuteImpl interface and a TypeLib were both | 605 // In the past, the ICommandExecuteImpl interface and a TypeLib were both |
604 // registered. Remove these since this operation may be updating a machine | 606 // registered. Remove these since this operation may be updating a machine |
605 // that had the old registrations. | 607 // that had the old registrations. |
606 list->AddDeleteRegKeyWorkItem(root, | 608 list->AddDeleteRegKeyWorkItem(root, |
607 L"Software\\Classes\\Interface\\" | 609 L"Software\\Classes\\Interface\\" |
608 L"{0BA0D4E9-2259-4963-B9AE-A839F7CB7544}"); | 610 L"{0BA0D4E9-2259-4963-B9AE-A839F7CB7544}"); |
(...skipping 11 matching lines...) Expand all Loading... |
620 // (exclusively -- crrev.com/132596), registered a DelegateExecute class by | 622 // (exclusively -- crrev.com/132596), registered a DelegateExecute class by |
621 // mistake (with the same GUID as Chrome). The fix stopped registering the bad | 623 // mistake (with the same GUID as Chrome). The fix stopped registering the bad |
622 // value, but didn't delete it. This is a problem for users who had installed | 624 // value, but didn't delete it. This is a problem for users who had installed |
623 // Canary before 20.0.1106.0 and now have a system-level Chrome, as the | 625 // Canary before 20.0.1106.0 and now have a system-level Chrome, as the |
624 // left-behind Canary registrations in HKCU mask the HKLM registrations for the | 626 // left-behind Canary registrations in HKCU mask the HKLM registrations for the |
625 // same GUID. Cleanup those registrations if they still exist and belong to this | 627 // same GUID. Cleanup those registrations if they still exist and belong to this |
626 // Canary (i.e., the registered delegate_execute's path is under |target_path|). | 628 // Canary (i.e., the registered delegate_execute's path is under |target_path|). |
627 void CleanupBadCanaryDelegateExecuteRegistration( | 629 void CleanupBadCanaryDelegateExecuteRegistration( |
628 const base::FilePath& target_path, | 630 const base::FilePath& target_path, |
629 WorkItemList* list) { | 631 WorkItemList* list) { |
630 string16 google_chrome_delegate_execute_path( | 632 base::string16 google_chrome_delegate_execute_path( |
631 L"Software\\Classes\\CLSID\\{5C65F4B0-3651-4514-B207-D10CB699B14B}"); | 633 L"Software\\Classes\\CLSID\\{5C65F4B0-3651-4514-B207-D10CB699B14B}"); |
632 string16 google_chrome_local_server_32( | 634 base::string16 google_chrome_local_server_32( |
633 google_chrome_delegate_execute_path + L"\\LocalServer32"); | 635 google_chrome_delegate_execute_path + L"\\LocalServer32"); |
634 | 636 |
635 RegKey local_server_32_key; | 637 RegKey local_server_32_key; |
636 string16 registered_server; | 638 base::string16 registered_server; |
637 if (local_server_32_key.Open(HKEY_CURRENT_USER, | 639 if (local_server_32_key.Open(HKEY_CURRENT_USER, |
638 google_chrome_local_server_32.c_str(), | 640 google_chrome_local_server_32.c_str(), |
639 KEY_QUERY_VALUE) == ERROR_SUCCESS && | 641 KEY_QUERY_VALUE) == ERROR_SUCCESS && |
640 local_server_32_key.ReadValue(L"ServerExecutable", | 642 local_server_32_key.ReadValue(L"ServerExecutable", |
641 ®istered_server) == ERROR_SUCCESS && | 643 ®istered_server) == ERROR_SUCCESS && |
642 target_path.IsParent(base::FilePath(registered_server))) { | 644 target_path.IsParent(base::FilePath(registered_server))) { |
643 scoped_ptr<WorkItemList> no_rollback_list( | 645 scoped_ptr<WorkItemList> no_rollback_list( |
644 WorkItem::CreateNoRollbackWorkItemList()); | 646 WorkItem::CreateNoRollbackWorkItemList()); |
645 AddUninstallDelegateExecuteWorkItems( | 647 AddUninstallDelegateExecuteWorkItems( |
646 HKEY_CURRENT_USER, google_chrome_delegate_execute_path, | 648 HKEY_CURRENT_USER, google_chrome_delegate_execute_path, |
(...skipping 27 matching lines...) Expand all Loading... |
674 // Do not quote the command line for the MSI invocation. | 676 // Do not quote the command line for the MSI invocation. |
675 base::FilePath install_path(installer_state.target_path()); | 677 base::FilePath install_path(installer_state.target_path()); |
676 base::FilePath installer_path( | 678 base::FilePath installer_path( |
677 installer_state.GetInstallerDirectory(new_version)); | 679 installer_state.GetInstallerDirectory(new_version)); |
678 installer_path = installer_path.Append(setup_path.BaseName()); | 680 installer_path = installer_path.Append(setup_path.BaseName()); |
679 | 681 |
680 CommandLine uninstall_arguments(CommandLine::NO_PROGRAM); | 682 CommandLine uninstall_arguments(CommandLine::NO_PROGRAM); |
681 AppendUninstallCommandLineFlags(installer_state, product, | 683 AppendUninstallCommandLineFlags(installer_state, product, |
682 &uninstall_arguments); | 684 &uninstall_arguments); |
683 | 685 |
684 string16 update_state_key(browser_dist->GetStateKey()); | 686 base::string16 update_state_key(browser_dist->GetStateKey()); |
685 install_list->AddCreateRegKeyWorkItem(reg_root, update_state_key); | 687 install_list->AddCreateRegKeyWorkItem(reg_root, update_state_key); |
686 install_list->AddSetRegValueWorkItem(reg_root, update_state_key, | 688 install_list->AddSetRegValueWorkItem(reg_root, update_state_key, |
687 installer::kUninstallStringField, installer_path.value(), true); | 689 installer::kUninstallStringField, installer_path.value(), true); |
688 install_list->AddSetRegValueWorkItem(reg_root, update_state_key, | 690 install_list->AddSetRegValueWorkItem(reg_root, update_state_key, |
689 installer::kUninstallArgumentsField, | 691 installer::kUninstallArgumentsField, |
690 uninstall_arguments.GetCommandLineString(), true); | 692 uninstall_arguments.GetCommandLineString(), true); |
691 | 693 |
692 // MSI installations will manage their own uninstall shortcuts. | 694 // MSI installations will manage their own uninstall shortcuts. |
693 if (!installer_state.is_msi() && product.ShouldCreateUninstallEntry()) { | 695 if (!installer_state.is_msi() && product.ShouldCreateUninstallEntry()) { |
694 // We need to quote the command line for the Add/Remove Programs dialog. | 696 // We need to quote the command line for the Add/Remove Programs dialog. |
695 CommandLine quoted_uninstall_cmd(installer_path); | 697 CommandLine quoted_uninstall_cmd(installer_path); |
696 DCHECK_EQ(quoted_uninstall_cmd.GetCommandLineString()[0], '"'); | 698 DCHECK_EQ(quoted_uninstall_cmd.GetCommandLineString()[0], '"'); |
697 quoted_uninstall_cmd.AppendArguments(uninstall_arguments, false); | 699 quoted_uninstall_cmd.AppendArguments(uninstall_arguments, false); |
698 | 700 |
699 string16 uninstall_reg = browser_dist->GetUninstallRegPath(); | 701 base::string16 uninstall_reg = browser_dist->GetUninstallRegPath(); |
700 install_list->AddCreateRegKeyWorkItem(reg_root, uninstall_reg); | 702 install_list->AddCreateRegKeyWorkItem(reg_root, uninstall_reg); |
701 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, | 703 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, |
702 installer::kUninstallDisplayNameField, browser_dist->GetDisplayName(), | 704 installer::kUninstallDisplayNameField, browser_dist->GetDisplayName(), |
703 true); | 705 true); |
704 install_list->AddSetRegValueWorkItem(reg_root, | 706 install_list->AddSetRegValueWorkItem(reg_root, |
705 uninstall_reg, installer::kUninstallStringField, | 707 uninstall_reg, installer::kUninstallStringField, |
706 quoted_uninstall_cmd.GetCommandLineString(), true); | 708 quoted_uninstall_cmd.GetCommandLineString(), true); |
707 install_list->AddSetRegValueWorkItem(reg_root, | 709 install_list->AddSetRegValueWorkItem(reg_root, |
708 uninstall_reg, | 710 uninstall_reg, |
709 L"InstallLocation", | 711 L"InstallLocation", |
710 install_path.value(), | 712 install_path.value(), |
711 true); | 713 true); |
712 | 714 |
713 BrowserDistribution* dist = product.distribution(); | 715 BrowserDistribution* dist = product.distribution(); |
714 string16 chrome_icon = ShellUtil::FormatIconLocation( | 716 base::string16 chrome_icon = ShellUtil::FormatIconLocation( |
715 install_path.Append(dist->GetIconFilename()).value(), | 717 install_path.Append(dist->GetIconFilename()).value(), |
716 dist->GetIconIndex(BrowserDistribution::SHORTCUT_CHROME)); | 718 dist->GetIconIndex(BrowserDistribution::SHORTCUT_CHROME)); |
717 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, | 719 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, |
718 L"DisplayIcon", chrome_icon, true); | 720 L"DisplayIcon", chrome_icon, true); |
719 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, | 721 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, |
720 L"NoModify", static_cast<DWORD>(1), | 722 L"NoModify", static_cast<DWORD>(1), |
721 true); | 723 true); |
722 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, | 724 install_list->AddSetRegValueWorkItem(reg_root, uninstall_reg, |
723 L"NoRepair", static_cast<DWORD>(1), | 725 L"NoRepair", static_cast<DWORD>(1), |
724 true); | 726 true); |
(...skipping 28 matching lines...) Expand all Loading... |
753 | 755 |
754 // Create Version key for a product (if not already present) and sets the new | 756 // Create Version key for a product (if not already present) and sets the new |
755 // product version as the last step. | 757 // product version as the last step. |
756 void AddVersionKeyWorkItems(HKEY root, | 758 void AddVersionKeyWorkItems(HKEY root, |
757 BrowserDistribution* dist, | 759 BrowserDistribution* dist, |
758 const Version& new_version, | 760 const Version& new_version, |
759 bool add_language_identifier, | 761 bool add_language_identifier, |
760 WorkItemList* list) { | 762 WorkItemList* list) { |
761 // Create Version key for each distribution (if not already present) and set | 763 // Create Version key for each distribution (if not already present) and set |
762 // the new product version as the last step. | 764 // the new product version as the last step. |
763 string16 version_key(dist->GetVersionKey()); | 765 base::string16 version_key(dist->GetVersionKey()); |
764 list->AddCreateRegKeyWorkItem(root, version_key); | 766 list->AddCreateRegKeyWorkItem(root, version_key); |
765 | 767 |
766 string16 product_name(dist->GetDisplayName()); | 768 base::string16 product_name(dist->GetDisplayName()); |
767 list->AddSetRegValueWorkItem(root, version_key, google_update::kRegNameField, | 769 list->AddSetRegValueWorkItem(root, version_key, google_update::kRegNameField, |
768 product_name, true); // overwrite name also | 770 product_name, true); // overwrite name also |
769 list->AddSetRegValueWorkItem(root, version_key, | 771 list->AddSetRegValueWorkItem(root, version_key, |
770 google_update::kRegOopcrashesField, | 772 google_update::kRegOopcrashesField, |
771 static_cast<DWORD>(1), | 773 static_cast<DWORD>(1), |
772 false); // set during first install | 774 false); // set during first install |
773 if (add_language_identifier) { | 775 if (add_language_identifier) { |
774 // Write the language identifier of the current translation. Omaha's set of | 776 // Write the language identifier of the current translation. Omaha's set of |
775 // languages is a superset of Chrome's set of translations with this one | 777 // languages is a superset of Chrome's set of translations with this one |
776 // exception: what Chrome calls "en-us", Omaha calls "en". sigh. | 778 // exception: what Chrome calls "en-us", Omaha calls "en". sigh. |
777 string16 language(GetCurrentTranslation()); | 779 base::string16 language(GetCurrentTranslation()); |
778 if (LowerCaseEqualsASCII(language, "en-us")) | 780 if (LowerCaseEqualsASCII(language, "en-us")) |
779 language.resize(2); | 781 language.resize(2); |
780 list->AddSetRegValueWorkItem(root, version_key, | 782 list->AddSetRegValueWorkItem(root, version_key, |
781 google_update::kRegLangField, language, | 783 google_update::kRegLangField, language, |
782 false); // do not overwrite language | 784 false); // do not overwrite language |
783 } | 785 } |
784 list->AddSetRegValueWorkItem(root, version_key, | 786 list->AddSetRegValueWorkItem(root, version_key, |
785 google_update::kRegVersionField, | 787 google_update::kRegVersionField, |
786 ASCIIToWide(new_version.GetString()), | 788 ASCIIToWide(new_version.GetString()), |
787 true); // overwrite version | 789 true); // overwrite version |
788 } | 790 } |
789 | 791 |
790 // Mirror oeminstall the first time anything is installed multi. There is no | 792 // Mirror oeminstall the first time anything is installed multi. There is no |
791 // need to update the value on future install/update runs since this value never | 793 // need to update the value on future install/update runs since this value never |
792 // changes. Note that the value is removed by Google Update after EULA | 794 // changes. Note that the value is removed by Google Update after EULA |
793 // acceptance is processed. | 795 // acceptance is processed. |
794 void AddOemInstallWorkItems(const InstallationState& original_state, | 796 void AddOemInstallWorkItems(const InstallationState& original_state, |
795 const InstallerState& installer_state, | 797 const InstallerState& installer_state, |
796 WorkItemList* install_list) { | 798 WorkItemList* install_list) { |
797 DCHECK(installer_state.is_multi_install()); | 799 DCHECK(installer_state.is_multi_install()); |
798 const bool system_install = installer_state.system_install(); | 800 const bool system_install = installer_state.system_install(); |
799 if (!original_state.GetProductState(system_install, | 801 if (!original_state.GetProductState(system_install, |
800 BrowserDistribution::CHROME_BINARIES)) { | 802 BrowserDistribution::CHROME_BINARIES)) { |
801 const HKEY root_key = installer_state.root_key(); | 803 const HKEY root_key = installer_state.root_key(); |
802 string16 multi_key( | 804 base::string16 multi_key( |
803 installer_state.multi_package_binaries_distribution()->GetStateKey()); | 805 installer_state.multi_package_binaries_distribution()->GetStateKey()); |
804 | 806 |
805 // Copy the value from Chrome unless Chrome isn't installed or being | 807 // Copy the value from Chrome unless Chrome isn't installed or being |
806 // installed. | 808 // installed. |
807 BrowserDistribution::Type source_type; | 809 BrowserDistribution::Type source_type; |
808 if (installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER)) { | 810 if (installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER)) { |
809 source_type = BrowserDistribution::CHROME_BROWSER; | 811 source_type = BrowserDistribution::CHROME_BROWSER; |
810 } else if (!installer_state.products().empty()) { | 812 } else if (!installer_state.products().empty()) { |
811 // Pick a product, any product. | 813 // Pick a product, any product. |
812 source_type = installer_state.products()[0]->distribution()->GetType(); | 814 source_type = installer_state.products()[0]->distribution()->GetType(); |
813 } else { | 815 } else { |
814 // Nothing is being installed? Entirely unexpected, so do no harm. | 816 // Nothing is being installed? Entirely unexpected, so do no harm. |
815 LOG(ERROR) << "No products found in AddOemInstallWorkItems"; | 817 LOG(ERROR) << "No products found in AddOemInstallWorkItems"; |
816 return; | 818 return; |
817 } | 819 } |
818 const ProductState* source_product = | 820 const ProductState* source_product = |
819 original_state.GetNonVersionedProductState(system_install, source_type); | 821 original_state.GetNonVersionedProductState(system_install, source_type); |
820 | 822 |
821 string16 oem_install; | 823 base::string16 oem_install; |
822 if (source_product->GetOemInstall(&oem_install)) { | 824 if (source_product->GetOemInstall(&oem_install)) { |
823 VLOG(1) << "Mirroring oeminstall=\"" << oem_install << "\" from " | 825 VLOG(1) << "Mirroring oeminstall=\"" << oem_install << "\" from " |
824 << BrowserDistribution::GetSpecificDistribution(source_type)-> | 826 << BrowserDistribution::GetSpecificDistribution(source_type)-> |
825 GetDisplayName(); | 827 GetDisplayName(); |
826 install_list->AddCreateRegKeyWorkItem(root_key, multi_key); | 828 install_list->AddCreateRegKeyWorkItem(root_key, multi_key); |
827 // Always overwrite an old value. | 829 // Always overwrite an old value. |
828 install_list->AddSetRegValueWorkItem(root_key, multi_key, | 830 install_list->AddSetRegValueWorkItem(root_key, multi_key, |
829 google_update::kRegOemInstallField, | 831 google_update::kRegOemInstallField, |
830 oem_install, true); | 832 oem_install, true); |
831 } else { | 833 } else { |
832 // Clear any old value. | 834 // Clear any old value. |
833 install_list->AddDeleteRegValueWorkItem( | 835 install_list->AddDeleteRegValueWorkItem( |
834 root_key, multi_key, google_update::kRegOemInstallField); | 836 root_key, multi_key, google_update::kRegOemInstallField); |
835 } | 837 } |
836 } | 838 } |
837 } | 839 } |
838 | 840 |
839 // Mirror eulaaccepted the first time anything is installed multi. There is no | 841 // Mirror eulaaccepted the first time anything is installed multi. There is no |
840 // need to update the value on future install/update runs since | 842 // need to update the value on future install/update runs since |
841 // GoogleUpdateSettings::SetEULAConsent will modify the value for both the | 843 // GoogleUpdateSettings::SetEULAConsent will modify the value for both the |
842 // relevant product and for the binaries. | 844 // relevant product and for the binaries. |
843 void AddEulaAcceptedWorkItems(const InstallationState& original_state, | 845 void AddEulaAcceptedWorkItems(const InstallationState& original_state, |
844 const InstallerState& installer_state, | 846 const InstallerState& installer_state, |
845 WorkItemList* install_list) { | 847 WorkItemList* install_list) { |
846 DCHECK(installer_state.is_multi_install()); | 848 DCHECK(installer_state.is_multi_install()); |
847 const bool system_install = installer_state.system_install(); | 849 const bool system_install = installer_state.system_install(); |
848 if (!original_state.GetProductState(system_install, | 850 if (!original_state.GetProductState(system_install, |
849 BrowserDistribution::CHROME_BINARIES)) { | 851 BrowserDistribution::CHROME_BINARIES)) { |
850 const HKEY root_key = installer_state.root_key(); | 852 const HKEY root_key = installer_state.root_key(); |
851 string16 multi_key( | 853 base::string16 multi_key( |
852 installer_state.multi_package_binaries_distribution()->GetStateKey()); | 854 installer_state.multi_package_binaries_distribution()->GetStateKey()); |
853 | 855 |
854 // Copy the value from the product with the greatest value. | 856 // Copy the value from the product with the greatest value. |
855 bool have_eula_accepted = false; | 857 bool have_eula_accepted = false; |
856 BrowserDistribution::Type product_type; | 858 BrowserDistribution::Type product_type; |
857 DWORD eula_accepted; | 859 DWORD eula_accepted; |
858 const Products& products = installer_state.products(); | 860 const Products& products = installer_state.products(); |
859 for (Products::const_iterator it = products.begin(); it < products.end(); | 861 for (Products::const_iterator it = products.begin(); it < products.end(); |
860 ++it) { | 862 ++it) { |
861 const Product& product = **it; | 863 const Product& product = **it; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 WorkItemList* install_list) { | 898 WorkItemList* install_list) { |
897 // Is a multi-install product being installed or over-installed? | 899 // Is a multi-install product being installed or over-installed? |
898 if (installer_state.operation() != InstallerState::MULTI_INSTALL && | 900 if (installer_state.operation() != InstallerState::MULTI_INSTALL && |
899 installer_state.operation() != InstallerState::MULTI_UPDATE) { | 901 installer_state.operation() != InstallerState::MULTI_UPDATE) { |
900 VLOG(1) << "AddGoogleUpdateWorkItems noop: " << installer_state.operation(); | 902 VLOG(1) << "AddGoogleUpdateWorkItems noop: " << installer_state.operation(); |
901 return; | 903 return; |
902 } | 904 } |
903 | 905 |
904 const bool system_install = installer_state.system_install(); | 906 const bool system_install = installer_state.system_install(); |
905 const HKEY root_key = installer_state.root_key(); | 907 const HKEY root_key = installer_state.root_key(); |
906 string16 multi_key( | 908 base::string16 multi_key( |
907 installer_state.multi_package_binaries_distribution()->GetStateKey()); | 909 installer_state.multi_package_binaries_distribution()->GetStateKey()); |
908 | 910 |
909 // For system-level installs, make sure the ClientStateMedium key for the | 911 // For system-level installs, make sure the ClientStateMedium key for the |
910 // binaries exists. | 912 // binaries exists. |
911 if (system_install) { | 913 if (system_install) { |
912 install_list->AddCreateRegKeyWorkItem( | 914 install_list->AddCreateRegKeyWorkItem( |
913 root_key, | 915 root_key, |
914 installer_state.multi_package_binaries_distribution()-> | 916 installer_state.multi_package_binaries_distribution()-> |
915 GetStateMediumKey().c_str()); | 917 GetStateMediumKey().c_str()); |
916 } | 918 } |
917 | 919 |
918 // Creating the ClientState key for binaries, if we're migrating to multi then | 920 // Creating the ClientState key for binaries, if we're migrating to multi then |
919 // copy over Chrome's brand code if it has one. Chrome Frame currently never | 921 // copy over Chrome's brand code if it has one. Chrome Frame currently never |
920 // has a brand code. | 922 // has a brand code. |
921 if (installer_state.state_type() != BrowserDistribution::CHROME_BINARIES) { | 923 if (installer_state.state_type() != BrowserDistribution::CHROME_BINARIES) { |
922 const ProductState* chrome_product_state = | 924 const ProductState* chrome_product_state = |
923 original_state.GetNonVersionedProductState( | 925 original_state.GetNonVersionedProductState( |
924 system_install, BrowserDistribution::CHROME_BROWSER); | 926 system_install, BrowserDistribution::CHROME_BROWSER); |
925 | 927 |
926 const string16& brand(chrome_product_state->brand()); | 928 const base::string16& brand(chrome_product_state->brand()); |
927 if (!brand.empty()) { | 929 if (!brand.empty()) { |
928 install_list->AddCreateRegKeyWorkItem(root_key, multi_key); | 930 install_list->AddCreateRegKeyWorkItem(root_key, multi_key); |
929 // Write Chrome's brand code to the multi key. Never overwrite the value | 931 // Write Chrome's brand code to the multi key. Never overwrite the value |
930 // if one is already present (although this shouldn't happen). | 932 // if one is already present (although this shouldn't happen). |
931 install_list->AddSetRegValueWorkItem(root_key, | 933 install_list->AddSetRegValueWorkItem(root_key, |
932 multi_key, | 934 multi_key, |
933 google_update::kRegBrandField, | 935 google_update::kRegBrandField, |
934 brand, | 936 brand, |
935 false); | 937 false); |
936 } | 938 } |
(...skipping 26 matching lines...) Expand all Loading... |
963 BrowserDistribution* dist = (*scan)->distribution(); | 965 BrowserDistribution* dist = (*scan)->distribution(); |
964 const ProductState* product_state = | 966 const ProductState* product_state = |
965 original_state.GetNonVersionedProductState( | 967 original_state.GetNonVersionedProductState( |
966 installer_state.system_install(), dist->GetType()); | 968 installer_state.system_install(), dist->GetType()); |
967 value_found = product_state->GetUsageStats(&usagestats); | 969 value_found = product_state->GetUsageStats(&usagestats); |
968 } | 970 } |
969 | 971 |
970 // If a value was found, write it in the appropriate location for the | 972 // If a value was found, write it in the appropriate location for the |
971 // binaries and remove all values from the products. | 973 // binaries and remove all values from the products. |
972 if (value_found) { | 974 if (value_found) { |
973 string16 state_key( | 975 base::string16 state_key( |
974 installer_state.multi_package_binaries_distribution()->GetStateKey()); | 976 installer_state.multi_package_binaries_distribution()->GetStateKey()); |
975 install_list->AddCreateRegKeyWorkItem(root_key, state_key); | 977 install_list->AddCreateRegKeyWorkItem(root_key, state_key); |
976 // Overwrite any existing value so that overinstalls (where Omaha writes a | 978 // Overwrite any existing value so that overinstalls (where Omaha writes a |
977 // new value into a product's state key) pick up the correct value. | 979 // new value into a product's state key) pick up the correct value. |
978 install_list->AddSetRegValueWorkItem(root_key, state_key, | 980 install_list->AddSetRegValueWorkItem(root_key, state_key, |
979 google_update::kRegUsageStatsField, | 981 google_update::kRegUsageStatsField, |
980 usagestats, true); | 982 usagestats, true); |
981 | 983 |
982 for (Products::const_iterator scan = products.begin(), end = products.end(); | 984 for (Products::const_iterator scan = products.begin(), end = products.end(); |
983 scan != end; ++scan) { | 985 scan != end; ++scan) { |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1032 setup_path.BaseName())); | 1034 setup_path.BaseName())); |
1033 | 1035 |
1034 CommandLine rename(installer_path); | 1036 CommandLine rename(installer_path); |
1035 rename.AppendSwitch(switches::kRenameChromeExe); | 1037 rename.AppendSwitch(switches::kRenameChromeExe); |
1036 if (installer_state.system_install()) | 1038 if (installer_state.system_install()) |
1037 rename.AppendSwitch(switches::kSystemLevel); | 1039 rename.AppendSwitch(switches::kSystemLevel); |
1038 | 1040 |
1039 if (installer_state.verbose_logging()) | 1041 if (installer_state.verbose_logging()) |
1040 rename.AppendSwitch(switches::kVerboseLogging); | 1042 rename.AppendSwitch(switches::kVerboseLogging); |
1041 | 1043 |
1042 string16 version_key; | 1044 base::string16 version_key; |
1043 for (size_t i = 0; i < products.size(); ++i) { | 1045 for (size_t i = 0; i < products.size(); ++i) { |
1044 BrowserDistribution* dist = products[i]->distribution(); | 1046 BrowserDistribution* dist = products[i]->distribution(); |
1045 version_key = dist->GetVersionKey(); | 1047 version_key = dist->GetVersionKey(); |
1046 | 1048 |
1047 if (current_version) { | 1049 if (current_version) { |
1048 in_use_update_work_items->AddSetRegValueWorkItem(root, version_key, | 1050 in_use_update_work_items->AddSetRegValueWorkItem(root, version_key, |
1049 google_update::kRegOldVersionField, | 1051 google_update::kRegOldVersionField, |
1050 ASCIIToWide(current_version->GetString()), true); | 1052 ASCIIToWide(current_version->GetString()), true); |
1051 } | 1053 } |
1052 if (critical_version.IsValid()) { | 1054 if (critical_version.IsValid()) { |
(...skipping 30 matching lines...) Expand all Loading... |
1083 // Append work items that will be executed if this was NOT an in-use update. | 1085 // Append work items that will be executed if this was NOT an in-use update. |
1084 { | 1086 { |
1085 scoped_ptr<WorkItemList> regular_update_work_items( | 1087 scoped_ptr<WorkItemList> regular_update_work_items( |
1086 WorkItem::CreateConditionalWorkItemList( | 1088 WorkItem::CreateConditionalWorkItemList( |
1087 new Not(new ConditionRunIfFileExists(new_chrome_exe)))); | 1089 new Not(new ConditionRunIfFileExists(new_chrome_exe)))); |
1088 regular_update_work_items->set_log_message("RegularUpdateWorkItemList"); | 1090 regular_update_work_items->set_log_message("RegularUpdateWorkItemList"); |
1089 | 1091 |
1090 // Since this was not an in-use-update, delete 'opv', 'cpv', and 'cmd' keys. | 1092 // Since this was not an in-use-update, delete 'opv', 'cpv', and 'cmd' keys. |
1091 for (size_t i = 0; i < products.size(); ++i) { | 1093 for (size_t i = 0; i < products.size(); ++i) { |
1092 BrowserDistribution* dist = products[i]->distribution(); | 1094 BrowserDistribution* dist = products[i]->distribution(); |
1093 string16 version_key(dist->GetVersionKey()); | 1095 base::string16 version_key(dist->GetVersionKey()); |
1094 regular_update_work_items->AddDeleteRegValueWorkItem(root, version_key, | 1096 regular_update_work_items->AddDeleteRegValueWorkItem(root, version_key, |
1095 google_update::kRegOldVersionField); | 1097 google_update::kRegOldVersionField); |
1096 regular_update_work_items->AddDeleteRegValueWorkItem(root, version_key, | 1098 regular_update_work_items->AddDeleteRegValueWorkItem(root, version_key, |
1097 google_update::kRegCriticalVersionField); | 1099 google_update::kRegCriticalVersionField); |
1098 regular_update_work_items->AddDeleteRegValueWorkItem(root, version_key, | 1100 regular_update_work_items->AddDeleteRegValueWorkItem(root, version_key, |
1099 google_update::kRegRenameCmdField); | 1101 google_update::kRegRenameCmdField); |
1100 } | 1102 } |
1101 | 1103 |
1102 if (installer_state.FindProduct(BrowserDistribution::CHROME_FRAME)) { | 1104 if (installer_state.FindProduct(BrowserDistribution::CHROME_FRAME)) { |
1103 AddDeleteOldIELowRightsPolicyWorkItems(installer_state, | 1105 AddDeleteOldIELowRightsPolicyWorkItems(installer_state, |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1265 DCHECK(set_msi_work_item); | 1267 DCHECK(set_msi_work_item); |
1266 set_msi_work_item->set_ignore_failure(true); | 1268 set_msi_work_item->set_ignore_failure(true); |
1267 set_msi_work_item->set_log_message("Could not write MSI marker!"); | 1269 set_msi_work_item->set_log_message("Could not write MSI marker!"); |
1268 } | 1270 } |
1269 | 1271 |
1270 void AddDelegateExecuteWorkItems(const InstallerState& installer_state, | 1272 void AddDelegateExecuteWorkItems(const InstallerState& installer_state, |
1271 const base::FilePath& target_path, | 1273 const base::FilePath& target_path, |
1272 const Version& new_version, | 1274 const Version& new_version, |
1273 const Product& product, | 1275 const Product& product, |
1274 WorkItemList* list) { | 1276 WorkItemList* list) { |
1275 string16 handler_class_uuid; | 1277 base::string16 handler_class_uuid; |
1276 BrowserDistribution* dist = product.distribution(); | 1278 BrowserDistribution* dist = product.distribution(); |
1277 if (!dist->GetCommandExecuteImplClsid(&handler_class_uuid)) { | 1279 if (!dist->GetCommandExecuteImplClsid(&handler_class_uuid)) { |
1278 if (InstallUtil::IsChromeSxSProcess()) { | 1280 if (InstallUtil::IsChromeSxSProcess()) { |
1279 CleanupBadCanaryDelegateExecuteRegistration(target_path, list); | 1281 CleanupBadCanaryDelegateExecuteRegistration(target_path, list); |
1280 } else { | 1282 } else { |
1281 VLOG(1) << "No DelegateExecute verb handler processing to do for " | 1283 VLOG(1) << "No DelegateExecute verb handler processing to do for " |
1282 << dist->GetDisplayName(); | 1284 << dist->GetDisplayName(); |
1283 } | 1285 } |
1284 return; | 1286 return; |
1285 } | 1287 } |
1286 | 1288 |
1287 HKEY root = installer_state.root_key(); | 1289 HKEY root = installer_state.root_key(); |
1288 string16 delegate_execute_path(L"Software\\Classes\\CLSID\\"); | 1290 base::string16 delegate_execute_path(L"Software\\Classes\\CLSID\\"); |
1289 delegate_execute_path.append(handler_class_uuid); | 1291 delegate_execute_path.append(handler_class_uuid); |
1290 | 1292 |
1291 // Unconditionally remove registration regardless of whether or not it is | 1293 // Unconditionally remove registration regardless of whether or not it is |
1292 // needed since builds after r132190 included it when it wasn't strictly | 1294 // needed since builds after r132190 included it when it wasn't strictly |
1293 // necessary. Do this removal before adding in the new key to ensure that | 1295 // necessary. Do this removal before adding in the new key to ensure that |
1294 // the COM probe/flush below does its job. | 1296 // the COM probe/flush below does its job. |
1295 AddUninstallDelegateExecuteWorkItems(root, delegate_execute_path, list); | 1297 AddUninstallDelegateExecuteWorkItems(root, delegate_execute_path, list); |
1296 | 1298 |
1297 // Add work items to register the handler iff it is present. | 1299 // Add work items to register the handler iff it is present. |
1298 // See also shell_util.cc's GetProgIdEntries. | 1300 // See also shell_util.cc's GetProgIdEntries. |
1299 if (installer_state.operation() != InstallerState::UNINSTALL) { | 1301 if (installer_state.operation() != InstallerState::UNINSTALL) { |
1300 VLOG(1) << "Adding registration items for DelegateExecute verb handler."; | 1302 VLOG(1) << "Adding registration items for DelegateExecute verb handler."; |
1301 | 1303 |
1302 // Force COM to flush its cache containing the path to the old handler. | 1304 // Force COM to flush its cache containing the path to the old handler. |
1303 list->AddCallbackWorkItem(base::Bind(&ProbeCommandExecuteCallback, | 1305 list->AddCallbackWorkItem(base::Bind(&ProbeCommandExecuteCallback, |
1304 handler_class_uuid)); | 1306 handler_class_uuid)); |
1305 | 1307 |
1306 // The path to the exe (in the version directory). | 1308 // The path to the exe (in the version directory). |
1307 base::FilePath delegate_execute(target_path); | 1309 base::FilePath delegate_execute(target_path); |
1308 if (new_version.IsValid()) | 1310 if (new_version.IsValid()) |
1309 delegate_execute = delegate_execute.AppendASCII(new_version.GetString()); | 1311 delegate_execute = delegate_execute.AppendASCII(new_version.GetString()); |
1310 delegate_execute = delegate_execute.Append(kDelegateExecuteExe); | 1312 delegate_execute = delegate_execute.Append(kDelegateExecuteExe); |
1311 | 1313 |
1312 // Command-line featuring the quoted path to the exe. | 1314 // Command-line featuring the quoted path to the exe. |
1313 string16 command(1, L'"'); | 1315 base::string16 command(1, L'"'); |
1314 command.append(delegate_execute.value()).append(1, L'"'); | 1316 command.append(delegate_execute.value()).append(1, L'"'); |
1315 | 1317 |
1316 // Register the CommandExecuteImpl class in Software\Classes\CLSID\... | 1318 // Register the CommandExecuteImpl class in Software\Classes\CLSID\... |
1317 list->AddCreateRegKeyWorkItem(root, delegate_execute_path); | 1319 list->AddCreateRegKeyWorkItem(root, delegate_execute_path); |
1318 list->AddSetRegValueWorkItem(root, delegate_execute_path, L"", | 1320 list->AddSetRegValueWorkItem(root, delegate_execute_path, L"", |
1319 L"CommandExecuteImpl Class", true); | 1321 L"CommandExecuteImpl Class", true); |
1320 string16 subkey(delegate_execute_path); | 1322 base::string16 subkey(delegate_execute_path); |
1321 subkey.append(L"\\LocalServer32"); | 1323 subkey.append(L"\\LocalServer32"); |
1322 list->AddCreateRegKeyWorkItem(root, subkey); | 1324 list->AddCreateRegKeyWorkItem(root, subkey); |
1323 list->AddSetRegValueWorkItem(root, subkey, L"", command, true); | 1325 list->AddSetRegValueWorkItem(root, subkey, L"", command, true); |
1324 list->AddSetRegValueWorkItem(root, subkey, L"ServerExecutable", | 1326 list->AddSetRegValueWorkItem(root, subkey, L"ServerExecutable", |
1325 delegate_execute.value(), true); | 1327 delegate_execute.value(), true); |
1326 | 1328 |
1327 subkey.assign(delegate_execute_path).append(L"\\Programmable"); | 1329 subkey.assign(delegate_execute_path).append(L"\\Programmable"); |
1328 list->AddCreateRegKeyWorkItem(root, subkey); | 1330 list->AddCreateRegKeyWorkItem(root, subkey); |
1329 } | 1331 } |
1330 } | 1332 } |
1331 | 1333 |
1332 void AddActiveSetupWorkItems(const InstallerState& installer_state, | 1334 void AddActiveSetupWorkItems(const InstallerState& installer_state, |
1333 const base::FilePath& setup_path, | 1335 const base::FilePath& setup_path, |
1334 const Version& new_version, | 1336 const Version& new_version, |
1335 const Product& product, | 1337 const Product& product, |
1336 WorkItemList* list) { | 1338 WorkItemList* list) { |
1337 DCHECK(installer_state.operation() != InstallerState::UNINSTALL); | 1339 DCHECK(installer_state.operation() != InstallerState::UNINSTALL); |
1338 BrowserDistribution* dist = product.distribution(); | 1340 BrowserDistribution* dist = product.distribution(); |
1339 | 1341 |
1340 if (!product.is_chrome() || !installer_state.system_install()) { | 1342 if (!product.is_chrome() || !installer_state.system_install()) { |
1341 const char* install_level = | 1343 const char* install_level = |
1342 installer_state.system_install() ? "system" : "user"; | 1344 installer_state.system_install() ? "system" : "user"; |
1343 VLOG(1) << "No Active Setup processing to do for " << install_level | 1345 VLOG(1) << "No Active Setup processing to do for " << install_level |
1344 << "-level " << dist->GetDisplayName(); | 1346 << "-level " << dist->GetDisplayName(); |
1345 return; | 1347 return; |
1346 } | 1348 } |
1347 DCHECK(installer_state.RequiresActiveSetup()); | 1349 DCHECK(installer_state.RequiresActiveSetup()); |
1348 | 1350 |
1349 const HKEY root = HKEY_LOCAL_MACHINE; | 1351 const HKEY root = HKEY_LOCAL_MACHINE; |
1350 const string16 active_setup_path(InstallUtil::GetActiveSetupPath(dist)); | 1352 const base::string16 active_setup_path(InstallUtil::GetActiveSetupPath(dist)); |
1351 | 1353 |
1352 VLOG(1) << "Adding registration items for Active Setup."; | 1354 VLOG(1) << "Adding registration items for Active Setup."; |
1353 list->AddCreateRegKeyWorkItem(root, active_setup_path); | 1355 list->AddCreateRegKeyWorkItem(root, active_setup_path); |
1354 list->AddSetRegValueWorkItem(root, active_setup_path, L"", | 1356 list->AddSetRegValueWorkItem(root, active_setup_path, L"", |
1355 dist->GetDisplayName(), true); | 1357 dist->GetDisplayName(), true); |
1356 | 1358 |
1357 base::FilePath active_setup_exe(installer_state.GetInstallerDirectory( | 1359 base::FilePath active_setup_exe(installer_state.GetInstallerDirectory( |
1358 new_version).Append(kActiveSetupExe)); | 1360 new_version).Append(kActiveSetupExe)); |
1359 CommandLine cmd(active_setup_exe); | 1361 CommandLine cmd(active_setup_exe); |
1360 cmd.AppendSwitch(installer::switches::kConfigureUserSettings); | 1362 cmd.AppendSwitch(installer::switches::kConfigureUserSettings); |
(...skipping 13 matching lines...) Expand all Loading... |
1374 | 1376 |
1375 list->AddSetRegValueWorkItem(root, active_setup_path, L"Version", | 1377 list->AddSetRegValueWorkItem(root, active_setup_path, L"Version", |
1376 kActiveSetupVersion, true); | 1378 kActiveSetupVersion, true); |
1377 } | 1379 } |
1378 | 1380 |
1379 void AddDeleteOldIELowRightsPolicyWorkItems( | 1381 void AddDeleteOldIELowRightsPolicyWorkItems( |
1380 const InstallerState& installer_state, | 1382 const InstallerState& installer_state, |
1381 WorkItemList* install_list) { | 1383 WorkItemList* install_list) { |
1382 DCHECK(install_list); | 1384 DCHECK(install_list); |
1383 | 1385 |
1384 string16 key_path; | 1386 base::string16 key_path; |
1385 GetIELowRightsElevationPolicyKeyPath(OLD_ELEVATION_POLICY, &key_path); | 1387 GetIELowRightsElevationPolicyKeyPath(OLD_ELEVATION_POLICY, &key_path); |
1386 install_list->AddDeleteRegKeyWorkItem(installer_state.root_key(), key_path); | 1388 install_list->AddDeleteRegKeyWorkItem(installer_state.root_key(), key_path); |
1387 } | 1389 } |
1388 | 1390 |
1389 // Adds work items to copy the chrome_launcher IE low rights elevation policy | 1391 // Adds work items to copy the chrome_launcher IE low rights elevation policy |
1390 // from the primary policy GUID to the "old" policy GUID. Take care not to | 1392 // from the primary policy GUID to the "old" policy GUID. Take care not to |
1391 // perform the copy if there is already an old policy present, as the ones under | 1393 // perform the copy if there is already an old policy present, as the ones under |
1392 // the main kElevationPolicyGuid would then correspond to an intermediate | 1394 // the main kElevationPolicyGuid would then correspond to an intermediate |
1393 // version (current_version < pv < new_version). | 1395 // version (current_version < pv < new_version). |
1394 void AddCopyIELowRightsPolicyWorkItems(const InstallerState& installer_state, | 1396 void AddCopyIELowRightsPolicyWorkItems(const InstallerState& installer_state, |
1395 WorkItemList* install_list) { | 1397 WorkItemList* install_list) { |
1396 DCHECK(install_list); | 1398 DCHECK(install_list); |
1397 | 1399 |
1398 string16 current_key_path; | 1400 base::string16 current_key_path; |
1399 string16 old_key_path; | 1401 base::string16 old_key_path; |
1400 | 1402 |
1401 GetIELowRightsElevationPolicyKeyPath(CURRENT_ELEVATION_POLICY, | 1403 GetIELowRightsElevationPolicyKeyPath(CURRENT_ELEVATION_POLICY, |
1402 ¤t_key_path); | 1404 ¤t_key_path); |
1403 GetIELowRightsElevationPolicyKeyPath(OLD_ELEVATION_POLICY, &old_key_path); | 1405 GetIELowRightsElevationPolicyKeyPath(OLD_ELEVATION_POLICY, &old_key_path); |
1404 // Do not clobber existing old policies. | 1406 // Do not clobber existing old policies. |
1405 install_list->AddCopyRegKeyWorkItem(installer_state.root_key(), | 1407 install_list->AddCopyRegKeyWorkItem(installer_state.root_key(), |
1406 current_key_path, old_key_path, | 1408 current_key_path, old_key_path, |
1407 WorkItem::IF_NOT_PRESENT); | 1409 WorkItem::IF_NOT_PRESENT); |
1408 } | 1410 } |
1409 | 1411 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1450 VLOG(1) << "Cannot load " << kIEFrameDll; | 1452 VLOG(1) << "Cannot load " << kIEFrameDll; |
1451 } | 1453 } |
1452 } | 1454 } |
1453 | 1455 |
1454 void AddOsUpgradeWorkItems(const InstallerState& installer_state, | 1456 void AddOsUpgradeWorkItems(const InstallerState& installer_state, |
1455 const base::FilePath& setup_path, | 1457 const base::FilePath& setup_path, |
1456 const Version& new_version, | 1458 const Version& new_version, |
1457 const Product& product, | 1459 const Product& product, |
1458 WorkItemList* install_list) { | 1460 WorkItemList* install_list) { |
1459 const HKEY root_key = installer_state.root_key(); | 1461 const HKEY root_key = installer_state.root_key(); |
1460 string16 cmd_key(GetRegCommandKey(product.distribution(), kCmdOnOsUpgrade)); | 1462 base::string16 cmd_key( |
| 1463 GetRegCommandKey(product.distribution(), kCmdOnOsUpgrade)); |
1461 | 1464 |
1462 if (installer_state.operation() == InstallerState::UNINSTALL) { | 1465 if (installer_state.operation() == InstallerState::UNINSTALL) { |
1463 install_list->AddDeleteRegKeyWorkItem(root_key, cmd_key)-> | 1466 install_list->AddDeleteRegKeyWorkItem(root_key, cmd_key)-> |
1464 set_log_message("Removing OS upgrade command"); | 1467 set_log_message("Removing OS upgrade command"); |
1465 } else { | 1468 } else { |
1466 // Register with Google Update to have setup.exe --on-os-upgrade called on | 1469 // Register with Google Update to have setup.exe --on-os-upgrade called on |
1467 // OS upgrade. | 1470 // OS upgrade. |
1468 CommandLine cmd_line(installer_state | 1471 CommandLine cmd_line(installer_state |
1469 .GetInstallerDirectory(new_version) | 1472 .GetInstallerDirectory(new_version) |
1470 .Append(setup_path.BaseName())); | 1473 .Append(setup_path.BaseName())); |
(...skipping 11 matching lines...) Expand all Loading... |
1482 cmd.AddWorkItems(installer_state.root_key(), cmd_key, install_list); | 1485 cmd.AddWorkItems(installer_state.root_key(), cmd_key, install_list); |
1483 } | 1486 } |
1484 } | 1487 } |
1485 | 1488 |
1486 void AddQueryEULAAcceptanceWorkItems(const InstallerState& installer_state, | 1489 void AddQueryEULAAcceptanceWorkItems(const InstallerState& installer_state, |
1487 const base::FilePath& setup_path, | 1490 const base::FilePath& setup_path, |
1488 const Version& new_version, | 1491 const Version& new_version, |
1489 const Product& product, | 1492 const Product& product, |
1490 WorkItemList* work_item_list) { | 1493 WorkItemList* work_item_list) { |
1491 const HKEY root_key = installer_state.root_key(); | 1494 const HKEY root_key = installer_state.root_key(); |
1492 string16 cmd_key(GetRegCommandKey(product.distribution(), | 1495 base::string16 cmd_key( |
1493 kCmdQueryEULAAcceptance)); | 1496 GetRegCommandKey(product.distribution(), kCmdQueryEULAAcceptance)); |
1494 if (installer_state.operation() == InstallerState::UNINSTALL) { | 1497 if (installer_state.operation() == InstallerState::UNINSTALL) { |
1495 work_item_list->AddDeleteRegKeyWorkItem(root_key, cmd_key)-> | 1498 work_item_list->AddDeleteRegKeyWorkItem(root_key, cmd_key)-> |
1496 set_log_message("Removing query EULA acceptance command"); | 1499 set_log_message("Removing query EULA acceptance command"); |
1497 } else { | 1500 } else { |
1498 CommandLine cmd_line(installer_state | 1501 CommandLine cmd_line(installer_state |
1499 .GetInstallerDirectory(new_version) | 1502 .GetInstallerDirectory(new_version) |
1500 .Append(setup_path.BaseName())); | 1503 .Append(setup_path.BaseName())); |
1501 cmd_line.AppendSwitch(switches::kQueryEULAAcceptance); | 1504 cmd_line.AppendSwitch(switches::kQueryEULAAcceptance); |
1502 if (installer_state.system_install()) | 1505 if (installer_state.system_install()) |
1503 cmd_line.AppendSwitch(installer::switches::kSystemLevel); | 1506 cmd_line.AppendSwitch(installer::switches::kSystemLevel); |
1504 if (installer_state.verbose_logging()) | 1507 if (installer_state.verbose_logging()) |
1505 cmd_line.AppendSwitch(installer::switches::kVerboseLogging); | 1508 cmd_line.AppendSwitch(installer::switches::kVerboseLogging); |
1506 AppCommand cmd(cmd_line.GetCommandLineString()); | 1509 AppCommand cmd(cmd_line.GetCommandLineString()); |
1507 cmd.set_is_web_accessible(true); | 1510 cmd.set_is_web_accessible(true); |
1508 cmd.set_is_run_as_user(true); | 1511 cmd.set_is_run_as_user(true); |
1509 cmd.AddWorkItems(installer_state.root_key(), cmd_key, work_item_list); | 1512 cmd.AddWorkItems(installer_state.root_key(), cmd_key, work_item_list); |
1510 } | 1513 } |
1511 } | 1514 } |
1512 | 1515 |
1513 void AddQuickEnableChromeFrameWorkItems(const InstallerState& installer_state, | 1516 void AddQuickEnableChromeFrameWorkItems(const InstallerState& installer_state, |
1514 WorkItemList* work_item_list) { | 1517 WorkItemList* work_item_list) { |
1515 DCHECK(work_item_list); | 1518 DCHECK(work_item_list); |
1516 | 1519 |
1517 string16 cmd_key(GetRegCommandKey( | 1520 base::string16 cmd_key( |
1518 BrowserDistribution::GetSpecificDistribution( | 1521 GetRegCommandKey(BrowserDistribution::GetSpecificDistribution( |
1519 BrowserDistribution::CHROME_BINARIES), | 1522 BrowserDistribution::CHROME_BINARIES), |
1520 kCmdQuickEnableCf)); | 1523 kCmdQuickEnableCf)); |
1521 | 1524 |
1522 // Unconditionally remove the legacy Quick Enable command from the binaries. | 1525 // Unconditionally remove the legacy Quick Enable command from the binaries. |
1523 // Do this even if multi-install Chrome isn't installed to ensure that it is | 1526 // Do this even if multi-install Chrome isn't installed to ensure that it is |
1524 // not left behind in any case. | 1527 // not left behind in any case. |
1525 work_item_list->AddDeleteRegKeyWorkItem( | 1528 work_item_list->AddDeleteRegKeyWorkItem( |
1526 installer_state.root_key(), cmd_key)->set_log_message( | 1529 installer_state.root_key(), cmd_key)->set_log_message( |
1527 "removing " + WideToASCII(kCmdQuickEnableCf) + " command"); | 1530 "removing " + WideToASCII(kCmdQuickEnableCf) + " command"); |
1528 | 1531 |
1529 } | 1532 } |
1530 | 1533 |
1531 } // namespace installer | 1534 } // namespace installer |
OLD | NEW |