[go: up one dir, main page]

Add from_devtools_debugger parameter to gesture params and pointer
driver and use it to set kFromDebugger modififier.

This modifier will be used for a different event routing in target.

(cherry picked from commit 7d1caa6ede42056461b2ededf4d983d28c68e073)

Bug: 1117173
Change-Id: I0da662f4dffee7eb0702bf99e901d3cbbdf6135b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3259628
Reviewed-by: Dave Tapuska <dtapuska@chromium.org>
Reviewed-by: Keren Zhu <kerenzhu@chromium.org>
Commit-Queue: Danil Somsikov <dsv@chromium.org>
Cr-Original-Commit-Position: refs/heads/main@{#938874}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3329604
Cr-Commit-Position: refs/branch-heads/4664@{#1300}
Cr-Branched-From: 24dc4ee75e01a29d390d43c9c264372a169273a7-refs/heads/main@{#929512}
diff --git a/content/browser/renderer_host/input/synthetic_mouse_driver.cc b/content/browser/renderer_host/input/synthetic_mouse_driver.cc
index 39508f0..0f3d413 100644
--- a/content/browser/renderer_host/input/synthetic_mouse_driver.cc
+++ b/content/browser/renderer_host/input/synthetic_mouse_driver.cc
@@ -44,6 +44,8 @@
   click_count_ = ComputeClickCount(timestamp, pressed_button, x, y);
   int modifiers =
       SyntheticPointerActionParams::GetWebMouseEventModifier(button);
+  if (from_devtools_debugger_)
+    key_modifiers |= blink::WebInputEvent::kFromDebugger;
   mouse_event_ = blink::SyntheticWebMouseEventBuilder::Build(
       blink::WebInputEvent::Type::kMouseDown, x, y,
       modifiers | key_modifiers | last_modifiers_, mouse_event_.pointer_type);
@@ -75,6 +77,8 @@
   DCHECK_EQ(index, 0);
   int button_modifiers =
       SyntheticPointerActionParams::GetWebMouseEventModifier(button);
+  if (from_devtools_debugger_)
+    key_modifiers |= blink::WebInputEvent::kFromDebugger;
   mouse_event_ = blink::SyntheticWebMouseEventBuilder::Build(
       blink::WebInputEvent::Type::kMouseMove, x, y,
       button_modifiers | key_modifiers | last_modifiers_,
@@ -104,6 +108,8 @@
                                    SyntheticPointerActionParams::Button button,
                                    int key_modifiers) {
   DCHECK_EQ(index, 0);
+  if (from_devtools_debugger_)
+    key_modifiers |= blink::WebInputEvent::kFromDebugger;
   mouse_event_ = blink::SyntheticWebMouseEventBuilder::Build(
       blink::WebInputEvent::Type::kMouseUp, mouse_event_.PositionInWidget().x(),
       mouse_event_.PositionInWidget().y(), key_modifiers | last_modifiers_,
diff --git a/content/browser/renderer_host/input/synthetic_pen_driver.cc b/content/browser/renderer_host/input/synthetic_pen_driver.cc
index 1733681..1c25f13 100644
--- a/content/browser/renderer_host/input/synthetic_pen_driver.cc
+++ b/content/browser/renderer_host/input/synthetic_pen_driver.cc
@@ -16,10 +16,13 @@
 
 void SyntheticPenDriver::Leave(int index) {
   DCHECK_EQ(index, 0);
+  int modifiers = last_modifiers_;
+  if (from_devtools_debugger_)
+    modifiers |= blink::WebInputEvent::kFromDebugger;
   mouse_event_ = blink::SyntheticWebMouseEventBuilder::Build(
       blink::WebInputEvent::Type::kMouseLeave,
       mouse_event_.PositionInWidget().x(), mouse_event_.PositionInWidget().y(),
-      last_modifiers_, mouse_event_.pointer_type);
+      modifiers, mouse_event_.pointer_type);
 }
 
 }  // namespace content
diff --git a/content/browser/renderer_host/input/synthetic_pointer_action.cc b/content/browser/renderer_host/input/synthetic_pointer_action.cc
index 27a8f95..a7c10873 100644
--- a/content/browser/renderer_host/input/synthetic_pointer_action.cc
+++ b/content/browser/renderer_host/input/synthetic_pointer_action.cc
@@ -28,8 +28,8 @@
       gesture_source_type_ = target->GetDefaultSyntheticGestureSourceType();
 
     if (!synthetic_pointer_driver_) {
-      owned_synthetic_pointer_driver_ =
-          SyntheticPointerDriver::Create(gesture_source_type_);
+      owned_synthetic_pointer_driver_ = SyntheticPointerDriver::Create(
+          gesture_source_type_, params_.from_devtools_debugger);
       synthetic_pointer_driver_ = owned_synthetic_pointer_driver_.get();
     }
 
diff --git a/content/browser/renderer_host/input/synthetic_pointer_action_unittest.cc b/content/browser/renderer_host/input/synthetic_pointer_action_unittest.cc
index d4aa3cc..3e9ed235 100644
--- a/content/browser/renderer_host/input/synthetic_pointer_action_unittest.cc
+++ b/content/browser/renderer_host/input/synthetic_pointer_action_unittest.cc
@@ -121,8 +121,11 @@
 
   WebInputEvent::Type type() const { return type_; }
 
+  void ExpectFromDebugger() { expect_from_debugger_ = true; }
+
  protected:
   WebInputEvent::Type type_;
+  bool expect_from_debugger_ = false;
 };
 
 class MockSyntheticPointerTouchActionTarget
@@ -151,6 +154,7 @@
           touch_event.touches[i].rotation_angle;
       forces_[num_dispatched_pointer_actions_] = touch_event.touches[i].force;
       timestamps_[num_dispatched_pointer_actions_] = touch_event.TimeStamp();
+      modifiers_[num_dispatched_pointer_actions_] = touch_event.GetModifiers();
       num_dispatched_pointer_actions_++;
     }
   }
@@ -215,6 +219,17 @@
              << "Dispatched event's time stamp  was " << timestamps_[index]
              << ", expected " << param.timestamp() << ".";
     }
+    if (expect_from_debugger_ &&
+        !(modifiers_[index] & blink::WebInputEvent::kFromDebugger)) {
+      return testing::AssertionFailure()
+             << "Dispatched event's modifers did not include expected "
+                "kFromDebugger bit.";
+    } else if (!expect_from_debugger_ &&
+               (modifiers_[index] & blink::WebInputEvent::kFromDebugger)) {
+      return testing::AssertionFailure()
+             << "Dispatched event's modifers included unexpected "
+                "kFromDebugger bit.";
+    }
     return testing::AssertionSuccess();
   }
 
@@ -250,6 +265,7 @@
   float rotation_angles_[WebTouchEvent::kTouchesLengthCap];
   float forces_[WebTouchEvent::kTouchesLengthCap];
   base::TimeTicks timestamps_[WebTouchEvent::kTouchesLengthCap];
+  int modifiers_[WebTouchEvent::kTouchesLengthCap];
 };
 
 class MockSyntheticPointerMouseActionTarget
@@ -331,6 +347,9 @@
           buttons[index]);
     }
     modifiers |= param.key_modifiers();
+    if (expect_from_debugger_)
+      modifiers |= blink::WebInputEvent::kFromDebugger;
+
     if (modifiers_ != modifiers) {
       return testing::AssertionFailure() << "Pointer modifiers was "
                                          << modifiers_ << ", expected "
@@ -687,6 +706,59 @@
   EXPECT_EQ(3, num_failure_);
 }
 
+TEST_F(SyntheticPointerActionTest, PointerTouchActionFromDebugger) {
+  CreateSyntheticPointerActionTarget<MockSyntheticPointerTouchActionTarget>();
+  target_->ExpectFromDebugger();
+  params_.from_devtools_debugger = true;
+
+  // Send a touch press for one finger.
+  SyntheticPointerActionParams param1 = SyntheticPointerActionParams(
+      SyntheticPointerActionParams::PointerActionType::PRESS);
+  param1.set_pointer_id(0);
+  param1.set_position(gfx::PointF(54, 89));
+  param1.set_width(30);
+  param1.set_height(45);
+  param1.set_rotation_angle(10);
+  param1.set_force(15);
+  SyntheticPointerActionListParams::ParamList param_list1;
+  param_list1.push_back(param1);
+  params_.PushPointerActionParamsList(param_list1);
+
+  // Send a touch move for the first finger and a touch press for the second
+  // finger.
+  param1.set_pointer_action_type(
+      SyntheticPointerActionParams::PointerActionType::MOVE);
+  param1.set_position(gfx::PointF(133, 156));
+  SyntheticPointerActionParams param2 = SyntheticPointerActionParams(
+      SyntheticPointerActionParams::PointerActionType::PRESS);
+  param2.set_pointer_id(1);
+  param2.set_position(gfx::PointF(79, 132));
+  param2.set_width(10);
+  param2.set_height(35);
+  param2.set_rotation_angle(30);
+  param2.set_force(10);
+  SyntheticPointerActionListParams::ParamList param_list2;
+  param_list2.push_back(param1);
+  param_list2.push_back(param2);
+  params_.PushPointerActionParamsList(param_list2);
+  pointer_action_ = std::make_unique<SyntheticPointerAction>(params_);
+
+  ForwardSyntheticPointerAction();
+  MockSyntheticPointerTouchActionTarget* pointer_touch_target =
+      static_cast<MockSyntheticPointerTouchActionTarget*>(target_.get());
+  int index_array[2] = {0, 1};
+  EXPECT_EQ(1, num_success_);
+  EXPECT_EQ(0, num_failure_);
+  EXPECT_TRUE(pointer_touch_target->SyntheticTouchActionListDispatchedCorrectly(
+      param_list1, index_array));
+
+  ForwardSyntheticPointerAction();
+  EXPECT_EQ(2, num_success_);
+  EXPECT_EQ(0, num_failure_);
+  EXPECT_TRUE(pointer_touch_target->SyntheticTouchActionListDispatchedCorrectly(
+      param_list2, index_array));
+}
+
 TEST_F(SyntheticPointerActionTest, PointerMouseAction) {
   CreateSyntheticPointerActionTarget<MockSyntheticPointerMouseActionTarget>();
 
@@ -974,6 +1046,52 @@
   EXPECT_EQ(1, num_failure_);
 }
 
+TEST_F(SyntheticPointerActionTest, PointerMouseFromDebugger) {
+  CreateSyntheticPointerActionTarget<MockSyntheticPointerMouseActionTarget>();
+  target_->ExpectFromDebugger();
+  params_.from_devtools_debugger = true;
+
+  // Send a mouse down.
+  SyntheticPointerActionParams param1 = SyntheticPointerActionParams(
+      SyntheticPointerActionParams::PointerActionType::PRESS);
+  param1.set_position(gfx::PointF(189, 62));
+  params_.PushPointerActionParams(param1);
+
+  // Send a mouse drag.
+  SyntheticPointerActionParams param2 = SyntheticPointerActionParams(
+      SyntheticPointerActionParams::PointerActionType::MOVE);
+  param2.set_position(gfx::PointF(326, 298));
+  params_.PushPointerActionParams(param2);
+
+  // Send a mouse up.
+  SyntheticPointerActionParams param3 = SyntheticPointerActionParams(
+      SyntheticPointerActionParams::PointerActionType::RELEASE);
+  params_.PushPointerActionParams(param3);
+  pointer_action_ = std::make_unique<SyntheticPointerAction>(params_);
+
+  ForwardSyntheticPointerAction();
+  MockSyntheticPointerMouseActionTarget* pointer_mouse_target =
+      static_cast<MockSyntheticPointerMouseActionTarget*>(target_.get());
+  EXPECT_EQ(1, num_success_);
+  EXPECT_EQ(0, num_failure_);
+  std::vector<SyntheticPointerActionParams::Button> buttons;
+  buttons.push_back(SyntheticPointerActionParams::Button::LEFT);
+  EXPECT_TRUE(pointer_mouse_target->SyntheticMouseActionDispatchedCorrectly(
+      param1, 1, buttons, SyntheticPointerActionParams::Button::LEFT));
+
+  ForwardSyntheticPointerAction();
+  EXPECT_EQ(2, num_success_);
+  EXPECT_EQ(0, num_failure_);
+  EXPECT_TRUE(pointer_mouse_target->SyntheticMouseActionDispatchedCorrectly(
+      param2, 0, buttons, SyntheticPointerActionParams::Button::LEFT));
+
+  ForwardSyntheticPointerAction();
+  EXPECT_EQ(3, num_success_);
+  EXPECT_EQ(0, num_failure_);
+  EXPECT_TRUE(pointer_mouse_target->SyntheticMouseActionDispatchedCorrectly(
+      param3, 1, buttons, SyntheticPointerActionParams::Button::LEFT));
+}
+
 TEST_F(SyntheticPointerActionTest, PointerPenAction) {
   CreateSyntheticPointerActionTarget<MockSyntheticPointerPenActionTarget>();
 
@@ -1034,6 +1152,68 @@
       content::mojom::GestureSourceType::kPenInput));
 }
 
+TEST_F(SyntheticPointerActionTest, PointerPenActionFromDebugger) {
+  CreateSyntheticPointerActionTarget<MockSyntheticPointerPenActionTarget>();
+  target_->ExpectFromDebugger();
+  params_.from_devtools_debugger = true;
+
+  // Send a pen move.
+  SyntheticPointerActionParams param1 = SyntheticPointerActionParams(
+      SyntheticPointerActionParams::PointerActionType::MOVE);
+  param1.set_position(gfx::PointF(189, 62));
+  params_.PushPointerActionParams(param1);
+
+  // Send a pen down.
+  SyntheticPointerActionParams param2 = SyntheticPointerActionParams(
+      SyntheticPointerActionParams::PointerActionType::PRESS);
+  param2.set_position(gfx::PointF(189, 62));
+  params_.PushPointerActionParams(param2);
+
+  // Send a pen up.
+  SyntheticPointerActionParams param3 = SyntheticPointerActionParams(
+      SyntheticPointerActionParams::PointerActionType::RELEASE);
+  params_.PushPointerActionParams(param3);
+
+  // Send a pen leave.
+  SyntheticPointerActionParams param4 = SyntheticPointerActionParams(
+      SyntheticPointerActionParams::PointerActionType::LEAVE);
+  params_.PushPointerActionParams(param4);
+  pointer_action_ = std::make_unique<SyntheticPointerAction>(params_);
+
+  ForwardSyntheticPointerAction();
+  MockSyntheticPointerPenActionTarget* pointer_pen_target =
+      static_cast<MockSyntheticPointerPenActionTarget*>(target_.get());
+  EXPECT_EQ(1, num_success_);
+  EXPECT_EQ(0, num_failure_);
+  std::vector<SyntheticPointerActionParams::Button> buttons;
+  EXPECT_TRUE(pointer_pen_target->SyntheticMouseActionDispatchedCorrectly(
+      param1, 0, buttons, SyntheticPointerActionParams::Button::NO_BUTTON,
+      content::mojom::GestureSourceType::kPenInput));
+
+  ForwardSyntheticPointerAction();
+  EXPECT_EQ(2, num_success_);
+  EXPECT_EQ(0, num_failure_);
+  buttons.push_back(SyntheticPointerActionParams::Button::LEFT);
+  EXPECT_TRUE(pointer_pen_target->SyntheticMouseActionDispatchedCorrectly(
+      param2, 1, buttons, SyntheticPointerActionParams::Button::LEFT,
+      content::mojom::GestureSourceType::kPenInput));
+
+  ForwardSyntheticPointerAction();
+  EXPECT_EQ(3, num_success_);
+  EXPECT_EQ(0, num_failure_);
+  EXPECT_TRUE(pointer_pen_target->SyntheticMouseActionDispatchedCorrectly(
+      param3, 1, buttons, SyntheticPointerActionParams::Button::LEFT,
+      content::mojom::GestureSourceType::kPenInput));
+
+  ForwardSyntheticPointerAction();
+  EXPECT_EQ(4, num_success_);
+  EXPECT_EQ(0, num_failure_);
+  buttons.pop_back();
+  EXPECT_TRUE(pointer_pen_target->SyntheticMouseActionDispatchedCorrectly(
+      param4, 0, buttons, SyntheticPointerActionParams::Button::NO_BUTTON,
+      content::mojom::GestureSourceType::kPenInput));
+}
+
 TEST_F(SyntheticPointerActionTest, EmptyParams) {
   CreateSyntheticPointerActionTarget<MockSyntheticPointerPenActionTarget>();
   pointer_action_ = std::make_unique<SyntheticPointerAction>(params_);
diff --git a/content/browser/renderer_host/input/synthetic_pointer_driver.cc b/content/browser/renderer_host/input/synthetic_pointer_driver.cc
index 471f729..b0d035a 100644
--- a/content/browser/renderer_host/input/synthetic_pointer_driver.cc
+++ b/content/browser/renderer_host/input/synthetic_pointer_driver.cc
@@ -30,4 +30,13 @@
   return nullptr;
 }
 
+// static
+std::unique_ptr<SyntheticPointerDriver> SyntheticPointerDriver::Create(
+    content::mojom::GestureSourceType gesture_source_type,
+    bool from_devtools_debugger) {
+  auto driver = Create(gesture_source_type);
+  driver->from_devtools_debugger_ = from_devtools_debugger;
+  return driver;
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/input/synthetic_pointer_driver.h b/content/browser/renderer_host/input/synthetic_pointer_driver.h
index 9eeb621..a68ca14 100644
--- a/content/browser/renderer_host/input/synthetic_pointer_driver.h
+++ b/content/browser/renderer_host/input/synthetic_pointer_driver.h
@@ -27,6 +27,9 @@
 
   static std::unique_ptr<SyntheticPointerDriver> Create(
       content::mojom::GestureSourceType gesture_source_type);
+  static std::unique_ptr<SyntheticPointerDriver> Create(
+      content::mojom::GestureSourceType gesture_source_type,
+      bool from_devtools_debugger);
 
   virtual void DispatchEvent(SyntheticGestureTarget* target,
                              const base::TimeTicks& timestamp) = 0;
@@ -73,6 +76,9 @@
   // a valid sequence of pointer actions.
   virtual bool UserInputCheck(
       const SyntheticPointerActionParams& params) const = 0;
+
+ protected:
+  bool from_devtools_debugger_ = false;
 };
 
 }  // namespace content
diff --git a/content/browser/renderer_host/input/synthetic_touch_driver.cc b/content/browser/renderer_host/input/synthetic_touch_driver.cc
index 553066e..c255a59 100644
--- a/content/browser/renderer_host/input/synthetic_touch_driver.cc
+++ b/content/browser/renderer_host/input/synthetic_touch_driver.cc
@@ -45,6 +45,8 @@
                               force, tangential_pressure, tilt_x, tilt_y);
   touch_event_.touches[touch_index].id = index;
   pointer_id_map_[index] = touch_index;
+  if (from_devtools_debugger_)
+    key_modifiers |= blink::WebInputEvent::kFromDebugger;
   touch_event_.SetModifiers(key_modifiers);
 }
 
@@ -65,6 +67,8 @@
   touch_event_.MovePoint(pointer_id_map_[index], x, y, width / 2.f,
                          height / 2.f, rotation_angle, force,
                          tangential_pressure, tilt_x, tilt_y);
+  if (from_devtools_debugger_)
+    key_modifiers |= blink::WebInputEvent::kFromDebugger;
   touch_event_.SetModifiers(key_modifiers);
 }
 
@@ -74,6 +78,8 @@
   DCHECK_GE(index, 0);
   DCHECK(pointer_id_map_.find(index) != pointer_id_map_.end());
   touch_event_.ReleasePoint(pointer_id_map_[index]);
+  if (from_devtools_debugger_)
+    key_modifiers |= blink::WebInputEvent::kFromDebugger;
   touch_event_.SetModifiers(key_modifiers);
   pointer_id_map_.erase(index);
 }
@@ -84,6 +90,8 @@
   DCHECK_GE(index, 0);
   DCHECK(pointer_id_map_.find(index) != pointer_id_map_.end());
   touch_event_.CancelPoint(pointer_id_map_[index]);
+  if (from_devtools_debugger_)
+    key_modifiers |= blink::WebInputEvent::kFromDebugger;
   touch_event_.SetModifiers(key_modifiers);
   touch_event_.dispatch_type =
       blink::WebInputEvent::DispatchType::kEventNonBlocking;
diff --git a/content/common/input/synthetic_gesture_params.cc b/content/common/input/synthetic_gesture_params.cc
index fd71023..e3bdc4f 100644
--- a/content/common/input/synthetic_gesture_params.cc
+++ b/content/common/input/synthetic_gesture_params.cc
@@ -11,8 +11,7 @@
     : gesture_source_type(mojom::GestureSourceType::kDefaultInput) {}
 
 SyntheticGestureParams::SyntheticGestureParams(
-    const SyntheticGestureParams& other)
-    : gesture_source_type(other.gesture_source_type) {}
+    const SyntheticGestureParams& other) = default;
 
 SyntheticGestureParams::~SyntheticGestureParams() {}
 
diff --git a/content/common/input/synthetic_gesture_params.h b/content/common/input/synthetic_gesture_params.h
index b2b7a73..9190692 100644
--- a/content/common/input/synthetic_gesture_params.h
+++ b/content/common/input/synthetic_gesture_params.h
@@ -44,6 +44,7 @@
   // platform.
   static bool IsGestureSourceTypeSupported(
       content::mojom::GestureSourceType gesture_source_type);
+  bool from_devtools_debugger = false;
 };
 
 }  // namespace content