Index: chrome/installer/setup/chrome_frame_ready_mode.cc |
=================================================================== |
--- chrome/installer/setup/chrome_frame_ready_mode.cc (revision 72487) |
+++ chrome/installer/setup/chrome_frame_ready_mode.cc (working copy) |
@@ -22,8 +22,6 @@ |
#include "chrome/installer/util/installer_state.h" |
#include "chrome/installer/util/master_preferences.h" |
#include "chrome/installer/util/master_preferences_constants.h" |
-#include "chrome/installer/util/package.h" |
-#include "chrome/installer/util/package_properties.h" |
#include "chrome/installer/util/product.h" |
#include "chrome/installer/util/util_constants.h" |
#include "chrome/installer/util/work_item.h" |
@@ -31,76 +29,100 @@ |
namespace installer { |
-InstallStatus ChromeFrameReadyModeOptIn(const InstallerState& installer_state, |
- const CommandLine& cmd_line) { |
+// If Chrome is not multi-installed at the appropriate level, error. |
+// If Chrome Frame is already multi-installed at the appropriate level, noop. |
+// If Chrome Frame is single-installed at the appropriate level, error. |
+// Add uninstall for Chrome Frame. |
+// Update uninstall for Chrome. |
+// Update ChannelInfo for all multi-installed products. |
+// Remove ready-mode. |
+InstallStatus ChromeFrameReadyModeOptIn( |
+ const InstallationState& machine_state, |
+ const InstallerState& installer_state) { |
VLOG(1) << "Opting into Chrome Frame"; |
InstallStatus status = INSTALL_REPAIRED; |
- const MasterPreferences& prefs = MasterPreferences::ForCurrentProcess(); |
- bool system_install = false; |
- prefs.GetBool(master_preferences::kSystemLevel, &system_install); |
- BrowserDistribution* cf = BrowserDistribution::GetSpecificDistribution( |
- BrowserDistribution::CHROME_FRAME, prefs); |
- DCHECK(cf->ShouldCreateUninstallEntry()) |
- << "Opting into CF should create an uninstall entry"; |
- BrowserDistribution* chrome = BrowserDistribution::GetSpecificDistribution( |
- BrowserDistribution::CHROME_BROWSER, prefs); |
+ // Make sure Chrome and Chrome Frame are both multi-installed. |
+ const ProductState* chrome_state = |
+ machine_state.GetProductState(installer_state.system_install(), |
+ BrowserDistribution::CHROME_BROWSER); |
+ const ProductState* cf_state = |
+ machine_state.GetProductState(installer_state.system_install(), |
+ BrowserDistribution::CHROME_FRAME); |
+ if (chrome_state == NULL) { |
+ LOG(ERROR) << "Chrome Frame opt-in requires multi-install of Chrome."; |
+ return CHROME_NOT_INSTALLED; |
+ } |
+ if (!chrome_state->is_multi_install()) { |
+ LOG(ERROR) << "Chrome Frame opt-in requires multi-install of Chrome."; |
+ return NON_MULTI_INSTALLATION_EXISTS; |
+ } |
+ if (cf_state == NULL) { |
+ LOG(ERROR) << "Chrome Frame opt-in requires multi-install of Chrome Frame."; |
+ return CHROME_NOT_INSTALLED; |
+ } |
+ if (!cf_state->is_multi_install()) { |
+ LOG(ERROR) << "Chrome Frame opt-in requires multi-install of Chrome Frame."; |
+ return NON_MULTI_INSTALLATION_EXISTS; |
+ } |
- ActivePackageProperties package_properties; |
+ // Create a new InstallerState to be used for this operation. |
+ InstallerState opt_in_state(installer_state.level()); |
- // Remove ChromeFrameReadyMode, update Chrome's uninstallation commands to |
- // only uninstall Chrome, and add an entry to the Add/Remove Programs |
- // dialog for GCF. |
+ // Add the two products we're going to operate on. |
+ const Product* chrome = |
+ opt_in_state.AddProductFromState(BrowserDistribution::CHROME_BROWSER, |
+ *chrome_state); |
+ Product* cf = |
+ opt_in_state.AddProductFromState(BrowserDistribution::CHROME_FRAME, |
+ *cf_state); |
+ // DCHECKs will fire in this case if it ever happens (it won't). |
+ if (chrome == NULL || cf == NULL) |
+ return READY_MODE_OPT_IN_FAILED; |
- FilePath path(GetChromeFrameInstallPath(true, system_install, cf)); |
- if (path.empty()) { |
- LOG(ERROR) << "Conflicting installations"; |
- status = NON_MULTI_INSTALLATION_EXISTS; |
- } else { |
- InstallationState original_state; |
- original_state.Initialize(prefs); |
+ // Turn off ready-mode on Chrome Frame, thereby making it fully installed. |
+ if (!cf->SetOption(kOptionReadyMode, false)) { |
+ LOG(WARNING) |
+ << "Chrome Frame is already fully installed; opting-in nonetheless."; |
+ } |
- scoped_refptr<Package> package(new Package(prefs.is_multi_install(), |
- system_install, path, &package_properties)); |
- scoped_refptr<Product> cf_product(new Product(cf, package)); |
- DCHECK(cf_product->ShouldCreateUninstallEntry() || cf_product->IsMsi()); |
- scoped_refptr<Product> chrome_product(new Product(chrome, package)); |
- const ProductState* product_state = |
- original_state.GetProductState(system_install, cf->GetType()); |
- if (product_state == NULL) { |
- LOG(ERROR) << "No Chrome Frame installation found for opt-in."; |
- return CHROME_NOT_INSTALLED; |
- } |
- scoped_ptr<WorkItemList> item_list(WorkItem::CreateWorkItemList()); |
+ // Update Chrome's uninstallation commands to only uninstall Chrome, and add |
+ // an entry to the Add/Remove Programs dialog for GCF. |
+ DCHECK(cf->ShouldCreateUninstallEntry() || opt_in_state.is_msi()); |
- // This creates the uninstallation entry for GCF. |
- AddUninstallShortcutWorkItems(cmd_line.GetProgram(), |
- product_state->version(), item_list.get(), *cf_product.get()); |
- // This updates the Chrome uninstallation entries. |
- AddUninstallShortcutWorkItems(cmd_line.GetProgram(), |
- product_state->version(), item_list.get(), *chrome_product.get()); |
+ scoped_ptr<WorkItemList> item_list(WorkItem::CreateWorkItemList()); |
- // Add a work item to delete the ChromeFrameReadyMode registry value. |
- HKEY root = system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
- item_list->AddDeleteRegValueWorkItem(root, package_properties.GetStateKey(), |
- kChromeFrameReadyModeField); |
+ // This creates the uninstallation entry for GCF. |
+ AddUninstallShortcutWorkItems(opt_in_state, cf_state->GetSetupPath(), |
+ cf_state->version(), item_list.get(), *cf); |
+ // This updates the Chrome uninstallation entries. |
+ AddUninstallShortcutWorkItems(opt_in_state, chrome_state->GetSetupPath(), |
+ chrome_state->version(), item_list.get(), *chrome); |
- // Delete the command elevation registry keys |
- std::wstring version_key(cf->GetVersionKey()); |
- item_list->AddDeleteRegValueWorkItem( |
- root, version_key, google_update::kRegCFTempOptOutCmdField); |
- item_list->AddDeleteRegValueWorkItem( |
- root, version_key, google_update::kRegCFEndTempOptOutCmdField); |
- item_list->AddDeleteRegValueWorkItem(root, version_key, |
- google_update::kRegCFOptOutCmdField); |
- item_list->AddDeleteRegValueWorkItem(root, version_key, |
- google_update::kRegCFOptInCmdField); |
+ // Add a work item to delete the ChromeFrameReadyMode registry value. |
+ HKEY root = opt_in_state.root_key(); |
+ item_list->AddDeleteRegValueWorkItem(root, |
+ opt_in_state.multi_package_binaries_distribution()->GetStateKey(), |
+ kChromeFrameReadyModeField); |
- if (!item_list->Do()) { |
- LOG(ERROR) << "Failed to opt into GCF"; |
- item_list->Rollback(); |
- status = READY_MODE_OPT_IN_FAILED; |
- } |
+ // Update the Google Update channel ("ap") value. |
+ AddGoogleUpdateWorkItems(opt_in_state, item_list.get()); |
+ |
+ // Delete the command elevation registry keys |
+ std::wstring version_key(cf->distribution()->GetVersionKey()); |
+ item_list->AddDeleteRegValueWorkItem( |
+ root, version_key, google_update::kRegCFTempOptOutCmdField); |
+ item_list->AddDeleteRegValueWorkItem( |
+ root, version_key, google_update::kRegCFEndTempOptOutCmdField); |
+ item_list->AddDeleteRegValueWorkItem(root, version_key, |
+ google_update::kRegCFOptOutCmdField); |
+ item_list->AddDeleteRegValueWorkItem(root, version_key, |
+ google_update::kRegCFOptInCmdField); |
+ |
+ if (!item_list->Do()) { |
+ LOG(ERROR) << "Failed to opt into GCF"; |
+ item_list->Rollback(); |
+ status = READY_MODE_OPT_IN_FAILED; |
} |
return status; |
@@ -111,100 +133,104 @@ |
L"User Agent\\Post Platform"; |
const wchar_t kChromeFramePrefix[] = L"chromeframe/"; |
-InstallStatus ChromeFrameReadyModeTempOptOut(const CommandLine& cmd_line) { |
+InstallStatus ChromeFrameReadyModeTempOptOut( |
+ const InstallationState& machine_state, |
+ const InstallerState& installer_state) { |
VLOG(1) << "Temporarily opting out of Chrome Frame"; |
InstallStatus status = INSTALL_REPAIRED; |
- const MasterPreferences& prefs = MasterPreferences::ForCurrentProcess(); |
- bool system_install = false; |
- prefs.GetBool(master_preferences::kSystemLevel, &system_install); |
- BrowserDistribution* cf = BrowserDistribution::GetSpecificDistribution( |
- BrowserDistribution::CHROME_FRAME, prefs); |
+ // Make sure Chrome Frame is multi-installed. |
+ const ProductState* cf_state = |
+ machine_state.GetProductState(installer_state.system_install(), |
+ BrowserDistribution::CHROME_FRAME); |
+ if (cf_state == NULL) { |
+ LOG(ERROR) |
+ << "Chrome Frame temp opt-out requires multi-install of Chrome Frame."; |
+ return CHROME_NOT_INSTALLED; |
+ } |
+ if (!cf_state->is_multi_install()) { |
+ LOG(ERROR) |
+ << "Chrome Frame temp opt-out requires multi-install of Chrome Frame."; |
+ return NON_MULTI_INSTALLATION_EXISTS; |
+ } |
- installer::ActivePackageProperties package_properties; |
+ scoped_ptr<WorkItemList> item_list(WorkItem::CreateWorkItemList()); |
- // Remove the ChromeFrame user agent string from the registry, modify the |
- // ReadyMode state flag. |
- FilePath path(GetChromeFrameInstallPath(true, system_install, cf)); |
- if (path.empty()) { |
- LOG(ERROR) << "Conflicting installations"; |
- status = NON_MULTI_INSTALLATION_EXISTS; |
- } else { |
- scoped_ptr<WorkItemList> item_list(WorkItem::CreateWorkItemList()); |
+ HKEY root = installer_state.root_key(); |
- HKEY root = system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
- |
- // Add a work item to delete the ChromeFrame user agent registry value. |
- base::win::RegistryValueIterator values(root, kPostPlatformUAKey); |
- while (values.Valid()) { |
- const wchar_t* name = values.Name(); |
- if (StartsWith(name, kChromeFramePrefix, true)) { |
- item_list->AddDeleteRegValueWorkItem(root, kPostPlatformUAKey, name); |
- } |
- ++values; |
+ // Add a work item to delete the ChromeFrame user agent registry value. |
+ base::win::RegistryValueIterator values(root, kPostPlatformUAKey); |
+ while (values.Valid()) { |
+ const wchar_t* name = values.Name(); |
+ if (StartsWith(name, kChromeFramePrefix, true)) { |
+ item_list->AddDeleteRegValueWorkItem(root, kPostPlatformUAKey, name); |
} |
+ ++values; |
+ } |
- // Add a work item to update the Ready Mode state flag |
- int64 timestamp = base::Time::Now().ToInternalValue(); |
- item_list->AddSetRegValueWorkItem(root, package_properties.GetStateKey(), |
- kChromeFrameReadyModeField, timestamp, |
- true); |
+ // Add a work item to update the Ready Mode state flag |
+ int64 timestamp = base::Time::Now().ToInternalValue(); |
+ BrowserDistribution* dist = BrowserDistribution::GetSpecificDistribution( |
+ BrowserDistribution::CHROME_BINARIES); |
+ item_list->AddSetRegValueWorkItem(root, dist->GetStateKey(), |
+ kChromeFrameReadyModeField, timestamp, |
+ true); |
- if (!item_list->Do()) { |
- LOG(ERROR) << "Failed to temporarily opt out of GCF"; |
- item_list->Rollback(); |
- status = READY_MODE_TEMP_OPT_OUT_FAILED; |
- } |
+ if (!item_list->Do()) { |
+ LOG(ERROR) << "Failed to temporarily opt out of GCF"; |
+ item_list->Rollback(); |
+ status = READY_MODE_TEMP_OPT_OUT_FAILED; |
} |
return status; |
} |
-InstallStatus ChromeFrameReadyModeEndTempOptOut(const CommandLine& cmd_line) { |
+InstallStatus ChromeFrameReadyModeEndTempOptOut( |
+ const InstallationState& machine_state, |
+ const InstallerState& installer_state) { |
VLOG(1) << "Ending temporary opt-out of Chrome Frame"; |
InstallStatus status = INSTALL_REPAIRED; |
- const MasterPreferences& prefs = MasterPreferences::ForCurrentProcess(); |
- bool system_install = false; |
- prefs.GetBool(master_preferences::kSystemLevel, &system_install); |
- BrowserDistribution* cf = BrowserDistribution::GetSpecificDistribution( |
- BrowserDistribution::CHROME_FRAME, prefs); |
+ // Make sure Chrome Frame is multi-installed. |
+ const ProductState* cf_state = |
+ machine_state.GetProductState(installer_state.system_install(), |
+ BrowserDistribution::CHROME_FRAME); |
+ if (cf_state == NULL) { |
+ LOG(ERROR) |
+ << "Chrome Frame temp opt-out requires multi-install of Chrome Frame."; |
+ return CHROME_NOT_INSTALLED; |
+ } |
+ if (!cf_state->is_multi_install()) { |
+ LOG(ERROR) |
+ << "Chrome Frame temp opt-out requires multi-install of Chrome Frame."; |
+ return NON_MULTI_INSTALLATION_EXISTS; |
+ } |
- installer::ActivePackageProperties package_properties; |
- |
// Replace the ChromeFrame user agent string in the registry, modify the |
// ReadyMode state flag. |
- FilePath path(GetChromeFrameInstallPath(true, system_install, cf)); |
- scoped_ptr<Version> installed_version( |
- InstallUtil::GetChromeVersion(cf, system_install)); |
+ const Version& installed_version = cf_state->version(); |
- if (path.empty()) { |
- LOG(ERROR) << "Conflicting installations"; |
- status = NON_MULTI_INSTALLATION_EXISTS; |
- } else if (installed_version == NULL) { |
- LOG(ERROR) << "Failed to query installed version of Chrome Frame"; |
- status = READY_MODE_END_TEMP_OPT_OUT_FAILED; |
- } else { |
- scoped_ptr<WorkItemList> item_list(WorkItem::CreateWorkItemList()); |
+ scoped_ptr<WorkItemList> item_list(WorkItem::CreateWorkItemList()); |
- HKEY root = system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
+ HKEY root = installer_state.root_key(); |
- std::wstring chrome_frame_ua_value_name = kChromeFramePrefix; |
- chrome_frame_ua_value_name += ASCIIToWide(installed_version->GetString()); |
+ std::wstring chrome_frame_ua_value_name(kChromeFramePrefix); |
+ chrome_frame_ua_value_name += ASCIIToWide(installed_version.GetString()); |
- // Store the Chrome Frame user agent string |
- item_list->AddSetRegValueWorkItem(root, kPostPlatformUAKey, |
- chrome_frame_ua_value_name, L"", true); |
- // Add a work item to update the Ready Mode state flag |
- item_list->AddSetRegValueWorkItem(root, package_properties.GetStateKey(), |
- kChromeFrameReadyModeField, |
- static_cast<int64>(1), true); |
+ // Store the Chrome Frame user agent string |
+ item_list->AddSetRegValueWorkItem(root, kPostPlatformUAKey, |
+ chrome_frame_ua_value_name, L"", true); |
+ // Add a work item to update the Ready Mode state flag |
+ BrowserDistribution* dist = BrowserDistribution::GetSpecificDistribution( |
+ BrowserDistribution::CHROME_BINARIES); |
+ item_list->AddSetRegValueWorkItem(root, dist->GetStateKey(), |
+ kChromeFrameReadyModeField, |
+ static_cast<int64>(1), true); |
- if (!item_list->Do()) { |
- LOG(ERROR) << "Failed to end temporary opt out of GCF"; |
- item_list->Rollback(); |
- status = READY_MODE_END_TEMP_OPT_OUT_FAILED; |
- } |
+ if (!item_list->Do()) { |
+ LOG(ERROR) << "Failed to end temporary opt out of GCF"; |
+ item_list->Rollback(); |
+ status = READY_MODE_END_TEMP_OPT_OUT_FAILED; |
} |
return status; |