OLD | NEW |
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 730 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 const gfx::Rect rect) { | 741 const gfx::Rect rect) { |
742 if (content_view_core_) | 742 if (content_view_core_) |
743 content_view_core_->OnSmartClipDataExtracted(text, html, rect); | 743 content_view_core_->OnSmartClipDataExtracted(text, html, rect); |
744 } | 744 } |
745 | 745 |
746 bool RenderWidgetHostViewAndroid::OnTouchEvent( | 746 bool RenderWidgetHostViewAndroid::OnTouchEvent( |
747 const ui::MotionEvent& event) { | 747 const ui::MotionEvent& event) { |
748 if (!host_) | 748 if (!host_) |
749 return false; | 749 return false; |
750 | 750 |
| 751 // If a browser-based widget consumes the touch event, it's critical that |
| 752 // touch event interception be disabled. This avoids issues with |
| 753 // double-handling for embedder-detected gestures like side swipe. |
751 if (selection_controller_ && | 754 if (selection_controller_ && |
752 selection_controller_->WillHandleTouchEvent(event)) | 755 selection_controller_->WillHandleTouchEvent(event)) { |
| 756 RequestDisallowInterceptTouchEvent(); |
753 return true; | 757 return true; |
| 758 } |
754 | 759 |
755 if (stylus_text_selector_.OnTouchEvent(event)) | 760 if (stylus_text_selector_.OnTouchEvent(event)) { |
| 761 RequestDisallowInterceptTouchEvent(); |
756 return true; | 762 return true; |
| 763 } |
757 | 764 |
758 ui::FilteredGestureProvider::TouchHandlingResult result = | 765 ui::FilteredGestureProvider::TouchHandlingResult result = |
759 gesture_provider_.OnTouchEvent(event); | 766 gesture_provider_.OnTouchEvent(event); |
760 if (!result.succeeded) | 767 if (!result.succeeded) |
761 return false; | 768 return false; |
762 | 769 |
763 blink::WebTouchEvent web_event = | 770 blink::WebTouchEvent web_event = |
764 ui::CreateWebTouchEventFromMotionEvent(event, result.did_generate_scroll); | 771 ui::CreateWebTouchEventFromMotionEvent(event, result.did_generate_scroll); |
765 host_->ForwardTouchEventWithLatencyInfo(web_event, ui::LatencyInfo()); | 772 host_->ForwardTouchEventWithLatencyInfo(web_event, ui::LatencyInfo()); |
766 | 773 |
767 // Send a proactive BeginFrame on the next vsync to reduce latency. | 774 // Send a proactive BeginFrame on the next vsync to reduce latency. |
768 // This is good enough as long as the first touch event has Begin semantics | 775 // This is good enough as long as the first touch event has Begin semantics |
769 // and the actual scroll happens on the next vsync. | 776 // and the actual scroll happens on the next vsync. |
770 if (observing_root_window_) | 777 if (observing_root_window_) |
771 RequestVSyncUpdate(BEGIN_FRAME); | 778 RequestVSyncUpdate(BEGIN_FRAME); |
772 | 779 |
773 return true; | 780 return true; |
774 } | 781 } |
775 | 782 |
776 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent( | 783 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent( |
777 const ui::MotionEvent& event) { | 784 const ui::MotionEvent& event) { |
778 return selection_controller_ && | 785 return selection_controller_ && |
779 selection_controller_->WillHandleTouchEvent(event); | 786 selection_controller_->WillHandleTouchEvent(event); |
780 } | 787 } |
781 | 788 |
782 void RenderWidgetHostViewAndroid::ResetGestureDetection() { | 789 void RenderWidgetHostViewAndroid::ResetGestureDetection() { |
783 const ui::MotionEvent* current_down_event = | 790 const ui::MotionEvent* current_down_event = |
784 gesture_provider_.GetCurrentDownEvent(); | 791 gesture_provider_.GetCurrentDownEvent(); |
785 if (current_down_event) { | 792 if (!current_down_event) { |
786 scoped_ptr<ui::MotionEvent> cancel_event = current_down_event->Cancel(); | 793 // A hard reset ensures prevention of any timer-based events that might fire |
787 OnTouchEvent(*cancel_event); | 794 // after a touch sequence has ended. |
| 795 gesture_provider_.ResetDetection(); |
| 796 return; |
788 } | 797 } |
789 | 798 |
790 // A hard reset ensures prevention of any timer-based events. | 799 scoped_ptr<ui::MotionEvent> cancel_event = current_down_event->Cancel(); |
791 gesture_provider_.ResetDetection(); | 800 if (gesture_provider_.OnTouchEvent(*cancel_event).succeeded) { |
| 801 bool causes_scrolling = false; |
| 802 host_->ForwardTouchEventWithLatencyInfo( |
| 803 ui::CreateWebTouchEventFromMotionEvent(*cancel_event, causes_scrolling), |
| 804 ui::LatencyInfo()); |
| 805 } |
792 } | 806 } |
793 | 807 |
794 void RenderWidgetHostViewAndroid::OnDidNavigateMainFrameToNewPage() { | 808 void RenderWidgetHostViewAndroid::OnDidNavigateMainFrameToNewPage() { |
795 ResetGestureDetection(); | 809 ResetGestureDetection(); |
796 } | 810 } |
797 | 811 |
798 void RenderWidgetHostViewAndroid::SetDoubleTapSupportEnabled(bool enabled) { | 812 void RenderWidgetHostViewAndroid::SetDoubleTapSupportEnabled(bool enabled) { |
799 gesture_provider_.SetDoubleTapSupportForPlatformEnabled(enabled); | 813 gesture_provider_.SetDoubleTapSupportForPlatformEnabled(enabled); |
800 } | 814 } |
801 | 815 |
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1256 const gfx::PointF& base, | 1270 const gfx::PointF& base, |
1257 const gfx::PointF& extent) { | 1271 const gfx::PointF& extent) { |
1258 DCHECK(content_view_core_); | 1272 DCHECK(content_view_core_); |
1259 content_view_core_->SelectBetweenCoordinates(base, extent); | 1273 content_view_core_->SelectBetweenCoordinates(base, extent); |
1260 } | 1274 } |
1261 | 1275 |
1262 void RenderWidgetHostViewAndroid::OnSelectionEvent( | 1276 void RenderWidgetHostViewAndroid::OnSelectionEvent( |
1263 ui::SelectionEventType event) { | 1277 ui::SelectionEventType event) { |
1264 DCHECK(content_view_core_); | 1278 DCHECK(content_view_core_); |
1265 DCHECK(selection_controller_); | 1279 DCHECK(selection_controller_); |
1266 // Showing the selection action bar can alter the current View coordinates in | 1280 // 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 | 1281 // sequence. Immediately cancel gesture detection and any downstream touch |
1268 // space. Avoid the associated scroll jump by pre-emptively cancelling gesture | 1282 // listeners (e.g., web content) to communicate this transfer. |
1269 // detection; scrolling after the selection is activated is unnecessary. | 1283 if (event == ui::SELECTION_SHOWN) |
1270 if (event == ui::SelectionEventType::SELECTION_SHOWN) | |
1271 ResetGestureDetection(); | 1284 ResetGestureDetection(); |
1272 content_view_core_->OnSelectionEvent( | 1285 content_view_core_->OnSelectionEvent( |
1273 event, selection_controller_->GetStartPosition(), | 1286 event, selection_controller_->GetStartPosition(), |
1274 GetSelectionRect(*selection_controller_)); | 1287 GetSelectionRect(*selection_controller_)); |
1275 } | 1288 } |
1276 | 1289 |
1277 scoped_ptr<ui::TouchHandleDrawable> | 1290 scoped_ptr<ui::TouchHandleDrawable> |
1278 RenderWidgetHostViewAndroid::CreateDrawable() { | 1291 RenderWidgetHostViewAndroid::CreateDrawable() { |
1279 DCHECK(content_view_core_); | 1292 DCHECK(content_view_core_); |
1280 if (!using_browser_compositor_) | 1293 if (!using_browser_compositor_) |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1524 bool needs_animate = false; | 1537 bool needs_animate = false; |
1525 if (overscroll_controller_) { | 1538 if (overscroll_controller_) { |
1526 needs_animate |= overscroll_controller_->Animate( | 1539 needs_animate |= overscroll_controller_->Animate( |
1527 frame_time, content_view_core_->GetLayer().get()); | 1540 frame_time, content_view_core_->GetLayer().get()); |
1528 } | 1541 } |
1529 if (selection_controller_) | 1542 if (selection_controller_) |
1530 needs_animate |= selection_controller_->Animate(frame_time); | 1543 needs_animate |= selection_controller_->Animate(frame_time); |
1531 return needs_animate; | 1544 return needs_animate; |
1532 } | 1545 } |
1533 | 1546 |
| 1547 void RenderWidgetHostViewAndroid::RequestDisallowInterceptTouchEvent() { |
| 1548 if (content_view_core_) |
| 1549 content_view_core_->RequestDisallowInterceptTouchEvent(); |
| 1550 } |
| 1551 |
1534 void RenderWidgetHostViewAndroid::EvictDelegatedFrame() { | 1552 void RenderWidgetHostViewAndroid::EvictDelegatedFrame() { |
1535 if (layer_.get()) | 1553 if (layer_.get()) |
1536 DestroyDelegatedContent(); | 1554 DestroyDelegatedContent(); |
1537 frame_evictor_->DiscardedFrame(); | 1555 frame_evictor_->DiscardedFrame(); |
1538 } | 1556 } |
1539 | 1557 |
1540 bool RenderWidgetHostViewAndroid::HasAcceleratedSurface( | 1558 bool RenderWidgetHostViewAndroid::HasAcceleratedSurface( |
1541 const gfx::Size& desired_size) { | 1559 const gfx::Size& desired_size) { |
1542 NOTREACHED(); | 1560 NOTREACHED(); |
1543 return false; | 1561 return false; |
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2016 results->orientationAngle = display.RotationAsDegree(); | 2034 results->orientationAngle = display.RotationAsDegree(); |
2017 results->orientationType = | 2035 results->orientationType = |
2018 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); | 2036 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); |
2019 gfx::DeviceDisplayInfo info; | 2037 gfx::DeviceDisplayInfo info; |
2020 results->depth = info.GetBitsPerPixel(); | 2038 results->depth = info.GetBitsPerPixel(); |
2021 results->depthPerComponent = info.GetBitsPerComponent(); | 2039 results->depthPerComponent = info.GetBitsPerComponent(); |
2022 results->isMonochrome = (results->depthPerComponent == 0); | 2040 results->isMonochrome = (results->depthPerComponent == 0); |
2023 } | 2041 } |
2024 | 2042 |
2025 } // namespace content | 2043 } // namespace content |
OLD | NEW |