diff options
author | grt@chromium.org <grt@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-13 15:12:27 +0000 |
---|---|---|
committer | grt@chromium.org <grt@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-13 15:12:27 +0000 |
commit | f31da96954da4b76a90c543c7bc61167005599aa (patch) | |
tree | fedaa8153c42c4b6c2a61590540bbf3b7a9e329d | |
parent | 501f4e85ffa8304d1f5f81a300c45eebedf83480 (diff) | |
download | chromium_src-f31da96954da4b76a90c543c7bc61167005599aa.zip chromium_src-f31da96954da4b76a90c543c7bc61167005599aa.tar.gz chromium_src-f31da96954da4b76a90c543c7bc61167005599aa.tar.bz2 |
Register the delegate execute class, interface, and typelib during install, and yank at uninstall.
BUG=119242
TEST=none
Review URL: https://chromiumcodereview.appspot.com/10084008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@132190 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/installer/setup/install_worker.cc | 111 | ||||
-rw-r--r-- | chrome/installer/setup/install_worker.h | 12 | ||||
-rw-r--r-- | chrome/installer/setup/uninstall.cc | 18 | ||||
-rw-r--r-- | chrome/installer/util/util_constants.cc | 23 | ||||
-rw-r--r-- | chrome/installer/util/util_constants.h | 10 |
5 files changed, 167 insertions, 7 deletions
diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc index a7f3321..ce8a456 100644 --- a/chrome/installer/setup/install_worker.cc +++ b/chrome/installer/setup/install_worker.cc @@ -7,6 +7,7 @@ #include "chrome/installer/setup/install_worker.h" +#include <oaidl.h> #include <shlobj.h> #include <time.h> #include <vector> @@ -291,6 +292,9 @@ void AddProductSpecificWorkItems(const InstallationState& original_state, if (p.is_chrome_frame()) { AddChromeFrameWorkItems(original_state, installer_state, setup_path, new_version, p, list); + } else if (p.is_chrome()) { + AddChromeWorkItems(original_state, installer_state, setup_path, + new_version, p, list); } } } @@ -1026,6 +1030,113 @@ void AddChromeFrameWorkItems(const InstallationState& original_state, } } +void AddChromeWorkItems(const InstallationState& original_state, + const InstallerState& installer_state, + const FilePath& setup_path, + const Version& new_version, + const Product& product, + WorkItemList* list) { + // For the moment, this function adds work items to perform COM registration + // specific to the Windows 8 delegate. If more work needs to be done in the + // future, pull this into its own function called by AddChromeWorkItems. + DCHECK(product.is_chrome()); + HKEY root = installer_state.root_key(); + const bool is_install = + (installer_state.operation() != InstallerState::UNINSTALL); + string16 delegate_execute_path(L"Software\\Classes\\CLSID\\"); + delegate_execute_path.append(kCommandExecuteImplUuid); + string16 typelib_path(L"Software\\Classes\\TypeLib\\"); + typelib_path.append(kDelegateExecuteLibUuid); + string16 interface_path(L"Software\\Classes\\Interface\\"); + interface_path.append(kICommandExecuteImplUuid); + + if (is_install) { + // The path to the exe (in the version directory). + FilePath delegate_execute( + installer_state.target_path().AppendASCII(new_version.GetString())); + delegate_execute = delegate_execute.Append(kDelegateExecuteExe); + + // Command-line featuring the quoted path to the exe. + string16 command(1, L'"'); + command.append(delegate_execute.value()).append(1, L'"'); + + // Register the CommandExecuteImpl class at + // Software\Classes\CLSID\{5C65F4B0-3651-4514-B207-D10CB699B14B} + list->AddCreateRegKeyWorkItem(root, delegate_execute_path); + list->AddSetRegValueWorkItem(root, delegate_execute_path, L"", + L"CommandExecuteImpl Class", true); + string16 subkey(delegate_execute_path); + subkey.append(L"\\LocalServer32"); + list->AddCreateRegKeyWorkItem(root, subkey); + list->AddSetRegValueWorkItem(root, subkey, L"", command, true); + list->AddSetRegValueWorkItem(root, subkey, L"ServerExecutable", + delegate_execute.value(), true); + + subkey.assign(delegate_execute_path).append(L"\\Programmable"); + list->AddCreateRegKeyWorkItem(root, subkey); + + subkey.assign(delegate_execute_path).append(L"\\TypeLib"); + list->AddCreateRegKeyWorkItem(root, subkey); + list->AddSetRegValueWorkItem(root, subkey, L"", kDelegateExecuteLibUuid, + true); + + subkey.assign(delegate_execute_path).append(L"\\Version"); + list->AddCreateRegKeyWorkItem(root, subkey); + list->AddSetRegValueWorkItem(root, subkey, L"", kDelegateExecuteLibVersion, + true); + + // Register the DelegateExecuteLib type library at + // Software\Classes\TypeLib\{4E805ED8-EBA0-4601-9681-12815A56EBFD} + list->AddCreateRegKeyWorkItem(root, typelib_path); + + string16 version_key(typelib_path); + version_key.append(1, L'\\').append(kDelegateExecuteLibVersion); + list->AddCreateRegKeyWorkItem(root, version_key); + list->AddSetRegValueWorkItem(root, version_key, L"", kDelegateExecuteLib, + true); + + subkey.assign(version_key).append(L"\\FLAGS"); + const DWORD flags = LIBFLAG_FRESTRICTED | LIBFLAG_FCONTROL; + list->AddCreateRegKeyWorkItem(root, subkey); + list->AddSetRegValueWorkItem(root, subkey, L"", flags, true); + + subkey.assign(version_key).append(L"\\0"); + list->AddCreateRegKeyWorkItem(root, subkey); + + subkey.append(L"\\win32"); + list->AddCreateRegKeyWorkItem(root, subkey); + list->AddSetRegValueWorkItem(root, subkey, L"", delegate_execute.value(), + true); + + subkey.assign(version_key).append(L"\\HELPDIR"); + list->AddCreateRegKeyWorkItem(root, subkey); + list->AddSetRegValueWorkItem(root, subkey, L"", + delegate_execute.DirName().value(), true); + + // Register to ICommandExecuteImpl interface at + // Software\Classes\Interface\{0BA0D4E9-2259-4963-B9AE-A839F7CB7544} + list->AddCreateRegKeyWorkItem(root, interface_path); + list->AddSetRegValueWorkItem(root, interface_path, L"", + kICommandExecuteImpl, true); + + subkey.assign(interface_path).append(L"\\ProxyStubClsid32"); + list->AddCreateRegKeyWorkItem(root, subkey); + list->AddSetRegValueWorkItem(root, subkey, L"", kPSOAInterfaceUuid, true); + + subkey.assign(interface_path).append(L"\\TypeLib"); + list->AddCreateRegKeyWorkItem(root, subkey); + list->AddSetRegValueWorkItem(root, subkey, L"", kDelegateExecuteLibUuid, + true); + list->AddSetRegValueWorkItem(root, subkey, L"Version", + kDelegateExecuteLibVersion, true); + + } else { + list->AddDeleteRegKeyWorkItem(root, delegate_execute_path); + list->AddDeleteRegKeyWorkItem(root, typelib_path); + list->AddDeleteRegKeyWorkItem(root, interface_path); + } +} + namespace { enum ElevationPolicyId { diff --git a/chrome/installer/setup/install_worker.h b/chrome/installer/setup/install_worker.h index a415003..d486c61 100644 --- a/chrome/installer/setup/install_worker.h +++ b/chrome/installer/setup/install_worker.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // @@ -122,6 +122,16 @@ void AddChromeFrameWorkItems(const InstallationState& original_state, const Product& product, WorkItemList* list); +// Called for either installation or uninstallation. This method updates the +// registry according to Chrome specific options for the current installation. +// This includes handling of the delegate execute server. +void AddChromeWorkItems(const InstallationState& original_state, + const InstallerState& installer_state, + const FilePath& setup_path, + const Version& new_version, + const Product& product, + WorkItemList* list); + // This method adds work items to create (or update) Chrome uninstall entry in // either the Control Panel->Add/Remove Programs list or in the Omaha client // state key if running under an MSI installer. diff --git a/chrome/installer/setup/uninstall.cc b/chrome/installer/setup/uninstall.cc index 83953e4..599c580 100644 --- a/chrome/installer/setup/uninstall.cc +++ b/chrome/installer/setup/uninstall.cc @@ -689,6 +689,19 @@ const wchar_t kChromeExtProgId[] = L"ChromiumExt"; } } +bool ProcessChromeWorkItems(const InstallationState& original_state, + const InstallerState& installer_state, + const FilePath& setup_path, + const Product& product) { + if (product.is_chrome()) + return false; + + scoped_ptr<WorkItemList> item_list(WorkItem::CreateWorkItemList()); + AddChromeWorkItems(original_state, installer_state, setup_path, Version(), + product, item_list.get()); + return item_list->Do(); +} + bool ProcessChromeFrameWorkItems(const InstallationState& original_state, const InstallerState& installer_state, const FilePath& setup_path, @@ -806,7 +819,10 @@ InstallStatus UninstallProduct(const InstallationState& original_state, suffix, installer_state.target_path(), &ret); } - if (!is_chrome) { + if (is_chrome) { + ProcessChromeWorkItems(original_state, installer_state, setup_path, + product); + } else { ProcessChromeFrameWorkItems(original_state, installer_state, setup_path, product); } diff --git a/chrome/installer/util/util_constants.cc b/chrome/installer/util/util_constants.cc index 432d675..c97ac69 100644 --- a/chrome/installer/util/util_constants.cc +++ b/chrome/installer/util/util_constants.cc @@ -171,6 +171,7 @@ const wchar_t kChromeLauncherExe[] = L"chrome_launcher.exe"; const wchar_t kChromeNewExe[] = L"new_chrome.exe"; const wchar_t kChromeOldExe[] = L"old_chrome.exe"; const wchar_t kCmdQuickEnableCf[] = L"quick-enable-cf"; +const wchar_t kDelegateExecuteExe[] = L"delegate_execute.exe"; const wchar_t kGoogleChromeInstallSubDir1[] = L"Google"; const wchar_t kGoogleChromeInstallSubDir2[] = L"Chrome"; const wchar_t kInstallBinaryDir[] = L"Application"; @@ -201,10 +202,22 @@ const wchar_t kOptionMultiInstall[] = L"multi-install"; const wchar_t kOptionReadyMode[] = L"ready-mode"; // Chrome channel display names. -extern const wchar_t kChromeChannelUnknown[] = L"unknown"; -extern const wchar_t kChromeChannelCanary[] = L"canary"; -extern const wchar_t kChromeChannelDev[] = L"dev"; -extern const wchar_t kChromeChannelBeta[] = L"beta"; -extern const wchar_t kChromeChannelStable[] = L""; +const wchar_t kChromeChannelUnknown[] = L"unknown"; +const wchar_t kChromeChannelCanary[] = L"canary"; +const wchar_t kChromeChannelDev[] = L"dev"; +const wchar_t kChromeChannelBeta[] = L"beta"; +const wchar_t kChromeChannelStable[] = L""; + +// See delegate_execute.idl. +const wchar_t kCommandExecuteImplUuid[] = + L"{5C65F4B0-3651-4514-B207-D10CB699B14B}"; +const wchar_t kDelegateExecuteLib[] = L"DelegateExecuteLib"; +const wchar_t kDelegateExecuteLibUuid[] = + L"{4E805ED8-EBA0-4601-9681-12815A56EBFD}"; +const wchar_t kDelegateExecuteLibVersion[] = L"1.0"; +const wchar_t kICommandExecuteImpl[] = L"ICommandExecuteImpl"; +const wchar_t kICommandExecuteImplUuid[] = + L"{0BA0D4E9-2259-4963-B9AE-A839F7CB7544}"; +const wchar_t kPSOAInterfaceUuid[] = L"{00020424-0000-0000-C000-000000000046}"; } // namespace installer diff --git a/chrome/installer/util/util_constants.h b/chrome/installer/util/util_constants.h index 39e7d4d..d2b4bb2 100644 --- a/chrome/installer/util/util_constants.h +++ b/chrome/installer/util/util_constants.h @@ -176,6 +176,7 @@ extern const wchar_t kChromeLauncherExe[]; extern const wchar_t kChromeOldExe[]; extern const wchar_t kChromeNewExe[]; extern const wchar_t kCmdQuickEnableCf[]; +extern const wchar_t kDelegateExecuteExe[]; extern const wchar_t kGoogleChromeInstallSubDir1[]; extern const wchar_t kGoogleChromeInstallSubDir2[]; extern const wchar_t kInstallBinaryDir[]; @@ -215,6 +216,15 @@ extern const wchar_t kChromeChannelDev[]; extern const wchar_t kChromeChannelBeta[]; extern const wchar_t kChromeChannelStable[]; +// Delegate Execute registration values. +extern const wchar_t kCommandExecuteImplUuid[]; +extern const wchar_t kDelegateExecuteLib[]; +extern const wchar_t kDelegateExecuteLibUuid[]; +extern const wchar_t kDelegateExecuteLibVersion[]; +extern const wchar_t kICommandExecuteImpl[]; +extern const wchar_t kICommandExecuteImplUuid[]; +extern const wchar_t kPSOAInterfaceUuid[]; + } // namespace installer #endif // CHROME_INSTALLER_UTIL_UTIL_CONSTANTS_H_ |