Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/aura/window_event_dispatcher.h" | 5 #include "ui/aura/window_event_dispatcher.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 143 | 143 |
| 144 Window* target = GetGestureTarget(event); | 144 Window* target = GetGestureTarget(event); |
| 145 if (target) { | 145 if (target) { |
| 146 event->ConvertLocationToTarget(window(), target); | 146 event->ConvertLocationToTarget(window(), target); |
| 147 DispatchDetails details = DispatchEvent(target, event); | 147 DispatchDetails details = DispatchEvent(target, event); |
| 148 if (details.dispatcher_destroyed) | 148 if (details.dispatcher_destroyed) |
| 149 return; | 149 return; |
| 150 } | 150 } |
| 151 } | 151 } |
| 152 | 152 |
| 153 void WindowEventDispatcher::DispatchMouseExitAtPoint(const gfx::Point& point) { | 153 DispatchDetails WindowEventDispatcher::DispatchMouseExitAtPoint( |
| 154 const gfx::Point& point) { | |
| 154 ui::MouseEvent event(ui::ET_MOUSE_EXITED, point, point, ui::EF_NONE, | 155 ui::MouseEvent event(ui::ET_MOUSE_EXITED, point, point, ui::EF_NONE, |
| 155 ui::EF_NONE); | 156 ui::EF_NONE); |
| 156 DispatchDetails details = | 157 return DispatchMouseEnterOrExit(event, ui::ET_MOUSE_EXITED); |
| 157 DispatchMouseEnterOrExit(event, ui::ET_MOUSE_EXITED); | |
| 158 if (details.dispatcher_destroyed) | |
| 159 return; | |
| 160 } | 158 } |
| 161 | 159 |
| 162 void WindowEventDispatcher::ProcessedTouchEvent(ui::TouchEvent* event, | 160 void WindowEventDispatcher::ProcessedTouchEvent(ui::TouchEvent* event, |
| 163 Window* window, | 161 Window* window, |
| 164 ui::EventResult result) { | 162 ui::EventResult result) { |
| 165 scoped_ptr<ui::GestureRecognizer::Gestures> gestures; | 163 scoped_ptr<ui::GestureRecognizer::Gestures> gestures; |
| 166 gestures.reset(ui::GestureRecognizer::Get()-> | 164 gestures.reset(ui::GestureRecognizer::Get()-> |
| 167 ProcessTouchEventForGesture(*event, result, window)); | 165 ProcessTouchEventForGesture(*event, result, window)); |
| 168 DispatchDetails details = ProcessGestures(gestures.get()); | 166 DispatchDetails details = ProcessGestures(gestures.get()); |
| 169 if (details.dispatcher_destroyed) | 167 if (details.dispatcher_destroyed) |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 235 } | 233 } |
| 236 | 234 |
| 237 void WindowEventDispatcher::DispatchMouseExitToHidingWindow(Window* window) { | 235 void WindowEventDispatcher::DispatchMouseExitToHidingWindow(Window* window) { |
| 238 // The mouse capture is intentionally ignored. Think that a mouse enters | 236 // The mouse capture is intentionally ignored. Think that a mouse enters |
| 239 // to a window, the window sets the capture, the mouse exits the window, | 237 // to a window, the window sets the capture, the mouse exits the window, |
| 240 // and then it releases the capture. In that case OnMouseExited won't | 238 // and then it releases the capture. In that case OnMouseExited won't |
| 241 // be called. So it is natural not to emit OnMouseExited even though | 239 // be called. So it is natural not to emit OnMouseExited even though |
| 242 // |window| is the capture window. | 240 // |window| is the capture window. |
| 243 gfx::Point last_mouse_location = GetLastMouseLocationInRoot(); | 241 gfx::Point last_mouse_location = GetLastMouseLocationInRoot(); |
| 244 if (window->Contains(mouse_moved_handler_) && | 242 if (window->Contains(mouse_moved_handler_) && |
| 245 window->ContainsPointInRoot(last_mouse_location)) | 243 window->ContainsPointInRoot(last_mouse_location)) { |
| 246 DispatchMouseExitAtPoint(last_mouse_location); | 244 DispatchDetails details = DispatchMouseExitAtPoint(last_mouse_location); |
| 245 if (details.dispatcher_destroyed) | |
| 246 return; | |
| 247 } | |
| 247 } | 248 } |
| 248 | 249 |
| 249 ui::EventDispatchDetails WindowEventDispatcher::DispatchMouseEnterOrExit( | 250 ui::EventDispatchDetails WindowEventDispatcher::DispatchMouseEnterOrExit( |
| 250 const ui::MouseEvent& event, | 251 const ui::MouseEvent& event, |
| 251 ui::EventType type) { | 252 ui::EventType type) { |
| 252 if (event.type() != ui::ET_MOUSE_CAPTURE_CHANGED && | 253 if (event.type() != ui::ET_MOUSE_CAPTURE_CHANGED && |
| 253 !(event.flags() & ui::EF_IS_SYNTHESIZED)) { | 254 !(event.flags() & ui::EF_IS_SYNTHESIZED)) { |
| 254 SetLastMouseLocation(window(), event.root_location()); | 255 SetLastMouseLocation(window(), event.root_location()); |
| 255 } | 256 } |
| 256 | 257 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 359 if (mouse_moved_handler_ && !window()->Contains(mouse_moved_handler_)) | 360 if (mouse_moved_handler_ && !window()->Contains(mouse_moved_handler_)) |
| 360 mouse_moved_handler_ = NULL; | 361 mouse_moved_handler_ = NULL; |
| 361 | 362 |
| 362 if (old_capture && old_capture->GetRootWindow() == window() && | 363 if (old_capture && old_capture->GetRootWindow() == window() && |
| 363 old_capture->delegate()) { | 364 old_capture->delegate()) { |
| 364 // Send a capture changed event with bogus location data. | 365 // Send a capture changed event with bogus location data. |
| 365 ui::MouseEvent event(ui::ET_MOUSE_CAPTURE_CHANGED, gfx::Point(), | 366 ui::MouseEvent event(ui::ET_MOUSE_CAPTURE_CHANGED, gfx::Point(), |
| 366 gfx::Point(), 0, 0); | 367 gfx::Point(), 0, 0); |
| 367 | 368 |
| 368 DispatchDetails details = DispatchEvent(old_capture, &event); | 369 DispatchDetails details = DispatchEvent(old_capture, &event); |
| 369 if (details.dispatcher_destroyed) | 370 if (details.dispatcher_destroyed || details.target_destroyed) |
| 370 return; | 371 return; |
| 371 | 372 |
| 372 old_capture->delegate()->OnCaptureLost(); | 373 old_capture->delegate()->OnCaptureLost(); |
| 374 | |
| 375 if (!new_capture) { | |
| 376 // Make sure |mouse_moved_handler_| gets updated. | |
| 377 DispatchDetails details = SynthesizeMouseMoveEvent(); | |
| 378 if (details.dispatcher_destroyed) | |
| 379 return; | |
| 380 } | |
| 381 } else if (mouse_moved_handler_ && | |
| 382 mouse_moved_handler_ != new_capture) { | |
|
sadrul
2014/06/24 18:33:09
Should you check for a non-null |new_capture| here
| |
| 383 // Dispatch a mouse exit to reset any state associated with hover. This is | |
| 384 // important when going from no window having capture to a window having | |
| 385 // capture because we do not dispatch ET_MOUSE_CAPTURE_CHANGED in this case. | |
| 386 DispatchDetails details = DispatchMouseExitAtPoint( | |
| 387 GetLastMouseLocationInRoot()); | |
| 388 if (details.dispatcher_destroyed) | |
| 389 return; | |
| 373 } | 390 } |
| 374 | 391 |
| 375 if (new_capture) { | 392 if (new_capture) { |
| 376 // Make all subsequent mouse events go to the capture window. We shouldn't | 393 // Make all subsequent mouse events go to the capture window. |
| 377 // need to send an event here as OnCaptureLost() should take care of that. | |
| 378 if (mouse_moved_handler_ || Env::GetInstance()->IsMouseButtonDown()) | 394 if (mouse_moved_handler_ || Env::GetInstance()->IsMouseButtonDown()) |
| 379 mouse_moved_handler_ = new_capture; | 395 mouse_moved_handler_ = new_capture; |
| 380 } else { | |
| 381 // Make sure mouse_moved_handler gets updated. | |
| 382 DispatchDetails details = SynthesizeMouseMoveEvent(); | |
| 383 if (details.dispatcher_destroyed) | |
| 384 return; | |
| 385 } | 396 } |
| 386 mouse_pressed_handler_ = NULL; | 397 mouse_pressed_handler_ = NULL; |
| 387 } | 398 } |
| 388 | 399 |
| 389 void WindowEventDispatcher::OnOtherRootGotCapture() { | 400 void WindowEventDispatcher::OnOtherRootGotCapture() { |
| 401 if (mouse_moved_handler_) { | |
| 402 // Dispatch a mouse exit to reset any state associated with hover. This is | |
| 403 // important when going from no window having capture to a window having | |
| 404 // capture because we do not dispatch ET_MOUSE_CAPTURE_CHANGED in this case. | |
| 405 DispatchDetails details = DispatchMouseExitAtPoint( | |
| 406 GetLastMouseLocationInRoot()); | |
| 407 if (details.dispatcher_destroyed) | |
| 408 return; | |
| 409 } | |
| 410 | |
| 390 mouse_moved_handler_ = NULL; | 411 mouse_moved_handler_ = NULL; |
| 391 mouse_pressed_handler_ = NULL; | 412 mouse_pressed_handler_ = NULL; |
| 392 } | 413 } |
| 393 | 414 |
| 394 void WindowEventDispatcher::SetNativeCapture() { | 415 void WindowEventDispatcher::SetNativeCapture() { |
| 395 host_->SetCapture(); | 416 host_->SetCapture(); |
| 396 } | 417 } |
| 397 | 418 |
| 398 void WindowEventDispatcher::ReleaseNativeCapture() { | 419 void WindowEventDispatcher::ReleaseNativeCapture() { |
| 399 host_->ReleaseCapture(); | 420 host_->ReleaseCapture(); |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 843 break; | 864 break; |
| 844 | 865 |
| 845 default: | 866 default: |
| 846 NOTREACHED(); | 867 NOTREACHED(); |
| 847 break; | 868 break; |
| 848 } | 869 } |
| 849 PreDispatchLocatedEvent(target, event); | 870 PreDispatchLocatedEvent(target, event); |
| 850 } | 871 } |
| 851 | 872 |
| 852 } // namespace aura | 873 } // namespace aura |
| OLD | NEW |