Commit 5e805748 authored by jamescook's avatar jamescook Committed by Commit bot

mash: Fix DCHECK when clicking on window close box

There is no pointer event equivalent for mouse event type MOUSE_CAPTURE_CHANGED
and MoveEventHandler doesn't need to deal with this event type.

https://codereview.chromium.org/1814533002/ caused a change in mouse event
handling that caused this DCHECK to be hit.

BUG=598330
TEST=mojo_runner mojo:mash_session and click the close box for any window

Review URL: https://codereview.chromium.org/1843433002

Cr-Commit-Position: refs/heads/master@{#383858}
parent 52290867
......@@ -58,6 +58,12 @@ void MoveEventHandler::ProcessLocatedEvent(ui::LocatedEvent* event) {
const bool had_move_loop = move_loop_.get() != nullptr;
DCHECK(event->IsMouseEvent() || event->IsTouchEvent());
// This event handler can receive mouse events like ET_MOUSE_CAPTURE_CHANGED
// that cannot be converted to PointerEvents. Ignore them because they aren't
// needed for move handling.
if (!ui::PointerEvent::CanConvertFrom(*event))
return;
// TODO(moshayedi): no need for this once MoveEventHandler directly receives
// pointer events.
scoped_ptr<ui::PointerEvent> pointer_event;
......
......@@ -721,6 +721,24 @@ void TouchEvent::FixRotationAngle() {
////////////////////////////////////////////////////////////////////////////////
// PointerEvent
bool PointerEvent::CanConvertFrom(const Event& event) {
switch (event.type()) {
case ET_MOUSE_PRESSED:
case ET_MOUSE_DRAGGED:
case ET_MOUSE_MOVED:
case ET_MOUSE_ENTERED:
case ET_MOUSE_EXITED:
case ET_MOUSE_RELEASED:
case ET_TOUCH_PRESSED:
case ET_TOUCH_MOVED:
case ET_TOUCH_RELEASED:
case ET_TOUCH_CANCELLED:
return true;
default:
return false;
}
}
PointerEvent::PointerEvent(const PointerEvent& pointer_event)
: LocatedEvent(pointer_event),
pointer_id_(pointer_event.pointer_id()),
......@@ -730,6 +748,7 @@ PointerEvent::PointerEvent(const MouseEvent& mouse_event)
: LocatedEvent(mouse_event),
pointer_id_(kMousePointerId),
details_(mouse_event.pointer_details()) {
DCHECK(CanConvertFrom(mouse_event));
switch (mouse_event.type()) {
case ET_MOUSE_PRESSED:
SetType(ET_POINTER_DOWN);
......@@ -761,6 +780,7 @@ PointerEvent::PointerEvent(const TouchEvent& touch_event)
: LocatedEvent(touch_event),
pointer_id_(touch_event.touch_id()),
details_(touch_event.pointer_details()) {
DCHECK(CanConvertFrom(touch_event));
switch (touch_event.type()) {
case ET_TOUCH_PRESSED:
SetType(ET_POINTER_DOWN);
......
......@@ -737,6 +737,11 @@ class EVENTS_EXPORT PointerEvent : public LocatedEvent {
public:
static const int32_t kMousePointerId;
// Returns true if a PointerEvent can be constructed from the given mouse or
// touch event. For example, PointerEvent does not support ET_MOUSEWHEEL or
// ET_MOUSE_CAPTURE_CHANGED.
static bool CanConvertFrom(const Event& event);
PointerEvent(const PointerEvent& pointer_event);
explicit PointerEvent(const MouseEvent& mouse_event);
explicit PointerEvent(const TouchEvent& touch_event);
......
......@@ -725,6 +725,52 @@ TEST(EventTest, PointerDetailsCustomTouch) {
EXPECT_EQ(touch_event.pointer_details(), touch_event_copy.pointer_details());
}
TEST(EventTest, PointerEventCanConvertFrom) {
const gfx::Point point;
const base::TimeDelta time;
// Common mouse events can be converted.
const EventType mouse_allowed[] = {
ET_MOUSE_PRESSED,
ET_MOUSE_DRAGGED,
ET_MOUSE_MOVED,
ET_MOUSE_ENTERED,
ET_MOUSE_EXITED,
ET_MOUSE_RELEASED
};
for (size_t i = 0; i < arraysize(mouse_allowed); i++) {
MouseEvent event(mouse_allowed[i], point, point, time, 0, 0);
EXPECT_TRUE(PointerEvent::CanConvertFrom(event));
}
// Common touch events can be converted.
const EventType touch_allowed[] = {
ET_TOUCH_PRESSED,
ET_TOUCH_MOVED,
ET_TOUCH_RELEASED,
ET_TOUCH_CANCELLED
};
for (size_t i = 0; i < arraysize(touch_allowed); i++) {
TouchEvent event(touch_allowed[i], point, 0, time);
EXPECT_TRUE(PointerEvent::CanConvertFrom(event));
}
// Capture changes cannot be converted.
EXPECT_FALSE(
PointerEvent::CanConvertFrom(
MouseEvent(ET_MOUSE_CAPTURE_CHANGED, point, point, time, 0, 0)));
// Wheel events cannot be converted.
EXPECT_FALSE(
PointerEvent::CanConvertFrom(
MouseWheelEvent(gfx::Vector2d(), point, point, time, 0, 0)));
// Non-mouse non-touch events cannot be converted.
EXPECT_FALSE(
PointerEvent::CanConvertFrom(
KeyEvent(ET_KEY_PRESSED, VKEY_SPACE, EF_NONE)));
}
TEST(EventTest, PointerEventType) {
const ui::EventType kMouseTypeMap[][2] = {
{ui::ET_MOUSE_PRESSED, ui::ET_POINTER_DOWN},
......
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