Index: ui/aura/root_window.cc |
diff --git a/ui/aura/root_window.cc b/ui/aura/root_window.cc |
index 7c95443b8a92cad7ce7b2ec2bb60d9b145fb4be2..ac66bdf5f44f7bc8c7fbb7171fe42bd75dab2053 100644 |
--- a/ui/aura/root_window.cc |
+++ b/ui/aura/root_window.cc |
@@ -669,8 +669,28 @@ void RootWindow::ClearMouseHandlers() { |
//////////////////////////////////////////////////////////////////////////////// |
// RootWindow, private: |
-void RootWindow::TransformEventForDeviceScaleFactor(ui::LocatedEvent* event) { |
+void RootWindow::TransformEventForDeviceScaleFactor(bool keep_inside_root, |
+ ui::LocatedEvent* event) { |
event->UpdateForRootTransform(GetRootTransform()); |
+#if defined(OS_CHROMEOS) |
+ const gfx::Rect& root_bounds = bounds(); |
+ if (keep_inside_root & |
+ host_->GetBounds().Contains(event->system_location()) && |
+ !root_bounds.Contains(event->root_location())) { |
+ // Make sure that the mouse location inside the host window gets |
+ // translated inside root window. |
+ // TODO(oshima): This is (hopefully) short term bandaid to deal |
+ // with calculation error in inverted matrix. We'll try better |
+ // alternative (crbug.com/222483) for m28. |
+ int x = event->location().x(); |
+ int y = event->location().y(); |
+ x = std::min(std::max(x, root_bounds.x()), root_bounds.right()); |
+ y = std::min(std::max(y, root_bounds.y()), root_bounds.bottom()); |
+ const gfx::Point new_location(x, y); |
+ event->set_location(new_location); |
+ event->set_root_location(new_location); |
+ } |
+#endif // defined(OS_CHROMEOS) |
} |
void RootWindow::HandleMouseMoved(const ui::MouseEvent& event, Window* target) { |
@@ -884,7 +904,7 @@ bool RootWindow::OnHostMouseEvent(ui::MouseEvent* event) { |
bool RootWindow::OnHostScrollEvent(ui::ScrollEvent* event) { |
DispatchHeldEvents(); |
- TransformEventForDeviceScaleFactor(event); |
+ TransformEventForDeviceScaleFactor(false, event); |
SetLastMouseLocation(this, event->location()); |
synthesize_mouse_move_ = false; |
@@ -930,7 +950,7 @@ bool RootWindow::OnHostTouchEvent(ui::TouchEvent* event) { |
default: |
break; |
} |
- TransformEventForDeviceScaleFactor(event); |
+ TransformEventForDeviceScaleFactor(false, event); |
bool handled = false; |
Window* target = client::GetCaptureWindow(this); |
if (!target) { |
@@ -1031,7 +1051,7 @@ RootWindow* RootWindow::AsRootWindow() { |
// RootWindow, private: |
bool RootWindow::DispatchMouseEventImpl(ui::MouseEvent* event) { |
- TransformEventForDeviceScaleFactor(event); |
+ TransformEventForDeviceScaleFactor(true, event); |
Window* target = mouse_pressed_handler_ ? |
mouse_pressed_handler_ : client::GetCaptureWindow(this); |
if (!target) |