summaryrefslogtreecommitdiffstats
path: root/chrome_frame/chrome_frame_helper_util.cc
diff options
context:
space:
mode:
authorrobertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-04 00:59:39 +0000
committerrobertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-04 00:59:39 +0000
commit35e09b2423478119f1175872ca00a165bf455f17 (patch)
tree5ceb5fd2b46020b83025c86e91f462935c44f742 /chrome_frame/chrome_frame_helper_util.cc
parent8eb475b508d79cf63fde2a81ace45e4ff6b51b27 (diff)
downloadchromium_src-35e09b2423478119f1175872ca00a165bf455f17.zip
chromium_src-35e09b2423478119f1175872ca00a165bf455f17.tar.gz
chromium_src-35e09b2423478119f1175872ca00a165bf455f17.tar.bz2
Add support for IE9 to user-level installations of Chrome Frame.
BUG=70274 TEST=Install user-level Chrome Frame without admin privileges on a system with IE9. Observe CF being loaded in IE. Review URL: http://codereview.chromium.org/6246040 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@73721 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame/chrome_frame_helper_util.cc')
-rw-r--r--chrome_frame/chrome_frame_helper_util.cc107
1 files changed, 103 insertions, 4 deletions
diff --git a/chrome_frame/chrome_frame_helper_util.cc b/chrome_frame/chrome_frame_helper_util.cc
index d246881..87f0efc 100644
--- a/chrome_frame/chrome_frame_helper_util.cc
+++ b/chrome_frame/chrome_frame_helper_util.cc
@@ -64,21 +64,32 @@ HRESULT UtilGetWebBrowserObjectFromWindow(HWND window,
return E_NOINTERFACE;
}
-
bool IsWindowOfClass(HWND window_to_check, const wchar_t* window_class) {
bool window_matches = false;
const int buf_size = MAX_PATH;
wchar_t buffer[buf_size] = {0};
- DWORD dwRetSize = GetClassNameW(window_to_check, buffer, buf_size);
+ DWORD size = GetClassNameW(window_to_check, buffer, buf_size);
// If the window name is any longer than this, it isn't the one we want.
- if (dwRetSize < (buf_size - 1)) {
- if (0 == lstrcmpiW(window_class, buffer)) {
+ if (size < (buf_size - 1)) {
+ if (!lstrcmpiW(window_class, buffer)) {
window_matches = true;
}
}
return window_matches;
}
+bool IsNamedWindow(HWND window, const wchar_t* window_name) {
+ bool window_matches = false;
+ const int buf_size = MAX_PATH;
+ wchar_t buffer[buf_size] = {0};
+ DWORD size = GetWindowText(window, buffer, buf_size);
+ if (size < (buf_size - 1)) {
+ if (!lstrcmpiW(window_name, buffer)) {
+ window_matches = true;
+ }
+ }
+ return window_matches;
+}
bool IsNamedProcess(const wchar_t* process_name) {
wchar_t file_path[2048] = {0};
@@ -86,3 +97,91 @@ bool IsNamedProcess(const wchar_t* process_name) {
wchar_t* file_name = PathFindFileName(file_path);
return (0 == lstrcmpiW(file_name, process_name));
}
+
+namespace {
+struct FindWindowParams {
+ HWND parent_;
+ const wchar_t* class_name_;
+ const wchar_t* window_name_;
+ HWND window_found_;
+ DWORD thread_id_;
+ DWORD process_id_;
+ FindWindowParams(HWND parent,
+ const wchar_t* class_name,
+ const wchar_t* window_name,
+ DWORD thread_id,
+ DWORD process_id)
+ : parent_(parent),
+ class_name_(class_name),
+ window_name_(window_name),
+ window_found_(NULL),
+ thread_id_(thread_id),
+ process_id_(process_id) {
+ }
+};
+
+// Checks a window against a set of parameters defined in params. If the
+// window matches, fills in params->window_found_ with the HWND of the window
+// and returns true. Returns false otherwise.
+bool WindowMatches(HWND window, FindWindowParams* params) {
+ bool found = false;
+ DWORD process_id = 0;
+ DWORD thread_id = GetWindowThreadProcessId(window, &process_id);
+
+ // First check that the PID and TID match if we're interested.
+ if (params->process_id_ == 0 || params->process_id_ == process_id) {
+ if (params->thread_id_ == 0 || params->thread_id_ == thread_id) {
+ // Then check that we match on class and window names, again only if
+ // we're interested.
+ if ((params->class_name_ == NULL ||
+ IsWindowOfClass(window, params->class_name_)) &&
+ (params->window_name_ == NULL) ||
+ IsNamedWindow(window, params->window_name_)) {
+ found = true;
+ params->window_found_ = window;
+ }
+ }
+ }
+ return found;
+}
+
+} // namespace
+
+BOOL CALLBACK WndEnumProc(HWND window, LPARAM lparam) {
+ FindWindowParams* params = reinterpret_cast<FindWindowParams *>(lparam);
+ if (!params) {
+ return FALSE;
+ }
+
+ if (WindowMatches(window, params)) {
+ // We found a match on a top level window. Return false to stop enumerating.
+ return FALSE;
+ } else {
+ // If criteria not satisfied, let us try child windows.
+ HWND child_window = RecurseFindWindow(window,
+ params->class_name_,
+ params->window_name_,
+ params->thread_id_,
+ params->process_id_);
+ if (child_window != NULL) {
+ // We found the window we are looking for.
+ params->window_found_ = child_window;
+ return FALSE;
+ }
+ return TRUE;
+ }
+}
+
+HWND RecurseFindWindow(HWND parent,
+ const wchar_t* class_name,
+ const wchar_t* window_name,
+ DWORD thread_id_to_match,
+ DWORD process_id_to_match) {
+ if ((class_name == NULL) && (window_name == NULL)) {
+ return NULL;
+ }
+ FindWindowParams params(parent, class_name, window_name,
+ thread_id_to_match, process_id_to_match);
+ EnumChildWindows(parent, WndEnumProc, reinterpret_cast<LPARAM>(&params));
+ return params.window_found_;
+}