Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / browser / renderer_host / input / gesture_text_selector.cc
index 59f28cf..67c4fe7 100644 (file)
 #include "content/browser/renderer_host/input/gesture_text_selector.h"
 
 #include "ui/events/event_constants.h"
-#include "ui/events/gesture_detection/gesture_event_data.h"
+#include "ui/events/gesture_detection/gesture_detector.h"
+#include "ui/events/gesture_detection/gesture_provider_config_helper.h"
 #include "ui/events/gesture_detection/motion_event.h"
 
+using ui::GestureDetector;
+using ui::MotionEvent;
+
 namespace content {
+namespace {
+scoped_ptr<GestureDetector> CreateGestureDetector(
+    ui::GestureListener* listener) {
+  GestureDetector::Config config =
+      ui::DefaultGestureProviderConfig().gesture_detector_config;
+
+  ui::DoubleTapListener* null_double_tap_listener = nullptr;
+
+  // Doubletap, showpress and longpress detection are not required, and
+  // should be explicitly disabled for efficiency.
+  scoped_ptr<ui::GestureDetector> detector(
+      new ui::GestureDetector(config, listener, null_double_tap_listener));
+  detector->set_longpress_enabled(false);
+  detector->set_showpress_enabled(false);
+
+  return detector.Pass();
+}
+
+}  // namespace
 
 GestureTextSelector::GestureTextSelector(GestureTextSelectorClient* client)
     : client_(client),
       text_selection_triggered_(false),
+      secondary_button_pressed_(false),
       anchor_x_(0.0f),
       anchor_y_(0.0f) {
+  DCHECK(client);
 }
 
 GestureTextSelector::~GestureTextSelector() {
 }
 
-bool GestureTextSelector::OnTouchEvent(const ui::MotionEvent& event) {
-  if (event.GetAction() == ui::MotionEvent::ACTION_DOWN) {
+bool GestureTextSelector::OnTouchEvent(const MotionEvent& event) {
+  if (event.GetAction() == MotionEvent::ACTION_DOWN) {
     // Only trigger selection on ACTION_DOWN to prevent partial touch or gesture
     // sequences from being forwarded.
     text_selection_triggered_ = ShouldStartTextSelection(event);
+    secondary_button_pressed_ =
+        event.GetButtonState() == MotionEvent::BUTTON_SECONDARY;
+    anchor_x_ = event.GetX();
+    anchor_y_ = event.GetY();
   }
-  return text_selection_triggered_;
-}
 
-bool GestureTextSelector::OnGestureEvent(const ui::GestureEventData& gesture) {
   if (!text_selection_triggered_)
     return false;
 
-  switch (gesture.type()) {
-    case ui::ET_GESTURE_TAP: {
-      client_->LongPress(gesture.time, gesture.x, gesture.y);
-      break;
-    }
-    case ui::ET_GESTURE_SCROLL_BEGIN: {
-      client_->Unselect();
-      anchor_x_ = gesture.x;
-      anchor_y_ = gesture.y;
-      break;
+  if (event.GetAction() == MotionEvent::ACTION_MOVE) {
+    secondary_button_pressed_ =
+        event.GetButtonState() == MotionEvent::BUTTON_SECONDARY;
+    if (!secondary_button_pressed_) {
+      anchor_x_ = event.GetX();
+      anchor_y_ = event.GetY();
     }
-    case ui::ET_GESTURE_SCROLL_UPDATE: {
-      // TODO(changwan): check if we can show handles on ET_GESTURE_SCROLL_END
-      // instead. Currently it is not possible as ShowSelectionHandles should
-      // be called before we change the selection.
-      client_->ShowSelectionHandlesAutomatically();
-      client_->SelectRange(anchor_x_, anchor_y_, gesture.x, gesture.y);
-      break;
-    }
-    default:
-      // Suppress all other gestures when we are selecting text.
-      break;
   }
+
+  if (!gesture_detector_)
+    gesture_detector_ = CreateGestureDetector(this);
+
+  gesture_detector_->OnTouchEvent(event);
+
+  // Always return true, even if |gesture_detector_| technically doesn't
+  // consume the event, to prevent a partial touch stream from being forwarded.
+  return true;
+}
+
+bool GestureTextSelector::OnSingleTapUp(const MotionEvent& e) {
+  DCHECK(text_selection_triggered_);
+  client_->LongPress(e.GetEventTime(), e.GetX(), e.GetY());
+  return true;
+}
+
+bool GestureTextSelector::OnScroll(const MotionEvent& e1,
+                                   const MotionEvent& e2,
+                                   float distance_x,
+                                   float distance_y) {
+  DCHECK(text_selection_triggered_);
+
+  // Return if Stylus button is not pressed.
+  if (!secondary_button_pressed_)
+    return true;
+
+  // TODO(changwan): check if we can show handles after the scroll finishes
+  // instead. Currently it is not possible as ShowSelectionHandles should
+  // be called before we change the selection.
+  client_->ShowSelectionHandlesAutomatically();
+  client_->SelectRange(anchor_x_, anchor_y_, e2.GetX(), e2.GetY());
   return true;
 }
 
 // static
-bool GestureTextSelector::ShouldStartTextSelection(
-    const ui::MotionEvent& event) {
+bool GestureTextSelector::ShouldStartTextSelection(const MotionEvent& event) {
   DCHECK_GT(event.GetPointerCount(), 0u);
   // Currently we are supporting stylus-only cases.
-  const bool is_stylus =
-      event.GetToolType(0) == ui::MotionEvent::TOOL_TYPE_STYLUS;
+  const bool is_stylus = event.GetToolType(0) == MotionEvent::TOOL_TYPE_STYLUS;
   const bool is_only_secondary_button_pressed =
-      event.GetButtonState() == ui::MotionEvent::BUTTON_SECONDARY;
+      event.GetButtonState() == MotionEvent::BUTTON_SECONDARY;
   return is_stylus && is_only_secondary_button_pressed;
 }