Index: chrome/browser/renderer_host/render_widget_host_view_win.cc |
=================================================================== |
--- chrome/browser/renderer_host/render_widget_host_view_win.cc (revision 96873) |
+++ chrome/browser/renderer_host/render_widget_host_view_win.cc (working copy) |
@@ -2,6 +2,14 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+// Need Win 7 headers for WM_GESTURE and ChangeWindowMessageFilterEx |
+// TODO(jschuh): See crbug.com/92941 for longterm fix. |
+#undef WINVER |
+#define WINVER _WIN32_WINNT_WIN7 |
+#undef _WIN32_WINNT |
+#define _WIN32_WINNT _WIN32_WINNT_WIN7 |
+#include <windows.h> |
+ |
#include "chrome/browser/renderer_host/render_widget_host_view_win.h" |
#include <algorithm> |
@@ -209,6 +217,14 @@ |
return ::DefWindowProc(window, message, wparam, lparam); |
} |
+// Must be dynamically loaded to avoid startup failures on Win XP. |
+typedef BOOL (WINAPI *ChangeWindowMessageFilterExFunction)( |
+ HWND hwnd, |
+ UINT message, |
+ DWORD action, |
+ PCHANGEFILTERSTRUCT change_filter_struct); |
+ChangeWindowMessageFilterExFunction g_ChangeWindowMessageFilterEx; |
+ |
} // namespace |
// RenderWidgetHostView -------------------------------------------------------- |
@@ -446,12 +462,30 @@ |
} |
DCHECK(window_class); |
+ HWND orig_parent = ::GetParent(window); |
HWND parent = CreateWindowEx( |
WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR, |
MAKEINTATOM(window_class), 0, |
WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, |
- 0, 0, 0, 0, ::GetParent(window), 0, GetModuleHandle(NULL), 0); |
+ 0, 0, 0, 0, orig_parent, 0, GetModuleHandle(NULL), 0); |
ui::CheckWindowCreated(parent); |
+ // If UIPI is enabled we need to add message filters for parents with |
+ // children that cross process boundaries. |
+ if (::GetPropW(orig_parent, webkit::npapi::kNativeWindowClassFilterProp)) { |
+ // Process-wide message filters required on Vista must be added to: |
+ // chrome_content_client.cc ChromeContentClient::SandboxPlugin |
+ if (!g_ChangeWindowMessageFilterEx) { |
+ g_ChangeWindowMessageFilterEx = |
+ reinterpret_cast<ChangeWindowMessageFilterExFunction>( |
+ ::GetProcAddress(::GetModuleHandle(L"user32.dll"), |
+ "ChangeWindowMessageFilterEx")); |
+ } |
+ // Process-wide message filters required on Vista must be added to: |
+ // chrome_content_client.cc ChromeContentClient::SandboxPlugin |
+ g_ChangeWindowMessageFilterEx(parent, WM_MOUSEWHEEL, MSGFLT_ALLOW, NULL); |
+ g_ChangeWindowMessageFilterEx(parent, WM_GESTURE, MSGFLT_ALLOW, NULL); |
+ ::SetPropW(orig_parent, webkit::npapi::kNativeWindowClassFilterProp, NULL); |
jam
2011/08/26 00:29:12
this needs a matching call to RemoveProp(). per th
|
+ } |
::SetParent(window, parent); |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |