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

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

Issue 359033002: [Android] Enable composited selection updates (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@input_native_handles_0_compositor
Patch Set: Rebase Created 6 years, 3 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 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 is_showing_(!widget_host->is_hidden()), 271 is_showing_(!widget_host->is_hidden()),
272 content_view_core_(NULL), 272 content_view_core_(NULL),
273 ime_adapter_android_(this), 273 ime_adapter_android_(this),
274 cached_background_color_(SK_ColorWHITE), 274 cached_background_color_(SK_ColorWHITE),
275 last_output_surface_id_(kUndefinedOutputSurfaceId), 275 last_output_surface_id_(kUndefinedOutputSurfaceId),
276 overscroll_effect_enabled_( 276 overscroll_effect_enabled_(
277 !base::CommandLine::ForCurrentProcess()->HasSwitch( 277 !base::CommandLine::ForCurrentProcess()->HasSwitch(
278 switches::kDisableOverscrollEdgeEffect)), 278 switches::kDisableOverscrollEdgeEffect)),
279 gesture_provider_(CreateGestureProviderConfig(), this), 279 gesture_provider_(CreateGestureProviderConfig(), this),
280 gesture_text_selector_(this), 280 gesture_text_selector_(this),
281 touch_scrolling_(false),
282 potentially_active_fling_count_(0),
283 accelerated_surface_route_id_(0), 281 accelerated_surface_route_id_(0),
284 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( 282 using_synchronous_compositor_(SynchronousCompositorImpl::FromID(
285 widget_host->GetProcess()->GetID(), 283 widget_host->GetProcess()->GetID(),
286 widget_host->GetRoutingID()) != NULL), 284 widget_host->GetRoutingID()) != NULL),
287 frame_evictor_(new DelegatedFrameEvictor(this)), 285 frame_evictor_(new DelegatedFrameEvictor(this)),
288 locks_on_frame_count_(0), 286 locks_on_frame_count_(0),
289 observing_root_window_(false), 287 observing_root_window_(false),
290 weak_ptr_factory_(this) { 288 weak_ptr_factory_(this) {
291 host_->SetView(this); 289 host_->SetView(this);
292 SetContentViewCore(content_view_core); 290 SetContentViewCore(content_view_core);
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 726
729 void RenderWidgetHostViewAndroid::ResetGestureDetection() { 727 void RenderWidgetHostViewAndroid::ResetGestureDetection() {
730 const ui::MotionEvent* current_down_event = 728 const ui::MotionEvent* current_down_event =
731 gesture_provider_.GetCurrentDownEvent(); 729 gesture_provider_.GetCurrentDownEvent();
732 if (!current_down_event) 730 if (!current_down_event)
733 return; 731 return;
734 732
735 scoped_ptr<ui::MotionEvent> cancel_event = current_down_event->Cancel(); 733 scoped_ptr<ui::MotionEvent> cancel_event = current_down_event->Cancel();
736 DCHECK(cancel_event); 734 DCHECK(cancel_event);
737 OnTouchEvent(*cancel_event); 735 OnTouchEvent(*cancel_event);
738
739 touch_scrolling_ = false;
740 potentially_active_fling_count_ = 0;
741 OnContentScrollingChange();
742 } 736 }
743 737
744 void RenderWidgetHostViewAndroid::SetDoubleTapSupportEnabled(bool enabled) { 738 void RenderWidgetHostViewAndroid::SetDoubleTapSupportEnabled(bool enabled) {
745 gesture_provider_.SetDoubleTapSupportForPlatformEnabled(enabled); 739 gesture_provider_.SetDoubleTapSupportForPlatformEnabled(enabled);
746 } 740 }
747 741
748 void RenderWidgetHostViewAndroid::SetMultiTouchZoomSupportEnabled( 742 void RenderWidgetHostViewAndroid::SetMultiTouchZoomSupportEnabled(
749 bool enabled) { 743 bool enabled) {
750 gesture_provider_.SetMultiTouchZoomSupportEnabled(enabled); 744 gesture_provider_.SetMultiTouchZoomSupportEnabled(enabled);
751 } 745 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 return; 799 return;
806 } 800 }
807 801
808 std::string utf8_selection = base::UTF16ToUTF8(text.substr(pos, n)); 802 std::string utf8_selection = base::UTF16ToUTF8(text.substr(pos, n));
809 803
810 content_view_core_->OnSelectionChanged(utf8_selection); 804 content_view_core_->OnSelectionChanged(utf8_selection);
811 } 805 }
812 806
813 void RenderWidgetHostViewAndroid::SelectionBoundsChanged( 807 void RenderWidgetHostViewAndroid::SelectionBoundsChanged(
814 const ViewHostMsg_SelectionBounds_Params& params) { 808 const ViewHostMsg_SelectionBounds_Params& params) {
815 if (!selection_controller_) 809 NOTREACHED() << "Selection bounds should be routed through the compositor.";
816 return;
817
818 gfx::RectF start_rect(params.anchor_rect);
819 gfx::RectF end_rect(params.focus_rect);
820 if (params.is_anchor_first)
821 std::swap(start_rect, end_rect);
822
823 cc::ViewportSelectionBound start_bound, end_bound;
824 start_bound.visible = true;
825 end_bound.visible = true;
826 start_bound.edge_top = start_rect.origin();
827 start_bound.edge_bottom = start_rect.bottom_left();
828 end_bound.edge_top = end_rect.origin();
829 end_bound.edge_bottom = end_rect.bottom_left();
830
831 if (params.anchor_rect == params.focus_rect) {
832 if (params.anchor_rect.x() || params.anchor_rect.y())
833 start_bound.type = end_bound.type = cc::SELECTION_BOUND_CENTER;
834 } else {
835 start_bound.type = params.anchor_dir == blink::WebTextDirectionRightToLeft
836 ? cc::SELECTION_BOUND_LEFT
837 : cc::SELECTION_BOUND_RIGHT;
838 end_bound.type = params.focus_dir == blink::WebTextDirectionRightToLeft
839 ? cc::SELECTION_BOUND_RIGHT
840 : cc::SELECTION_BOUND_LEFT;
841 }
842
843 selection_controller_->OnSelectionBoundsChanged(start_bound, end_bound);
844 } 810 }
845 811
846 void RenderWidgetHostViewAndroid::SetBackgroundOpaque(bool opaque) { 812 void RenderWidgetHostViewAndroid::SetBackgroundOpaque(bool opaque) {
847 RenderWidgetHostViewBase::SetBackgroundOpaque(opaque); 813 RenderWidgetHostViewBase::SetBackgroundOpaque(opaque);
848 host_->SetBackgroundOpaque(opaque); 814 host_->SetBackgroundOpaque(opaque);
849 } 815 }
850 816
851 void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( 817 void RenderWidgetHostViewAndroid::CopyFromCompositingSurface(
852 const gfx::Rect& src_subrect, 818 const gfx::Rect& src_subrect,
853 const gfx::Size& dst_size, 819 const gfx::Size& dst_size,
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
1231 // web design, so text will be legible without zooming). Also disable 1197 // web design, so text will be legible without zooming). Also disable
1232 // double tap and pinch for pages that prevent zooming in or out. 1198 // double tap and pinch for pages that prevent zooming in or out.
1233 bool has_mobile_viewport = HasMobileViewport(frame_metadata); 1199 bool has_mobile_viewport = HasMobileViewport(frame_metadata);
1234 bool has_fixed_page_scale = HasFixedPageScale(frame_metadata); 1200 bool has_fixed_page_scale = HasFixedPageScale(frame_metadata);
1235 gesture_provider_.SetDoubleTapSupportForPageEnabled( 1201 gesture_provider_.SetDoubleTapSupportForPageEnabled(
1236 !has_fixed_page_scale && !has_mobile_viewport); 1202 !has_fixed_page_scale && !has_mobile_viewport);
1237 1203
1238 if (!content_view_core_) 1204 if (!content_view_core_)
1239 return; 1205 return;
1240 1206
1207 DCHECK(selection_controller_);
1208 selection_controller_->OnSelectionBoundsChanged(
1209 frame_metadata.selection_start, frame_metadata.selection_end);
1210
1241 // All offsets and sizes are in CSS pixels. 1211 // All offsets and sizes are in CSS pixels.
1242 content_view_core_->UpdateFrameInfo( 1212 content_view_core_->UpdateFrameInfo(
1243 frame_metadata.root_scroll_offset, 1213 frame_metadata.root_scroll_offset,
1244 frame_metadata.page_scale_factor, 1214 frame_metadata.page_scale_factor,
1245 gfx::Vector2dF(frame_metadata.min_page_scale_factor, 1215 gfx::Vector2dF(frame_metadata.min_page_scale_factor,
1246 frame_metadata.max_page_scale_factor), 1216 frame_metadata.max_page_scale_factor),
1247 frame_metadata.root_layer_size, 1217 frame_metadata.root_layer_size,
1248 frame_metadata.scrollable_viewport_size, 1218 frame_metadata.scrollable_viewport_size,
1249 frame_metadata.location_bar_offset, 1219 frame_metadata.location_bar_offset,
1250 frame_metadata.location_bar_content_translation); 1220 frame_metadata.location_bar_content_translation);
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1352 } 1322 }
1353 1323
1354 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { 1324 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) {
1355 bool needs_animate = 1325 bool needs_animate =
1356 overscroll_effect_ ? overscroll_effect_->Animate(frame_time) : false; 1326 overscroll_effect_ ? overscroll_effect_->Animate(frame_time) : false;
1357 if (selection_controller_) 1327 if (selection_controller_)
1358 needs_animate |= selection_controller_->Animate(frame_time); 1328 needs_animate |= selection_controller_->Animate(frame_time);
1359 return needs_animate; 1329 return needs_animate;
1360 } 1330 }
1361 1331
1362 void RenderWidgetHostViewAndroid::OnContentScrollingChange() {
1363 if (selection_controller_)
1364 selection_controller_->SetTemporarilyHidden(IsContentScrolling());
1365 }
1366
1367 bool RenderWidgetHostViewAndroid::IsContentScrolling() const {
1368 return touch_scrolling_ || potentially_active_fling_count_ > 0;
1369 }
1370
1371 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( 1332 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer(
1372 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, 1333 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params,
1373 int gpu_host_id) { 1334 int gpu_host_id) {
1374 NOTREACHED(); 1335 NOTREACHED();
1375 } 1336 }
1376 1337
1377 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() { 1338 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() {
1378 NOTREACHED(); 1339 NOTREACHED();
1379 } 1340 }
1380 1341
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1427 void RenderWidgetHostViewAndroid::GestureEventAck( 1388 void RenderWidgetHostViewAndroid::GestureEventAck(
1428 const blink::WebGestureEvent& event, 1389 const blink::WebGestureEvent& event,
1429 InputEventAckState ack_result) { 1390 InputEventAckState ack_result) {
1430 // The overscroll effect requires an explicit release signal that may not be 1391 // The overscroll effect requires an explicit release signal that may not be
1431 // sent from the renderer compositor. 1392 // sent from the renderer compositor.
1432 if (event.type == blink::WebInputEvent::GestureScrollEnd || 1393 if (event.type == blink::WebInputEvent::GestureScrollEnd ||
1433 event.type == blink::WebInputEvent::GestureFlingStart) { 1394 event.type == blink::WebInputEvent::GestureFlingStart) {
1434 DidOverscroll(DidOverscrollParams()); 1395 DidOverscroll(DidOverscrollParams());
1435 } 1396 }
1436 1397
1437 switch (event.type) {
1438 case blink::WebInputEvent::GestureScrollBegin:
1439 touch_scrolling_ = true;
1440 potentially_active_fling_count_ = 0;
1441 OnContentScrollingChange();
1442 break;
1443 case blink::WebInputEvent::GestureScrollEnd:
1444 touch_scrolling_ = false;
1445 OnContentScrollingChange();
1446 break;
1447 case blink::WebInputEvent::GestureFlingStart:
1448 touch_scrolling_ = false;
1449 if (ack_result == INPUT_EVENT_ACK_STATE_CONSUMED)
1450 ++potentially_active_fling_count_;
1451 OnContentScrollingChange();
1452 break;
1453 default:
1454 break;
1455 }
1456
1457 if (content_view_core_) 1398 if (content_view_core_)
1458 content_view_core_->OnGestureEventAck(event, ack_result); 1399 content_view_core_->OnGestureEventAck(event, ack_result);
1459 } 1400 }
1460 1401
1461 InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent( 1402 InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent(
1462 const blink::WebInputEvent& input_event) { 1403 const blink::WebInputEvent& input_event) {
1463 if (selection_controller_) { 1404 if (selection_controller_) {
1464 switch (input_event.type) { 1405 switch (input_event.type) {
1465 case blink::WebInputEvent::GestureLongPress: 1406 case blink::WebInputEvent::GestureLongPress:
1466 selection_controller_->OnLongPressEvent(); 1407 selection_controller_->OnLongPressEvent();
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1608 gfx::ScaleVector2d(params.current_fling_velocity, 1549 gfx::ScaleVector2d(params.current_fling_velocity,
1609 device_scale_factor), 1550 device_scale_factor),
1610 gfx::ScaleVector2d( 1551 gfx::ScaleVector2d(
1611 params.causal_event_viewport_point.OffsetFromOrigin(), 1552 params.causal_event_viewport_point.OffsetFromOrigin(),
1612 device_scale_factor))) { 1553 device_scale_factor))) {
1613 SetNeedsAnimate(); 1554 SetNeedsAnimate();
1614 } 1555 }
1615 } 1556 }
1616 1557
1617 void RenderWidgetHostViewAndroid::DidStopFlinging() { 1558 void RenderWidgetHostViewAndroid::DidStopFlinging() {
1618 if (potentially_active_fling_count_) {
1619 --potentially_active_fling_count_;
1620 OnContentScrollingChange();
1621 }
1622
1623 if (content_view_core_) 1559 if (content_view_core_)
1624 content_view_core_->DidStopFlinging(); 1560 content_view_core_->DidStopFlinging();
1625 } 1561 }
1626 1562
1627 void RenderWidgetHostViewAndroid::SetContentViewCore( 1563 void RenderWidgetHostViewAndroid::SetContentViewCore(
1628 ContentViewCoreImpl* content_view_core) { 1564 ContentViewCoreImpl* content_view_core) {
1629 RemoveLayers(); 1565 RemoveLayers();
1630 StopObservingRootWindow(); 1566 StopObservingRootWindow();
1631 1567
1632 bool resize = false; 1568 bool resize = false;
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
1867 results->orientationAngle = display.RotationAsDegree(); 1803 results->orientationAngle = display.RotationAsDegree();
1868 results->orientationType = 1804 results->orientationType =
1869 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); 1805 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display);
1870 gfx::DeviceDisplayInfo info; 1806 gfx::DeviceDisplayInfo info;
1871 results->depth = info.GetBitsPerPixel(); 1807 results->depth = info.GetBitsPerPixel();
1872 results->depthPerComponent = info.GetBitsPerComponent(); 1808 results->depthPerComponent = info.GetBitsPerComponent();
1873 results->isMonochrome = (results->depthPerComponent == 0); 1809 results->isMonochrome = (results->depthPerComponent == 0);
1874 } 1810 }
1875 1811
1876 } // namespace content 1812 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698