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