| 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/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/callback_helpers.h" | 11 #include "base/callback_helpers.h" |
| 12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/message_loop/message_loop.h" | 14 #include "base/message_loop/message_loop.h" |
| 15 #include "base/metrics/histogram.h" | 15 #include "base/metrics/histogram.h" |
| 16 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
| 17 #include "base/sys_info.h" | 17 #include "base/sys_info.h" |
| 18 #include "base/threading/worker_pool.h" | 18 #include "base/threading/worker_pool.h" |
| 19 #include "cc/base/latency_info_swap_promise.h" | 19 #include "cc/base/latency_info_swap_promise.h" |
| 20 #include "cc/layers/delegated_frame_provider.h" | 20 #include "cc/layers/delegated_frame_provider.h" |
| 21 #include "cc/layers/delegated_renderer_layer.h" | 21 #include "cc/layers/delegated_renderer_layer.h" |
| 22 #include "cc/layers/layer.h" | 22 #include "cc/layers/layer.h" |
| 23 #include "cc/output/compositor_frame.h" | 23 #include "cc/output/compositor_frame.h" |
| 24 #include "cc/output/compositor_frame_ack.h" | 24 #include "cc/output/compositor_frame_ack.h" |
| 25 #include "cc/output/copy_output_request.h" | 25 #include "cc/output/copy_output_request.h" |
| 26 #include "cc/output/copy_output_result.h" | 26 #include "cc/output/copy_output_result.h" |
| 27 #include "cc/resources/single_release_callback.h" | 27 #include "cc/resources/single_release_callback.h" |
| 28 #include "cc/trees/layer_tree_host.h" | 28 #include "cc/trees/layer_tree_host.h" |
| 29 #include "content/browser/accessibility/browser_accessibility_manager_android.h" | 29 #include "content/browser/accessibility/browser_accessibility_manager_android.h" |
| 30 #include "content/browser/android/composited_touch_handle_drawable.h" |
| 30 #include "content/browser/android/content_view_core_impl.h" | 31 #include "content/browser/android/content_view_core_impl.h" |
| 31 #include "content/browser/android/in_process/synchronous_compositor_impl.h" | 32 #include "content/browser/android/in_process/synchronous_compositor_impl.h" |
| 32 #include "content/browser/android/overscroll_glow.h" | 33 #include "content/browser/android/overscroll_glow.h" |
| 33 #include "content/browser/devtools/render_view_devtools_agent_host.h" | 34 #include "content/browser/devtools/render_view_devtools_agent_host.h" |
| 34 #include "content/browser/gpu/compositor_util.h" | 35 #include "content/browser/gpu/compositor_util.h" |
| 35 #include "content/browser/gpu/gpu_data_manager_impl.h" | 36 #include "content/browser/gpu/gpu_data_manager_impl.h" |
| 36 #include "content/browser/gpu/gpu_process_host_ui_shim.h" | 37 #include "content/browser/gpu/gpu_process_host_ui_shim.h" |
| 37 #include "content/browser/gpu/gpu_surface_tracker.h" | 38 #include "content/browser/gpu/gpu_surface_tracker.h" |
| 38 #include "content/browser/media/media_web_contents_observer.h" | 39 #include "content/browser/media/media_web_contents_observer.h" |
| 39 #include "content/browser/renderer_host/compositor_impl_android.h" | 40 #include "content/browser/renderer_host/compositor_impl_android.h" |
| 40 #include "content/browser/renderer_host/dip_util.h" | 41 #include "content/browser/renderer_host/dip_util.h" |
| 41 #include "content/browser/renderer_host/image_transport_factory_android.h" | 42 #include "content/browser/renderer_host/image_transport_factory_android.h" |
| 42 #include "content/browser/renderer_host/input/synthetic_gesture_target_android.h
" | 43 #include "content/browser/renderer_host/input/synthetic_gesture_target_android.h
" |
| 44 #include "content/browser/renderer_host/input/touch_selection_controller.h" |
| 43 #include "content/browser/renderer_host/input/web_input_event_builders_android.h
" | 45 #include "content/browser/renderer_host/input/web_input_event_builders_android.h
" |
| 44 #include "content/browser/renderer_host/input/web_input_event_util.h" | 46 #include "content/browser/renderer_host/input/web_input_event_util.h" |
| 45 #include "content/browser/renderer_host/render_process_host_impl.h" | 47 #include "content/browser/renderer_host/render_process_host_impl.h" |
| 46 #include "content/browser/renderer_host/render_view_host_impl.h" | 48 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 47 #include "content/browser/renderer_host/render_widget_host_impl.h" | 49 #include "content/browser/renderer_host/render_widget_host_impl.h" |
| 48 #include "content/common/gpu/client/gl_helper.h" | 50 #include "content/common/gpu/client/gl_helper.h" |
| 49 #include "content/common/gpu/gpu_messages.h" | 51 #include "content/common/gpu/gpu_messages.h" |
| 50 #include "content/common/input/did_overscroll_params.h" | 52 #include "content/common/input/did_overscroll_params.h" |
| 51 #include "content/common/input_messages.h" | 53 #include "content/common/input_messages.h" |
| 52 #include "content/common/view_messages.h" | 54 #include "content/common/view_messages.h" |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 content_view_core_(NULL), | 186 content_view_core_(NULL), |
| 185 ime_adapter_android_(this), | 187 ime_adapter_android_(this), |
| 186 cached_background_color_(SK_ColorWHITE), | 188 cached_background_color_(SK_ColorWHITE), |
| 187 last_output_surface_id_(kUndefinedOutputSurfaceId), | 189 last_output_surface_id_(kUndefinedOutputSurfaceId), |
| 188 weak_ptr_factory_(this), | 190 weak_ptr_factory_(this), |
| 189 overscroll_effect_enabled_(!CommandLine::ForCurrentProcess()->HasSwitch( | 191 overscroll_effect_enabled_(!CommandLine::ForCurrentProcess()->HasSwitch( |
| 190 switches::kDisableOverscrollEdgeEffect)), | 192 switches::kDisableOverscrollEdgeEffect)), |
| 191 overscroll_effect_(OverscrollGlow::Create(overscroll_effect_enabled_)), | 193 overscroll_effect_(OverscrollGlow::Create(overscroll_effect_enabled_)), |
| 192 gesture_provider_(CreateGestureProviderConfig(), this), | 194 gesture_provider_(CreateGestureProviderConfig(), this), |
| 193 gesture_text_selector_(this), | 195 gesture_text_selector_(this), |
| 196 touch_scrolling_(false), |
| 197 potentially_active_fling_count_(0), |
| 194 flush_input_requested_(false), | 198 flush_input_requested_(false), |
| 195 accelerated_surface_route_id_(0), | 199 accelerated_surface_route_id_(0), |
| 196 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( | 200 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( |
| 197 widget_host->GetProcess()->GetID(), | 201 widget_host->GetProcess()->GetID(), |
| 198 widget_host->GetRoutingID()) != NULL), | 202 widget_host->GetRoutingID()) != NULL), |
| 199 frame_evictor_(new DelegatedFrameEvictor(this)), | 203 frame_evictor_(new DelegatedFrameEvictor(this)), |
| 200 locks_on_frame_count_(0), | 204 locks_on_frame_count_(0), |
| 201 observing_root_window_(false) { | 205 observing_root_window_(false) { |
| 202 host_->SetView(this); | 206 host_->SetView(this); |
| 203 SetContentViewCore(content_view_core); | 207 SetContentViewCore(content_view_core); |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 const gfx::Rect rect) { | 557 const gfx::Rect rect) { |
| 554 if (content_view_core_) | 558 if (content_view_core_) |
| 555 content_view_core_->OnSmartClipDataExtracted(text, html, rect); | 559 content_view_core_->OnSmartClipDataExtracted(text, html, rect); |
| 556 } | 560 } |
| 557 | 561 |
| 558 bool RenderWidgetHostViewAndroid::OnTouchEvent( | 562 bool RenderWidgetHostViewAndroid::OnTouchEvent( |
| 559 const ui::MotionEvent& event) { | 563 const ui::MotionEvent& event) { |
| 560 if (!host_) | 564 if (!host_) |
| 561 return false; | 565 return false; |
| 562 | 566 |
| 567 if (selection_controller_ && |
| 568 selection_controller_->WillHandleTouchEvent(event)) |
| 569 return true; |
| 570 |
| 563 if (!gesture_provider_.OnTouchEvent(event)) | 571 if (!gesture_provider_.OnTouchEvent(event)) |
| 564 return false; | 572 return false; |
| 565 | 573 |
| 566 if (gesture_text_selector_.OnTouchEvent(event)) { | 574 if (gesture_text_selector_.OnTouchEvent(event)) { |
| 567 gesture_provider_.OnTouchEventAck(false); | 575 gesture_provider_.OnTouchEventAck(false); |
| 568 return true; | 576 return true; |
| 569 } | 577 } |
| 570 | 578 |
| 571 // Short-circuit touch forwarding if no touch handlers exist. | 579 // Short-circuit touch forwarding if no touch handlers exist. |
| 572 if (!host_->ShouldForwardTouchEvent()) { | 580 if (!host_->ShouldForwardTouchEvent()) { |
| 573 const bool event_consumed = false; | 581 const bool event_consumed = false; |
| 574 gesture_provider_.OnTouchEventAck(event_consumed); | 582 gesture_provider_.OnTouchEventAck(event_consumed); |
| 575 return true; | 583 return true; |
| 576 } | 584 } |
| 577 | 585 |
| 578 SendTouchEvent(CreateWebTouchEventFromMotionEvent(event)); | 586 SendTouchEvent(CreateWebTouchEventFromMotionEvent(event)); |
| 579 return true; | 587 return true; |
| 580 } | 588 } |
| 581 | 589 |
| 590 bool RenderWidgetHostViewAndroid::OnTouchHandleEvent( |
| 591 const ui::MotionEvent& event) { |
| 592 return selection_controller_ && |
| 593 selection_controller_->WillHandleTouchEvent(event); |
| 594 } |
| 595 |
| 582 void RenderWidgetHostViewAndroid::ResetGestureDetection() { | 596 void RenderWidgetHostViewAndroid::ResetGestureDetection() { |
| 583 const ui::MotionEvent* current_down_event = | 597 const ui::MotionEvent* current_down_event = |
| 584 gesture_provider_.GetCurrentDownEvent(); | 598 gesture_provider_.GetCurrentDownEvent(); |
| 585 if (!current_down_event) | 599 if (!current_down_event) |
| 586 return; | 600 return; |
| 587 | 601 |
| 588 scoped_ptr<ui::MotionEvent> cancel_event = current_down_event->Cancel(); | 602 scoped_ptr<ui::MotionEvent> cancel_event = current_down_event->Cancel(); |
| 589 DCHECK(cancel_event); | 603 DCHECK(cancel_event); |
| 590 OnTouchEvent(*cancel_event); | 604 OnTouchEvent(*cancel_event); |
| 605 |
| 606 touch_scrolling_ = false; |
| 607 potentially_active_fling_count_ = 0; |
| 608 OnContentScrollingChange(); |
| 591 } | 609 } |
| 592 | 610 |
| 593 void RenderWidgetHostViewAndroid::SetDoubleTapSupportEnabled(bool enabled) { | 611 void RenderWidgetHostViewAndroid::SetDoubleTapSupportEnabled(bool enabled) { |
| 594 gesture_provider_.SetDoubleTapSupportForPlatformEnabled(enabled); | 612 gesture_provider_.SetDoubleTapSupportForPlatformEnabled(enabled); |
| 595 } | 613 } |
| 596 | 614 |
| 597 void RenderWidgetHostViewAndroid::SetMultiTouchZoomSupportEnabled( | 615 void RenderWidgetHostViewAndroid::SetMultiTouchZoomSupportEnabled( |
| 598 bool enabled) { | 616 bool enabled) { |
| 599 gesture_provider_.SetMultiTouchZoomSupportEnabled(enabled); | 617 gesture_provider_.SetMultiTouchZoomSupportEnabled(enabled); |
| 600 } | 618 } |
| 601 | 619 |
| 602 void RenderWidgetHostViewAndroid::ImeCancelComposition() { | 620 void RenderWidgetHostViewAndroid::ImeCancelComposition() { |
| 603 ime_adapter_android_.CancelComposition(); | 621 ime_adapter_android_.CancelComposition(); |
| 604 } | 622 } |
| 605 | 623 |
| 606 void RenderWidgetHostViewAndroid::FocusedNodeChanged(bool is_editable_node) { | 624 void RenderWidgetHostViewAndroid::FocusedNodeChanged(bool is_editable_node) { |
| 607 ime_adapter_android_.FocusedNodeChanged(is_editable_node); | 625 ime_adapter_android_.FocusedNodeChanged(is_editable_node); |
| 626 if (selection_controller_) |
| 627 selection_controller_->OnSelectionEditable(is_editable_node); |
| 608 } | 628 } |
| 609 | 629 |
| 610 void RenderWidgetHostViewAndroid::RenderProcessGone( | 630 void RenderWidgetHostViewAndroid::RenderProcessGone( |
| 611 base::TerminationStatus status, int error_code) { | 631 base::TerminationStatus status, int error_code) { |
| 612 Destroy(); | 632 Destroy(); |
| 613 } | 633 } |
| 614 | 634 |
| 615 void RenderWidgetHostViewAndroid::Destroy() { | 635 void RenderWidgetHostViewAndroid::Destroy() { |
| 616 RemoveLayers(); | 636 RemoveLayers(); |
| 617 SetContentViewCore(NULL); | 637 SetContentViewCore(NULL); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 643 return; | 663 return; |
| 644 } | 664 } |
| 645 | 665 |
| 646 std::string utf8_selection = base::UTF16ToUTF8(text.substr(pos, n)); | 666 std::string utf8_selection = base::UTF16ToUTF8(text.substr(pos, n)); |
| 647 | 667 |
| 648 content_view_core_->OnSelectionChanged(utf8_selection); | 668 content_view_core_->OnSelectionChanged(utf8_selection); |
| 649 } | 669 } |
| 650 | 670 |
| 651 void RenderWidgetHostViewAndroid::SelectionBoundsChanged( | 671 void RenderWidgetHostViewAndroid::SelectionBoundsChanged( |
| 652 const ViewHostMsg_SelectionBounds_Params& params) { | 672 const ViewHostMsg_SelectionBounds_Params& params) { |
| 653 if (content_view_core_) { | 673 if (!selection_controller_) |
| 654 content_view_core_->OnSelectionBoundsChanged(params); | 674 return; |
| 675 |
| 676 gfx::RectF anchor_rect(params.anchor_rect); |
| 677 gfx::RectF focus_rect(params.focus_rect); |
| 678 if (params.is_anchor_first) |
| 679 std::swap(anchor_rect, focus_rect); |
| 680 |
| 681 TouchHandleOrientation anchor_orientation(TOUCH_HANDLE_ORIENTATION_UNDEFINED); |
| 682 TouchHandleOrientation focus_orientation(TOUCH_HANDLE_ORIENTATION_UNDEFINED); |
| 683 if (params.anchor_rect == params.focus_rect) { |
| 684 if (params.anchor_rect.x() && params.anchor_rect.y()) |
| 685 anchor_orientation = focus_orientation = TOUCH_HANDLE_CENTER; |
| 686 } else { |
| 687 anchor_orientation = params.anchor_dir == blink::WebTextDirectionRightToLeft |
| 688 ? TOUCH_HANDLE_LEFT |
| 689 : TOUCH_HANDLE_RIGHT; |
| 690 focus_orientation = params.focus_dir == blink::WebTextDirectionRightToLeft |
| 691 ? TOUCH_HANDLE_RIGHT |
| 692 : TOUCH_HANDLE_LEFT; |
| 655 } | 693 } |
| 694 |
| 695 selection_controller_->OnSelectionBoundsChanged(anchor_rect, |
| 696 anchor_orientation, |
| 697 true, |
| 698 focus_rect, |
| 699 focus_orientation, |
| 700 true); |
| 656 } | 701 } |
| 657 | 702 |
| 658 void RenderWidgetHostViewAndroid::ScrollOffsetChanged() { | 703 void RenderWidgetHostViewAndroid::ScrollOffsetChanged() { |
| 659 } | 704 } |
| 660 | 705 |
| 661 void RenderWidgetHostViewAndroid::SetBackgroundOpaque(bool opaque) { | 706 void RenderWidgetHostViewAndroid::SetBackgroundOpaque(bool opaque) { |
| 662 RenderWidgetHostViewBase::SetBackgroundOpaque(opaque); | 707 RenderWidgetHostViewBase::SetBackgroundOpaque(opaque); |
| 663 host_->SetBackgroundOpaque(opaque); | 708 host_->SetBackgroundOpaque(opaque); |
| 664 } | 709 } |
| 665 | 710 |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 891 DCHECK(!frame->delegated_frame_data->render_pass_list.empty()); | 936 DCHECK(!frame->delegated_frame_data->render_pass_list.empty()); |
| 892 | 937 |
| 893 cc::RenderPass* root_pass = | 938 cc::RenderPass* root_pass = |
| 894 frame->delegated_frame_data->render_pass_list.back(); | 939 frame->delegated_frame_data->render_pass_list.back(); |
| 895 texture_size_in_layer_ = root_pass->output_rect.size(); | 940 texture_size_in_layer_ = root_pass->output_rect.size(); |
| 896 ComputeContentsSize(frame->metadata); | 941 ComputeContentsSize(frame->metadata); |
| 897 | 942 |
| 898 SwapDelegatedFrame(output_surface_id, frame->delegated_frame_data.Pass()); | 943 SwapDelegatedFrame(output_surface_id, frame->delegated_frame_data.Pass()); |
| 899 frame_evictor_->SwappedFrame(!host_->is_hidden()); | 944 frame_evictor_->SwappedFrame(!host_->is_hidden()); |
| 900 | 945 |
| 946 // As the metadata update may trigger view invalidation, always call it after |
| 947 // any potential compositor scheduling. |
| 901 OnFrameMetadataUpdated(frame->metadata); | 948 OnFrameMetadataUpdated(frame->metadata); |
| 902 } | 949 } |
| 903 | 950 |
| 904 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( | 951 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( |
| 905 uint32 output_surface_id, | 952 uint32 output_surface_id, |
| 906 scoped_ptr<cc::CompositorFrame> frame) { | 953 scoped_ptr<cc::CompositorFrame> frame) { |
| 907 InternalSwapCompositorFrame(output_surface_id, frame.Pass()); | 954 InternalSwapCompositorFrame(output_surface_id, frame.Pass()); |
| 908 } | 955 } |
| 909 | 956 |
| 910 void RenderWidgetHostViewAndroid::RetainFrame( | 957 void RenderWidgetHostViewAndroid::RetainFrame( |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 947 static_cast<RenderViewDevToolsAgentHost*>(dtah.get()), | 994 static_cast<RenderViewDevToolsAgentHost*>(dtah.get()), |
| 948 frame_metadata)); | 995 frame_metadata)); |
| 949 } | 996 } |
| 950 } | 997 } |
| 951 | 998 |
| 952 void RenderWidgetHostViewAndroid::SetOverlayVideoMode(bool enabled) { | 999 void RenderWidgetHostViewAndroid::SetOverlayVideoMode(bool enabled) { |
| 953 if (layer_) | 1000 if (layer_) |
| 954 layer_->SetContentsOpaque(!enabled); | 1001 layer_->SetContentsOpaque(!enabled); |
| 955 } | 1002 } |
| 956 | 1003 |
| 1004 bool RenderWidgetHostViewAndroid::SupportsAnimation() const { |
| 1005 // The synchronous (WebView) compositor does not have a proper browser |
| 1006 // compositor with which to drive animations. |
| 1007 return !using_synchronous_compositor_; |
| 1008 } |
| 1009 |
| 1010 void RenderWidgetHostViewAndroid::SetNeedsAnimate() { |
| 1011 DCHECK(content_view_core_); |
| 1012 DCHECK(!using_synchronous_compositor_); |
| 1013 content_view_core_->GetWindowAndroid()->SetNeedsAnimate(); |
| 1014 } |
| 1015 |
| 1016 void RenderWidgetHostViewAndroid::MoveCaret(const gfx::PointF& position) { |
| 1017 MoveCaret(gfx::Point(position.x(), position.y())); |
| 1018 } |
| 1019 |
| 1020 void RenderWidgetHostViewAndroid::SelectBetweenCoordinates( |
| 1021 const gfx::PointF& start, |
| 1022 const gfx::PointF& end) { |
| 1023 DCHECK(content_view_core_); |
| 1024 content_view_core_->SelectBetweenCoordinates(start, end); |
| 1025 } |
| 1026 |
| 1027 void RenderWidgetHostViewAndroid::OnSelectionEvent( |
| 1028 SelectionEventType event, |
| 1029 const gfx::PointF& position) { |
| 1030 DCHECK(content_view_core_); |
| 1031 content_view_core_->OnSelectionEvent(event, position); |
| 1032 } |
| 1033 |
| 1034 scoped_ptr<TouchHandleDrawable> RenderWidgetHostViewAndroid::CreateDrawable() { |
| 1035 DCHECK(content_view_core_); |
| 1036 if (using_synchronous_compositor_) |
| 1037 return content_view_core_->CreatePopupTouchHandleDrawable(); |
| 1038 |
| 1039 return scoped_ptr<TouchHandleDrawable>(new CompositedTouchHandleDrawable( |
| 1040 content_view_core_->GetLayer(), |
| 1041 content_view_core_->GetDpiScale(), |
| 1042 content_view_core_->GetContext().obj())); |
| 1043 } |
| 1044 |
| 957 void RenderWidgetHostViewAndroid::SynchronousCopyContents( | 1045 void RenderWidgetHostViewAndroid::SynchronousCopyContents( |
| 958 const gfx::Rect& src_subrect_in_pixel, | 1046 const gfx::Rect& src_subrect_in_pixel, |
| 959 const gfx::Size& dst_size_in_pixel, | 1047 const gfx::Size& dst_size_in_pixel, |
| 960 const base::Callback<void(bool, const SkBitmap&)>& callback, | 1048 const base::Callback<void(bool, const SkBitmap&)>& callback, |
| 961 const SkColorType color_type) { | 1049 const SkColorType color_type) { |
| 962 SynchronousCompositor* compositor = | 1050 SynchronousCompositor* compositor = |
| 963 SynchronousCompositorImpl::FromID(host_->GetProcess()->GetID(), | 1051 SynchronousCompositorImpl::FromID(host_->GetProcess()->GetID(), |
| 964 host_->GetRoutingID()); | 1052 host_->GetRoutingID()); |
| 965 if (!compositor) { | 1053 if (!compositor) { |
| 966 callback.Run(false, SkBitmap()); | 1054 callback.Run(false, SkBitmap()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 987 // narrower viewport (indicating that this is a mobile-optimized or responsive | 1075 // narrower viewport (indicating that this is a mobile-optimized or responsive |
| 988 // web design, so text will be legible without zooming). Also disable | 1076 // web design, so text will be legible without zooming). Also disable |
| 989 // double tap and pinch for pages that prevent zooming in or out. | 1077 // double tap and pinch for pages that prevent zooming in or out. |
| 990 bool has_mobile_viewport = HasMobileViewport(frame_metadata); | 1078 bool has_mobile_viewport = HasMobileViewport(frame_metadata); |
| 991 bool has_fixed_page_scale = HasFixedPageScale(frame_metadata); | 1079 bool has_fixed_page_scale = HasFixedPageScale(frame_metadata); |
| 992 gesture_provider_.SetDoubleTapSupportForPageEnabled( | 1080 gesture_provider_.SetDoubleTapSupportForPageEnabled( |
| 993 !has_fixed_page_scale && !has_mobile_viewport); | 1081 !has_fixed_page_scale && !has_mobile_viewport); |
| 994 | 1082 |
| 995 if (!content_view_core_) | 1083 if (!content_view_core_) |
| 996 return; | 1084 return; |
| 1085 |
| 997 // All offsets and sizes are in CSS pixels. | 1086 // All offsets and sizes are in CSS pixels. |
| 998 content_view_core_->UpdateFrameInfo( | 1087 content_view_core_->UpdateFrameInfo( |
| 999 frame_metadata.root_scroll_offset, | 1088 frame_metadata.root_scroll_offset, |
| 1000 frame_metadata.page_scale_factor, | 1089 frame_metadata.page_scale_factor, |
| 1001 gfx::Vector2dF(frame_metadata.min_page_scale_factor, | 1090 gfx::Vector2dF(frame_metadata.min_page_scale_factor, |
| 1002 frame_metadata.max_page_scale_factor), | 1091 frame_metadata.max_page_scale_factor), |
| 1003 frame_metadata.root_layer_size, | 1092 frame_metadata.root_layer_size, |
| 1004 frame_metadata.scrollable_viewport_size, | 1093 frame_metadata.scrollable_viewport_size, |
| 1005 frame_metadata.location_bar_offset, | 1094 frame_metadata.location_bar_offset, |
| 1006 frame_metadata.location_bar_content_translation, | 1095 frame_metadata.location_bar_content_translation, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1033 | 1122 |
| 1034 content_view_core_->AttachLayer(layer_); | 1123 content_view_core_->AttachLayer(layer_); |
| 1035 if (overscroll_effect_enabled_) | 1124 if (overscroll_effect_enabled_) |
| 1036 overscroll_effect_->Enable(); | 1125 overscroll_effect_->Enable(); |
| 1037 layer_->SetHideLayerAndSubtree(!is_showing_); | 1126 layer_->SetHideLayerAndSubtree(!is_showing_); |
| 1038 } | 1127 } |
| 1039 | 1128 |
| 1040 void RenderWidgetHostViewAndroid::RemoveLayers() { | 1129 void RenderWidgetHostViewAndroid::RemoveLayers() { |
| 1041 if (!content_view_core_) | 1130 if (!content_view_core_) |
| 1042 return; | 1131 return; |
| 1132 |
| 1043 if (!layer_.get()) | 1133 if (!layer_.get()) |
| 1044 return; | 1134 return; |
| 1045 | 1135 |
| 1046 content_view_core_->RemoveLayer(layer_); | 1136 content_view_core_->RemoveLayer(layer_); |
| 1047 overscroll_effect_->Disable(); | 1137 overscroll_effect_->Disable(); |
| 1048 } | 1138 } |
| 1049 | 1139 |
| 1050 void RenderWidgetHostViewAndroid::SetNeedsAnimate() { | 1140 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { |
| 1051 content_view_core_->GetWindowAndroid()->SetNeedsAnimate(); | 1141 bool needs_animate = overscroll_effect_->Animate(frame_time); |
| 1142 if (selection_controller_) |
| 1143 needs_animate |= selection_controller_->Animate(frame_time); |
| 1144 return needs_animate; |
| 1052 } | 1145 } |
| 1053 | 1146 |
| 1054 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { | 1147 void RenderWidgetHostViewAndroid::OnContentScrollingChange() { |
| 1055 return overscroll_effect_->Animate(frame_time); | 1148 if (selection_controller_) |
| 1149 selection_controller_->SetTemporarilyHidden(IsContentScrolling()); |
| 1150 } |
| 1151 |
| 1152 bool RenderWidgetHostViewAndroid::IsContentScrolling() const { |
| 1153 return touch_scrolling_ || potentially_active_fling_count_ > 0; |
| 1056 } | 1154 } |
| 1057 | 1155 |
| 1058 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( | 1156 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( |
| 1059 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, | 1157 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, |
| 1060 int gpu_host_id) { | 1158 int gpu_host_id) { |
| 1061 NOTREACHED(); | 1159 NOTREACHED(); |
| 1062 } | 1160 } |
| 1063 | 1161 |
| 1064 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() { | 1162 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() { |
| 1065 NOTREACHED(); | 1163 NOTREACHED(); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1104 | 1202 |
| 1105 void RenderWidgetHostViewAndroid::ProcessAckedTouchEvent( | 1203 void RenderWidgetHostViewAndroid::ProcessAckedTouchEvent( |
| 1106 const TouchEventWithLatencyInfo& touch, InputEventAckState ack_result) { | 1204 const TouchEventWithLatencyInfo& touch, InputEventAckState ack_result) { |
| 1107 const bool event_consumed = ack_result == INPUT_EVENT_ACK_STATE_CONSUMED; | 1205 const bool event_consumed = ack_result == INPUT_EVENT_ACK_STATE_CONSUMED; |
| 1108 gesture_provider_.OnTouchEventAck(event_consumed); | 1206 gesture_provider_.OnTouchEventAck(event_consumed); |
| 1109 } | 1207 } |
| 1110 | 1208 |
| 1111 void RenderWidgetHostViewAndroid::GestureEventAck( | 1209 void RenderWidgetHostViewAndroid::GestureEventAck( |
| 1112 const blink::WebGestureEvent& event, | 1210 const blink::WebGestureEvent& event, |
| 1113 InputEventAckState ack_result) { | 1211 InputEventAckState ack_result) { |
| 1212 switch (event.type) { |
| 1213 case blink::WebInputEvent::GestureScrollBegin: |
| 1214 touch_scrolling_ = true; |
| 1215 potentially_active_fling_count_ = 0; |
| 1216 OnContentScrollingChange(); |
| 1217 break; |
| 1218 case blink::WebInputEvent::GestureScrollEnd: |
| 1219 touch_scrolling_ = false; |
| 1220 OnContentScrollingChange(); |
| 1221 break; |
| 1222 case blink::WebInputEvent::GestureFlingStart: |
| 1223 touch_scrolling_ = false; |
| 1224 if (ack_result == INPUT_EVENT_ACK_STATE_CONSUMED) |
| 1225 ++potentially_active_fling_count_; |
| 1226 OnContentScrollingChange(); |
| 1227 break; |
| 1228 default: |
| 1229 break; |
| 1230 } |
| 1231 |
| 1114 if (content_view_core_) | 1232 if (content_view_core_) |
| 1115 content_view_core_->OnGestureEventAck(event, ack_result); | 1233 content_view_core_->OnGestureEventAck(event, ack_result); |
| 1116 } | 1234 } |
| 1117 | 1235 |
| 1118 InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent( | 1236 InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent( |
| 1119 const blink::WebInputEvent& input_event) { | 1237 const blink::WebInputEvent& input_event) { |
| 1238 if (selection_controller_) { |
| 1239 switch (input_event.type) { |
| 1240 case blink::WebInputEvent::GestureLongPress: |
| 1241 case blink::WebInputEvent::GestureLongTap: |
| 1242 selection_controller_->ShowInsertionHandleAutomatically(); |
| 1243 selection_controller_->ShowSelectionHandlesAutomatically(); |
| 1244 break; |
| 1245 case blink::WebInputEvent::GestureTap: |
| 1246 selection_controller_->ShowInsertionHandleAutomatically(); |
| 1247 break; |
| 1248 default: |
| 1249 break; |
| 1250 } |
| 1251 } |
| 1252 |
| 1120 if (content_view_core_ && | 1253 if (content_view_core_ && |
| 1121 content_view_core_->FilterInputEvent(input_event)) | 1254 content_view_core_->FilterInputEvent(input_event)) |
| 1122 return INPUT_EVENT_ACK_STATE_CONSUMED; | 1255 return INPUT_EVENT_ACK_STATE_CONSUMED; |
| 1123 | 1256 |
| 1124 if (!host_) | 1257 if (!host_) |
| 1125 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; | 1258 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; |
| 1126 | 1259 |
| 1127 if (input_event.type == blink::WebInputEvent::GestureTapDown || | 1260 if (input_event.type == blink::WebInputEvent::GestureTapDown || |
| 1128 input_event.type == blink::WebInputEvent::TouchStart) { | 1261 input_event.type == blink::WebInputEvent::TouchStart) { |
| 1129 GpuDataManagerImpl* gpu_data = GpuDataManagerImpl::GetInstance(); | 1262 GpuDataManagerImpl* gpu_data = GpuDataManagerImpl::GetInstance(); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1213 | 1346 |
| 1214 if (host_) | 1347 if (host_) |
| 1215 host_->ForwardGestureEventWithLatencyInfo(event, CreateLatencyInfo(event)); | 1348 host_->ForwardGestureEventWithLatencyInfo(event, CreateLatencyInfo(event)); |
| 1216 } | 1349 } |
| 1217 | 1350 |
| 1218 void RenderWidgetHostViewAndroid::MoveCaret(const gfx::Point& point) { | 1351 void RenderWidgetHostViewAndroid::MoveCaret(const gfx::Point& point) { |
| 1219 if (host_) | 1352 if (host_) |
| 1220 host_->MoveCaret(point); | 1353 host_->MoveCaret(point); |
| 1221 } | 1354 } |
| 1222 | 1355 |
| 1356 void RenderWidgetHostViewAndroid::HideTextHandles() { |
| 1357 if (selection_controller_) |
| 1358 selection_controller_->HideAndDisallowAutomaticShowing(); |
| 1359 } |
| 1360 |
| 1223 SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { | 1361 SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { |
| 1224 return cached_background_color_; | 1362 return cached_background_color_; |
| 1225 } | 1363 } |
| 1226 | 1364 |
| 1227 void RenderWidgetHostViewAndroid::DidOverscroll( | 1365 void RenderWidgetHostViewAndroid::DidOverscroll( |
| 1228 const DidOverscrollParams& params) { | 1366 const DidOverscrollParams& params) { |
| 1229 if (!content_view_core_ || !layer_ || !is_showing_) | 1367 if (!content_view_core_ || !layer_ || !is_showing_) |
| 1230 return; | 1368 return; |
| 1231 | 1369 |
| 1232 const float device_scale_factor = content_view_core_->GetDpiScale(); | 1370 const float device_scale_factor = content_view_core_->GetDpiScale(); |
| 1233 if (overscroll_effect_->OnOverscrolled( | 1371 if (overscroll_effect_->OnOverscrolled( |
| 1234 content_view_core_->GetLayer(), | 1372 content_view_core_->GetLayer(), |
| 1235 base::TimeTicks::Now(), | 1373 base::TimeTicks::Now(), |
| 1236 gfx::ScaleVector2d(params.accumulated_overscroll, | 1374 gfx::ScaleVector2d(params.accumulated_overscroll, |
| 1237 device_scale_factor), | 1375 device_scale_factor), |
| 1238 gfx::ScaleVector2d(params.latest_overscroll_delta, | 1376 gfx::ScaleVector2d(params.latest_overscroll_delta, |
| 1239 device_scale_factor), | 1377 device_scale_factor), |
| 1240 gfx::ScaleVector2d(params.current_fling_velocity, | 1378 gfx::ScaleVector2d(params.current_fling_velocity, |
| 1241 device_scale_factor))) { | 1379 device_scale_factor))) { |
| 1242 SetNeedsAnimate(); | 1380 SetNeedsAnimate(); |
| 1243 } | 1381 } |
| 1244 } | 1382 } |
| 1245 | 1383 |
| 1246 void RenderWidgetHostViewAndroid::DidStopFlinging() { | 1384 void RenderWidgetHostViewAndroid::DidStopFlinging() { |
| 1385 if (potentially_active_fling_count_) { |
| 1386 --potentially_active_fling_count_; |
| 1387 OnContentScrollingChange(); |
| 1388 } |
| 1389 |
| 1247 if (content_view_core_) | 1390 if (content_view_core_) |
| 1248 content_view_core_->DidStopFlinging(); | 1391 content_view_core_->DidStopFlinging(); |
| 1249 } | 1392 } |
| 1250 | 1393 |
| 1251 void RenderWidgetHostViewAndroid::SetContentViewCore( | 1394 void RenderWidgetHostViewAndroid::SetContentViewCore( |
| 1252 ContentViewCoreImpl* content_view_core) { | 1395 ContentViewCoreImpl* content_view_core) { |
| 1253 RemoveLayers(); | 1396 RemoveLayers(); |
| 1254 if (observing_root_window_ && content_view_core_) { | 1397 if (observing_root_window_ && content_view_core_) { |
| 1255 content_view_core_->GetWindowAndroid()->RemoveObserver(this); | 1398 content_view_core_->GetWindowAndroid()->RemoveObserver(this); |
| 1256 observing_root_window_ = false; | 1399 observing_root_window_ = false; |
| 1257 } | 1400 } |
| 1258 | 1401 |
| 1259 bool resize = false; | 1402 bool resize = false; |
| 1260 if (content_view_core != content_view_core_) { | 1403 if (content_view_core != content_view_core_) { |
| 1404 selection_controller_.reset(); |
| 1261 ReleaseLocksOnSurface(); | 1405 ReleaseLocksOnSurface(); |
| 1262 resize = true; | 1406 resize = true; |
| 1263 } | 1407 } |
| 1264 | 1408 |
| 1265 content_view_core_ = content_view_core; | 1409 content_view_core_ = content_view_core; |
| 1266 | 1410 |
| 1267 BrowserAccessibilityManager* manager = NULL; | 1411 BrowserAccessibilityManager* manager = NULL; |
| 1268 if (host_) | 1412 if (host_) |
| 1269 manager = host_->GetRootBrowserAccessibilityManager(); | 1413 manager = host_->GetRootBrowserAccessibilityManager(); |
| 1270 if (manager) { | 1414 if (manager) { |
| 1271 base::android::ScopedJavaLocalRef<jobject> obj; | 1415 base::android::ScopedJavaLocalRef<jobject> obj; |
| 1272 if (content_view_core_) | 1416 if (content_view_core_) |
| 1273 obj = content_view_core_->GetJavaObject(); | 1417 obj = content_view_core_->GetJavaObject(); |
| 1274 manager->ToBrowserAccessibilityManagerAndroid()->SetContentViewCore(obj); | 1418 manager->ToBrowserAccessibilityManagerAndroid()->SetContentViewCore(obj); |
| 1275 } | 1419 } |
| 1276 | 1420 |
| 1277 AttachLayers(); | 1421 AttachLayers(); |
| 1278 if (content_view_core_ && !using_synchronous_compositor_) { | 1422 |
| 1423 if (!content_view_core_) |
| 1424 return; |
| 1425 |
| 1426 if (!using_synchronous_compositor_) { |
| 1279 content_view_core_->GetWindowAndroid()->AddObserver(this); | 1427 content_view_core_->GetWindowAndroid()->AddObserver(this); |
| 1280 observing_root_window_ = true; | 1428 observing_root_window_ = true; |
| 1281 if (needs_begin_frame_) | 1429 if (needs_begin_frame_) |
| 1282 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); | 1430 content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
| 1283 } | 1431 } |
| 1284 | 1432 |
| 1285 if (resize && content_view_core_) | 1433 if (resize) |
| 1286 WasResized(); | 1434 WasResized(); |
| 1435 |
| 1436 if (!selection_controller_) |
| 1437 selection_controller_.reset(new TouchSelectionController(this)); |
| 1287 } | 1438 } |
| 1288 | 1439 |
| 1289 void RenderWidgetHostViewAndroid::RunAckCallbacks() { | 1440 void RenderWidgetHostViewAndroid::RunAckCallbacks() { |
| 1290 while (!ack_callbacks_.empty()) { | 1441 while (!ack_callbacks_.empty()) { |
| 1291 ack_callbacks_.front().Run(); | 1442 ack_callbacks_.front().Run(); |
| 1292 ack_callbacks_.pop(); | 1443 ack_callbacks_.pop(); |
| 1293 } | 1444 } |
| 1294 } | 1445 } |
| 1295 | 1446 |
| 1296 void RenderWidgetHostViewAndroid::OnGestureEvent( | 1447 void RenderWidgetHostViewAndroid::OnGestureEvent( |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1438 // supported we should go with that (this degrades quality) | 1589 // supported we should go with that (this degrades quality) |
| 1439 // or stick back to the default format. | 1590 // or stick back to the default format. |
| 1440 if (base::SysInfo::IsLowEndDevice()) { | 1591 if (base::SysInfo::IsLowEndDevice()) { |
| 1441 if (IsReadbackConfigSupported(kRGB_565_SkColorType)) | 1592 if (IsReadbackConfigSupported(kRGB_565_SkColorType)) |
| 1442 return kRGB_565_SkColorType; | 1593 return kRGB_565_SkColorType; |
| 1443 } | 1594 } |
| 1444 return kN32_SkColorType; | 1595 return kN32_SkColorType; |
| 1445 } | 1596 } |
| 1446 | 1597 |
| 1447 void RenderWidgetHostViewAndroid::ShowSelectionHandlesAutomatically() { | 1598 void RenderWidgetHostViewAndroid::ShowSelectionHandlesAutomatically() { |
| 1448 if (content_view_core_) | 1599 if (selection_controller_) |
| 1449 content_view_core_->ShowSelectionHandlesAutomatically(); | 1600 selection_controller_->ShowSelectionHandlesAutomatically(); |
| 1450 } | 1601 } |
| 1451 | 1602 |
| 1452 void RenderWidgetHostViewAndroid::SelectRange( | 1603 void RenderWidgetHostViewAndroid::SelectRange( |
| 1453 float x1, float y1, float x2, float y2) { | 1604 float x1, float y1, float x2, float y2) { |
| 1454 if (content_view_core_) | 1605 if (content_view_core_) |
| 1455 static_cast<WebContentsImpl*>(content_view_core_->GetWebContents())-> | 1606 static_cast<WebContentsImpl*>(content_view_core_->GetWebContents())-> |
| 1456 SelectRange(gfx::Point(x1, y1), gfx::Point(x2, y2)); | 1607 SelectRange(gfx::Point(x1, y1), gfx::Point(x2, y2)); |
| 1457 } | 1608 } |
| 1458 | 1609 |
| 1459 void RenderWidgetHostViewAndroid::Unselect() { | 1610 void RenderWidgetHostViewAndroid::Unselect() { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1481 results->orientationAngle = display.RotationAsDegree(); | 1632 results->orientationAngle = display.RotationAsDegree(); |
| 1482 results->orientationType = | 1633 results->orientationType = |
| 1483 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); | 1634 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); |
| 1484 gfx::DeviceDisplayInfo info; | 1635 gfx::DeviceDisplayInfo info; |
| 1485 results->depth = info.GetBitsPerPixel(); | 1636 results->depth = info.GetBitsPerPixel(); |
| 1486 results->depthPerComponent = info.GetBitsPerComponent(); | 1637 results->depthPerComponent = info.GetBitsPerComponent(); |
| 1487 results->isMonochrome = (results->depthPerComponent == 0); | 1638 results->isMonochrome = (results->depthPerComponent == 0); |
| 1488 } | 1639 } |
| 1489 | 1640 |
| 1490 } // namespace content | 1641 } // namespace content |
| OLD | NEW |