Index: chrome/browser/google_update.cc |
=================================================================== |
--- chrome/browser/google_update.cc (revision 12286) |
+++ chrome/browser/google_update.cc (working copy) |
@@ -18,8 +18,11 @@ |
#include "chrome/installer/util/google_update_constants.h" |
#include "chrome/installer/util/helper.h" |
#include "chrome/installer/util/install_util.h" |
+#include "chrome/views/window/window.h" |
#include "google_update_idl_i.c" |
+using views::Window; |
+ |
namespace { |
// Check if the currently running instance can be updated by Google Update. |
// Returns true only if the instance running is a Google Chrome |
@@ -49,8 +52,11 @@ |
// Creates an instance of a COM Local Server class using either plain vanilla |
// CoCreateInstance, or using the Elevation moniker if running on Vista. |
+// hwnd must refer to a foregound window in order to get the UAC prompt |
+// showing up in the foreground if running on Vista. It can also be NULL if |
+// background UAC prompts are desired. |
HRESULT CoCreateInstanceAsAdmin(REFCLSID class_id, REFIID interface_id, |
- void** interface_ptr) { |
+ HWND hwnd, void** interface_ptr) { |
if (!interface_ptr) |
return E_POINTER; |
@@ -62,13 +68,14 @@ |
arraysize(class_id_as_string)); |
std::wstring elevation_moniker_name = |
- StringPrintf(L"Elevation:Administrator!new:%s", class_id_as_string); |
+ StringPrintf(L"Elevation:Administrator!new:%ls", class_id_as_string); |
BIND_OPTS3 bind_opts; |
memset(&bind_opts, 0, sizeof(bind_opts)); |
- |
bind_opts.cbStruct = sizeof(bind_opts); |
bind_opts.dwClassContext = CLSCTX_LOCAL_SERVER; |
+ bind_opts.hwnd = hwnd; |
+ |
return CoGetObject(elevation_moniker_name.c_str(), &bind_opts, |
interface_id, reinterpret_cast<void**>(interface_ptr)); |
} |
@@ -201,13 +208,13 @@ |
//////////////////////////////////////////////////////////////////////////////// |
// GoogleUpdate, views::DialogDelegate implementation: |
-void GoogleUpdate::CheckForUpdate(bool install_if_newer) { |
+void GoogleUpdate::CheckForUpdate(bool install_if_newer, Window* window) { |
// We need to shunt this request over to InitiateGoogleUpdateCheck and have |
// it run in the file thread. |
MessageLoop* file_loop = g_browser_process->file_thread()->message_loop(); |
file_loop->PostTask(FROM_HERE, NewRunnableMethod(this, |
&GoogleUpdate::InitiateGoogleUpdateCheck, |
- install_if_newer, MessageLoop::current())); |
+ install_if_newer, window, MessageLoop::current())); |
} |
// Adds/removes a listener. Only one listener is maintained at the moment. |
@@ -225,6 +232,7 @@ |
// GoogleUpdate, private: |
bool GoogleUpdate::InitiateGoogleUpdateCheck(bool install_if_newer, |
+ Window* window, |
MessageLoop* main_loop) { |
std::wstring chrome_exe_path; |
@@ -264,8 +272,13 @@ |
if (!install_if_newer) { |
hr = on_demand.CoCreateInstance(CLSID_OnDemandMachineAppsClass); |
} else { |
+ HWND foreground_hwnd = NULL; |
+ if (window != NULL) { |
+ foreground_hwnd = window->GetNativeWindow(); |
+ } |
+ |
hr = CoCreateInstanceAsAdmin(CLSID_OnDemandMachineAppsClass, |
- IID_IGoogleUpdate, |
+ IID_IGoogleUpdate, foreground_hwnd, |
reinterpret_cast<void**>(&on_demand)); |
} |
} |