Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(104)

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 1087893003: Support longpress drag selection (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Code review Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_view_android.h" 5 #include "content/browser/renderer_host/render_widget_host_view_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 8
9 #include "base/android/build_info.h" 9 #include "base/android/build_info.h"
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 775
776 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent( 776 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent(
777 const ui::MotionEvent& event) { 777 const ui::MotionEvent& event) {
778 return selection_controller_ && 778 return selection_controller_ &&
779 selection_controller_->WillHandleTouchEvent(event); 779 selection_controller_->WillHandleTouchEvent(event);
780 } 780 }
781 781
782 void RenderWidgetHostViewAndroid::ResetGestureDetection() { 782 void RenderWidgetHostViewAndroid::ResetGestureDetection() {
783 const ui::MotionEvent* current_down_event = 783 const ui::MotionEvent* current_down_event =
784 gesture_provider_.GetCurrentDownEvent(); 784 gesture_provider_.GetCurrentDownEvent();
785 if (current_down_event) { 785 if (!current_down_event) {
786 scoped_ptr<ui::MotionEvent> cancel_event = current_down_event->Cancel(); 786 // A hard reset ensures prevention of any timer-based events that might fire
787 OnTouchEvent(*cancel_event); 787 // after a touch sequence has ended.
788 gesture_provider_.ResetDetection();
789 return;
788 } 790 }
789 791
790 // A hard reset ensures prevention of any timer-based events. 792 scoped_ptr<ui::MotionEvent> cancel_event = current_down_event->Cancel();
791 gesture_provider_.ResetDetection(); 793 if (gesture_provider_.OnTouchEvent(*cancel_event).succeeded) {
794 bool causes_scrolling = false;
795 host_->ForwardTouchEventWithLatencyInfo(
796 ui::CreateWebTouchEventFromMotionEvent(*cancel_event, causes_scrolling),
797 ui::LatencyInfo());
798 }
792 } 799 }
793 800
794 void RenderWidgetHostViewAndroid::OnDidNavigateMainFrameToNewPage() { 801 void RenderWidgetHostViewAndroid::OnDidNavigateMainFrameToNewPage() {
795 ResetGestureDetection(); 802 ResetGestureDetection();
796 } 803 }
797 804
798 void RenderWidgetHostViewAndroid::SetDoubleTapSupportEnabled(bool enabled) { 805 void RenderWidgetHostViewAndroid::SetDoubleTapSupportEnabled(bool enabled) {
799 gesture_provider_.SetDoubleTapSupportForPlatformEnabled(enabled); 806 gesture_provider_.SetDoubleTapSupportForPlatformEnabled(enabled);
800 } 807 }
801 808
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after
1256 const gfx::PointF& base, 1263 const gfx::PointF& base,
1257 const gfx::PointF& extent) { 1264 const gfx::PointF& extent) {
1258 DCHECK(content_view_core_); 1265 DCHECK(content_view_core_);
1259 content_view_core_->SelectBetweenCoordinates(base, extent); 1266 content_view_core_->SelectBetweenCoordinates(base, extent);
1260 } 1267 }
1261 1268
1262 void RenderWidgetHostViewAndroid::OnSelectionEvent( 1269 void RenderWidgetHostViewAndroid::OnSelectionEvent(
1263 ui::SelectionEventType event) { 1270 ui::SelectionEventType event) {
1264 DCHECK(content_view_core_); 1271 DCHECK(content_view_core_);
1265 DCHECK(selection_controller_); 1272 DCHECK(selection_controller_);
1266 // Showing the selection action bar can alter the current View coordinates in 1273 // If a selection drag has started, it has taken over the active touch
1267 // such a way that the current MotionEvent stream is suddenly shifted in 1274 // sequence. Immediately cancel gesture detection and any downstream touch
1268 // space. Avoid the associated scroll jump by pre-emptively cancelling gesture 1275 // listeners (e.g., web content) to communicate this transfer.
1269 // detection; scrolling after the selection is activated is unnecessary. 1276 if (event == ui::SELECTION_SHOWN)
1270 if (event == ui::SelectionEventType::SELECTION_SHOWN)
1271 ResetGestureDetection(); 1277 ResetGestureDetection();
1278
1272 content_view_core_->OnSelectionEvent( 1279 content_view_core_->OnSelectionEvent(
1273 event, selection_controller_->GetStartPosition(), 1280 event, selection_controller_->GetStartPosition(),
1274 GetSelectionRect(*selection_controller_)); 1281 GetSelectionRect(*selection_controller_));
1275 } 1282 }
1276 1283
1277 scoped_ptr<ui::TouchHandleDrawable> 1284 scoped_ptr<ui::TouchHandleDrawable>
1278 RenderWidgetHostViewAndroid::CreateDrawable() { 1285 RenderWidgetHostViewAndroid::CreateDrawable() {
1279 DCHECK(content_view_core_); 1286 DCHECK(content_view_core_);
1280 if (!using_browser_compositor_) 1287 if (!using_browser_compositor_)
1281 return content_view_core_->CreatePopupTouchHandleDrawable(); 1288 return content_view_core_->CreatePopupTouchHandleDrawable();
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
1579 if (content_view_core_) 1586 if (content_view_core_)
1580 content_view_core_->OnGestureEventAck(event, ack_result); 1587 content_view_core_->OnGestureEventAck(event, ack_result);
1581 } 1588 }
1582 1589
1583 InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent( 1590 InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent(
1584 const blink::WebInputEvent& input_event) { 1591 const blink::WebInputEvent& input_event) {
1585 if (selection_controller_ && 1592 if (selection_controller_ &&
1586 blink::WebInputEvent::isGestureEventType(input_event.type)) { 1593 blink::WebInputEvent::isGestureEventType(input_event.type)) {
1587 const blink::WebGestureEvent& gesture_event = 1594 const blink::WebGestureEvent& gesture_event =
1588 static_cast<const blink::WebGestureEvent&>(input_event); 1595 static_cast<const blink::WebGestureEvent&>(input_event);
1589 gfx::PointF gesture_location(gesture_event.x, gesture_event.y); 1596 switch (gesture_event.type) {
1590 if (input_event.type == blink::WebInputEvent::GestureLongPress) { 1597 case blink::WebInputEvent::GestureLongPress:
1591 if (selection_controller_->WillHandleLongPressEvent(gesture_location)) 1598 if (selection_controller_->WillHandleLongPressEvent(
1592 return INPUT_EVENT_ACK_STATE_CONSUMED; 1599 base::TimeTicks() +
1593 } else if (input_event.type == blink::WebInputEvent::GestureTap) { 1600 base::TimeDelta::FromSecondsD(input_event.timeStampSeconds),
1594 if (selection_controller_->WillHandleTapEvent(gesture_location)) 1601 gfx::PointF(gesture_event.x, gesture_event.y))) {
1595 return INPUT_EVENT_ACK_STATE_CONSUMED; 1602 return INPUT_EVENT_ACK_STATE_CONSUMED;
1603 }
1604 break;
1605
1606 case blink::WebInputEvent::GestureTap:
1607 if (selection_controller_->WillHandleTapEvent(
1608 gfx::PointF(gesture_event.x, gesture_event.y))) {
1609 return INPUT_EVENT_ACK_STATE_CONSUMED;
1610 }
1611 break;
1612
1613 default:
1614 break;
1596 } 1615 }
1597 } 1616 }
1598 1617
1599 if (overscroll_controller_ && 1618 if (overscroll_controller_ &&
1600 blink::WebInputEvent::isGestureEventType(input_event.type) && 1619 blink::WebInputEvent::isGestureEventType(input_event.type) &&
1601 overscroll_controller_->WillHandleGestureEvent( 1620 overscroll_controller_->WillHandleGestureEvent(
1602 static_cast<const blink::WebGestureEvent&>(input_event))) { 1621 static_cast<const blink::WebGestureEvent&>(input_event))) {
1603 return INPUT_EVENT_ACK_STATE_CONSUMED; 1622 return INPUT_EVENT_ACK_STATE_CONSUMED;
1604 } 1623 }
1605 1624
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
2016 results->orientationAngle = display.RotationAsDegree(); 2035 results->orientationAngle = display.RotationAsDegree();
2017 results->orientationType = 2036 results->orientationType =
2018 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); 2037 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display);
2019 gfx::DeviceDisplayInfo info; 2038 gfx::DeviceDisplayInfo info;
2020 results->depth = info.GetBitsPerPixel(); 2039 results->depth = info.GetBitsPerPixel();
2021 results->depthPerComponent = info.GetBitsPerComponent(); 2040 results->depthPerComponent = info.GetBitsPerComponent();
2022 results->isMonochrome = (results->depthPerComponent == 0); 2041 results->isMonochrome = (results->depthPerComponent == 0);
2023 } 2042 }
2024 2043
2025 } // namespace content 2044 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | ui/events/test/motion_event_test_utils.h » ('j') | ui/events/test/motion_event_test_utils.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698