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 b67e93de6aa93e98b21046085f5c2d03340ecbc3..4d28e062322f0f3d9147d991a48d807a7fe3cf05 100644 |
--- a/content/browser/renderer_host/input/touch_emulator.cc |
+++ b/content/browser/renderer_host/input/touch_emulator.cc |
@@ -46,8 +46,6 @@ const double kMouseMoveDropIntervalSeconds = 5.f / 1000; |
TouchEmulator::TouchEmulator(TouchEmulatorClient* client) |
: client_(client), |
- gesture_provider_(GetGestureProviderConfig(), this), |
- enabled_(false), |
emulated_stream_active_sequence_count_(0), |
native_stream_active_sequence_count_(0) { |
DCHECK(client_); |
@@ -68,12 +66,6 @@ TouchEmulator::TouchEmulator(TouchEmulatorClient* client) |
WebCursor::CursorInfo cursor_info; |
cursor_info.type = blink::WebCursorInfo::TypePointer; |
pointer_cursor_.InitFromCursorInfo(cursor_info); |
- |
- // TODO(dgozman): Use synthetic secondary touch to support multi-touch. |
- gesture_provider_.SetMultiTouchZoomSupportEnabled(false); |
- // TODO(dgozman): Enable double tap if requested by the renderer. |
- // TODO(dgozman): Don't break double-tap-based pinch with shift handling. |
- gesture_provider_.SetDoubleTapSupportForPlatformEnabled(false); |
} |
TouchEmulator::~TouchEmulator() { |
@@ -93,20 +85,27 @@ void TouchEmulator::ResetState() { |
} |
void TouchEmulator::Enable() { |
- if (!enabled_) { |
- enabled_ = true; |
+ if (!enabled()) { |
+ gesture_provider_.reset(new ui::FilteredGestureProvider( |
+ GetGestureProviderConfig(), this)); |
+ // TODO(dgozman): Use synthetic secondary touch to support multi-touch. |
+ gesture_provider_->SetMultiTouchZoomSupportEnabled(false); |
+ // TODO(dgozman): Enable double tap if requested by the renderer. |
+ // TODO(dgozman): Don't break double-tap-based pinch with shift handling. |
+ gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false); |
+ |
ResetState(); |
} |
UpdateCursor(); |
} |
void TouchEmulator::Disable() { |
- if (!enabled_) |
+ if (!enabled()) |
return; |
- enabled_ = false; |
UpdateCursor(); |
CancelTouch(); |
+ gesture_provider_.reset(); |
} |
gfx::SizeF TouchEmulator::InitCursorFromResource( |
@@ -128,7 +127,7 @@ gfx::SizeF TouchEmulator::InitCursorFromResource( |
} |
bool TouchEmulator::HandleMouseEvent(const WebMouseEvent& mouse_event) { |
- if (!enabled_) |
+ if (!enabled()) |
return false; |
if (mouse_event.button == WebMouseEvent::ButtonRight && |
@@ -172,7 +171,7 @@ bool TouchEmulator::HandleMouseEvent(const WebMouseEvent& mouse_event) { |
} |
bool TouchEmulator::HandleMouseWheelEvent(const WebMouseWheelEvent& event) { |
- if (!enabled_) |
+ if (!enabled()) |
return false; |
// Send mouse wheel for easy scrolling when there is no active touch. |
@@ -180,7 +179,7 @@ bool TouchEmulator::HandleMouseWheelEvent(const WebMouseWheelEvent& event) { |
} |
bool TouchEmulator::HandleKeyboardEvent(const WebKeyboardEvent& event) { |
- if (!enabled_) |
+ if (!enabled()) |
return false; |
if (!UpdateShiftPressed((event.modifiers & WebInputEvent::ShiftKey) != 0)) |
@@ -218,21 +217,22 @@ bool TouchEmulator::HandleTouchEvent(const blink::WebTouchEvent& event) { |
} |
void TouchEmulator::HandleEmulatedTouchEvent(blink::WebTouchEvent event) { |
- auto result = gesture_provider_.OnTouchEvent(MotionEventWeb(event)); |
+ DCHECK(gesture_provider_); |
+ auto result = gesture_provider_->OnTouchEvent(MotionEventWeb(event)); |
if (!result.succeeded) |
return; |
const bool event_consumed = true; |
// Block emulated event when emulated native stream is active. |
if (native_stream_active_sequence_count_) { |
- gesture_provider_.OnSyncTouchEventAck(event_consumed); |
+ gesture_provider_->OnSyncTouchEventAck(event_consumed); |
return; |
} |
bool is_sequence_start = WebTouchEventTraits::IsTouchSequenceStart(event); |
// Do not allow middle-sequence event to pass through, if start was blocked. |
if (!emulated_stream_active_sequence_count_ && !is_sequence_start) { |
- gesture_provider_.OnSyncTouchEventAck(event_consumed); |
+ gesture_provider_->OnSyncTouchEventAck(event_consumed); |
return; |
} |
@@ -251,7 +251,8 @@ bool TouchEmulator::HandleTouchEventAck( |
emulated_stream_active_sequence_count_--; |
const bool event_consumed = ack_result == INPUT_EVENT_ACK_STATE_CONSUMED; |
- gesture_provider_.OnAsyncTouchEventAck(event_consumed); |
+ if (gesture_provider_) |
+ gesture_provider_->OnAsyncTouchEventAck(event_consumed); |
return true; |
} |
@@ -336,12 +337,13 @@ void TouchEmulator::CancelTouch() { |
WebInputEvent::TouchCancel, |
(base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(), |
&touch_event_); |
- if (gesture_provider_.GetCurrentDownEvent()) |
+ DCHECK(gesture_provider_); |
+ if (gesture_provider_->GetCurrentDownEvent()) |
HandleEmulatedTouchEvent(touch_event_); |
} |
void TouchEmulator::UpdateCursor() { |
- if (!enabled_) |
+ if (!enabled()) |
client_->SetCursor(pointer_cursor_); |
else |
client_->SetCursor(InPinchGestureMode() ? pinch_cursor_ : touch_cursor_); |