summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgrt@chromium.org <grt@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-13 15:12:27 +0000
committergrt@chromium.org <grt@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-13 15:12:27 +0000
commitf31da96954da4b76a90c543c7bc61167005599aa (patch)
treefedaa8153c42c4b6c2a61590540bbf3b7a9e329d
parent501f4e85ffa8304d1f5f81a300c45eebedf83480 (diff)
downloadchromium_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.cc111
-rw-r--r--chrome/installer/setup/install_worker.h12
-rw-r--r--chrome/installer/setup/uninstall.cc18
-rw-r--r--chrome/installer/util/util_constants.cc23
-rw-r--r--chrome/installer/util/util_constants.h10
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_