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

Unified Diff: content/browser/renderer_host/render_widget_host_view_aura.cc

Issue 698253004: Reland: Implement Aura side of unified touch text selection for contents (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month 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_aura.cc
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index 074a309e045a43ef514afa1c672bd7bb5a927292..e0144e0886b34d7076ce858875659235dc6eff51 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -34,6 +34,7 @@
#include "content/browser/renderer_host/render_widget_host_impl.h"
#include "content/browser/renderer_host/ui_events_helper.h"
#include "content/browser/renderer_host/web_input_event_aura.h"
+#include "content/browser/web_contents/web_contents_impl.h"
#include "content/common/gpu/client/gl_helper.h"
#include "content/common/gpu/gpu_messages.h"
#include "content/common/view_messages.h"
@@ -42,6 +43,7 @@
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/render_widget_host_view_frame_subscriber.h"
#include "content/public/browser/user_metrics.h"
+#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
#include "third_party/WebKit/public/platform/WebScreenInfo.h"
#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
@@ -73,6 +75,7 @@
#include "ui/gfx/screen.h"
#include "ui/gfx/size_conversions.h"
#include "ui/gfx/skia_util.h"
+#include "ui/strings/grit/ui_strings.h"
#include "ui/wm/public/activation_client.h"
#include "ui/wm/public/scoped_tooltip_disabler.h"
#include "ui/wm/public/tooltip_client.h"
@@ -450,7 +453,7 @@ RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host,
legacy_render_widget_host_HWND_(NULL),
#endif
has_snapped_to_boundary_(false),
- touch_editing_client_(NULL),
+ selection_controller_(new TouchSelectionControllerAura(this)),
is_guest_view_hack_(is_guest_view_hack),
weak_ptr_factory_(this) {
if (!is_guest_view_hack_)
@@ -770,6 +773,7 @@ void RenderWidgetHostViewAura::Focus() {
void RenderWidgetHostViewAura::Blur() {
window_->Blur();
+ selection_controller_->HideAndDisallowShowingAutomatically();
}
bool RenderWidgetHostViewAura::HasFocus() const {
@@ -847,8 +851,8 @@ void RenderWidgetHostViewAura::TextInputTypeChanged(
text_input_flags_ = flags;
if (GetInputMethod())
GetInputMethod()->OnTextInputTypeChanged(this);
- if (touch_editing_client_)
- touch_editing_client_->OnTextInputTypeChanged(text_input_type_);
+ const bool is_editable_node = type != ui::TEXT_INPUT_TYPE_NONE;
+ selection_controller_->OnSelectionEditable(is_editable_node);
}
}
@@ -905,6 +909,8 @@ void RenderWidgetHostViewAura::SelectionChanged(const base::string16& text,
const gfx::Range& range) {
RenderWidgetHostViewBase::SelectionChanged(text, offset, range);
+ selection_controller_->OnSelectionEmpty(text.empty());
+
#if defined(USE_X11) && !defined(OS_CHROMEOS)
if (text.empty() || range.is_empty())
return;
@@ -929,20 +935,7 @@ gfx::Size RenderWidgetHostViewAura::GetRequestedRendererSize() const {
void RenderWidgetHostViewAura::SelectionBoundsChanged(
const ViewHostMsg_SelectionBounds_Params& params) {
- if (selection_anchor_rect_ == params.anchor_rect &&
- selection_focus_rect_ == params.focus_rect)
- return;
-
- selection_anchor_rect_ = params.anchor_rect;
- selection_focus_rect_ = params.focus_rect;
-
- if (GetInputMethod())
- GetInputMethod()->OnCaretBoundsChanged(this);
-
- if (touch_editing_client_) {
- touch_editing_client_->OnSelectionOrCursorChanged(selection_anchor_rect_,
- selection_focus_rect_);
- }
+ NOTREACHED() << "Selection bounds should be routed through the compositor.";
jdduke (slow) 2014/11/06 16:17:45 Yay! I'm still curious how the frame metadata will
}
void RenderWidgetHostViewAura::CopyFromCompositingSurface(
@@ -1026,6 +1019,8 @@ void RenderWidgetHostViewAura::OnSwapCompositorFrame(
frame->delegated_frame_data.Pass(),
frame->metadata.device_scale_factor,
frame->metadata.latency_info);
+ SelectionBoundsUpdated(frame->metadata.selection_start,
+ frame->metadata.selection_end);
return;
}
@@ -1039,8 +1034,7 @@ void RenderWidgetHostViewAura::OnSwapCompositorFrame(
}
void RenderWidgetHostViewAura::DidStopFlinging() {
- if (touch_editing_client_)
- touch_editing_client_->DidStopFlinging();
+ selection_controller_->OnFlingCompleted();
}
#if defined(OS_WIN)
@@ -1126,9 +1120,6 @@ void RenderWidgetHostViewAura::WheelEventAck(
void RenderWidgetHostViewAura::GestureEventAck(
const blink::WebGestureEvent& event,
InputEventAckState ack_result) {
- if (touch_editing_client_)
- touch_editing_client_->GestureEventAck(event.type);
-
if (overscroll_controller_) {
overscroll_controller_->ReceivedEventACK(
event, (INPUT_EVENT_ACK_STATE_CONSUMED == ack_result));
@@ -1493,9 +1484,7 @@ gfx::Rect RenderWidgetHostViewAura::ConvertRectFromScreen(
}
gfx::Rect RenderWidgetHostViewAura::GetCaretBounds() const {
- const gfx::Rect rect =
- gfx::UnionRects(selection_anchor_rect_, selection_focus_rect_);
- return ConvertRectToScreen(rect);
+ return ConvertRectToScreen(selection_controller_->GetCaretBounds());
}
bool RenderWidgetHostViewAura::GetCompositionCharacterBounds(
@@ -1694,8 +1683,7 @@ bool RenderWidgetHostViewAura::CanFocus() {
void RenderWidgetHostViewAura::OnCaptureLost() {
host_->LostCapture();
- if (touch_editing_client_)
- touch_editing_client_->EndTouchEditing(false);
+ selection_controller_->HideAndDisallowShowingAutomatically();
}
void RenderWidgetHostViewAura::OnPaint(gfx::Canvas* canvas) {
@@ -1765,8 +1753,6 @@ void RenderWidgetHostViewAura::GetHitTestMask(gfx::Path* mask) const {
void RenderWidgetHostViewAura::OnKeyEvent(ui::KeyEvent* event) {
TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnKeyEvent");
- if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
- return;
if (popup_child_host_view_ && popup_child_host_view_->NeedsInputGrab()) {
popup_child_host_view_->OnKeyEvent(event);
@@ -1823,9 +1809,6 @@ void RenderWidgetHostViewAura::OnKeyEvent(ui::KeyEvent* event) {
void RenderWidgetHostViewAura::OnMouseEvent(ui::MouseEvent* event) {
TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnMouseEvent");
- if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
- return;
-
if (mouse_locked_) {
aura::client::CursorClient* cursor_client =
aura::client::GetCursorClient(window_->GetRootWindow());
@@ -1964,8 +1947,6 @@ void RenderWidgetHostViewAura::OnMouseEvent(ui::MouseEvent* event) {
void RenderWidgetHostViewAura::OnScrollEvent(ui::ScrollEvent* event) {
TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnScrollEvent");
- if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
- return;
if (event->type() == ui::ET_SCROLL) {
#if !defined(OS_WIN)
@@ -1995,7 +1976,9 @@ void RenderWidgetHostViewAura::OnScrollEvent(ui::ScrollEvent* event) {
void RenderWidgetHostViewAura::OnTouchEvent(ui::TouchEvent* event) {
TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnTouchEvent");
- if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
+
+ selection_controller_->HandleTouchEvent(event);
+ if (event->handled())
return;
// Update the touch event first.
@@ -2020,6 +2003,11 @@ void RenderWidgetHostViewAura::OnTouchEvent(ui::TouchEvent* event) {
void RenderWidgetHostViewAura::OnGestureEvent(ui::GestureEvent* event) {
TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnGestureEvent");
+
+ selection_controller_->HandleGestureEvent(event);
+ if (event->handled())
+ return;
+
if ((event->type() == ui::ET_GESTURE_PINCH_BEGIN ||
event->type() == ui::ET_GESTURE_PINCH_UPDATE ||
event->type() == ui::ET_GESTURE_PINCH_END) && !pinch_zoom_enabled_) {
@@ -2027,9 +2015,6 @@ void RenderWidgetHostViewAura::OnGestureEvent(ui::GestureEvent* event) {
return;
}
- if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
- return;
-
// Confirm existing composition text on TAP gesture, to make sure the input
// caret won't be moved with an ongoing composition text.
if (event->type() == ui::ET_GESTURE_TAP)
@@ -2077,6 +2062,101 @@ void RenderWidgetHostViewAura::OnGestureEvent(ui::GestureEvent* event) {
}
////////////////////////////////////////////////////////////////////////////////
+// RenderWidgetHostViewAura, TouchSelectionControllerClientAura implementation:
+
+float RenderWidgetHostViewAura::GetDeviceScaleFactor() {
+ return current_device_scale_factor_;
+}
+
+void RenderWidgetHostViewAura::MoveCaret(const gfx::PointF& position) {
+ RenderWidgetHostImpl* host =
+ RenderWidgetHostImpl::From(GetRenderWidgetHost());
+ host->MoveCaret(gfx::Point(position.x(), position.y()));
+}
+
+void RenderWidgetHostViewAura::SelectBetweenCoordinates(
+ const gfx::PointF& start,
+ const gfx::PointF& end) {
+ RenderWidgetHost* host = GetRenderWidgetHost();
+ RenderViewHost* rvh = RenderViewHost::From(host);
+ WebContentsImpl* wc =
+ static_cast<WebContentsImpl*>(WebContents::FromRenderViewHost(rvh));
+ gfx::Point start_point(start.x(), start.y());
+ gfx::Point end_point(end.x(), end.y());
+ wc->SelectRange(start_point, end_point);
+}
+
+aura::Window* RenderWidgetHostViewAura::GetParentWindow() {
+ return window_;
+}
+
+bool RenderWidgetHostViewAura::IsCommandIdEnabled(int command_id) {
+ bool editable = GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE;
+ bool readable = GetTextInputType() != ui::TEXT_INPUT_TYPE_PASSWORD;
+ gfx::Range selection_range;
+ GetSelectionRange(&selection_range);
+ bool has_selection = !selection_range.is_empty();
+ switch (command_id) {
+ case IDS_APP_CUT:
+ return editable && readable && has_selection;
+ case IDS_APP_COPY:
+ return readable && has_selection;
+ case IDS_APP_PASTE: {
+ base::string16 result;
+ ui::Clipboard::GetForCurrentThread()->ReadText(
+ ui::CLIPBOARD_TYPE_COPY_PASTE, &result);
+ return editable && !result.empty();
+ }
+ case IDS_APP_DELETE:
+ return editable && has_selection;
+ case IDS_APP_SELECT_ALL:
+ return true;
+ default:
+ return false;
+ }
+}
+
+void RenderWidgetHostViewAura::ExecuteCommand(int command_id, int event_flags) {
+ RenderWidgetHost* host = GetRenderWidgetHost();
+ RenderViewHost* rvh = RenderViewHost::From(host);
+ WebContents* wc = WebContents::FromRenderViewHost(rvh);
+
+ switch (command_id) {
+ case IDS_APP_CUT:
+ wc->Cut();
+ break;
+ case IDS_APP_COPY:
+ wc->Copy();
+ break;
+ case IDS_APP_PASTE:
+ wc->Paste();
+ break;
+ case IDS_APP_DELETE:
+ wc->Delete();
+ break;
+ case IDS_APP_SELECT_ALL:
+ wc->SelectAll();
+ break;
+ default:
+ NOTREACHED();
+ break;
+ }
+}
+
+void RenderWidgetHostViewAura::OpenContextMenu(const gfx::PointF& point) {
+ RenderWidgetHost* host = GetRenderWidgetHost();
+ host->Send(new ViewMsg_ShowContextMenu(host->GetRoutingID(),
+ ui::MENU_SOURCE_TOUCH_EDIT_MENU,
+ gfx::Point(point.x(), point.y())));
+}
+
+gfx::Rect RenderWidgetHostViewAura::ConvertRectToScreen(
+ const gfx::RectF& rect) const {
+ gfx::Rect r(rect.x(), rect.y(), rect.width(), rect.height());
+ return ConvertRectToScreen(r);
+}
+
+////////////////////////////////////////////////////////////////////////////////
// RenderWidgetHostViewAura, aura::client::ActivationDelegate implementation:
bool RenderWidgetHostViewAura::ShouldActivate() const {
@@ -2152,8 +2232,7 @@ void RenderWidgetHostViewAura::OnWindowFocused(aura::Window* gained_focus,
DetachFromInputMethod();
host_->SetInputMethodActive(false);
- if (touch_editing_client_)
- touch_editing_client_->EndTouchEditing(false);
+ selection_controller_->HideAndDisallowShowingAutomatically();
if (overscroll_controller_)
overscroll_controller_->Cancel();
@@ -2210,9 +2289,6 @@ void RenderWidgetHostViewAura::OnHostMoved(const aura::WindowTreeHost* host,
// RenderWidgetHostViewAura, private:
RenderWidgetHostViewAura::~RenderWidgetHostViewAura() {
- if (touch_editing_client_)
- touch_editing_client_->OnViewDestroyed();
-
delegated_frame_host_.reset();
window_observer_.reset();
if (window_->GetHost())
@@ -2387,10 +2463,6 @@ void RenderWidgetHostViewAura::InternalSetBounds(const gfx::Rect& rect) {
window_->SetBounds(rect);
host_->WasResized();
delegated_frame_host_->WasResized();
- if (touch_editing_client_) {
- touch_editing_client_->OnSelectionOrCursorChanged(selection_anchor_rect_,
- selection_focus_rect_);
- }
#if defined(OS_WIN)
if (mouse_locked_)
UpdateMouseLockRegion();
@@ -2491,6 +2563,14 @@ SkColorType RenderWidgetHostViewAura::PreferredReadbackFormat() {
return kN32_SkColorType;
}
+void RenderWidgetHostViewAura::SelectionBoundsUpdated(
+ const cc::ViewportSelectionBound& start,
+ const cc::ViewportSelectionBound& end) {
+ selection_controller_->OnSelectionBoundsChanged(start, end);
+ if (GetInputMethod())
+ GetInputMethod()->OnCaretBoundsChanged(this);
+}
+
////////////////////////////////////////////////////////////////////////////////
// DelegatedFrameHost, public:

Powered by Google App Engine
This is Rietveld 408576698