Commit de9262ec authored by Ella Ge's avatar Ella Ge Committed by Commit Bot

Make PPAPI mouse event use last_mouse_position to calculate movement

With kConsolidatedMovementXY enabled, mouse movement in blink is
calculated by current possiont - last position. The initial
implementation forgot to handle the pepper events.
This CL adds a last_mouse_position_ field in pepper and use it to
compute mouse movement.

Bug: 1013753
Change-Id: I116ead5e7bdd25d15072e8793e8e3eee02cd2b80
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1864566Reviewed-by: default avatarRaymes Khoury <raymes@chromium.org>
Reviewed-by: default avatarNavid Zolghadr <nzolghadr@chromium.org>
Commit-Queue: Ella Ge <eirage@chromium.org>
Cr-Commit-Position: refs/heads/master@{#714794}
parent 6cb531ec
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <algorithm> #include <algorithm>
#include <memory> #include <memory>
#include "base/feature_list.h"
#include "base/i18n/char_iterator.h" #include "base/i18n/char_iterator.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
...@@ -20,6 +21,7 @@ ...@@ -20,6 +21,7 @@
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "content/common/input/web_touch_event_traits.h" #include "content/common/input/web_touch_event_traits.h"
#include "content/public/common/content_features.h"
#include "device/gamepad/public/cpp/gamepads.h" #include "device/gamepad/public/cpp/gamepads.h"
#include "ppapi/c/pp_input_event.h" #include "ppapi/c/pp_input_event.h"
#include "ppapi/shared_impl/ppb_input_event_shared.h" #include "ppapi/shared_impl/ppb_input_event_shared.h"
...@@ -201,6 +203,7 @@ void AppendCharEvent(const WebInputEvent& event, ...@@ -201,6 +203,7 @@ void AppendCharEvent(const WebInputEvent& event,
} }
void AppendMouseEvent(const WebInputEvent& event, void AppendMouseEvent(const WebInputEvent& event,
std::unique_ptr<gfx::PointF>* in_out_last_mouse_position,
std::vector<InputEventData>* result_events) { std::vector<InputEventData>* result_events) {
static_assert(static_cast<int>(WebMouseEvent::Button::kNoButton) == static_assert(static_cast<int>(WebMouseEvent::Button::kNoButton) ==
static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_NONE), static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_NONE),
...@@ -236,8 +239,29 @@ void AppendMouseEvent(const WebInputEvent& event, ...@@ -236,8 +239,29 @@ void AppendMouseEvent(const WebInputEvent& event,
result.mouse_position.x = mouse_event.PositionInWidget().x; result.mouse_position.x = mouse_event.PositionInWidget().x;
result.mouse_position.y = mouse_event.PositionInWidget().y; result.mouse_position.y = mouse_event.PositionInWidget().y;
result.mouse_click_count = mouse_event.click_count; result.mouse_click_count = mouse_event.click_count;
result.mouse_movement.x = mouse_event.movement_x;
result.mouse_movement.y = mouse_event.movement_y; if (base::FeatureList::IsEnabled(features::kConsolidatedMovementXY)) {
if (mouse_event.GetType() == WebInputEvent::kMouseMove &&
*in_out_last_mouse_position) {
result.mouse_movement.x =
mouse_event.PositionInScreen().x - (*in_out_last_mouse_position)->x();
result.mouse_movement.y =
mouse_event.PositionInScreen().y - (*in_out_last_mouse_position)->y();
}
*in_out_last_mouse_position =
std::make_unique<gfx::PointF>(mouse_event.PositionInScreen());
// Filter out event generated by recentering the cursor when mouse locked.
// See |RenderWidgetHostViewEventHandler::HandleMouseEventWhileLocked|.
if ((mouse_event.GetModifiers() &
WebInputEvent::Modifiers::kRelativeMotionEvent)) {
return;
}
} else {
result.mouse_movement.x = mouse_event.movement_x;
result.mouse_movement.y = mouse_event.movement_y;
}
result_events->push_back(result); result_events->push_back(result);
} }
...@@ -602,8 +626,10 @@ void GetKeyCode(const std::string& char_text, ...@@ -602,8 +626,10 @@ void GetKeyCode(const std::string& char_text,
} // namespace } // namespace
void CreateInputEventData(const WebInputEvent& event, void CreateInputEventData(
std::vector<InputEventData>* result) { const WebInputEvent& event,
std::unique_ptr<gfx::PointF>* in_out_last_mouse_position,
std::vector<InputEventData>* result) {
result->clear(); result->clear();
switch (event.GetType()) { switch (event.GetType()) {
...@@ -613,7 +639,7 @@ void CreateInputEventData(const WebInputEvent& event, ...@@ -613,7 +639,7 @@ void CreateInputEventData(const WebInputEvent& event,
case WebInputEvent::kMouseEnter: case WebInputEvent::kMouseEnter:
case WebInputEvent::kMouseLeave: case WebInputEvent::kMouseLeave:
case WebInputEvent::kContextMenu: case WebInputEvent::kContextMenu:
AppendMouseEvent(event, result); AppendMouseEvent(event, in_out_last_mouse_position, result);
break; break;
case WebInputEvent::kMouseWheel: case WebInputEvent::kMouseWheel:
AppendMouseWheelEvent(event, result); AppendMouseWheelEvent(event, result);
......
...@@ -29,6 +29,7 @@ namespace content { ...@@ -29,6 +29,7 @@ namespace content {
// events will ge generated and the vector will be empty. // events will ge generated and the vector will be empty.
CONTENT_EXPORT void CreateInputEventData( CONTENT_EXPORT void CreateInputEventData(
const blink::WebInputEvent& event, const blink::WebInputEvent& event,
std::unique_ptr<gfx::PointF>* last_mouse_position,
std::vector<ppapi::InputEventData>* pp_events); std::vector<ppapi::InputEventData>* pp_events);
// Creates a WebInputEvent from the given PP_InputEvent. If it fails, returns // Creates a WebInputEvent from the given PP_InputEvent. If it fails, returns
......
...@@ -48,7 +48,7 @@ TEST_F(EventConversionTest, TouchStart) { ...@@ -48,7 +48,7 @@ TEST_F(EventConversionTest, TouchStart) {
touch.PressPoint(1.f, 2.f); touch.PressPoint(1.f, 2.f);
std::vector<ppapi::InputEventData> pp_events; std::vector<ppapi::InputEventData> pp_events;
CreateInputEventData(touch, &pp_events); CreateInputEventData(touch, nullptr, &pp_events);
ASSERT_EQ(1U, pp_events.size()); ASSERT_EQ(1U, pp_events.size());
const ppapi::InputEventData& pp_event = pp_events[0]; const ppapi::InputEventData& pp_event = pp_events[0];
...@@ -76,7 +76,7 @@ TEST_F(EventConversionTest, TouchMove) { ...@@ -76,7 +76,7 @@ TEST_F(EventConversionTest, TouchMove) {
touch.MovePoint(1, 5.f, 6.f); touch.MovePoint(1, 5.f, 6.f);
std::vector<ppapi::InputEventData> pp_events; std::vector<ppapi::InputEventData> pp_events;
CreateInputEventData(touch, &pp_events); CreateInputEventData(touch, nullptr, &pp_events);
ASSERT_EQ(1U, pp_events.size()); ASSERT_EQ(1U, pp_events.size());
const ppapi::InputEventData& pp_event = pp_events[0]; const ppapi::InputEventData& pp_event = pp_events[0];
...@@ -104,7 +104,7 @@ TEST_F(EventConversionTest, TouchEnd) { ...@@ -104,7 +104,7 @@ TEST_F(EventConversionTest, TouchEnd) {
touch.ReleasePoint(0); touch.ReleasePoint(0);
std::vector<ppapi::InputEventData> pp_events; std::vector<ppapi::InputEventData> pp_events;
CreateInputEventData(touch, &pp_events); CreateInputEventData(touch, nullptr, &pp_events);
ASSERT_EQ(1U, pp_events.size()); ASSERT_EQ(1U, pp_events.size());
const ppapi::InputEventData& pp_event = pp_events[0]; const ppapi::InputEventData& pp_event = pp_events[0];
...@@ -133,7 +133,7 @@ TEST_F(EventConversionTest, TouchCancel) { ...@@ -133,7 +133,7 @@ TEST_F(EventConversionTest, TouchCancel) {
touch.CancelPoint(0); touch.CancelPoint(0);
std::vector<ppapi::InputEventData> pp_events; std::vector<ppapi::InputEventData> pp_events;
CreateInputEventData(touch, &pp_events); CreateInputEventData(touch, nullptr, &pp_events);
ASSERT_EQ(1U, pp_events.size()); ASSERT_EQ(1U, pp_events.size());
const ppapi::InputEventData& pp_event = pp_events[0]; const ppapi::InputEventData& pp_event = pp_events[0];
...@@ -152,4 +152,33 @@ TEST_F(EventConversionTest, TouchCancel) { ...@@ -152,4 +152,33 @@ TEST_F(EventConversionTest, TouchCancel) {
CompareWebTouchEvents(touch, *touch_out); CompareWebTouchEvents(touch, *touch_out);
} }
TEST_F(EventConversionTest, MouseMove) {
std::unique_ptr<gfx::PointF> last_mouse_position;
blink::WebMouseEvent mouse_event = SyntheticWebMouseEventBuilder::Build(
blink::WebInputEvent::kMouseMove, 100, 200, 0);
std::vector<ppapi::InputEventData> pp_events;
CreateInputEventData(mouse_event, &last_mouse_position, &pp_events);
ASSERT_EQ(1U, pp_events.size());
const ppapi::InputEventData& pp_event = pp_events[0];
ASSERT_EQ(PP_INPUTEVENT_TYPE_MOUSEMOVE, pp_event.event_type);
ASSERT_EQ(pp_event.mouse_position.x, mouse_event.PositionInWidget().x);
ASSERT_EQ(pp_event.mouse_position.y, mouse_event.PositionInWidget().y);
ASSERT_EQ(pp_event.mouse_movement.x, 0);
ASSERT_EQ(pp_event.mouse_movement.y, 0);
if (last_mouse_position) {
ASSERT_EQ(*last_mouse_position.get(),
gfx::PointF(mouse_event.PositionInScreen()));
}
mouse_event = SyntheticWebMouseEventBuilder::Build(
blink::WebInputEvent::kMouseMove, 123, 188, 0);
CreateInputEventData(mouse_event, &last_mouse_position, &pp_events);
ASSERT_EQ(PP_INPUTEVENT_TYPE_MOUSEMOVE, pp_event.event_type);
ASSERT_EQ(pp_event.mouse_position.x, mouse_event.PositionInWidget().x);
ASSERT_EQ(pp_event.mouse_position.y, mouse_event.PositionInWidget().y);
ASSERT_EQ(pp_event.mouse_movement.x, 23);
ASSERT_EQ(pp_event.mouse_movement.y, -12);
}
} // namespace content } // namespace content
...@@ -1166,9 +1166,10 @@ bool PepperPluginInstanceImpl::HandleInputEvent( ...@@ -1166,9 +1166,10 @@ bool PepperPluginInstanceImpl::HandleInputEvent(
std::unique_ptr<const WebInputEvent> event_in_dip( std::unique_ptr<const WebInputEvent> event_in_dip(
ui::ScaleWebInputEvent(event, viewport_to_dip_scale_)); ui::ScaleWebInputEvent(event, viewport_to_dip_scale_));
if (event_in_dip) if (event_in_dip)
CreateInputEventData(*event_in_dip.get(), &events); CreateInputEventData(*event_in_dip.get(), &last_mouse_position_,
&events);
else else
CreateInputEventData(event, &events); CreateInputEventData(event, &last_mouse_position_, &events);
// Each input event may generate more than one PP_InputEvent. // Each input event may generate more than one PP_InputEvent.
for (size_t i = 0; i < events.size(); i++) { for (size_t i = 0; i < events.size(); i++) {
......
...@@ -871,6 +871,11 @@ class CONTENT_EXPORT PepperPluginInstanceImpl ...@@ -871,6 +871,11 @@ class CONTENT_EXPORT PepperPluginInstanceImpl
scoped_refptr<ppapi::TrackedCallback> lock_mouse_callback_; scoped_refptr<ppapi::TrackedCallback> lock_mouse_callback_;
// Last mouse position from mouse event, used for calculating movements. Null
// means no mouse event received yet. This value is updated by
// |CreateInputEventData|.
std::unique_ptr<gfx::PointF> last_mouse_position_;
// We store the arguments so we can re-send them if we are reset to talk to // We store the arguments so we can re-send them if we are reset to talk to
// NaCl via the IPC NaCl proxy. // NaCl via the IPC NaCl proxy.
std::vector<std::string> argn_; std::vector<std::string> argn_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment