1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/touch_editable_impl_aura.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_aura.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/view_messages.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/render_widget_host.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "grit/ui_strings.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/aura/client/activation_client.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/aura/client/screen_position_client.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/aura/root_window.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/aura/window.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/clipboard/clipboard.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/ui_base_switches_util.h"
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/range/range.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content {
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TouchEditableImplAura, public:
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TouchEditableImplAura::~TouchEditableImplAura() {
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Cleanup();
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TouchEditableImplAura* TouchEditableImplAura::Create() {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (switches::IsTouchEditingEnabled())
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return new TouchEditableImplAura();
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return NULL;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::AttachToView(RenderWidgetHostViewAura* view) {
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (rwhva_ == view)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Cleanup();
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!view)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  rwhva_ = view;
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  rwhva_->set_touch_editing_client(this);
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::UpdateEditingController() {
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!rwhva_ || !rwhva_->HasFocus())
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If touch editing handles were not visible, we bring them up only if
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // there is non-zero selection on the page. And the current event is a
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // gesture event (we dont want to show handles if the user is selecting
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // using mouse or keyboard).
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (selection_gesture_in_process_ && !scroll_in_progress_ &&
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      selection_anchor_rect_ != selection_focus_rect_)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StartTouchEditing();
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (text_input_type_ != ui::TEXT_INPUT_TYPE_NONE ||
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      selection_anchor_rect_ != selection_focus_rect_) {
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (touch_selection_controller_)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      touch_selection_controller_->SelectionChanged();
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTouchEditing();
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void TouchEditableImplAura::OverscrollStarted() {
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  overscroll_in_progress_ = true;
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void TouchEditableImplAura::OverscrollCompleted() {
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // We might receive multiple OverscrollStarted() and OverscrollCompleted()
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // during the same scroll session (for example, when the scroll direction
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // changes). We want to show the handles only when:
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // 1. Overscroll has completed
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // 2. Scrolling session is over, i.e. we have received ET_GESTURE_SCROLL_END.
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // 3. If we had hidden the handles when scrolling started
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // 4. If there is still a need to show handles (there is a non-empty selection
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // or non-NONE |text_input_type_|)
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (overscroll_in_progress_ && !scroll_in_progress_ &&
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      handles_hidden_due_to_scroll_ &&
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      (selection_anchor_rect_ != selection_focus_rect_ ||
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          text_input_type_ != ui::TEXT_INPUT_TYPE_NONE)) {
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    StartTouchEditing();
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    UpdateEditingController();
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  overscroll_in_progress_ = false;
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TouchEditableImplAura, RenderWidgetHostViewAura::TouchEditingClient
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// implementation:
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::StartTouchEditing() {
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!rwhva_ || !rwhva_->HasFocus())
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!touch_selection_controller_) {
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    touch_selection_controller_.reset(
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ui::TouchSelectionController::create(this));
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_selection_controller_)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    touch_selection_controller_->SelectionChanged();
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::EndTouchEditing() {
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_selection_controller_) {
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (touch_selection_controller_->IsHandleDragInProgress())
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      touch_selection_controller_->SelectionChanged();
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    else
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      touch_selection_controller_.reset();
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::OnSelectionOrCursorChanged(const gfx::Rect& anchor,
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                       const gfx::Rect& focus) {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  selection_anchor_rect_ = anchor;
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  selection_focus_rect_ = focus;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateEditingController();
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::OnTextInputTypeChanged(ui::TextInputType type) {
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  text_input_type_ = type;
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool TouchEditableImplAura::HandleInputEvent(const ui::Event* event) {
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(rwhva_);
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (event->IsTouchEvent())
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!event->IsGestureEvent()) {
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EndTouchEditing();
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const ui::GestureEvent* gesture_event =
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      static_cast<const ui::GestureEvent*>(event);
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (event->type()) {
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ui::ET_GESTURE_TAP:
142a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      tap_gesture_tap_count_queue_.push(gesture_event->details().tap_count());
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (gesture_event->details().tap_count() > 1)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        selection_gesture_in_process_ = true;
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // When the user taps, we want to show touch editing handles if user
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // tapped on selected text.
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (selection_anchor_rect_ != selection_focus_rect_) {
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // UnionRects only works for rects with non-zero width.
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        gfx::Rect anchor(selection_anchor_rect_.origin(),
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         gfx::Size(1, selection_anchor_rect_.height()));
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        gfx::Rect focus(selection_focus_rect_.origin(),
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        gfx::Size(1, selection_focus_rect_.height()));
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        gfx::Rect selection_rect = gfx::UnionRects(anchor, focus);
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (selection_rect.Contains(gesture_event->location())) {
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          StartTouchEditing();
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          return true;
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // For single taps, not inside selected region, we want to show handles
1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // only when the tap is on an already focused textfield.
161a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      is_tap_on_focused_textfield_ = false;
1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (gesture_event->details().tap_count() == 1 &&
1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          text_input_type_ != ui::TEXT_INPUT_TYPE_NONE)
164a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        is_tap_on_focused_textfield_ = true;
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ui::ET_GESTURE_LONG_PRESS:
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      selection_gesture_in_process_ = true;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_BEGIN:
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      // If selection handles are currently visible, we want to get them back up
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      // when scrolling ends. So we set |handles_hidden_due_to_scroll_| so that
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      // we can re-start touch editing when we call |UpdateEditingController()|
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      // on scroll end gesture.
17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scroll_in_progress_ = true;
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      handles_hidden_due_to_scroll_ = false;
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (touch_selection_controller_)
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        handles_hidden_due_to_scroll_ = true;
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      EndTouchEditing();
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_END:
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Scroll has ended, but we might still be in overscroll animation.
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (handles_hidden_due_to_scroll_ && !overscroll_in_progress_ &&
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          (selection_anchor_rect_ != selection_focus_rect_ ||
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)              text_input_type_ != ui::TEXT_INPUT_TYPE_NONE)) {
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        StartTouchEditing();
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        UpdateEditingController();
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // fall through to reset |scroll_in_progress_|.
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case ui::ET_SCROLL_FLING_START:
19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      selection_gesture_in_process_ = false;
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scroll_in_progress_ = false;
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default:
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return false;
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::GestureEventAck(int gesture_event_type) {
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(rwhva_);
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (gesture_event_type == blink::WebInputEvent::GestureTap &&
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      text_input_type_ != ui::TEXT_INPUT_TYPE_NONE &&
203a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      is_tap_on_focused_textfield_) {
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StartTouchEditing();
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (touch_selection_controller_)
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      touch_selection_controller_->SelectionChanged();
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (gesture_event_type == blink::WebInputEvent::GestureLongPress)
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    selection_gesture_in_process_ = false;
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (gesture_event_type == blink::WebInputEvent::GestureTap) {
212a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    if (tap_gesture_tap_count_queue_.front() > 1)
213a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      selection_gesture_in_process_ = false;
214a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    tap_gesture_tap_count_queue_.pop();
215a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::OnViewDestroyed() {
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Cleanup();
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TouchEditableImplAura, ui::TouchEditable implementation:
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::SelectRect(const gfx::Point& start,
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       const gfx::Point& end) {
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!rwhva_)
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderWidgetHostImpl* host = RenderWidgetHostImpl::From(
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      rwhva_->GetRenderWidgetHost());
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host->SelectRange(start, end);
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::MoveCaretTo(const gfx::Point& point) {
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!rwhva_)
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderWidgetHostImpl* host = RenderWidgetHostImpl::From(
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      rwhva_->GetRenderWidgetHost());
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host->MoveCaret(point);
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::GetSelectionEndPoints(gfx::Rect* p1,
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                  gfx::Rect* p2) {
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *p1 = selection_anchor_rect_;
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *p2 = selection_focus_rect_;
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Rect TouchEditableImplAura::GetBounds() {
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return rwhva_ ? rwhva_->GetNativeView()->bounds() : gfx::Rect();
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeView TouchEditableImplAura::GetNativeView() {
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return rwhva_ ? rwhva_->GetNativeView()->GetRootWindow() : NULL;
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::ConvertPointToScreen(gfx::Point* point) {
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!rwhva_)
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* window = rwhva_->GetNativeView();
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::client::ScreenPositionClient* screen_position_client =
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      aura::client::GetScreenPositionClient(window->GetRootWindow());
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (screen_position_client)
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    screen_position_client->ConvertPointToScreen(window, point);
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::ConvertPointFromScreen(gfx::Point* point) {
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!rwhva_)
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* window = rwhva_->GetNativeView();
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::client::ScreenPositionClient* screen_position_client =
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      aura::client::GetScreenPositionClient(window->GetRootWindow());
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (screen_position_client)
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    screen_position_client->ConvertPointFromScreen(window, point);
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool TouchEditableImplAura::DrawsHandles() {
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return false;
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void TouchEditableImplAura::OpenContextMenu(const gfx::Point& anchor) {
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!rwhva_)
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Point point = anchor;
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ConvertPointFromScreen(&point);
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderWidgetHost* host = rwhva_->GetRenderWidgetHost();
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  host->Send(new ViewMsg_ShowContextMenu(host->GetRoutingID(), point));
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EndTouchEditing();
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool TouchEditableImplAura::IsCommandIdChecked(int command_id) const {
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NOTREACHED();
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return false;
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool TouchEditableImplAura::IsCommandIdEnabled(int command_id) const {
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!rwhva_)
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool editable = rwhva_->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE;
30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Range selection_range;
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  rwhva_->GetSelectionRange(&selection_range);
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool has_selection = !selection_range.is_empty();
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (command_id) {
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case IDS_APP_CUT:
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return editable && has_selection;
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case IDS_APP_COPY:
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return has_selection;
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case IDS_APP_PASTE: {
310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16 result;
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ui::Clipboard::GetForCurrentThread()->ReadText(
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ui::CLIPBOARD_TYPE_COPY_PASTE, &result);
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return editable && !result.empty();
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case IDS_APP_DELETE:
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return editable && has_selection;
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case IDS_APP_SELECT_ALL:
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return true;
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default:
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool TouchEditableImplAura::GetAcceleratorForCommandId(
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int command_id,
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ui::Accelerator* accelerator) {
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return false;
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::ExecuteCommand(int command_id, int event_flags) {
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!rwhva_)
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderWidgetHost* host = rwhva_->GetRenderWidgetHost();
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (command_id) {
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case IDS_APP_CUT:
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      host->Cut();
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case IDS_APP_COPY:
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      host->Copy();
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case IDS_APP_PASTE:
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      host->Paste();
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case IDS_APP_DELETE:
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      host->Delete();
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case IDS_APP_SELECT_ALL:
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      host->SelectAll();
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default:
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTREACHED();
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EndTouchEditing();
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TouchEditableImplAura, private:
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TouchEditableImplAura::TouchEditableImplAura()
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      rwhva_(NULL),
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      selection_gesture_in_process_(false),
364a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      handles_hidden_due_to_scroll_(false),
36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scroll_in_progress_(false),
36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      overscroll_in_progress_(false),
367a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      is_tap_on_focused_textfield_(false) {
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEditableImplAura::Cleanup() {
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (rwhva_) {
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    rwhva_->set_touch_editing_client(NULL);
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    rwhva_ = NULL;
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
37558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  text_input_type_ = ui::TEXT_INPUT_TYPE_NONE;
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  touch_selection_controller_.reset();
37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  handles_hidden_due_to_scroll_ = false;
37858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scroll_in_progress_ = false;
37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  overscroll_in_progress_ = false;
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace content
383