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 |