Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_view_android.cc |
| diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc |
| index 182f33f3f1f3ba76ce8efc64fe8e82da09209262..4466fb448268cf7c8e663a5916f4b05e41b43803 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_android.cc |
| +++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
| @@ -27,6 +27,7 @@ |
| #include "cc/resources/single_release_callback.h" |
| #include "cc/trees/layer_tree_host.h" |
| #include "content/browser/accessibility/browser_accessibility_manager_android.h" |
| +#include "content/browser/android/composited_touch_handle_drawable.h" |
| #include "content/browser/android/content_view_core_impl.h" |
| #include "content/browser/android/in_process/synchronous_compositor_impl.h" |
| #include "content/browser/android/overscroll_glow.h" |
| @@ -40,6 +41,7 @@ |
| #include "content/browser/renderer_host/dip_util.h" |
| #include "content/browser/renderer_host/image_transport_factory_android.h" |
| #include "content/browser/renderer_host/input/synthetic_gesture_target_android.h" |
| +#include "content/browser/renderer_host/input/touch_selection_controller.h" |
| #include "content/browser/renderer_host/input/web_input_event_builders_android.h" |
| #include "content/browser/renderer_host/input/web_input_event_util.h" |
| #include "content/browser/renderer_host/render_process_host_impl.h" |
| @@ -153,6 +155,20 @@ ui::GestureProvider::Config CreateGestureProviderConfig() { |
| return config; |
| } |
| +TouchHandleOrientation SelectionBoundTypeToTouchHandleOrientation( |
| + cc::SelectionBoundType bound_type) { |
| + switch (bound_type) { |
| + case cc::SELECTION_BOUND_LEFT: |
| + return TOUCH_HANDLE_LEFT; |
| + case cc::SELECTION_BOUND_RIGHT: |
| + return TOUCH_HANDLE_RIGHT; |
| + case cc::SELECTION_BOUND_CENTER: |
| + return TOUCH_HANDLE_CENTER; |
| + case cc::SELECTION_BOUND_EMPTY: |
| + return TOUCH_HANDLE_ORIENTATION_UNDEFINED; |
| + } |
| +} |
| + |
| bool HasFixedPageScale(const cc::CompositorFrameMetadata& frame_metadata) { |
| return frame_metadata.min_page_scale_factor == |
| frame_metadata.max_page_scale_factor; |
| @@ -560,6 +576,10 @@ bool RenderWidgetHostViewAndroid::OnTouchEvent( |
| if (!host_) |
| return false; |
| + if (selection_controller_ && |
| + selection_controller_->WillHandleTouchEvent(event)) |
| + return true; |
| + |
| if (!gesture_provider_.OnTouchEvent(event)) |
| return false; |
| @@ -579,6 +599,12 @@ bool RenderWidgetHostViewAndroid::OnTouchEvent( |
| return true; |
| } |
| +bool RenderWidgetHostViewAndroid::OnTouchHandleEvent( |
| + const ui::MotionEvent& event) { |
| + return selection_controller_ && |
| + selection_controller_->WillHandleTouchEvent(event); |
| +} |
| + |
| void RenderWidgetHostViewAndroid::ResetGestureDetection() { |
| const ui::MotionEvent* current_down_event = |
| gesture_provider_.GetCurrentDownEvent(); |
| @@ -605,6 +631,8 @@ void RenderWidgetHostViewAndroid::ImeCancelComposition() { |
| void RenderWidgetHostViewAndroid::FocusedNodeChanged(bool is_editable_node) { |
| ime_adapter_android_.FocusedNodeChanged(is_editable_node); |
| + if (selection_controller_) |
| + selection_controller_->OnSelectionEditable(is_editable_node); |
| } |
| void RenderWidgetHostViewAndroid::RenderProcessGone( |
| @@ -954,6 +982,45 @@ void RenderWidgetHostViewAndroid::SetOverlayVideoMode(bool enabled) { |
| layer_->SetContentsOpaque(!enabled); |
| } |
| +bool RenderWidgetHostViewAndroid::SupportsAnimation() const { |
| + // The synchronous (WebView) compositor does not have a proper browser |
| + // compositor with which to drive animations. |
| + return !using_synchronous_compositor_; |
| +} |
| + |
| +void RenderWidgetHostViewAndroid::SetNeedsAnimate() { |
| + DCHECK(content_view_core_); |
| + DCHECK(!using_synchronous_compositor_); |
| + content_view_core_->GetWindowAndroid()->SetNeedsAnimate(); |
| +} |
| + |
| +void RenderWidgetHostViewAndroid::MoveCaret(const gfx::PointF& position) { |
| + MoveCaret(gfx::Point(position.x(), position.y())); |
| +} |
| + |
| +void RenderWidgetHostViewAndroid::SelectBetweenCoordinates( |
| + const gfx::PointF& start, |
| + const gfx::PointF& end) { |
| + DCHECK(content_view_core_); |
| + content_view_core_->SelectBetweenCoordinates(start, end); |
| +} |
| + |
| +void RenderWidgetHostViewAndroid::OnSelectionEvent( |
| + SelectionEventType event, |
| + const gfx::PointF& position) { |
| + DCHECK(content_view_core_); |
| + content_view_core_->OnSelectionEvent(event, position); |
| +} |
| + |
| +scoped_ptr<TouchHandleDrawable> RenderWidgetHostViewAndroid::CreateDrawable() { |
| + DCHECK(content_view_core_); |
| + if (using_synchronous_compositor_) |
| + return content_view_core_->CreatePopupTouchHandleDrawable(); |
| + |
| + return scoped_ptr<TouchHandleDrawable>(new CompositedTouchHandleDrawable( |
| + content_view_core_->GetLayer(), GetDpiScale())); |
| +} |
| + |
| void RenderWidgetHostViewAndroid::SynchronousCopyContents( |
| const gfx::Rect& src_subrect_in_pixel, |
| const gfx::Size& dst_size_in_pixel, |
| @@ -1025,23 +1092,14 @@ void RenderWidgetHostViewAndroid::UpdateSelectionBounds( |
| const cc::ViewportSelectionBound& start = frame_metadata.selection_start; |
| const cc::ViewportSelectionBound& end = frame_metadata.selection_end; |
| - if (cached_selection_start_ == start && cached_selection_end_ == end) |
| - return; |
| - |
| - TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::UpdateSelectionBounds"); |
| - |
| - cached_selection_start_ = start; |
| - cached_selection_end_ = end; |
| - |
| - content_view_core_->OnSelectionBoundsChanged( |
| - start.viewport_rect.bottom_left(), |
| - end.viewport_rect.bottom_left(), |
| - start.type == cc::SELECTION_BOUND_RIGHT |
| - ? blink::WebTextDirectionRightToLeft |
| - : blink::WebTextDirectionDefault, |
| - end.type == cc::SELECTION_BOUND_LEFT |
| - ? blink::WebTextDirectionRightToLeft |
| - : blink::WebTextDirectionDefault); |
| + DCHECK(selection_controller_); |
| + selection_controller_->OnSelectionBoundsChanged( |
| + start.viewport_rect, |
| + SelectionBoundTypeToTouchHandleOrientation(start.type), |
| + start.visible, |
| + end.viewport_rect, |
| + SelectionBoundTypeToTouchHandleOrientation(end.type), |
| + end.visible); |
| } |
| void RenderWidgetHostViewAndroid::AcceleratedSurfaceInitialized(int host_id, |
| @@ -1070,6 +1128,7 @@ void RenderWidgetHostViewAndroid::AttachLayers() { |
| void RenderWidgetHostViewAndroid::RemoveLayers() { |
| if (!content_view_core_) |
| return; |
| + |
| if (!layer_.get()) |
| return; |
| @@ -1077,12 +1136,16 @@ void RenderWidgetHostViewAndroid::RemoveLayers() { |
| overscroll_effect_->Disable(); |
| } |
| -void RenderWidgetHostViewAndroid::SetNeedsAnimate() { |
| - content_view_core_->GetWindowAndroid()->SetNeedsAnimate(); |
| +bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { |
| + bool needs_animate = overscroll_effect_->Animate(frame_time); |
| + if (selection_controller_) |
| + needs_animate |= selection_controller_->Animate(frame_time); |
| + return needs_animate; |
| } |
| -bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) { |
| - return overscroll_effect_->Animate(frame_time); |
| +float RenderWidgetHostViewAndroid::GetDpiScale() const { |
| + DCHECK(content_view_core_); |
| + return content_view_core_->GetDpiScale(); |
| } |
| void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( |
| @@ -1147,6 +1210,21 @@ void RenderWidgetHostViewAndroid::GestureEventAck( |
| InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent( |
| const blink::WebInputEvent& input_event) { |
| + if (selection_controller_) { |
| + switch (input_event.type) { |
| + case blink::WebInputEvent::GestureLongPress: |
| + case blink::WebInputEvent::GestureLongTap: |
| + selection_controller_->AllowAutomaticInsertionShowing(); |
| + selection_controller_->AllowAutomaticSelectionShowing(); |
| + break; |
| + case blink::WebInputEvent::GestureTap: |
| + selection_controller_->AllowAutomaticInsertionShowing(); |
| + break; |
| + default: |
| + break; |
| + } |
| + } |
| + |
| if (content_view_core_ && |
| content_view_core_->FilterInputEvent(input_event)) |
| return INPUT_EVENT_ACK_STATE_CONSUMED; |
| @@ -1254,6 +1332,11 @@ void RenderWidgetHostViewAndroid::MoveCaret(const gfx::Point& point) { |
| host_->MoveCaret(point); |
| } |
| +void RenderWidgetHostViewAndroid::HideTextHandles() { |
| + if (selection_controller_) |
| + selection_controller_->HideAndDisallowAutomaticShowing(); |
| +} |
| + |
| SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { |
| return cached_background_color_; |
| } |
| @@ -1263,7 +1346,7 @@ void RenderWidgetHostViewAndroid::DidOverscroll( |
| if (!content_view_core_ || !layer_ || !is_showing_) |
| return; |
| - const float device_scale_factor = content_view_core_->GetDpiScale(); |
| + const float device_scale_factor = GetDpiScale(); |
| if (overscroll_effect_->OnOverscrolled( |
| content_view_core_->GetLayer(), |
| base::TimeTicks::Now(), |
| @@ -1292,6 +1375,7 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( |
| bool resize = false; |
| if (content_view_core != content_view_core_) { |
| + selection_controller_.reset(); |
| ReleaseLocksOnSurface(); |
| resize = true; |
| } |
| @@ -1307,15 +1391,22 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( |
| } |
| AttachLayers(); |
| - if (content_view_core_ && !using_synchronous_compositor_) { |
| + |
| + if (!content_view_core_) |
| + return; |
| + |
| + if (!using_synchronous_compositor_) { |
| content_view_core_->GetWindowAndroid()->AddObserver(this); |
| observing_root_window_ = true; |
| if (needs_begin_frame_) |
| content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
| } |
| - if (resize && content_view_core_) |
| + if (resize) |
| WasResized(); |
| + |
| + if (!selection_controller_) |
| + selection_controller_.reset(new TouchSelectionController(this)); |
| } |
| void RenderWidgetHostViewAndroid::RunAckCallbacks() { |
| @@ -1477,8 +1568,8 @@ SkColorType RenderWidgetHostViewAndroid::PreferredReadbackFormat() { |
| } |
| void RenderWidgetHostViewAndroid::ShowSelectionHandlesAutomatically() { |
| - if (content_view_core_) |
| - content_view_core_->ShowSelectionHandlesAutomatically(); |
| + if (selection_controller_) |
| + selection_controller_->AllowAutomaticSelectionShowing(); |
|
aelias_OOO_until_Jul13
2014/07/18 19:06:40
nit: can this be renamed to be consistent with the
jdduke (slow)
2014/07/18 22:58:05
Done.
|
| } |
| void RenderWidgetHostViewAndroid::SelectRange( |