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

Unified 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: Clean up paste popup interaction 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 side-by-side diff with in-line comments
Download patch
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 ed4600ae92866fb66e7ba2a3c7d65ad8a64d5046..9d5d1597dc642cf351cdae0c28f153296cb889c0 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"
@@ -152,6 +154,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;
@@ -557,6 +573,10 @@ bool RenderWidgetHostViewAndroid::OnTouchEvent(
if (!host_)
return false;
+ if (selection_controller_ &&
+ selection_controller_->WillHandleTouchEvent(event))
+ return true;
+
if (!gesture_provider_.OnTouchEvent(event))
return false;
@@ -576,6 +596,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();
@@ -602,6 +628,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(
@@ -951,6 +979,38 @@ void RenderWidgetHostViewAndroid::SetOverlayVideoMode(bool enabled) {
layer_->SetContentsOpaque(!enabled);
}
+void RenderWidgetHostViewAndroid::SetNeedsAnimate() {
+ DCHECK(content_view_core_);
+ 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,
@@ -1019,28 +1079,17 @@ void RenderWidgetHostViewAndroid::UpdateSelectionBounds(
if (!content_view_core_)
return;
- const cc::ViewportSelectionBound& anchor = frame_metadata.selection_anchor;
- const cc::ViewportSelectionBound& focus = frame_metadata.selection_focus;
-
- if (cached_selection_anchor_ == anchor && cached_selection_focus_ == focus)
- return;
-
- TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::UpdateSelectionBounds");
-
- cached_selection_anchor_ = anchor;
- cached_selection_focus_ = focus;
+ const cc::ViewportSelectionBound& start = frame_metadata.selection_start;
+ const cc::ViewportSelectionBound& end = frame_metadata.selection_end;
- content_view_core_->OnSelectionBoundsChanged(
- anchor.viewport_rect.bottom_left(),
- focus.viewport_rect.bottom_left(),
- anchor.type == cc::SELECTION_BOUND_RIGHT
- ? blink::WebTextDirectionRightToLeft
- : blink::WebTextDirectionDefault,
- focus.type == cc::SELECTION_BOUND_LEFT
- ? blink::WebTextDirectionRightToLeft
- : blink::WebTextDirectionDefault,
- anchor.visible,
- focus.visible);
+ 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,
@@ -1069,6 +1118,7 @@ void RenderWidgetHostViewAndroid::AttachLayers() {
void RenderWidgetHostViewAndroid::RemoveLayers() {
if (!content_view_core_)
return;
+
if (!layer_.get())
return;
@@ -1076,12 +1126,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(
@@ -1146,6 +1200,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;
@@ -1253,6 +1322,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_;
}
@@ -1262,7 +1336,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(),
@@ -1291,6 +1365,7 @@ void RenderWidgetHostViewAndroid::SetContentViewCore(
bool resize = false;
if (content_view_core != content_view_core_) {
+ selection_controller_.reset();
ReleaseLocksOnSurface();
resize = true;
}
@@ -1306,15 +1381,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 +1559,8 @@ SkBitmap::Config RenderWidgetHostViewAndroid::PreferredReadbackFormat() {
}
void RenderWidgetHostViewAndroid::ShowSelectionHandlesAutomatically() {
- if (content_view_core_)
- content_view_core_->ShowSelectionHandlesAutomatically();
+ if (selection_controller_)
+ selection_controller_->AllowAutomaticSelectionShowing();
}
void RenderWidgetHostViewAndroid::SelectRange(

Powered by Google App Engine
This is Rietveld 408576698