Chromium Code Reviews| Index: services/ui/ws/window_tree.cc |
| diff --git a/services/ui/ws/window_tree.cc b/services/ui/ws/window_tree.cc |
| index 0206327b3029fe4a72b98b55812605d6bcc98571..9096a41490fbb27f80e7936a62101338ec438112 100644 |
| --- a/services/ui/ws/window_tree.cc |
| +++ b/services/ui/ws/window_tree.cc |
| @@ -987,16 +987,26 @@ void WindowTree::DispatchInputEventImpl(ServerWindow* target, |
| event_source_wms_ = display_root->window_manager_state(); |
| // Should only get events from windows attached to a host. |
| DCHECK(event_source_wms_); |
| - bool matched_observer = |
| - event_observer_matcher_ && event_observer_matcher_->MatchesEvent(event); |
| + bool matched_pointer_watcher = EventMatchesPointerWatcher(event); |
| client()->OnWindowInputEvent( |
| event_ack_id_, ClientWindowIdForWindow(target).id, |
| - ui::Event::Clone(event), matched_observer ? event_observer_id_ : 0); |
| + ui::Event::Clone(event), |
| + matched_pointer_watcher ? pointer_watcher_id_ : 0); |
| +} |
| + |
| +bool WindowTree::EventMatchesPointerWatcher(const ui::Event& event) { |
| + if (!has_pointer_watcher_) |
| + return false; |
| + if (!event.IsPointerEvent()) |
| + return false; |
| + if (!pointer_watcher_want_moves_ && event.type() == ui::ET_POINTER_MOVED) |
|
James Cook
2016/07/27 01:54:01
For now, let's also limit POINTER_ENTER and POINTE
riajiang
2016/07/27 22:39:16
Done.
|
| + return false; |
| + return true; |
| } |
| void WindowTree::SendToEventObserver(const ui::Event& event) { |
| - if (event_observer_matcher_ && event_observer_matcher_->MatchesEvent(event)) |
| - client()->OnEventObserved(ui::Event::Clone(event), event_observer_id_); |
| + if (EventMatchesPointerWatcher(event)) |
| + client()->OnEventObserved(ui::Event::Clone(event), pointer_watcher_id_); |
| } |
| void WindowTree::NewWindow( |
| @@ -1162,50 +1172,21 @@ void WindowTree::ReleaseCapture(uint32_t change_id, Id window_id) { |
| client()->OnChangeCompleted(change_id, success); |
| } |
| -void WindowTree::SetEventObserver(mojom::EventMatcherPtr matcher, |
| - uint32_t observer_id) { |
| - if (matcher.is_null() || observer_id == 0) { |
| - // Clear any existing event observer. |
| - event_observer_matcher_.reset(); |
| - event_observer_id_ = 0; |
| - return; |
| - } |
| - |
| - // Do not allow key events to be observed, as a compromised app could register |
| - // itself as an event observer and spy on keystrokes to another app. |
| - if (!matcher->type_matcher && !matcher->pointer_kind_matcher) { |
| - DVLOG(1) << "SetEventObserver must specify an event type."; |
| +void WindowTree::StartPointerWatcher(bool want_moves, |
| + uint32_t pointer_watcher_id) { |
| + if (pointer_watcher_id == 0) { |
| + StopPointerWatcher(); |
| return; |
| } |
| + has_pointer_watcher_ = true; |
| + pointer_watcher_want_moves_ = want_moves; |
| + pointer_watcher_id_ = pointer_watcher_id; |
| +} |
| - const ui::mojom::EventType event_type_whitelist[] = { |
| - ui::mojom::EventType::POINTER_CANCEL, ui::mojom::EventType::POINTER_DOWN, |
| - ui::mojom::EventType::POINTER_MOVE, ui::mojom::EventType::POINTER_UP, |
| - ui::mojom::EventType::MOUSE_EXIT, ui::mojom::EventType::WHEEL, |
| - }; |
| - |
| - if (matcher->type_matcher) { |
| - auto iter = |
| - std::find(std::begin(event_type_whitelist), |
| - std::end(event_type_whitelist), matcher->type_matcher->type); |
| - if (iter == std::end(event_type_whitelist)) { |
| - DVLOG(1) << "SetEventObserver event type not allowed"; |
| - return; |
| - } |
| - } |
| - if (matcher->pointer_kind_matcher) { |
| - ui::mojom::PointerKind pointer_kind = |
| - matcher->pointer_kind_matcher->pointer_kind; |
| - if (pointer_kind != ui::mojom::PointerKind::MOUSE && |
| - pointer_kind != ui::mojom::PointerKind::TOUCH && |
| - pointer_kind != ui::mojom::PointerKind::PEN) { |
| - DVLOG(1) << "SetEventObserver pointer kind not allowed"; |
| - return; |
| - } |
| - } |
| - |
| - event_observer_matcher_.reset(new EventMatcher(*matcher)); |
| - event_observer_id_ = observer_id; |
| +void WindowTree::StopPointerWatcher() { |
| + has_pointer_watcher_ = false; |
| + pointer_watcher_want_moves_ = false; |
| + pointer_watcher_id_ = 0; |
| } |
| void WindowTree::SetWindowBounds(uint32_t change_id, |