| 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 <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 922 bool RenderWidgetHostViewAndroid::OnTouchEvent( | 922 bool RenderWidgetHostViewAndroid::OnTouchEvent( |
| 923 const ui::MotionEvent& event) { | 923 const ui::MotionEvent& event) { |
| 924 if (!host_ || !host_->delegate()) | 924 if (!host_ || !host_->delegate()) |
| 925 return false; | 925 return false; |
| 926 | 926 |
| 927 ComputeEventLatencyOSTouchHistograms(event); | 927 ComputeEventLatencyOSTouchHistograms(event); |
| 928 | 928 |
| 929 // If a browser-based widget consumes the touch event, it's critical that | 929 // If a browser-based widget consumes the touch event, it's critical that |
| 930 // touch event interception be disabled. This avoids issues with | 930 // touch event interception be disabled. This avoids issues with |
| 931 // double-handling for embedder-detected gestures like side swipe. | 931 // double-handling for embedder-detected gestures like side swipe. |
| 932 if (selection_controller_ && | 932 if (touch_selection_controller_ && |
| 933 selection_controller_->WillHandleTouchEvent(event)) { | 933 touch_selection_controller_->WillHandleTouchEvent(event)) { |
| 934 RequestDisallowInterceptTouchEvent(); | 934 RequestDisallowInterceptTouchEvent(); |
| 935 return true; | 935 return true; |
| 936 } | 936 } |
| 937 | 937 |
| 938 if (stylus_text_selector_.OnTouchEvent(event)) { | 938 if (stylus_text_selector_.OnTouchEvent(event)) { |
| 939 RequestDisallowInterceptTouchEvent(); | 939 RequestDisallowInterceptTouchEvent(); |
| 940 return true; | 940 return true; |
| 941 } | 941 } |
| 942 | 942 |
| 943 ui::FilteredGestureProvider::TouchHandlingResult result = | 943 ui::FilteredGestureProvider::TouchHandlingResult result = |
| (...skipping 18 matching lines...) Expand all Loading... |
| 962 // that BeginFrame requests made during ACTION_MOVE dispatch will be honored | 962 // that BeginFrame requests made during ACTION_MOVE dispatch will be honored |
| 963 // in the same vsync phase. | 963 // in the same vsync phase. |
| 964 if (observing_root_window_ && result.moved_beyond_slop_region) | 964 if (observing_root_window_ && result.moved_beyond_slop_region) |
| 965 AddBeginFrameRequest(BEGIN_FRAME); | 965 AddBeginFrameRequest(BEGIN_FRAME); |
| 966 | 966 |
| 967 return true; | 967 return true; |
| 968 } | 968 } |
| 969 | 969 |
| 970 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent( | 970 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent( |
| 971 const ui::MotionEvent& event) { | 971 const ui::MotionEvent& event) { |
| 972 return selection_controller_ && | 972 return touch_selection_controller_ && |
| 973 selection_controller_->WillHandleTouchEvent(event); | 973 touch_selection_controller_->WillHandleTouchEvent(event); |
| 974 } | 974 } |
| 975 | 975 |
| 976 void RenderWidgetHostViewAndroid::ResetGestureDetection() { | 976 void RenderWidgetHostViewAndroid::ResetGestureDetection() { |
| 977 const ui::MotionEvent* current_down_event = | 977 const ui::MotionEvent* current_down_event = |
| 978 gesture_provider_.GetCurrentDownEvent(); | 978 gesture_provider_.GetCurrentDownEvent(); |
| 979 if (!current_down_event) { | 979 if (!current_down_event) { |
| 980 // A hard reset ensures prevention of any timer-based events that might fire | 980 // A hard reset ensures prevention of any timer-based events that might fire |
| 981 // after a touch sequence has ended. | 981 // after a touch sequence has ended. |
| 982 gesture_provider_.ResetDetection(); | 982 gesture_provider_.ResetDetection(); |
| 983 return; | 983 return; |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1293 void RenderWidgetHostViewAndroid::SelectBetweenCoordinates( | 1293 void RenderWidgetHostViewAndroid::SelectBetweenCoordinates( |
| 1294 const gfx::PointF& base, | 1294 const gfx::PointF& base, |
| 1295 const gfx::PointF& extent) { | 1295 const gfx::PointF& extent) { |
| 1296 DCHECK(content_view_core_); | 1296 DCHECK(content_view_core_); |
| 1297 content_view_core_->SelectBetweenCoordinates(base, extent); | 1297 content_view_core_->SelectBetweenCoordinates(base, extent); |
| 1298 } | 1298 } |
| 1299 | 1299 |
| 1300 void RenderWidgetHostViewAndroid::OnSelectionEvent( | 1300 void RenderWidgetHostViewAndroid::OnSelectionEvent( |
| 1301 ui::SelectionEventType event) { | 1301 ui::SelectionEventType event) { |
| 1302 DCHECK(content_view_core_); | 1302 DCHECK(content_view_core_); |
| 1303 DCHECK(selection_controller_); | 1303 DCHECK(touch_selection_controller_); |
| 1304 // If a selection drag has started, it has taken over the active touch | 1304 // If a selection drag has started, it has taken over the active touch |
| 1305 // sequence. Immediately cancel gesture detection and any downstream touch | 1305 // sequence. Immediately cancel gesture detection and any downstream touch |
| 1306 // listeners (e.g., web content) to communicate this transfer. | 1306 // listeners (e.g., web content) to communicate this transfer. |
| 1307 if (event == ui::SELECTION_HANDLES_SHOWN && | 1307 if (event == ui::SELECTION_HANDLES_SHOWN && |
| 1308 gesture_provider_.GetCurrentDownEvent()) { | 1308 gesture_provider_.GetCurrentDownEvent()) { |
| 1309 ResetGestureDetection(); | 1309 ResetGestureDetection(); |
| 1310 } | 1310 } |
| 1311 content_view_core_->OnSelectionEvent( | 1311 content_view_core_->OnSelectionEvent( |
| 1312 event, selection_controller_->GetStartPosition(), | 1312 event, touch_selection_controller_->GetStartPosition(), |
| 1313 GetSelectionRect(*selection_controller_)); | 1313 GetSelectionRect(*touch_selection_controller_)); |
| 1314 } | 1314 } |
| 1315 | 1315 |
| 1316 std::unique_ptr<ui::TouchHandleDrawable> | 1316 std::unique_ptr<ui::TouchHandleDrawable> |
| 1317 RenderWidgetHostViewAndroid::CreateDrawable() { | 1317 RenderWidgetHostViewAndroid::CreateDrawable() { |
| 1318 DCHECK(content_view_core_); | 1318 DCHECK(content_view_core_); |
| 1319 if (!using_browser_compositor_) { | 1319 if (!using_browser_compositor_) { |
| 1320 if (!sync_compositor_) | 1320 if (!sync_compositor_) |
| 1321 return nullptr; | 1321 return nullptr; |
| 1322 return std::unique_ptr<ui::TouchHandleDrawable>( | 1322 return std::unique_ptr<ui::TouchHandleDrawable>( |
| 1323 sync_compositor_->client()->CreateDrawable()); | 1323 sync_compositor_->client()->CreateDrawable()); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1374 bool is_transparent) { | 1374 bool is_transparent) { |
| 1375 bool is_mobile_optimized = IsMobileOptimizedFrame(frame_metadata); | 1375 bool is_mobile_optimized = IsMobileOptimizedFrame(frame_metadata); |
| 1376 gesture_provider_.SetDoubleTapSupportForPageEnabled(!is_mobile_optimized); | 1376 gesture_provider_.SetDoubleTapSupportForPageEnabled(!is_mobile_optimized); |
| 1377 | 1377 |
| 1378 if (!content_view_core_) | 1378 if (!content_view_core_) |
| 1379 return; | 1379 return; |
| 1380 | 1380 |
| 1381 if (overscroll_controller_) | 1381 if (overscroll_controller_) |
| 1382 overscroll_controller_->OnFrameMetadataUpdated(frame_metadata); | 1382 overscroll_controller_->OnFrameMetadataUpdated(frame_metadata); |
| 1383 | 1383 |
| 1384 if (selection_controller_) { | 1384 if (touch_selection_controller_) { |
| 1385 selection_controller_->OnSelectionBoundsChanged( | 1385 touch_selection_controller_->OnSelectionBoundsChanged( |
| 1386 frame_metadata.selection.start, frame_metadata.selection.end); | 1386 frame_metadata.selection.start, frame_metadata.selection.end); |
| 1387 | 1387 |
| 1388 // Set parameters for adaptive handle orientation. | 1388 // Set parameters for adaptive handle orientation. |
| 1389 gfx::SizeF viewport_size(frame_metadata.scrollable_viewport_size); | 1389 gfx::SizeF viewport_size(frame_metadata.scrollable_viewport_size); |
| 1390 viewport_size.Scale(frame_metadata.page_scale_factor); | 1390 viewport_size.Scale(frame_metadata.page_scale_factor); |
| 1391 gfx::RectF viewport_rect(0.0f, frame_metadata.top_controls_height * | 1391 gfx::RectF viewport_rect(0.0f, frame_metadata.top_controls_height * |
| 1392 frame_metadata.top_controls_shown_ratio, | 1392 frame_metadata.top_controls_shown_ratio, |
| 1393 viewport_size.width(), viewport_size.height()); | 1393 viewport_size.width(), viewport_size.height()); |
| 1394 selection_controller_->OnViewportChanged(viewport_rect); | 1394 touch_selection_controller_->OnViewportChanged(viewport_rect); |
| 1395 } | 1395 } |
| 1396 | 1396 |
| 1397 UpdateBackgroundColor(is_transparent ? SK_ColorTRANSPARENT | 1397 UpdateBackgroundColor(is_transparent ? SK_ColorTRANSPARENT |
| 1398 : frame_metadata.root_background_color); | 1398 : frame_metadata.root_background_color); |
| 1399 | 1399 |
| 1400 view_.set_content_offset(gfx::Vector2dF(0.0f, | 1400 view_.set_content_offset(gfx::Vector2dF(0.0f, |
| 1401 frame_metadata.top_controls_height * | 1401 frame_metadata.top_controls_height * |
| 1402 frame_metadata.top_controls_shown_ratio)); | 1402 frame_metadata.top_controls_shown_ratio)); |
| 1403 | 1403 |
| 1404 float dip_scale = view_.GetDipScale(); | 1404 float dip_scale = view_.GetDipScale(); |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1593 if (sync_compositor_) | 1593 if (sync_compositor_) |
| 1594 sync_compositor_->DidSendBeginFrame(view_.GetWindowAndroid()); | 1594 sync_compositor_->DidSendBeginFrame(view_.GetWindowAndroid()); |
| 1595 } | 1595 } |
| 1596 | 1596 |
| 1597 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { | 1597 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { |
| 1598 bool needs_animate = false; | 1598 bool needs_animate = false; |
| 1599 if (overscroll_controller_ && !is_in_vr_) { | 1599 if (overscroll_controller_ && !is_in_vr_) { |
| 1600 needs_animate |= overscroll_controller_->Animate( | 1600 needs_animate |= overscroll_controller_->Animate( |
| 1601 frame_time, content_view_core_->GetViewAndroid()->GetLayer()); | 1601 frame_time, content_view_core_->GetViewAndroid()->GetLayer()); |
| 1602 } | 1602 } |
| 1603 if (selection_controller_) | 1603 if (touch_selection_controller_) |
| 1604 needs_animate |= selection_controller_->Animate(frame_time); | 1604 needs_animate |= touch_selection_controller_->Animate(frame_time); |
| 1605 return needs_animate; | 1605 return needs_animate; |
| 1606 } | 1606 } |
| 1607 | 1607 |
| 1608 void RenderWidgetHostViewAndroid::RequestDisallowInterceptTouchEvent() { | 1608 void RenderWidgetHostViewAndroid::RequestDisallowInterceptTouchEvent() { |
| 1609 if (content_view_core_) | 1609 if (content_view_core_) |
| 1610 content_view_core_->RequestDisallowInterceptTouchEvent(); | 1610 content_view_core_->RequestDisallowInterceptTouchEvent(); |
| 1611 } | 1611 } |
| 1612 | 1612 |
| 1613 void RenderWidgetHostViewAndroid::EvictDelegatedFrame() { | 1613 void RenderWidgetHostViewAndroid::EvictDelegatedFrame() { |
| 1614 DestroyDelegatedContent(); | 1614 DestroyDelegatedContent(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1638 InputEventAckState ack_result) { | 1638 InputEventAckState ack_result) { |
| 1639 if (overscroll_controller_) | 1639 if (overscroll_controller_) |
| 1640 overscroll_controller_->OnGestureEventAck(event, ack_result); | 1640 overscroll_controller_->OnGestureEventAck(event, ack_result); |
| 1641 | 1641 |
| 1642 if (content_view_core_) | 1642 if (content_view_core_) |
| 1643 content_view_core_->OnGestureEventAck(event, ack_result); | 1643 content_view_core_->OnGestureEventAck(event, ack_result); |
| 1644 } | 1644 } |
| 1645 | 1645 |
| 1646 InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent( | 1646 InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent( |
| 1647 const blink::WebInputEvent& input_event) { | 1647 const blink::WebInputEvent& input_event) { |
| 1648 if (selection_controller_ && | 1648 if (touch_selection_controller_ && |
| 1649 blink::WebInputEvent::IsGestureEventType(input_event.GetType())) { | 1649 blink::WebInputEvent::IsGestureEventType(input_event.GetType())) { |
| 1650 const blink::WebGestureEvent& gesture_event = | 1650 const blink::WebGestureEvent& gesture_event = |
| 1651 static_cast<const blink::WebGestureEvent&>(input_event); | 1651 static_cast<const blink::WebGestureEvent&>(input_event); |
| 1652 switch (gesture_event.GetType()) { | 1652 switch (gesture_event.GetType()) { |
| 1653 case blink::WebInputEvent::kGestureLongPress: | 1653 case blink::WebInputEvent::kGestureLongPress: |
| 1654 selection_controller_->HandleLongPressEvent( | 1654 touch_selection_controller_->HandleLongPressEvent( |
| 1655 base::TimeTicks() + | 1655 base::TimeTicks() + |
| 1656 base::TimeDelta::FromSecondsD(input_event.TimeStampSeconds()), | 1656 base::TimeDelta::FromSecondsD(input_event.TimeStampSeconds()), |
| 1657 gfx::PointF(gesture_event.x, gesture_event.y)); | 1657 gfx::PointF(gesture_event.x, gesture_event.y)); |
| 1658 break; | 1658 break; |
| 1659 | 1659 |
| 1660 case blink::WebInputEvent::kGestureTap: | 1660 case blink::WebInputEvent::kGestureTap: |
| 1661 selection_controller_->HandleTapEvent( | 1661 touch_selection_controller_->HandleTapEvent( |
| 1662 gfx::PointF(gesture_event.x, gesture_event.y), | 1662 gfx::PointF(gesture_event.x, gesture_event.y), |
| 1663 gesture_event.data.tap.tap_count); | 1663 gesture_event.data.tap.tap_count); |
| 1664 break; | 1664 break; |
| 1665 | 1665 |
| 1666 case blink::WebInputEvent::kGestureScrollBegin: | 1666 case blink::WebInputEvent::kGestureScrollBegin: |
| 1667 selection_controller_->OnScrollBeginEvent(); | 1667 touch_selection_controller_->OnScrollBeginEvent(); |
| 1668 break; | 1668 break; |
| 1669 | 1669 |
| 1670 default: | 1670 default: |
| 1671 break; | 1671 break; |
| 1672 } | 1672 } |
| 1673 } | 1673 } |
| 1674 | 1674 |
| 1675 if (overscroll_controller_ && | 1675 if (overscroll_controller_ && |
| 1676 blink::WebInputEvent::IsGestureEventType(input_event.GetType()) && | 1676 blink::WebInputEvent::IsGestureEventType(input_event.GetType()) && |
| 1677 overscroll_controller_->WillHandleGestureEvent( | 1677 overscroll_controller_->WillHandleGestureEvent( |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1824 host_->MoveCaret(point); | 1824 host_->MoveCaret(point); |
| 1825 } | 1825 } |
| 1826 | 1826 |
| 1827 void RenderWidgetHostViewAndroid::ShowContextMenuAtPoint( | 1827 void RenderWidgetHostViewAndroid::ShowContextMenuAtPoint( |
| 1828 const gfx::Point& point) { | 1828 const gfx::Point& point) { |
| 1829 if (host_) | 1829 if (host_) |
| 1830 host_->ShowContextMenuAtPoint(point); | 1830 host_->ShowContextMenuAtPoint(point); |
| 1831 } | 1831 } |
| 1832 | 1832 |
| 1833 void RenderWidgetHostViewAndroid::DismissTextHandles() { | 1833 void RenderWidgetHostViewAndroid::DismissTextHandles() { |
| 1834 if (selection_controller_) | 1834 if (touch_selection_controller_) |
| 1835 selection_controller_->HideAndDisallowShowingAutomatically(); | 1835 touch_selection_controller_->HideAndDisallowShowingAutomatically(); |
| 1836 } | 1836 } |
| 1837 | 1837 |
| 1838 void RenderWidgetHostViewAndroid::SetTextHandlesTemporarilyHidden(bool hidden) { | 1838 void RenderWidgetHostViewAndroid::SetTextHandlesTemporarilyHidden(bool hidden) { |
| 1839 if (selection_controller_) | 1839 if (touch_selection_controller_) |
| 1840 selection_controller_->SetTemporarilyHidden(hidden); | 1840 touch_selection_controller_->SetTemporarilyHidden(hidden); |
| 1841 } | 1841 } |
| 1842 | 1842 |
| 1843 SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { | 1843 SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { |
| 1844 return cached_background_color_; | 1844 return cached_background_color_; |
| 1845 } | 1845 } |
| 1846 | 1846 |
| 1847 void RenderWidgetHostViewAndroid::SetIsInVR(bool is_in_vr) { | 1847 void RenderWidgetHostViewAndroid::SetIsInVR(bool is_in_vr) { |
| 1848 is_in_vr_ = is_in_vr; | 1848 is_in_vr_ = is_in_vr; |
| 1849 } | 1849 } |
| 1850 | 1850 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1877 } | 1877 } |
| 1878 | 1878 |
| 1879 void RenderWidgetHostViewAndroid::SetContentViewCore( | 1879 void RenderWidgetHostViewAndroid::SetContentViewCore( |
| 1880 ContentViewCoreImpl* content_view_core) { | 1880 ContentViewCoreImpl* content_view_core) { |
| 1881 DCHECK(!content_view_core || !content_view_core_ || | 1881 DCHECK(!content_view_core || !content_view_core_ || |
| 1882 (content_view_core_ == content_view_core)); | 1882 (content_view_core_ == content_view_core)); |
| 1883 StopObservingRootWindow(); | 1883 StopObservingRootWindow(); |
| 1884 | 1884 |
| 1885 bool resize = false; | 1885 bool resize = false; |
| 1886 if (content_view_core != content_view_core_) { | 1886 if (content_view_core != content_view_core_) { |
| 1887 selection_controller_.reset(); | 1887 touch_selection_controller_.reset(); |
| 1888 RunAckCallbacks(); | 1888 RunAckCallbacks(); |
| 1889 // TODO(yusufo) : Get rid of the below conditions and have a better handling | 1889 // TODO(yusufo) : Get rid of the below conditions and have a better handling |
| 1890 // for resizing after crbug.com/628302 is handled. | 1890 // for resizing after crbug.com/628302 is handled. |
| 1891 bool is_size_initialized = !content_view_core | 1891 bool is_size_initialized = !content_view_core |
| 1892 || content_view_core->GetViewportSizeDip().width() != 0 | 1892 || content_view_core->GetViewportSizeDip().width() != 0 |
| 1893 || content_view_core->GetViewportSizeDip().height() != 0; | 1893 || content_view_core->GetViewportSizeDip().height() != 0; |
| 1894 if (content_view_core_ || is_size_initialized) | 1894 if (content_view_core_ || is_size_initialized) |
| 1895 resize = true; | 1895 resize = true; |
| 1896 if (content_view_core_) { | 1896 if (content_view_core_) { |
| 1897 content_view_core_->RemoveObserver(this); | 1897 content_view_core_->RemoveObserver(this); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1921 sync_compositor_.reset(); | 1921 sync_compositor_.reset(); |
| 1922 return; | 1922 return; |
| 1923 } | 1923 } |
| 1924 | 1924 |
| 1925 if (is_showing_ && view_.GetWindowAndroid()) | 1925 if (is_showing_ && view_.GetWindowAndroid()) |
| 1926 StartObservingRootWindow(); | 1926 StartObservingRootWindow(); |
| 1927 | 1927 |
| 1928 if (resize) | 1928 if (resize) |
| 1929 WasResized(); | 1929 WasResized(); |
| 1930 | 1930 |
| 1931 if (!selection_controller_) | 1931 if (!touch_selection_controller_) |
| 1932 selection_controller_ = CreateSelectionController(this, content_view_core_); | 1932 touch_selection_controller_ = |
| 1933 CreateSelectionController(this, content_view_core_); |
| 1933 | 1934 |
| 1934 if (content_view_core_) | 1935 if (content_view_core_) |
| 1935 CreateOverscrollControllerIfPossible(); | 1936 CreateOverscrollControllerIfPossible(); |
| 1936 } | 1937 } |
| 1937 | 1938 |
| 1938 void RenderWidgetHostViewAndroid::RunAckCallbacks() { | 1939 void RenderWidgetHostViewAndroid::RunAckCallbacks() { |
| 1939 while (!ack_callbacks_.empty()) { | 1940 while (!ack_callbacks_.empty()) { |
| 1940 ack_callbacks_.front().Run(); | 1941 ack_callbacks_.front().Run(); |
| 1941 ack_callbacks_.pop(); | 1942 ack_callbacks_.pop(); |
| 1942 } | 1943 } |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2194 | 2195 |
| 2195 ui::WindowAndroidCompositor* compositor = window_android->GetCompositor(); | 2196 ui::WindowAndroidCompositor* compositor = window_android->GetCompositor(); |
| 2196 if (!compositor) | 2197 if (!compositor) |
| 2197 return; | 2198 return; |
| 2198 | 2199 |
| 2199 overscroll_controller_ = base::MakeUnique<OverscrollControllerAndroid>( | 2200 overscroll_controller_ = base::MakeUnique<OverscrollControllerAndroid>( |
| 2200 overscroll_refresh_handler, compositor, view_.GetDipScale()); | 2201 overscroll_refresh_handler, compositor, view_.GetDipScale()); |
| 2201 } | 2202 } |
| 2202 | 2203 |
| 2203 } // namespace content | 2204 } // namespace content |
| OLD | NEW |