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

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: Tweaks to dragging and visibility 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 4e43842055a43e309c8e4134cb1d0aca36507b58..75f1eed37edbdea6696c080c6aa901df1688c1c0 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;
@@ -559,6 +575,10 @@ bool RenderWidgetHostViewAndroid::OnTouchEvent(
if (!host_)
return false;
+ if (selection_controller_ &&
+ selection_controller_->WillHandleTouchEvent(event))
+ return true;
+
if (!gesture_provider_.OnTouchEvent(event))
return false;
@@ -578,6 +598,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();
@@ -604,6 +630,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(
@@ -953,6 +981,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,
@@ -1024,23 +1091,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,
@@ -1069,6 +1127,7 @@ void RenderWidgetHostViewAndroid::AttachLayers() {
void RenderWidgetHostViewAndroid::RemoveLayers() {
if (!content_view_core_)
return;
+
if (!layer_.get())
return;
@@ -1076,12 +1135,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 +1209,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 +1331,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 +1345,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 +1374,7 @@ void RenderWidgetHostViewAndroid::SetContentViewCore(
bool resize = false;
if (content_view_core != content_view_core_) {
+ selection_controller_.reset();
ReleaseLocksOnSurface();
resize = true;
}
@@ -1306,15 +1390,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() {
@@ -1476,8 +1567,8 @@ SkColorType 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