Input.dispatchTouchEvent sends events to SyntheticGestureController
In order to make the synthetic events sent from
Input.dispatchTouchEvent close to the native OS events, we should send
events to SyntheticGestureController, which will dispatch events to
each platform at a very low level.
Change-Id: Ic9ad2b0e3add91e8ce67c2b07f7dbaa5527c722b
Reviewed-on: https://chromium-review.googlesource.com/c/1428239
Reviewed-by: Joel Einbinder <[email protected]>
Reviewed-by: Dmitry Gozman <[email protected]>
Reviewed-by: Navid Zolghadr <[email protected]>
Commit-Queue: Lan Wei <[email protected]>
Cr-Commit-Position: refs/heads/master@{#630973}
diff --git a/content/browser/renderer_host/input/synthetic_mouse_driver.cc b/content/browser/renderer_host/input/synthetic_mouse_driver.cc
index 92fbc73a..4e4e6a3 100644
--- a/content/browser/renderer_host/input/synthetic_mouse_driver.cc
+++ b/content/browser/renderer_host/input/synthetic_mouse_driver.cc
@@ -84,7 +84,9 @@
(~SyntheticPointerActionParams::GetWebMouseEventModifier(button));
}
-void SyntheticMouseDriver::Cancel(int index) {
+void SyntheticMouseDriver::Cancel(int index,
+ SyntheticPointerActionParams::Button button,
+ int key_modifiers) {
NOTIMPLEMENTED();
}
diff --git a/content/browser/renderer_host/input/synthetic_mouse_driver.h b/content/browser/renderer_host/input/synthetic_mouse_driver.h
index 4c3ec41..c08be40a 100644
--- a/content/browser/renderer_host/input/synthetic_mouse_driver.h
+++ b/content/browser/renderer_host/input/synthetic_mouse_driver.h
@@ -44,7 +44,10 @@
SyntheticPointerActionParams::Button button =
SyntheticPointerActionParams::Button::LEFT,
int key_modifiers = 0) override;
- void Cancel(int index = 0) override;
+ void Cancel(int index = 0,
+ SyntheticPointerActionParams::Button button =
+ SyntheticPointerActionParams::Button::LEFT,
+ int key_modifiers = 0) override;
void Leave(int index = 0) override;
bool UserInputCheck(
diff --git a/content/browser/renderer_host/input/synthetic_pointer_action.cc b/content/browser/renderer_host/input/synthetic_pointer_action.cc
index e3a7dee5..597180de 100644
--- a/content/browser/renderer_host/input/synthetic_pointer_action.cc
+++ b/content/browser/renderer_host/input/synthetic_pointer_action.cc
@@ -27,9 +27,11 @@
gesture_source_type_ = target->GetDefaultSyntheticGestureSourceType();
if (!synthetic_pointer_driver_) {
- synthetic_pointer_driver_ =
+ owned_synthetic_pointer_driver_ =
SyntheticPointerDriver::Create(gesture_source_type_);
+ synthetic_pointer_driver_ = owned_synthetic_pointer_driver_.get();
}
+
state_ = GestureState::RUNNING;
}
@@ -67,6 +69,7 @@
DCHECK_LT(num_actions_dispatched_, params_.params.size());
SyntheticPointerActionListParams::ParamList& param_list =
params_.params[num_actions_dispatched_];
+
for (const SyntheticPointerActionParams& param : param_list) {
if (!synthetic_pointer_driver_->UserInputCheck(param))
return GestureState::INVALID;
diff --git a/content/browser/renderer_host/input/synthetic_pointer_action.h b/content/browser/renderer_host/input/synthetic_pointer_action.h
index b1c03941..a6abfc5 100644
--- a/content/browser/renderer_host/input/synthetic_pointer_action.h
+++ b/content/browser/renderer_host/input/synthetic_pointer_action.h
@@ -5,6 +5,8 @@
#ifndef CONTENT_BROWSER_RENDERER_HOST_INPUT_SYNTHETIC_POINTER_ACTION_H_
#define CONTENT_BROWSER_RENDERER_HOST_INPUT_SYNTHETIC_POINTER_ACTION_H_
+#include <memory>
+
#include "base/macros.h"
#include "content/browser/renderer_host/input/synthetic_gesture.h"
#include "content/browser/renderer_host/input/synthetic_gesture_target.h"
@@ -28,6 +30,11 @@
void WaitForTargetAck(base::OnceClosure callback,
SyntheticGestureTarget* target) const override;
+ void SetSyntheticPointerDriver(
+ SyntheticPointerDriver* synthetic_pointer_driver) {
+ synthetic_pointer_driver_ = synthetic_pointer_driver;
+ }
+
private:
enum class GestureState { UNINITIALIZED, RUNNING, INVALID, DONE };
@@ -37,7 +44,15 @@
// params_ contains a list of lists of pointer actions, that each list of
// pointer actions will be dispatched together.
SyntheticPointerActionListParams params_;
- std::unique_ptr<SyntheticPointerDriver> synthetic_pointer_driver_;
+
+ // It is owned by this class, which is used when synthetic_pointer_driver_ is
+ // not initialized, where the SyntheticPointerAction object is not created
+ // in InputHandler class.
+ std::unique_ptr<SyntheticPointerDriver> owned_synthetic_pointer_driver_;
+ // It is owned by InputHandler class, which is used to keep the states of the
+ // previous synthetic events when a sequence of actions are dispatched one by
+ // one.
+ SyntheticPointerDriver* synthetic_pointer_driver_ = nullptr;
SyntheticGestureParams::GestureSourceType gesture_source_type_;
GestureState state_;
size_t num_actions_dispatched_;
diff --git a/content/browser/renderer_host/input/synthetic_pointer_driver.h b/content/browser/renderer_host/input/synthetic_pointer_driver.h
index 6725262..197489d 100644
--- a/content/browser/renderer_host/input/synthetic_pointer_driver.h
+++ b/content/browser/renderer_host/input/synthetic_pointer_driver.h
@@ -52,7 +52,10 @@
SyntheticPointerActionParams::Button button =
SyntheticPointerActionParams::Button::LEFT,
int key_modifiers = 0) = 0;
- virtual void Cancel(int index = 0) = 0;
+ virtual void Cancel(int index = 0,
+ SyntheticPointerActionParams::Button button =
+ SyntheticPointerActionParams::Button::LEFT,
+ int key_modifiers = 0) = 0;
virtual void Leave(int index = 0) = 0;
// Check if the user inputs in the SyntheticPointerActionParams can generate
diff --git a/content/browser/renderer_host/input/synthetic_touch_driver.cc b/content/browser/renderer_host/input/synthetic_touch_driver.cc
index 09ca096..971606a 100644
--- a/content/browser/renderer_host/input/synthetic_touch_driver.cc
+++ b/content/browser/renderer_host/input/synthetic_touch_driver.cc
@@ -40,6 +40,7 @@
rotation_angle, force);
touch_event_.touches[touch_index].id = index;
pointer_id_map_[index] = touch_index;
+ touch_event_.SetModifiers(key_modifiers);
}
void SyntheticTouchDriver::Move(float x,
@@ -54,6 +55,7 @@
DCHECK(pointer_id_map_.find(index) != pointer_id_map_.end());
touch_event_.MovePoint(pointer_id_map_[index], x, y, width / 2.f,
height / 2.f, rotation_angle, force);
+ touch_event_.SetModifiers(key_modifiers);
}
void SyntheticTouchDriver::Release(int index,
@@ -62,13 +64,17 @@
DCHECK_GE(index, 0);
DCHECK(pointer_id_map_.find(index) != pointer_id_map_.end());
touch_event_.ReleasePoint(pointer_id_map_[index]);
+ touch_event_.SetModifiers(key_modifiers);
pointer_id_map_.erase(index);
}
-void SyntheticTouchDriver::Cancel(int index) {
+void SyntheticTouchDriver::Cancel(int index,
+ SyntheticPointerActionParams::Button button,
+ int key_modifiers) {
DCHECK_GE(index, 0);
DCHECK(pointer_id_map_.find(index) != pointer_id_map_.end());
touch_event_.CancelPoint(pointer_id_map_[index]);
+ touch_event_.SetModifiers(key_modifiers);
touch_event_.dispatch_type = blink::WebInputEvent::kEventNonBlocking;
pointer_id_map_.erase(index);
}
@@ -113,6 +119,8 @@
if (touch_event_.touches[i].state !=
blink::WebTouchPoint::kStateUndefined) {
touch_event_.touches[free_index] = touch_event_.touches[i];
+ if (free_index != i)
+ touch_event_.touches[i] = blink::WebTouchPoint();
int pointer_id = GetIndexFromMap(i);
pointer_id_map_[pointer_id] = free_index;
free_index++;
diff --git a/content/browser/renderer_host/input/synthetic_touch_driver.h b/content/browser/renderer_host/input/synthetic_touch_driver.h
index fb28bc8..40445ca 100644
--- a/content/browser/renderer_host/input/synthetic_touch_driver.h
+++ b/content/browser/renderer_host/input/synthetic_touch_driver.h
@@ -46,7 +46,10 @@
SyntheticPointerActionParams::Button button =
SyntheticPointerActionParams::Button::LEFT,
int key_modifiers = 0) override;
- void Cancel(int index = 0) override;
+ void Cancel(int index = 0,
+ SyntheticPointerActionParams::Button button =
+ SyntheticPointerActionParams::Button::LEFT,
+ int key_modifiers = 0) override;
void Leave(int index = 0) override;
bool UserInputCheck(