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

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

Issue 335943002: [Android] Composited selection handle rendering (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@input_native_handles_final
Patch Set: Fix animation tests Created 6 years, 5 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
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | content/content.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | content/content.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698