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( |