Chromium Code Reviews| 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: |