| Index: content/browser/renderer_host/legacy_render_widget_host_win.cc
|
| ===================================================================
|
| --- content/browser/renderer_host/legacy_render_widget_host_win.cc (revision 250790)
|
| +++ content/browser/renderer_host/legacy_render_widget_host_win.cc (working copy)
|
| @@ -7,6 +7,7 @@
|
| #include "base/command_line.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/win/windows_version.h"
|
| +#include "base/win/win_util.h"
|
| #include "content/browser/accessibility/browser_accessibility_manager_win.h"
|
| #include "content/browser/accessibility/browser_accessibility_win.h"
|
| #include "content/public/common/content_switches.h"
|
| @@ -22,15 +23,17 @@
|
| // static
|
| scoped_ptr<LegacyRenderWidgetHostHWND> LegacyRenderWidgetHostHWND::Create(
|
| HWND parent) {
|
| + if (CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kDisableLegacyIntermediateWindow))
|
| + return scoped_ptr<LegacyRenderWidgetHostHWND>();
|
| +
|
| scoped_ptr<LegacyRenderWidgetHostHWND> legacy_window_instance;
|
| legacy_window_instance.reset(new LegacyRenderWidgetHostHWND(parent));
|
| // If we failed to create the child, or if the switch to disable the legacy
|
| // window is passed in, then return NULL.
|
| - if (!::IsWindow(legacy_window_instance->hwnd()) ||
|
| - CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kDisableLegacyIntermediateWindow))
|
| + if (!::IsWindow(legacy_window_instance->hwnd()))
|
| return scoped_ptr<LegacyRenderWidgetHostHWND>();
|
| -
|
| +
|
| legacy_window_instance->Init();
|
| return legacy_window_instance.Pass();
|
| }
|
| @@ -74,7 +77,8 @@
|
| }
|
|
|
| LegacyRenderWidgetHostHWND::LegacyRenderWidgetHostHWND(HWND parent)
|
| - : manager_(NULL) {
|
| + : manager_(NULL),
|
| + mouse_tracking_enabled_(false) {
|
| RECT rect = {0};
|
| Base::Create(parent, rect, L"Chrome Legacy Window",
|
| WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
|
| @@ -130,14 +134,52 @@
|
| WPARAM w_param,
|
| LPARAM l_param,
|
| BOOL& handled) {
|
| - POINT mouse_coords;
|
| - mouse_coords.x = GET_X_LPARAM(l_param);
|
| - mouse_coords.y = GET_Y_LPARAM(l_param);
|
| - ::MapWindowPoints(hwnd(), GetParent(), &mouse_coords, 1);
|
| - return ::SendMessage(GetParent(), message, w_param,
|
| - MAKELPARAM(mouse_coords.x, mouse_coords.y));
|
| + // Mark the WM_MOUSEMOVE message with a special flag in the high word of
|
| + // the WPARAM.
|
| + // The parent window has code to track mouse events, i.e to detect if the
|
| + // cursor left the bounds of the parent window. Technically entering a child
|
| + // window indicates that the cursor left the parent window.
|
| + // To ensure that the parent does not turn on tracking for the WM_MOUSEMOVE
|
| + // messages sent from us, we flag this in the WPARAM and track the mouse for
|
| + // our window to send the WM_MOUSELEAVE if needed to the parent.
|
| + if (message == WM_MOUSEMOVE) {
|
| + if (!mouse_tracking_enabled_) {
|
| + mouse_tracking_enabled_ = true;
|
| + TRACKMOUSEEVENT tme;
|
| + tme.cbSize = sizeof(tme);
|
| + tme.dwFlags = TME_LEAVE;
|
| + tme.hwndTrack = hwnd();
|
| + tme.dwHoverTime = 0;
|
| + TrackMouseEvent(&tme);
|
| + }
|
| + w_param = MAKEWPARAM(LOWORD(w_param), SPECIAL_MOUSEMOVE_NOT_TO_BE_TRACKED);
|
| + }
|
| +
|
| + // The offsets in mouse wheel messages are in screen coordinates. We should
|
| + // not be converting them to parent coordinates.
|
| + if (message != WM_MOUSEWHEEL && message != WM_MOUSEHWHEEL) {
|
| + POINT mouse_coords;
|
| + mouse_coords.x = GET_X_LPARAM(l_param);
|
| + mouse_coords.y = GET_Y_LPARAM(l_param);
|
| + ::MapWindowPoints(hwnd(), GetParent(), &mouse_coords, 1);
|
| + l_param = MAKELPARAM(mouse_coords.x, mouse_coords.y);
|
| + }
|
| + return ::SendMessage(GetParent(), message, w_param, l_param);
|
| }
|
|
|
| +LRESULT LegacyRenderWidgetHostHWND::OnMouseLeave(UINT message,
|
| + WPARAM w_param,
|
| + LPARAM l_param) {
|
| + mouse_tracking_enabled_ = false;
|
| + // We should send a WM_MOUSELEAVE to the parent window only if the mouse has
|
| + // moved outside the bounds of the parent.
|
| + POINT cursor_pos;
|
| + ::GetCursorPos(&cursor_pos);
|
| + if (::WindowFromPoint(cursor_pos) != GetParent())
|
| + return ::SendMessage(GetParent(), message, w_param, l_param);
|
| + return 0;
|
| +}
|
| +
|
| LRESULT LegacyRenderWidgetHostHWND::OnMouseActivate(UINT message,
|
| WPARAM w_param,
|
| LPARAM l_param) {
|
|
|