Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(576)

Unified Diff: content/browser/renderer_host/input/touch_emulator.cc

Issue 375863005: Touch emulator: allow multiple touch streams. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: moved to touch emulator Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/input/touch_emulator.cc
diff --git a/content/browser/renderer_host/input/touch_emulator.cc b/content/browser/renderer_host/input/touch_emulator.cc
index 6e4f26bc3acff17b82cb61d04fc83a0e800f893c..5fab626165817e6a87a1b1c4e71f36afef768274 100644
--- a/content/browser/renderer_host/input/touch_emulator.cc
+++ b/content/browser/renderer_host/input/touch_emulator.cc
@@ -85,7 +85,8 @@ void TouchEmulator::ResetState() {
last_mouse_move_timestamp_ = 0;
mouse_pressed_ = false;
shift_pressed_ = false;
- touch_active_ = false;
+ emulated_stream_active_ = false;
+ native_stream_active_ = false;
suppress_next_fling_cancel_ = false;
pinch_scale_ = 1.f;
pinch_gesture_active_ = false;
@@ -155,7 +156,7 @@ bool TouchEmulator::HandleMouseEvent(const WebMouseEvent& mouse_event) {
if (FillTouchEventAndPoint(mouse_event) &&
gesture_provider_.OnTouchEvent(MotionEventWeb(touch_event_))) {
- client_->ForwardTouchEvent(touch_event_);
+ ForwardTouchEventToClient();
}
// Do not pass mouse events to the renderer.
@@ -167,7 +168,7 @@ bool TouchEmulator::HandleMouseWheelEvent(const WebMouseWheelEvent& event) {
return false;
// Send mouse wheel for easy scrolling when there is no active touch.
- return touch_active_;
+ return emulated_stream_active_;
}
bool TouchEmulator::HandleKeyboardEvent(const WebKeyboardEvent& event) {
@@ -193,13 +194,49 @@ bool TouchEmulator::HandleKeyboardEvent(const WebKeyboardEvent& event) {
return false;
}
-bool TouchEmulator::HandleTouchEventAck(InputEventAckState ack_result) {
- const bool event_consumed = ack_result == INPUT_EVENT_ACK_STATE_CONSUMED;
- gesture_provider_.OnTouchEventAck(event_consumed);
- // TODO(dgozman): Disable emulation when real touch events are available.
+bool TouchEmulator::HandleTouchEvent(const blink::WebTouchEvent& event) {
+ // Block native event when emulated touch stream is active.
+ // Do not allow middle-sequence event to pass through, if start was blocked.
+ if (native_stream_active_ ||
jdduke (slow) 2014/07/15 19:43:03 Hmm, maybe split out the conditional? if (!emula
dgozman 2014/07/16 09:05:03 This code have changed now.
+ (!emulated_stream_active_ &&
+ WebTouchEventTraits::IsTouchSequenceStart(event))) {
+ native_stream_active_ = true;
+ return false;
+ }
return true;
}
+void TouchEmulator::ForwardTouchEventToClient() {
+ // Block emulated event when native touch stream is active.
+ // Do not allow middle-sequence event to pass through, if start was blocked.
+ if (emulated_stream_active_ ||
+ (!native_stream_active_ &&
+ WebTouchEventTraits::IsTouchSequenceStart(touch_event_))) {
+ emulated_stream_active_ = true;
+ client_->ForwardEmulatedTouchEvent(touch_event_);
+ } else {
+ // Block emulated stream and ack immediately.
+ gesture_provider_.OnTouchEventAck(true);
jdduke (slow) 2014/07/15 19:43:03 Nit: For readability maybe add something like con
dgozman 2014/07/16 09:05:03 Done.
+ }
+}
+
+bool TouchEmulator::HandleTouchEventAck(
+ const blink::WebTouchEvent& event, InputEventAckState ack_result) {
+ if (emulated_stream_active_) {
+ if (WebTouchEventTraits::IsTouchSequenceEnd(event))
+ emulated_stream_active_ = false;
+
+ const bool event_consumed = ack_result == INPUT_EVENT_ACK_STATE_CONSUMED;
+ gesture_provider_.OnTouchEventAck(event_consumed);
+ return true;
+ }
+
+ DCHECK(native_stream_active_);
+ if (WebTouchEventTraits::IsTouchSequenceEnd(event))
+ native_stream_active_ = false;
+ return false;
+}
+
void TouchEmulator::OnGestureEvent(const ui::GestureEventData& gesture) {
WebGestureEvent gesture_event =
CreateWebGestureEventFromGestureEventData(gesture);
@@ -267,16 +304,15 @@ void TouchEmulator::OnGestureEvent(const ui::GestureEventData& gesture) {
}
void TouchEmulator::CancelTouch() {
- if (!touch_active_)
+ if (!emulated_stream_active_)
return;
WebTouchEventTraits::ResetTypeAndTouchStates(
WebInputEvent::TouchCancel,
(base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(),
&touch_event_);
- touch_active_ = false;
if (gesture_provider_.OnTouchEvent(MotionEventWeb(touch_event_)))
- client_->ForwardTouchEvent(touch_event_);
+ ForwardTouchEventToClient();
}
void TouchEmulator::UpdateCursor() {
@@ -352,14 +388,12 @@ bool TouchEmulator::FillTouchEventAndPoint(const WebMouseEvent& mouse_event) {
switch (mouse_event.type) {
case WebInputEvent::MouseDown:
eventType = WebInputEvent::TouchStart;
- touch_active_ = true;
break;
case WebInputEvent::MouseMove:
eventType = WebInputEvent::TouchMove;
break;
case WebInputEvent::MouseUp:
eventType = WebInputEvent::TouchEnd;
- touch_active_ = false;
break;
default:
eventType = WebInputEvent::Undefined;

Powered by Google App Engine
This is Rietveld 408576698