Index: content/browser/renderer_host/input/gesture_text_selector.cc |
diff --git a/content/browser/renderer_host/input/gesture_text_selector.cc b/content/browser/renderer_host/input/gesture_text_selector.cc |
index 59f28cf3245f0288b397ddb2a47117f88531086d..aad60ddc40a6af385ed9479b1173b2b45bd491cc 100644 |
--- a/content/browser/renderer_host/input/gesture_text_selector.cc |
+++ b/content/browser/renderer_host/input/gesture_text_selector.cc |
@@ -5,69 +5,86 @@ |
#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_config_helper.h" |
+#include "ui/events/gesture_detection/gesture_detector.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), |
- anchor_x_(0.0f), |
- anchor_y_(0.0f) { |
+ text_selection_triggered_(false) { |
+ 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); |
} |
- 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; |
- } |
- 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); |
Changwan Ryu
2014/10/02 00:39:53
Could you add a comment why we should still return
jdduke (slow)
2014/10/02 19:30:23
Good call, done.
|
+ 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_); |
+ // 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(e1.GetX(), e1.GetY(), 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; |
} |