Skip to content

Commit

Permalink
chromeos: adds support for sending CANCEL_MODE events
Browse files Browse the repository at this point in the history
And this also changes ws2 to only stop cancelable events. To do otherwise
triggers a CHECK in Event.

BUG=837686
TEST=covered by tests

Change-Id: I6bc3d8b6a02eda1ecf7b7aecec6729a9ef7b1a2e
Reviewed-on: https://chromium-review.googlesource.com/1111268
Commit-Queue: Scott Violet <sky@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Michael Wasserman <msw@chromium.org>
Cr-Commit-Position: refs/heads/master@{#569751}
  • Loading branch information
Scott Violet authored and Commit Bot committed Jun 22, 2018
1 parent e45a733 commit d15bcae
Show file tree
Hide file tree
Showing 9 changed files with 121 additions and 85 deletions.
5 changes: 5 additions & 0 deletions services/ui/ws2/event_test_utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,12 @@ namespace ws2 {
std::string EventToEventType(const Event* event) {
if (!event)
return "<null>";

// TODO(sky): convert to using EventTypeName() is ui/events.h.
switch (event->type()) {
case ET_CANCEL_MODE:
return "CANCEL_MODE";

case ET_KEY_PRESSED:
return "KEY_PRESSED";

Expand Down
11 changes: 7 additions & 4 deletions services/ui/ws2/server_window.cc
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,8 @@ class ServerWindowEventHandler : public ui::EventHandler {

// The event was forwarded to the remote client. We don't want it handled
// locally too.
event->StopPropagation();
if (event->cancelable())
event->StopPropagation();
}

protected:
Expand Down Expand Up @@ -215,7 +216,8 @@ class ServerWindowEventHandler : public ui::EventHandler {
// for a client intercepting events.
if (server_window_->DoesOwnerInterceptEvents()) {
server_window_->owning_window_tree()->SendEventToClient(window(), *event);
event->StopPropagation();
if (event->cancelable())
event->StopPropagation();
return true;
}
return false;
Expand Down Expand Up @@ -325,7 +327,8 @@ class TopLevelEventHandler : public ServerWindowEventHandler {
if (wm::CaptureController::Get()->GetCaptureWindow()) {
if (server_window()->capture_owner()) {
server_window()->capture_owner()->SendEventToClient(window(), *event);
event->StopPropagation();
if (event->cancelable())
event->StopPropagation();
return;
}
return;
Expand Down Expand Up @@ -363,7 +366,7 @@ class TopLevelEventHandler : public ServerWindowEventHandler {
}
}
server_window()->owning_window_tree()->SendEventToClient(window(), *event);
if (stop_propagation)
if (stop_propagation && event->cancelable())
event->StopPropagation();
}

Expand Down
14 changes: 14 additions & 0 deletions services/ui/ws2/window_tree_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1475,6 +1475,20 @@ TEST(WindowTreeTest2, CancelMoveLoop) {
SingleChangeToDescription(*setup.changes()));
}

TEST(WindowTreeTest2, CancelMode) {
WindowServiceTestSetup setup;
aura::Window* top_level =
setup.window_tree_test_helper()->NewTopLevelWindow();
ASSERT_TRUE(top_level);
top_level->Show();
EXPECT_TRUE(setup.window_tree_test_helper()->SetFocus(top_level));
// Dispatch a CancelEvent. This should go to the |top_level| as it has focus.
setup.root()->GetHost()->dispatcher()->DispatchCancelModeEvent();
EXPECT_EQ("CANCEL_MODE",
EventToEventType(
setup.window_tree_client()->PopInputEvent().event.get()));
}

TEST(WindowTreeTest2, PerformDragDrop) {
WindowServiceTestSetup setup;
aura::Window* top_level =
Expand Down
92 changes: 13 additions & 79 deletions ui/events/event.cc
Original file line number Diff line number Diff line change
Expand Up @@ -40,71 +40,21 @@
namespace ui {
namespace {

const char* EventTypeName(EventType type) {
if (type >= ET_LAST)
return "";

#define CASE_TYPE(t) \
case t: \
return #t
switch (type) {
CASE_TYPE(ET_UNKNOWN);
CASE_TYPE(ET_MOUSE_PRESSED);
CASE_TYPE(ET_MOUSE_DRAGGED);
CASE_TYPE(ET_MOUSE_RELEASED);
CASE_TYPE(ET_MOUSE_MOVED);
CASE_TYPE(ET_MOUSE_ENTERED);
CASE_TYPE(ET_MOUSE_EXITED);
CASE_TYPE(ET_KEY_PRESSED);
CASE_TYPE(ET_KEY_RELEASED);
CASE_TYPE(ET_MOUSEWHEEL);
CASE_TYPE(ET_MOUSE_CAPTURE_CHANGED);
CASE_TYPE(ET_TOUCH_RELEASED);
CASE_TYPE(ET_TOUCH_PRESSED);
CASE_TYPE(ET_TOUCH_MOVED);
CASE_TYPE(ET_TOUCH_CANCELLED);
CASE_TYPE(ET_DROP_TARGET_EVENT);
CASE_TYPE(ET_POINTER_DOWN);
CASE_TYPE(ET_POINTER_MOVED);
CASE_TYPE(ET_POINTER_UP);
CASE_TYPE(ET_POINTER_CANCELLED);
CASE_TYPE(ET_POINTER_ENTERED);
CASE_TYPE(ET_POINTER_EXITED);
CASE_TYPE(ET_POINTER_WHEEL_CHANGED);
CASE_TYPE(ET_POINTER_CAPTURE_CHANGED);
CASE_TYPE(ET_GESTURE_SCROLL_BEGIN);
CASE_TYPE(ET_GESTURE_SCROLL_END);
CASE_TYPE(ET_GESTURE_SCROLL_UPDATE);
CASE_TYPE(ET_GESTURE_SHOW_PRESS);
CASE_TYPE(ET_GESTURE_TAP);
CASE_TYPE(ET_GESTURE_TAP_DOWN);
CASE_TYPE(ET_GESTURE_TAP_CANCEL);
CASE_TYPE(ET_GESTURE_BEGIN);
CASE_TYPE(ET_GESTURE_END);
CASE_TYPE(ET_GESTURE_TWO_FINGER_TAP);
CASE_TYPE(ET_GESTURE_PINCH_BEGIN);
CASE_TYPE(ET_GESTURE_PINCH_END);
CASE_TYPE(ET_GESTURE_PINCH_UPDATE);
CASE_TYPE(ET_GESTURE_LONG_PRESS);
CASE_TYPE(ET_GESTURE_LONG_TAP);
CASE_TYPE(ET_GESTURE_SWIPE);
CASE_TYPE(ET_GESTURE_TAP_UNCONFIRMED);
CASE_TYPE(ET_GESTURE_DOUBLE_TAP);
CASE_TYPE(ET_SCROLL);
CASE_TYPE(ET_SCROLL_FLING_START);
CASE_TYPE(ET_SCROLL_FLING_CANCEL);
CASE_TYPE(ET_CANCEL_MODE);
CASE_TYPE(ET_UMA_DATA);
case ET_LAST:
NOTREACHED();
return "";
// Don't include default, so that we get an error when new type is added.
}
#undef CASE_TYPE
#if defined(USE_X11)
bool X11EventHasNonStandardState(const PlatformEvent& event) {
const unsigned int kAllStateMask =
Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask |
Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | ShiftMask |
LockMask | ControlMask | AnyModifier;

NOTREACHED();
return "";
return event && (event->xkey.state & ~kAllStateMask) != 0;
}
#endif

constexpr int kChangedButtonFlagMask =
ui::EF_LEFT_MOUSE_BUTTON | ui::EF_MIDDLE_MOUSE_BUTTON |
ui::EF_RIGHT_MOUSE_BUTTON | ui::EF_BACK_MOUSE_BUTTON |
ui::EF_FORWARD_MOUSE_BUTTON;

SourceEventType EventTypeToLatencySourceEventType(EventType type) {
switch (type) {
Expand Down Expand Up @@ -179,22 +129,6 @@ SourceEventType EventTypeToLatencySourceEventType(EventType type) {
return SourceEventType::UNKNOWN;
}

#if defined(USE_X11)
bool X11EventHasNonStandardState(const PlatformEvent& event) {
const unsigned int kAllStateMask =
Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask |
Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | ShiftMask |
LockMask | ControlMask | AnyModifier;

return event && (event->xkey.state & ~kAllStateMask) != 0;
}
#endif

constexpr int kChangedButtonFlagMask =
ui::EF_LEFT_MOUSE_BUTTON | ui::EF_MIDDLE_MOUSE_BUTTON |
ui::EF_RIGHT_MOUSE_BUTTON | ui::EF_BACK_MOUSE_BUTTON |
ui::EF_FORWARD_MOUSE_BUTTON;

} // namespace

////////////////////////////////////////////////////////////////////////////////
Expand Down
4 changes: 3 additions & 1 deletion ui/events/event.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,9 @@ class EVENTS_EXPORT Event {
const base::TimeTicks time_stamp() const { return time_stamp_; }
int flags() const { return flags_; }

// Returns a name for the event, typically used in logging/debugging.
// Returns a name for the event, typically used in logging/debugging. This is
// a convenience for EventTypeName(type()) (EventTypeName() is in
// event_utils).
const char* GetName() const;

// This is only intended to be used externally by classes that are modifying
Expand Down
67 changes: 67 additions & 0 deletions ui/events/event_utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -154,4 +154,71 @@ void ConvertEventLocationToTargetWindowLocation(
located_event->set_root_location_f(location_in_pixel_in_host);
}

const char* EventTypeName(EventType type) {
if (type >= ET_LAST)
return "";

#define CASE_TYPE(t) \
case t: \
return #t

switch (type) {
CASE_TYPE(ET_UNKNOWN);
CASE_TYPE(ET_MOUSE_PRESSED);
CASE_TYPE(ET_MOUSE_DRAGGED);
CASE_TYPE(ET_MOUSE_RELEASED);
CASE_TYPE(ET_MOUSE_MOVED);
CASE_TYPE(ET_MOUSE_ENTERED);
CASE_TYPE(ET_MOUSE_EXITED);
CASE_TYPE(ET_KEY_PRESSED);
CASE_TYPE(ET_KEY_RELEASED);
CASE_TYPE(ET_MOUSEWHEEL);
CASE_TYPE(ET_MOUSE_CAPTURE_CHANGED);
CASE_TYPE(ET_TOUCH_RELEASED);
CASE_TYPE(ET_TOUCH_PRESSED);
CASE_TYPE(ET_TOUCH_MOVED);
CASE_TYPE(ET_TOUCH_CANCELLED);
CASE_TYPE(ET_DROP_TARGET_EVENT);
CASE_TYPE(ET_POINTER_DOWN);
CASE_TYPE(ET_POINTER_MOVED);
CASE_TYPE(ET_POINTER_UP);
CASE_TYPE(ET_POINTER_CANCELLED);
CASE_TYPE(ET_POINTER_ENTERED);
CASE_TYPE(ET_POINTER_EXITED);
CASE_TYPE(ET_POINTER_WHEEL_CHANGED);
CASE_TYPE(ET_POINTER_CAPTURE_CHANGED);
CASE_TYPE(ET_GESTURE_SCROLL_BEGIN);
CASE_TYPE(ET_GESTURE_SCROLL_END);
CASE_TYPE(ET_GESTURE_SCROLL_UPDATE);
CASE_TYPE(ET_GESTURE_SHOW_PRESS);
CASE_TYPE(ET_GESTURE_TAP);
CASE_TYPE(ET_GESTURE_TAP_DOWN);
CASE_TYPE(ET_GESTURE_TAP_CANCEL);
CASE_TYPE(ET_GESTURE_BEGIN);
CASE_TYPE(ET_GESTURE_END);
CASE_TYPE(ET_GESTURE_TWO_FINGER_TAP);
CASE_TYPE(ET_GESTURE_PINCH_BEGIN);
CASE_TYPE(ET_GESTURE_PINCH_END);
CASE_TYPE(ET_GESTURE_PINCH_UPDATE);
CASE_TYPE(ET_GESTURE_LONG_PRESS);
CASE_TYPE(ET_GESTURE_LONG_TAP);
CASE_TYPE(ET_GESTURE_SWIPE);
CASE_TYPE(ET_GESTURE_TAP_UNCONFIRMED);
CASE_TYPE(ET_GESTURE_DOUBLE_TAP);
CASE_TYPE(ET_SCROLL);
CASE_TYPE(ET_SCROLL_FLING_START);
CASE_TYPE(ET_SCROLL_FLING_CANCEL);
CASE_TYPE(ET_CANCEL_MODE);
CASE_TYPE(ET_UMA_DATA);
case ET_LAST:
NOTREACHED();
return "";
// Don't include default, so that we get an error when new type is added.
}
#undef CASE_TYPE

NOTREACHED();
return "";
}

} // namespace ui
3 changes: 3 additions & 0 deletions ui/events/event_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,9 @@ EVENTS_EXPORT void ConvertEventLocationToTargetWindowLocation(
const gfx::Point& current_window_origin,
ui::LocatedEvent* located_event);

// Returns a string description of an event type. Useful for debugging.
EVENTS_EXPORT const char* EventTypeName(EventType type);

} // namespace ui

#endif // UI_EVENTS_EVENT_UTILS_H_
1 change: 1 addition & 0 deletions ui/events/mojo/event_constants.mojom
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ enum EventType {
SCROLL,
SCROLL_FLING_START,
SCROLL_FLING_CANCEL,
CANCEL_MODE,
};

// This mirrors ui::EventFlags
Expand Down
9 changes: 8 additions & 1 deletion ui/events/mojo/event_struct_traits.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include "mojo/public/cpp/base/time_mojom_traits.h"
#include "ui/events/event.h"
#include "ui/events/event_utils.h"
#include "ui/events/gesture_event_details.h"
#include "ui/events/keycodes/dom/keycode_converter.h"
#include "ui/events/mojo/event_constants.mojom.h"
Expand Down Expand Up @@ -159,8 +160,11 @@ ui::mojom::EventType TypeConverter<ui::mojom::EventType,
return ui::mojom::EventType::SCROLL_FLING_START;
case ui::ET_SCROLL_FLING_CANCEL:
return ui::mojom::EventType::SCROLL_FLING_CANCEL;
case ui::ET_CANCEL_MODE:
return ui::mojom::EventType::CANCEL_MODE;
default:
NOTREACHED() << "Using unknown event types closes connections:" << type;
NOTREACHED() << "Using unknown event types closes connections:"
<< ui::EventTypeName(type);
break;
}
return ui::mojom::EventType::UNKNOWN;
Expand Down Expand Up @@ -443,6 +447,9 @@ bool StructTraits<ui::mojom::EventDataView, EventUniquePtr>::Read(
scroll_data->momentum_phase);
break;
}
case ui::mojom::EventType::CANCEL_MODE:
*out = std::make_unique<ui::CancelModeEvent>();
break;
case ui::mojom::EventType::UNKNOWN:
NOTREACHED() << "Using unknown event types closes connections";
return false;
Expand Down

0 comments on commit d15bcae

Please sign in to comment.