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 @@
#include <algorithm>
#include <memory>
#include "base/feature_list.h"
#include "base/i18n/char_iterator.h"
#include "base/logging.h"
#include "base/strings/string16.h"
......@@ -20,6 +21,7 @@
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.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 "ppapi/c/pp_input_event.h"
#include "ppapi/shared_impl/ppb_input_event_shared.h"
......@@ -201,6 +203,7 @@ void AppendCharEvent(const WebInputEvent& event,
}
void AppendMouseEvent(const WebInputEvent& event,
std::unique_ptr<gfx::PointF>* in_out_last_mouse_position,
std::vector<InputEventData>* result_events) {
static_assert(static_cast<int>(WebMouseEvent::Button::kNoButton) ==
static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_NONE),
......@@ -236,8 +239,29 @@ void AppendMouseEvent(const WebInputEvent& event,
result.mouse_position.x = mouse_event.PositionInWidget().x;
result.mouse_position.y = mouse_event.PositionInWidget().y;
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);
}
......@@ -602,8 +626,10 @@ void GetKeyCode(const std::string& char_text,
} // namespace
void CreateInputEventData(const WebInputEvent& event,
std::vector<InputEventData>* result) {
void CreateInputEventData(
const WebInputEvent& event,
std::unique_ptr<gfx::PointF>* in_out_last_mouse_position,
std::vector<InputEventData>* result) {
result->clear();
switch (event.GetType()) {
......@@ -613,7 +639,7 @@ void CreateInputEventData(const WebInputEvent& event,
case WebInputEvent::kMouseEnter:
case WebInputEvent::kMouseLeave:
case WebInputEvent::kContextMenu:
AppendMouseEvent(event, result);
AppendMouseEvent(event, in_out_last_mouse_position, result);
break;
case WebInputEvent::kMouseWheel:
AppendMouseWheelEvent(event, result);
......
......@@ -29,6 +29,7 @@ namespace content {
// events will ge generated and the vector will be empty.
CONTENT_EXPORT void CreateInputEventData(
const blink::WebInputEvent& event,
std::unique_ptr<gfx::PointF>* last_mouse_position,
std::vector<ppapi::InputEventData>* pp_events);
// Creates a WebInputEvent from the given PP_InputEvent. If it fails, returns
......
......@@ -48,7 +48,7 @@ TEST_F(EventConversionTest, TouchStart) {
touch.PressPoint(1.f, 2.f);
std::vector<ppapi::InputEventData> pp_events;
CreateInputEventData(touch, &pp_events);
CreateInputEventData(touch, nullptr, &pp_events);
ASSERT_EQ(1U, pp_events.size());
const ppapi::InputEventData& pp_event = pp_events[0];
......@@ -76,7 +76,7 @@ TEST_F(EventConversionTest, TouchMove) {
touch.MovePoint(1, 5.f, 6.f);
std::vector<ppapi::InputEventData> pp_events;
CreateInputEventData(touch, &pp_events);
CreateInputEventData(touch, nullptr, &pp_events);
ASSERT_EQ(1U, pp_events.size());
const ppapi::InputEventData& pp_event = pp_events[0];
......@@ -104,7 +104,7 @@ TEST_F(EventConversionTest, TouchEnd) {
touch.ReleasePoint(0);
std::vector<ppapi::InputEventData> pp_events;
CreateInputEventData(touch, &pp_events);
CreateInputEventData(touch, nullptr, &pp_events);
ASSERT_EQ(1U, pp_events.size());
const ppapi::InputEventData& pp_event = pp_events[0];
......@@ -133,7 +133,7 @@ TEST_F(EventConversionTest, TouchCancel) {
touch.CancelPoint(0);
std::vector<ppapi::InputEventData> pp_events;
CreateInputEventData(touch, &pp_events);
CreateInputEventData(touch, nullptr, &pp_events);
ASSERT_EQ(1U, pp_events.size());
const ppapi::InputEventData& pp_event = pp_events[0];
......@@ -152,4 +152,33 @@ TEST_F(EventConversionTest, TouchCancel) {
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
......@@ -1166,9 +1166,10 @@ bool PepperPluginInstanceImpl::HandleInputEvent(
std::unique_ptr<const WebInputEvent> event_in_dip(
ui::ScaleWebInputEvent(event, viewport_to_dip_scale_));
if (event_in_dip)
CreateInputEventData(*event_in_dip.get(), &events);
CreateInputEventData(*event_in_dip.get(), &last_mouse_position_,
&events);
else
CreateInputEventData(event, &events);
CreateInputEventData(event, &last_mouse_position_, &events);
// Each input event may generate more than one PP_InputEvent.
for (size_t i = 0; i < events.size(); i++) {
......
......@@ -871,6 +871,11 @@ class CONTENT_EXPORT PepperPluginInstanceImpl
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
// NaCl via the IPC NaCl proxy.
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