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 461c9274059fb5a74442d3db6071fffdc8bc9601..43f06129a4495bce501e1525619f091562ad744f 100644 |
| --- a/services/ui/ws/window_tree.cc |
| +++ b/services/ui/ws/window_tree.cc |
| @@ -987,16 +987,29 @@ 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); |
| } |
| -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_); |
| +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 || |
| + event.type() == ui::ET_POINTER_ENTERED || |
| + event.type() == ui::ET_POINTER_EXITED)) |
| + return false; |
| + return true; |
|
sadrul
2016/07/29 20:26:10
return pointer_watcher_want_moves_ ||
(event.ty
riajiang
2016/08/02 19:59:53
Done.
|
| +} |
| + |
| +void WindowTree::SendToPointerWatcher(const ui::Event& event) { |
| + if (EventMatchesPointerWatcher(event)) |
| + client()->OnPointerWatcherEvent(ui::Event::Clone(event), |
| + pointer_watcher_id_); |
| } |
| void WindowTree::NewWindow( |
| @@ -1162,50 +1175,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, |