diff options
author | robertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-04 00:59:39 +0000 |
---|---|---|
committer | robertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-04 00:59:39 +0000 |
commit | 35e09b2423478119f1175872ca00a165bf455f17 (patch) | |
tree | 5ceb5fd2b46020b83025c86e91f462935c44f742 /chrome_frame/chrome_frame_helper_util.cc | |
parent | 8eb475b508d79cf63fde2a81ace45e4ff6b51b27 (diff) | |
download | chromium_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.cc | 107 |
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>(¶ms)); + return params.window_found_; +} |