Add pen support for OSR (issue #1059)

This commit is contained in:
Riku Palomäki 2019-03-07 22:06:54 +00:00 committed by Marshall Greenblatt
parent 4cbcb4615a
commit 7b5d30e9a9
4 changed files with 110 additions and 6 deletions

View File

@ -1715,6 +1715,17 @@ typedef enum {
CEF_TET_CANCELLED CEF_TET_CANCELLED
} cef_touch_event_type_t; } cef_touch_event_type_t;
///
// The device type that caused the event.
///
typedef enum {
CEF_POINTER_TYPE_TOUCH = 0,
CEF_POINTER_TYPE_MOUSE,
CEF_POINTER_TYPE_PEN,
CEF_POINTER_TYPE_ERASER,
CEF_POINTER_TYPE_UNKNOWN
} cef_pointer_type_t;
/// ///
// Structure representing touch event information. // Structure representing touch event information.
/// ///
@ -1771,6 +1782,11 @@ typedef struct _cef_touch_event_t {
/// ///
uint32 modifiers; uint32 modifiers;
///
// The device type that caused the event.
///
cef_pointer_type_t pointer_type;
} cef_touch_event_t; } cef_touch_event_t;
/// ///

View File

@ -10,6 +10,28 @@
#include "ui/events/base_event_utils.h" #include "ui/events/base_event_utils.h"
#include "ui/events/gesture_detection/gesture_configuration.h" #include "ui/events/gesture_detection/gesture_configuration.h"
namespace {
ui::MotionEvent::ToolType CefPointerTypeToMotionEventToolType(
cef_pointer_type_t pointer_type) {
switch (pointer_type) {
case CEF_POINTER_TYPE_TOUCH:
return ui::MotionEvent::ToolType::FINGER;
case CEF_POINTER_TYPE_MOUSE:
return ui::MotionEvent::ToolType::MOUSE;
case CEF_POINTER_TYPE_PEN:
return ui::MotionEvent::ToolType::STYLUS;
case CEF_POINTER_TYPE_ERASER:
return ui::MotionEvent::ToolType::ERASER;
case CEF_POINTER_TYPE_UNKNOWN:
return ui::MotionEvent::ToolType::UNKNOWN;
}
NOTREACHED();
return ui::MotionEvent::ToolType::UNKNOWN;
}
} // namespace
CefMotionEventOSR::CefMotionEventOSR() { CefMotionEventOSR::CefMotionEventOSR() {
std::fill(id_map_, id_map_ + blink::WebTouchEvent::kTouchesLengthCap, -1); std::fill(id_map_, id_map_ + blink::WebTouchEvent::kTouchesLengthCap, -1);
} }
@ -205,14 +227,25 @@ ui::PointerProperties CefMotionEventOSR::GetPointerPropertiesFromTouchEvent(
pointer_properties.SetAxesAndOrientation(touch.radius_x, touch.radius_y, pointer_properties.SetAxesAndOrientation(touch.radius_x, touch.radius_y,
touch.rotation_angle); touch.rotation_angle);
if (!pointer_properties.touch_major) { if (!pointer_properties.touch_major) {
pointer_properties.touch_major = float default_size;
2.f * ui::GestureConfiguration::GetInstance()->default_radius(); switch (touch.pointer_type) {
pointer_properties.touch_minor = case CEF_POINTER_TYPE_PEN:
2.f * ui::GestureConfiguration::GetInstance()->default_radius(); case CEF_POINTER_TYPE_ERASER:
// Default size for stylus events is 1x1.
default_size = 1;
break;
default:
default_size =
2.f * ui::GestureConfiguration::GetInstance()->default_radius();
break;
}
pointer_properties.touch_major = pointer_properties.touch_minor =
default_size;
pointer_properties.orientation = 0; pointer_properties.orientation = 0;
} }
pointer_properties.tool_type = ui::MotionEvent::ToolType::FINGER; pointer_properties.tool_type =
CefPointerTypeToMotionEventToolType(touch.pointer_type);
return pointer_properties; return pointer_properties;
} }

View File

@ -168,6 +168,8 @@ enum OSRTestType {
OSR_TEST_TOUCH_END, OSR_TEST_TOUCH_END,
// touchCancel is triggered on dismissing // touchCancel is triggered on dismissing
OSR_TEST_TOUCH_CANCEL, OSR_TEST_TOUCH_CANCEL,
// CEF_POINTER_TYPE_PEN is mapped to pen pointer event
OSR_TEST_PEN,
// Define the range for popup tests. // Define the range for popup tests.
OSR_TEST_POPUP_FIRST = OSR_TEST_POPUP_PAINT, OSR_TEST_POPUP_FIRST = OSR_TEST_POPUP_PAINT,
OSR_TEST_POPUP_LAST = OSR_TEST_POPUP_SCROLL_INSIDE, OSR_TEST_POPUP_LAST = OSR_TEST_POPUP_SCROLL_INSIDE,
@ -318,6 +320,28 @@ class OSRTestHandler : public RoutingTestHandler,
break; break;
} }
} break; } break;
case OSR_TEST_PEN: {
switch (touch_state_) {
case CEF_TET_CANCELLED:
// The first message expected is pointerdown.
EXPECT_STREQ(messageStr.c_str(), "osrpointerdown pen");
touch_state_ = CEF_TET_PRESSED;
break;
case CEF_TET_PRESSED:
EXPECT_STREQ(messageStr.c_str(), "osrpointermove pen");
touch_state_ = CEF_TET_MOVED;
break;
case CEF_TET_MOVED:
// There might be multiple pointermove events, ignore.
if (messageStr != "osrpointermove pen") {
EXPECT_STREQ(messageStr.c_str(), "osrpointerup pen");
DestroySucceededTestSoon();
}
break;
default:
break;
}
} break;
default: default:
// Intentionally left blank // Intentionally left blank
break; break;
@ -1062,6 +1086,27 @@ class OSRTestHandler : public RoutingTestHandler,
browser->GetHost()->SendTouchEvent(touch_event2); browser->GetHost()->SendTouchEvent(touch_event2);
} }
} break; } break;
case OSR_TEST_PEN: {
if (StartTest()) {
const CefRect& pointerdiv = GetElementBounds("pointerdiv");
CefTouchEvent touch_event;
touch_event.x = MiddleX(pointerdiv) - 45;
touch_event.y = MiddleY(pointerdiv);
touch_event.type = CEF_TET_PRESSED;
touch_event.pointer_type = CEF_POINTER_TYPE_PEN;
browser->GetHost()->SendTouchEvent(touch_event);
touch_event.type = CEF_TET_MOVED;
for (size_t i = 0; i < 40; i++) {
touch_event.x++;
browser->GetHost()->SendTouchEvent(touch_event);
}
touch_event.type = CEF_TET_RELEASED;
browser->GetHost()->SendTouchEvent(touch_event);
}
} break;
default: default:
break; break;
} }
@ -1552,3 +1597,4 @@ OSR_TEST(TouchEnd, OSR_TEST_TOUCH_END, 1.0f);
OSR_TEST(TouchEnd2X, OSR_TEST_TOUCH_END, 2.0f); OSR_TEST(TouchEnd2X, OSR_TEST_TOUCH_END, 2.0f);
OSR_TEST(TouchCancel, OSR_TEST_TOUCH_CANCEL, 1.0f); OSR_TEST(TouchCancel, OSR_TEST_TOUCH_CANCEL, 1.0f);
OSR_TEST(TouchCancel2X, OSR_TEST_TOUCH_CANCEL, 2.0f); OSR_TEST(TouchCancel2X, OSR_TEST_TOUCH_CANCEL, 2.0f);
OSR_TEST(PenEvent, OSR_TEST_PEN, 1.0f);

View File

@ -25,7 +25,7 @@
left: 7px; left: 7px;
opacity: 0.4; opacity: 0.4;
} }
#touchdiv { #touchdiv, #pointerdiv {
width: 100px; width: 100px;
height: 50px; height: 50px;
background-color: red; background-color: red;
@ -61,6 +61,7 @@
elems.push(getElementBounds('dropdiv')); elems.push(getElementBounds('dropdiv'));
elems.push(getElementBounds('dragdiv')); elems.push(getElementBounds('dragdiv'));
elems.push(getElementBounds('touchdiv')); elems.push(getElementBounds('touchdiv'));
elems.push(getElementBounds('pointerdiv'));
if (window.testQuery) if (window.testQuery)
window.testQuery({request: JSON.stringify(param)}); window.testQuery({request: JSON.stringify(param)});
@ -138,6 +139,12 @@
window.testQuery({request: param}); window.testQuery({request: param});
} }
function onPointerEvent(ev) {
var param = 'osr' + ev.type + ' ' + ev.pointerType;
if (window.testQuery)
window.testQuery({request: param});
}
</script> </script>
<body onfocus='onEventTest(event)' onblur='onEventTest(event)' onload='load();'> <body onfocus='onEventTest(event)' onblur='onEventTest(event)' onload='load();'>
<h1 id='LI00' onclick="onEventTest(event)"> <h1 id='LI00' onclick="onEventTest(event)">
@ -178,6 +185,8 @@
</div> </div>
<div id="touchdiv" ontouchstart="onTouchEvent(event)" ontouchend="onTouchEvent(event)" ontouchmove="onTouchEvent(event)" ontouchcancel="onTouchEvent(event)"> <div id="touchdiv" ontouchstart="onTouchEvent(event)" ontouchend="onTouchEvent(event)" ontouchmove="onTouchEvent(event)" ontouchcancel="onTouchEvent(event)">
</div> </div>
<div id="pointerdiv" onpointerdown="onPointerEvent(event)" onpointerup="onPointerEvent(event)" onpointermove="onPointerEvent(event)" onpointercancel="onPointerEvent(event)">
</div>
<br /> <br />
<br /> <br />
<br /> <br />