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