| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "content/browser/renderer_host/render_widget_host_input_event_router.h" | 5 #include "content/browser/renderer_host/render_widget_host_input_event_router.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
| 10 | 10 |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 void RenderWidgetHostInputEventRouter::RouteMouseEvent( | 172 void RenderWidgetHostInputEventRouter::RouteMouseEvent( |
| 173 RenderWidgetHostViewBase* root_view, | 173 RenderWidgetHostViewBase* root_view, |
| 174 blink::WebMouseEvent* event, | 174 blink::WebMouseEvent* event, |
| 175 const ui::LatencyInfo& latency) { | 175 const ui::LatencyInfo& latency) { |
| 176 RenderWidgetHostViewBase* target; | 176 RenderWidgetHostViewBase* target; |
| 177 gfx::Point transformed_point; | 177 gfx::Point transformed_point; |
| 178 const int mouse_button_modifiers = blink::WebInputEvent::LeftButtonDown | | 178 const int mouse_button_modifiers = blink::WebInputEvent::LeftButtonDown | |
| 179 blink::WebInputEvent::MiddleButtonDown | | 179 blink::WebInputEvent::MiddleButtonDown | |
| 180 blink::WebInputEvent::RightButtonDown; | 180 blink::WebInputEvent::RightButtonDown; |
| 181 if (mouse_capture_target_.target && | 181 if (mouse_capture_target_.target && |
| 182 event->type != blink::WebInputEvent::MouseDown && | 182 event->type() != blink::WebInputEvent::MouseDown && |
| 183 (event->type == blink::WebInputEvent::MouseUp || | 183 (event->type() == blink::WebInputEvent::MouseUp || |
| 184 event->modifiers & mouse_button_modifiers)) { | 184 event->modifiers() & mouse_button_modifiers)) { |
| 185 target = mouse_capture_target_.target; | 185 target = mouse_capture_target_.target; |
| 186 if (!root_view->TransformPointToCoordSpaceForView( | 186 if (!root_view->TransformPointToCoordSpaceForView( |
| 187 gfx::Point(event->x, event->y), target, &transformed_point)) | 187 gfx::Point(event->x, event->y), target, &transformed_point)) |
| 188 return; | 188 return; |
| 189 if (event->type == blink::WebInputEvent::MouseUp) | 189 if (event->type() == blink::WebInputEvent::MouseUp) |
| 190 mouse_capture_target_.target = nullptr; | 190 mouse_capture_target_.target = nullptr; |
| 191 } else { | 191 } else { |
| 192 target = FindEventTarget(root_view, gfx::Point(event->x, event->y), | 192 target = FindEventTarget(root_view, gfx::Point(event->x, event->y), |
| 193 &transformed_point); | 193 &transformed_point); |
| 194 } | 194 } |
| 195 | 195 |
| 196 // RenderWidgetHostViewGuest does not properly handle direct routing of mouse | 196 // RenderWidgetHostViewGuest does not properly handle direct routing of mouse |
| 197 // events, so they have to go by the double-hop forwarding path through | 197 // events, so they have to go by the double-hop forwarding path through |
| 198 // the embedding renderer and then BrowserPluginGuest. | 198 // the embedding renderer and then BrowserPluginGuest. |
| 199 if (target && target->IsRenderWidgetHostViewGuest()) { | 199 if (target && target->IsRenderWidgetHostViewGuest()) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 217 gfx::Point(event->x, event->y), owner_view, &owner_point)) { | 217 gfx::Point(event->x, event->y), owner_view, &owner_point)) { |
| 218 return; | 218 return; |
| 219 } | 219 } |
| 220 event->x = owner_point.x(); | 220 event->x = owner_point.x(); |
| 221 event->y = owner_point.y(); | 221 event->y = owner_point.y(); |
| 222 } | 222 } |
| 223 owner_view->ProcessMouseEvent(*event, latency_info); | 223 owner_view->ProcessMouseEvent(*event, latency_info); |
| 224 return; | 224 return; |
| 225 } | 225 } |
| 226 | 226 |
| 227 if (event->type == blink::WebInputEvent::MouseDown) | 227 if (event->type() == blink::WebInputEvent::MouseDown) |
| 228 mouse_capture_target_.target = target; | 228 mouse_capture_target_.target = target; |
| 229 | 229 |
| 230 if (!target) | 230 if (!target) |
| 231 return; | 231 return; |
| 232 | 232 |
| 233 // SendMouseEnterOrLeaveEvents is called with the original event | 233 // SendMouseEnterOrLeaveEvents is called with the original event |
| 234 // coordinates, which are transformed independently for each view that will | 234 // coordinates, which are transformed independently for each view that will |
| 235 // receive an event. | 235 // receive an event. |
| 236 if ((event->type == blink::WebInputEvent::MouseLeave || | 236 if ((event->type() == blink::WebInputEvent::MouseLeave || |
| 237 event->type == blink::WebInputEvent::MouseMove) && | 237 event->type() == blink::WebInputEvent::MouseMove) && |
| 238 target != last_mouse_move_target_) | 238 target != last_mouse_move_target_) |
| 239 SendMouseEnterOrLeaveEvents(event, target, root_view); | 239 SendMouseEnterOrLeaveEvents(event, target, root_view); |
| 240 | 240 |
| 241 event->x = transformed_point.x(); | 241 event->x = transformed_point.x(); |
| 242 event->y = transformed_point.y(); | 242 event->y = transformed_point.y(); |
| 243 target->ProcessMouseEvent(*event, latency); | 243 target->ProcessMouseEvent(*event, latency); |
| 244 } | 244 } |
| 245 | 245 |
| 246 void RenderWidgetHostInputEventRouter::RouteMouseWheelEvent( | 246 void RenderWidgetHostInputEventRouter::RouteMouseWheelEvent( |
| 247 RenderWidgetHostViewBase* root_view, | 247 RenderWidgetHostViewBase* root_view, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 275 }; | 275 }; |
| 276 } | 276 } |
| 277 | 277 |
| 278 namespace { | 278 namespace { |
| 279 | 279 |
| 280 unsigned CountChangedTouchPoints(const blink::WebTouchEvent& event) { | 280 unsigned CountChangedTouchPoints(const blink::WebTouchEvent& event) { |
| 281 unsigned changed_count = 0; | 281 unsigned changed_count = 0; |
| 282 | 282 |
| 283 blink::WebTouchPoint::State required_state = | 283 blink::WebTouchPoint::State required_state = |
| 284 blink::WebTouchPoint::StateUndefined; | 284 blink::WebTouchPoint::StateUndefined; |
| 285 switch (event.type) { | 285 switch (event.type()) { |
| 286 case blink::WebInputEvent::TouchStart: | 286 case blink::WebInputEvent::TouchStart: |
| 287 required_state = blink::WebTouchPoint::StatePressed; | 287 required_state = blink::WebTouchPoint::StatePressed; |
| 288 break; | 288 break; |
| 289 case blink::WebInputEvent::TouchEnd: | 289 case blink::WebInputEvent::TouchEnd: |
| 290 required_state = blink::WebTouchPoint::StateReleased; | 290 required_state = blink::WebTouchPoint::StateReleased; |
| 291 break; | 291 break; |
| 292 case blink::WebInputEvent::TouchCancel: | 292 case blink::WebInputEvent::TouchCancel: |
| 293 required_state = blink::WebTouchPoint::StateCancelled; | 293 required_state = blink::WebTouchPoint::StateCancelled; |
| 294 break; | 294 break; |
| 295 default: | 295 default: |
| 296 // We'll only ever call this method for TouchStart, TouchEnd | 296 // We'll only ever call this method for TouchStart, TouchEnd |
| 297 // and TounchCancel events, so mark the rest as not-reached. | 297 // and TounchCancel events, so mark the rest as not-reached. |
| 298 NOTREACHED(); | 298 NOTREACHED(); |
| 299 } | 299 } |
| 300 for (unsigned i = 0; i < event.touchesLength; ++i) { | 300 for (unsigned i = 0; i < event.touchesLength; ++i) { |
| 301 if (event.touches[i].state == required_state) | 301 if (event.touches[i].state == required_state) |
| 302 ++changed_count; | 302 ++changed_count; |
| 303 } | 303 } |
| 304 | 304 |
| 305 DCHECK(event.type == blink::WebInputEvent::TouchCancel || changed_count == 1); | 305 DCHECK(event.type() == blink::WebInputEvent::TouchCancel || |
| 306 changed_count == 1); |
| 306 return changed_count; | 307 return changed_count; |
| 307 } | 308 } |
| 308 | 309 |
| 309 } // namespace | 310 } // namespace |
| 310 | 311 |
| 311 void RenderWidgetHostInputEventRouter::RouteTouchEvent( | 312 void RenderWidgetHostInputEventRouter::RouteTouchEvent( |
| 312 RenderWidgetHostViewBase* root_view, | 313 RenderWidgetHostViewBase* root_view, |
| 313 blink::WebTouchEvent* event, | 314 blink::WebTouchEvent* event, |
| 314 const ui::LatencyInfo& latency) { | 315 const ui::LatencyInfo& latency) { |
| 315 switch (event->type) { | 316 switch (event->type()) { |
| 316 case blink::WebInputEvent::TouchStart: { | 317 case blink::WebInputEvent::TouchStart: { |
| 317 active_touches_ += CountChangedTouchPoints(*event); | 318 active_touches_ += CountChangedTouchPoints(*event); |
| 318 if (active_touches_ == 1) { | 319 if (active_touches_ == 1) { |
| 319 // Since this is the first touch, it defines the target for the rest | 320 // Since this is the first touch, it defines the target for the rest |
| 320 // of this sequence. | 321 // of this sequence. |
| 321 DCHECK(!touch_target_.target); | 322 DCHECK(!touch_target_.target); |
| 322 gfx::Point transformed_point; | 323 gfx::Point transformed_point; |
| 323 gfx::Point original_point(event->touches[0].position.x, | 324 gfx::Point original_point(event->touches[0].position.x, |
| 324 event->touches[0].position.y); | 325 event->touches[0].position.y); |
| 325 touch_target_.target = | 326 touch_target_.target = |
| 326 FindEventTarget(root_view, original_point, &transformed_point); | 327 FindEventTarget(root_view, original_point, &transformed_point); |
| 327 | 328 |
| 328 // TODO(wjmaclean): Instead of just computing a delta, we should extract | 329 // TODO(wjmaclean): Instead of just computing a delta, we should extract |
| 329 // the complete transform. We assume it doesn't change for the duration | 330 // the complete transform. We assume it doesn't change for the duration |
| 330 // of the touch sequence, though this could be wrong; a better approach | 331 // of the touch sequence, though this could be wrong; a better approach |
| 331 // might be to always transform each point to the |touch_target_.target| | 332 // might be to always transform each point to the |touch_target_.target| |
| 332 // for the duration of the sequence. | 333 // for the duration of the sequence. |
| 333 touch_target_.delta = transformed_point - original_point; | 334 touch_target_.delta = transformed_point - original_point; |
| 334 touchscreen_gesture_target_queue_.push_back(touch_target_); | 335 touchscreen_gesture_target_queue_.push_back(touch_target_); |
| 335 | 336 |
| 336 if (!touch_target_.target) | 337 if (!touch_target_.target) |
| 337 return; | 338 return; |
| 338 | 339 |
| 339 if (touch_target_.target == bubbling_gesture_scroll_target_.target) { | 340 if (touch_target_.target == bubbling_gesture_scroll_target_.target) { |
| 340 SendGestureScrollEnd( | 341 SendGestureScrollEnd( |
| 341 bubbling_gesture_scroll_target_.target, | 342 bubbling_gesture_scroll_target_.target, |
| 342 DummyGestureScrollUpdate(event->timeStampSeconds)); | 343 DummyGestureScrollUpdate(event->timeStampSeconds())); |
| 343 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); | 344 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); |
| 344 } | 345 } |
| 345 } | 346 } |
| 346 | 347 |
| 347 if (touch_target_.target) { | 348 if (touch_target_.target) { |
| 348 TransformEventTouchPositions(event, touch_target_.delta); | 349 TransformEventTouchPositions(event, touch_target_.delta); |
| 349 touch_target_.target->ProcessTouchEvent(*event, latency); | 350 touch_target_.target->ProcessTouchEvent(*event, latency); |
| 350 } | 351 } |
| 351 break; | 352 break; |
| 352 } | 353 } |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 | 500 |
| 500 void RenderWidgetHostInputEventRouter::BubbleScrollEvent( | 501 void RenderWidgetHostInputEventRouter::BubbleScrollEvent( |
| 501 RenderWidgetHostViewBase* target_view, | 502 RenderWidgetHostViewBase* target_view, |
| 502 const blink::WebGestureEvent& event) { | 503 const blink::WebGestureEvent& event) { |
| 503 // TODO(kenrb, tdresser): This needs to be refactored when scroll latching | 504 // TODO(kenrb, tdresser): This needs to be refactored when scroll latching |
| 504 // is implemented (see https://crbug.com/526463). This design has some | 505 // is implemented (see https://crbug.com/526463). This design has some |
| 505 // race problems that can result in lost scroll delta, which are very | 506 // race problems that can result in lost scroll delta, which are very |
| 506 // difficult to resolve until this is changed to do all scroll targeting, | 507 // difficult to resolve until this is changed to do all scroll targeting, |
| 507 // including bubbling, based on GestureScrollBegin. | 508 // including bubbling, based on GestureScrollBegin. |
| 508 DCHECK(target_view); | 509 DCHECK(target_view); |
| 509 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || | 510 DCHECK(event.type() == blink::WebInputEvent::GestureScrollUpdate || |
| 510 event.type == blink::WebInputEvent::GestureScrollEnd); | 511 event.type() == blink::WebInputEvent::GestureScrollEnd); |
| 511 // DCHECK_XNOR the current and original bubble targets. Both should be set | 512 // DCHECK_XNOR the current and original bubble targets. Both should be set |
| 512 // if a bubbling gesture scroll is in progress. | 513 // if a bubbling gesture scroll is in progress. |
| 513 DCHECK(!first_bubbling_scroll_target_.target == | 514 DCHECK(!first_bubbling_scroll_target_.target == |
| 514 !bubbling_gesture_scroll_target_.target); | 515 !bubbling_gesture_scroll_target_.target); |
| 515 | 516 |
| 516 ui::LatencyInfo latency_info = | 517 ui::LatencyInfo latency_info = |
| 517 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event); | 518 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event); |
| 518 | 519 |
| 519 // If target_view is already set up for bubbled scrolls, we forward | 520 // If target_view is already set up for bubbled scrolls, we forward |
| 520 // the event to the current scroll target without further consideration. | 521 // the event to the current scroll target without further consideration. |
| 521 if (target_view == first_bubbling_scroll_target_.target) { | 522 if (target_view == first_bubbling_scroll_target_.target) { |
| 522 bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event, | 523 bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event, |
| 523 latency_info); | 524 latency_info); |
| 524 if (event.type == blink::WebInputEvent::GestureScrollEnd) { | 525 if (event.type() == blink::WebInputEvent::GestureScrollEnd) { |
| 525 first_bubbling_scroll_target_.target = nullptr; | 526 first_bubbling_scroll_target_.target = nullptr; |
| 526 bubbling_gesture_scroll_target_.target = nullptr; | 527 bubbling_gesture_scroll_target_.target = nullptr; |
| 527 } | 528 } |
| 528 return; | 529 return; |
| 529 } | 530 } |
| 530 | 531 |
| 531 // Disregard GestureScrollEnd events going to non-current targets. | 532 // Disregard GestureScrollEnd events going to non-current targets. |
| 532 // These should only happen on ACKs of synthesized GSE events that are | 533 // These should only happen on ACKs of synthesized GSE events that are |
| 533 // sent from SendGestureScrollEnd calls, and are not relevant here. | 534 // sent from SendGestureScrollEnd calls, and are not relevant here. |
| 534 if (event.type == blink::WebInputEvent::GestureScrollEnd) | 535 if (event.type() == blink::WebInputEvent::GestureScrollEnd) |
| 535 return; | 536 return; |
| 536 | 537 |
| 537 // This is a special case to catch races where multiple GestureScrollUpdates | 538 // This is a special case to catch races where multiple GestureScrollUpdates |
| 538 // have been sent to a renderer before the first one was ACKed, and the ACK | 539 // have been sent to a renderer before the first one was ACKed, and the ACK |
| 539 // caused a bubble retarget. In this case they all get forwarded. | 540 // caused a bubble retarget. In this case they all get forwarded. |
| 540 if (target_view == bubbling_gesture_scroll_target_.target) { | 541 if (target_view == bubbling_gesture_scroll_target_.target) { |
| 541 bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event, | 542 bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event, |
| 542 latency_info); | 543 latency_info); |
| 543 return; | 544 return; |
| 544 } | 545 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 563 | 564 |
| 564 bubbling_gesture_scroll_target_.target = target_view; | 565 bubbling_gesture_scroll_target_.target = target_view; |
| 565 | 566 |
| 566 SendGestureScrollBegin(target_view, event); | 567 SendGestureScrollBegin(target_view, event); |
| 567 target_view->ProcessGestureEvent(event, latency_info); | 568 target_view->ProcessGestureEvent(event, latency_info); |
| 568 } | 569 } |
| 569 | 570 |
| 570 void RenderWidgetHostInputEventRouter::SendGestureScrollBegin( | 571 void RenderWidgetHostInputEventRouter::SendGestureScrollBegin( |
| 571 RenderWidgetHostViewBase* view, | 572 RenderWidgetHostViewBase* view, |
| 572 const blink::WebGestureEvent& event) { | 573 const blink::WebGestureEvent& event) { |
| 573 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || | 574 DCHECK(event.type() == blink::WebInputEvent::GestureScrollUpdate || |
| 574 event.type == blink::WebInputEvent::GesturePinchBegin); | 575 event.type() == blink::WebInputEvent::GesturePinchBegin); |
| 575 blink::WebGestureEvent scroll_begin(event); | 576 blink::WebGestureEvent scroll_begin(event); |
| 576 scroll_begin.setType(blink::WebInputEvent::GestureScrollBegin); | 577 scroll_begin.setType(blink::WebInputEvent::GestureScrollBegin); |
| 577 scroll_begin.data.scrollBegin.deltaXHint = event.data.scrollUpdate.deltaX; | 578 scroll_begin.data.scrollBegin.deltaXHint = event.data.scrollUpdate.deltaX; |
| 578 scroll_begin.data.scrollBegin.deltaYHint = event.data.scrollUpdate.deltaY; | 579 scroll_begin.data.scrollBegin.deltaYHint = event.data.scrollUpdate.deltaY; |
| 579 scroll_begin.data.scrollBegin.deltaHintUnits = | 580 scroll_begin.data.scrollBegin.deltaHintUnits = |
| 580 event.data.scrollUpdate.deltaUnits; | 581 event.data.scrollUpdate.deltaUnits; |
| 581 view->ProcessGestureEvent( | 582 view->ProcessGestureEvent( |
| 582 scroll_begin, | 583 scroll_begin, |
| 583 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event)); | 584 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event)); |
| 584 } | 585 } |
| 585 | 586 |
| 586 void RenderWidgetHostInputEventRouter::SendGestureScrollEnd( | 587 void RenderWidgetHostInputEventRouter::SendGestureScrollEnd( |
| 587 RenderWidgetHostViewBase* view, | 588 RenderWidgetHostViewBase* view, |
| 588 const blink::WebGestureEvent& event) { | 589 const blink::WebGestureEvent& event) { |
| 589 DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate || | 590 DCHECK(event.type() == blink::WebInputEvent::GestureScrollUpdate || |
| 590 event.type == blink::WebInputEvent::GesturePinchEnd); | 591 event.type() == blink::WebInputEvent::GesturePinchEnd); |
| 591 blink::WebGestureEvent scroll_end(event); | 592 blink::WebGestureEvent scroll_end(event); |
| 592 scroll_end.setType(blink::WebInputEvent::GestureScrollEnd); | 593 scroll_end.setType(blink::WebInputEvent::GestureScrollEnd); |
| 593 scroll_end.setTimeStampSeconds( | 594 scroll_end.setTimeStampSeconds( |
| 594 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF()); | 595 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF()); |
| 595 scroll_end.data.scrollEnd.inertialPhase = | 596 scroll_end.data.scrollEnd.inertialPhase = |
| 596 event.data.scrollUpdate.inertialPhase; | 597 event.data.scrollUpdate.inertialPhase; |
| 597 scroll_end.data.scrollEnd.deltaUnits = event.data.scrollUpdate.deltaUnits; | 598 scroll_end.data.scrollEnd.deltaUnits = event.data.scrollUpdate.deltaUnits; |
| 598 view->ProcessGestureEvent( | 599 view->ProcessGestureEvent( |
| 599 scroll_end, | 600 scroll_end, |
| 600 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event)); | 601 ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event)); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 656 FindEventTarget(root_view, point, transformed_point) | 657 FindEventTarget(root_view, point, transformed_point) |
| 657 ->GetRenderWidgetHost()); | 658 ->GetRenderWidgetHost()); |
| 658 } | 659 } |
| 659 | 660 |
| 660 void RenderWidgetHostInputEventRouter::RouteTouchscreenGestureEvent( | 661 void RenderWidgetHostInputEventRouter::RouteTouchscreenGestureEvent( |
| 661 RenderWidgetHostViewBase* root_view, | 662 RenderWidgetHostViewBase* root_view, |
| 662 blink::WebGestureEvent* event, | 663 blink::WebGestureEvent* event, |
| 663 const ui::LatencyInfo& latency) { | 664 const ui::LatencyInfo& latency) { |
| 664 DCHECK_EQ(blink::WebGestureDeviceTouchscreen, event->sourceDevice); | 665 DCHECK_EQ(blink::WebGestureDeviceTouchscreen, event->sourceDevice); |
| 665 | 666 |
| 666 if (event->type == blink::WebInputEvent::GesturePinchBegin) { | 667 if (event->type() == blink::WebInputEvent::GesturePinchBegin) { |
| 667 in_touchscreen_gesture_pinch_ = true; | 668 in_touchscreen_gesture_pinch_ = true; |
| 668 // If the root view wasn't already receiving the gesture stream, then we | 669 // If the root view wasn't already receiving the gesture stream, then we |
| 669 // need to wrap the diverted pinch events in a GestureScrollBegin/End. | 670 // need to wrap the diverted pinch events in a GestureScrollBegin/End. |
| 670 // TODO(wjmaclean,kenrb,tdresser): When scroll latching lands, we can | 671 // TODO(wjmaclean,kenrb,tdresser): When scroll latching lands, we can |
| 671 // revisit how this code should work. | 672 // revisit how this code should work. |
| 672 // https://crbug.com/526463 | 673 // https://crbug.com/526463 |
| 673 auto rwhi = | 674 auto rwhi = |
| 674 static_cast<RenderWidgetHostImpl*>(root_view->GetRenderWidgetHost()); | 675 static_cast<RenderWidgetHostImpl*>(root_view->GetRenderWidgetHost()); |
| 675 // If the root view is the current gesture target, then we explicitly don't | 676 // If the root view is the current gesture target, then we explicitly don't |
| 676 // send a GestureScrollBegin, as by the time we see GesturePinchBegin there | 677 // send a GestureScrollBegin, as by the time we see GesturePinchBegin there |
| 677 // should have been one. | 678 // should have been one. |
| 678 if (root_view != touchscreen_gesture_target_.target && | 679 if (root_view != touchscreen_gesture_target_.target && |
| 679 !rwhi->is_in_touchscreen_gesture_scroll()) { | 680 !rwhi->is_in_touchscreen_gesture_scroll()) { |
| 680 gesture_pinch_did_send_scroll_begin_ = true; | 681 gesture_pinch_did_send_scroll_begin_ = true; |
| 681 SendGestureScrollBegin(root_view, *event); | 682 SendGestureScrollBegin(root_view, *event); |
| 682 } | 683 } |
| 683 } | 684 } |
| 684 | 685 |
| 685 if (in_touchscreen_gesture_pinch_) { | 686 if (in_touchscreen_gesture_pinch_) { |
| 686 root_view->ProcessGestureEvent(*event, latency); | 687 root_view->ProcessGestureEvent(*event, latency); |
| 687 if (event->type == blink::WebInputEvent::GesturePinchEnd) { | 688 if (event->type() == blink::WebInputEvent::GesturePinchEnd) { |
| 688 in_touchscreen_gesture_pinch_ = false; | 689 in_touchscreen_gesture_pinch_ = false; |
| 689 // If the root view wasn't already receiving the gesture stream, then we | 690 // If the root view wasn't already receiving the gesture stream, then we |
| 690 // need to wrap the diverted pinch events in a GestureScrollBegin/End. | 691 // need to wrap the diverted pinch events in a GestureScrollBegin/End. |
| 691 auto rwhi = | 692 auto rwhi = |
| 692 static_cast<RenderWidgetHostImpl*>(root_view->GetRenderWidgetHost()); | 693 static_cast<RenderWidgetHostImpl*>(root_view->GetRenderWidgetHost()); |
| 693 if (root_view != touchscreen_gesture_target_.target && | 694 if (root_view != touchscreen_gesture_target_.target && |
| 694 gesture_pinch_did_send_scroll_begin_ && | 695 gesture_pinch_did_send_scroll_begin_ && |
| 695 rwhi->is_in_touchscreen_gesture_scroll()) { | 696 rwhi->is_in_touchscreen_gesture_scroll()) { |
| 696 SendGestureScrollEnd(root_view, *event); | 697 SendGestureScrollEnd(root_view, *event); |
| 697 } | 698 } |
| 698 gesture_pinch_did_send_scroll_begin_ = false; | 699 gesture_pinch_did_send_scroll_begin_ = false; |
| 699 } | 700 } |
| 700 return; | 701 return; |
| 701 } | 702 } |
| 702 | 703 |
| 703 // We use GestureTapDown to detect the start of a gesture sequence since there | 704 // We use GestureTapDown to detect the start of a gesture sequence since there |
| 704 // is no WebGestureEvent equivalent for ET_GESTURE_BEGIN. Note that this | 705 // is no WebGestureEvent equivalent for ET_GESTURE_BEGIN. Note that this |
| 705 // means the GestureFlingCancel that always comes between ET_GESTURE_BEGIN and | 706 // means the GestureFlingCancel that always comes between ET_GESTURE_BEGIN and |
| 706 // GestureTapDown is sent to the previous target, in case it is still in a | 707 // GestureTapDown is sent to the previous target, in case it is still in a |
| 707 // fling. | 708 // fling. |
| 708 if (event->type == blink::WebInputEvent::GestureTapDown) { | 709 if (event->type() == blink::WebInputEvent::GestureTapDown) { |
| 709 bool no_target = touchscreen_gesture_target_queue_.empty(); | 710 bool no_target = touchscreen_gesture_target_queue_.empty(); |
| 710 // This UMA metric is temporary, and will be removed once it has fulfilled | 711 // This UMA metric is temporary, and will be removed once it has fulfilled |
| 711 // it's purpose, namely telling us when the incidents of empty | 712 // it's purpose, namely telling us when the incidents of empty |
| 712 // gesture-queues has dropped to zero. https://crbug.com/642008 | 713 // gesture-queues has dropped to zero. https://crbug.com/642008 |
| 713 UMA_HISTOGRAM_BOOLEAN("Event.FrameEventRouting.NoGestureTarget", no_target); | 714 UMA_HISTOGRAM_BOOLEAN("Event.FrameEventRouting.NoGestureTarget", no_target); |
| 714 if (no_target) { | 715 if (no_target) { |
| 715 LOG(ERROR) << "Gesture sequence start detected with no target available."; | 716 LOG(ERROR) << "Gesture sequence start detected with no target available."; |
| 716 // Ignore this gesture sequence as no target is available. | 717 // Ignore this gesture sequence as no target is available. |
| 717 // TODO(wjmaclean): this only happens on Windows, and should not happen. | 718 // TODO(wjmaclean): this only happens on Windows, and should not happen. |
| 718 // https://crbug.com/595422 | 719 // https://crbug.com/595422 |
| 719 touchscreen_gesture_target_.target = nullptr; | 720 touchscreen_gesture_target_.target = nullptr; |
| 720 return; | 721 return; |
| 721 } | 722 } |
| 722 | 723 |
| 723 touchscreen_gesture_target_ = touchscreen_gesture_target_queue_.front(); | 724 touchscreen_gesture_target_ = touchscreen_gesture_target_queue_.front(); |
| 724 touchscreen_gesture_target_queue_.pop_front(); | 725 touchscreen_gesture_target_queue_.pop_front(); |
| 725 | 726 |
| 726 // Abort any scroll bubbling in progress to avoid double entry. | 727 // Abort any scroll bubbling in progress to avoid double entry. |
| 727 if (touchscreen_gesture_target_.target && | 728 if (touchscreen_gesture_target_.target && |
| 728 touchscreen_gesture_target_.target == | 729 touchscreen_gesture_target_.target == |
| 729 bubbling_gesture_scroll_target_.target) { | 730 bubbling_gesture_scroll_target_.target) { |
| 730 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, | 731 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, |
| 731 DummyGestureScrollUpdate(event->timeStampSeconds)); | 732 DummyGestureScrollUpdate(event->timeStampSeconds())); |
| 732 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); | 733 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); |
| 733 } | 734 } |
| 734 } | 735 } |
| 735 | 736 |
| 736 if (!touchscreen_gesture_target_.target) | 737 if (!touchscreen_gesture_target_.target) |
| 737 return; | 738 return; |
| 738 | 739 |
| 739 // TODO(mohsen): Add tests to check event location. | 740 // TODO(mohsen): Add tests to check event location. |
| 740 event->x += touchscreen_gesture_target_.delta.x(); | 741 event->x += touchscreen_gesture_target_.delta.x(); |
| 741 event->y += touchscreen_gesture_target_.delta.y(); | 742 event->y += touchscreen_gesture_target_.delta.y(); |
| 742 touchscreen_gesture_target_.target->ProcessGestureEvent(*event, latency); | 743 touchscreen_gesture_target_.target->ProcessGestureEvent(*event, latency); |
| 743 } | 744 } |
| 744 | 745 |
| 745 void RenderWidgetHostInputEventRouter::RouteTouchpadGestureEvent( | 746 void RenderWidgetHostInputEventRouter::RouteTouchpadGestureEvent( |
| 746 RenderWidgetHostViewBase* root_view, | 747 RenderWidgetHostViewBase* root_view, |
| 747 blink::WebGestureEvent* event, | 748 blink::WebGestureEvent* event, |
| 748 const ui::LatencyInfo& latency) { | 749 const ui::LatencyInfo& latency) { |
| 749 DCHECK_EQ(blink::WebGestureDeviceTouchpad, event->sourceDevice); | 750 DCHECK_EQ(blink::WebGestureDeviceTouchpad, event->sourceDevice); |
| 750 | 751 |
| 751 if (event->type == blink::WebInputEvent::GesturePinchBegin || | 752 if (event->type() == blink::WebInputEvent::GesturePinchBegin || |
| 752 event->type == blink::WebInputEvent::GestureFlingStart) { | 753 event->type() == blink::WebInputEvent::GestureFlingStart) { |
| 753 gfx::Point transformed_point; | 754 gfx::Point transformed_point; |
| 754 gfx::Point original_point(event->x, event->y); | 755 gfx::Point original_point(event->x, event->y); |
| 755 touchpad_gesture_target_.target = | 756 touchpad_gesture_target_.target = |
| 756 FindEventTarget(root_view, original_point, &transformed_point); | 757 FindEventTarget(root_view, original_point, &transformed_point); |
| 757 // TODO(mohsen): Instead of just computing a delta, we should extract the | 758 // TODO(mohsen): Instead of just computing a delta, we should extract the |
| 758 // complete transform. We assume it doesn't change for the duration of the | 759 // complete transform. We assume it doesn't change for the duration of the |
| 759 // touchpad gesture sequence, though this could be wrong; a better approach | 760 // touchpad gesture sequence, though this could be wrong; a better approach |
| 760 // might be to always transform each point to the | 761 // might be to always transform each point to the |
| 761 // |touchpad_gesture_target_.target| for the duration of the sequence. | 762 // |touchpad_gesture_target_.target| for the duration of the sequence. |
| 762 touchpad_gesture_target_.delta = transformed_point - original_point; | 763 touchpad_gesture_target_.delta = transformed_point - original_point; |
| 763 | 764 |
| 764 // Abort any scroll bubbling in progress to avoid double entry. | 765 // Abort any scroll bubbling in progress to avoid double entry. |
| 765 if (touchpad_gesture_target_.target && | 766 if (touchpad_gesture_target_.target && |
| 766 touchpad_gesture_target_.target == | 767 touchpad_gesture_target_.target == |
| 767 bubbling_gesture_scroll_target_.target) { | 768 bubbling_gesture_scroll_target_.target) { |
| 768 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, | 769 SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, |
| 769 DummyGestureScrollUpdate(event->timeStampSeconds)); | 770 DummyGestureScrollUpdate(event->timeStampSeconds())); |
| 770 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); | 771 CancelScrollBubbling(bubbling_gesture_scroll_target_.target); |
| 771 } | 772 } |
| 772 } | 773 } |
| 773 | 774 |
| 774 if (!touchpad_gesture_target_.target) | 775 if (!touchpad_gesture_target_.target) |
| 775 return; | 776 return; |
| 776 | 777 |
| 777 // TODO(mohsen): Add tests to check event location. | 778 // TODO(mohsen): Add tests to check event location. |
| 778 event->x += touchpad_gesture_target_.delta.x(); | 779 event->x += touchpad_gesture_target_.delta.x(); |
| 779 event->y += touchpad_gesture_target_.delta.y(); | 780 event->y += touchpad_gesture_target_.delta.y(); |
| 780 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency); | 781 touchpad_gesture_target_.target->ProcessGestureEvent(*event, latency); |
| 781 } | 782 } |
| 782 | 783 |
| 783 } // namespace content | 784 } // namespace content |
| OLD | NEW |