| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/events/event_rewriter.h" | 5 #include "ui/events/event_rewriter.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 // same event type; it is used to test simple rewriting, and rewriter addition, | 76 // same event type; it is used to test simple rewriting, and rewriter addition, |
| 77 // removal, and sequencing. Consequently EVENT_REWRITE_DISPATCH_ANOTHER is not | 77 // removal, and sequencing. Consequently EVENT_REWRITE_DISPATCH_ANOTHER is not |
| 78 // supported here (calls to NextDispatchEvent() would continue indefinitely). | 78 // supported here (calls to NextDispatchEvent() would continue indefinitely). |
| 79 class TestConstantEventRewriter : public EventRewriter { | 79 class TestConstantEventRewriter : public EventRewriter { |
| 80 public: | 80 public: |
| 81 TestConstantEventRewriter(EventRewriteStatus status, EventType type) | 81 TestConstantEventRewriter(EventRewriteStatus status, EventType type) |
| 82 : status_(status), type_(type) { | 82 : status_(status), type_(type) { |
| 83 CHECK_NE(EVENT_REWRITE_DISPATCH_ANOTHER, status); | 83 CHECK_NE(EVENT_REWRITE_DISPATCH_ANOTHER, status); |
| 84 } | 84 } |
| 85 | 85 |
| 86 virtual EventRewriteStatus RewriteEvent(const Event& event, | 86 virtual EventRewriteStatus RewriteEvent(Event* event, |
| 87 scoped_ptr<Event>* rewritten_event) | 87 scoped_ptr<Event>* rewritten_event) |
| 88 OVERRIDE { | 88 OVERRIDE { |
| 89 if (status_ == EVENT_REWRITE_REWRITTEN) | 89 if (status_ == EVENT_REWRITE_REWRITTEN) |
| 90 rewritten_event->reset(new TestEvent(type_)); | 90 rewritten_event->reset(new TestEvent(type_)); |
| 91 return status_; | 91 return status_; |
| 92 } | 92 } |
| 93 virtual EventRewriteStatus NextDispatchEvent(const Event& last_event, | 93 virtual EventRewriteStatus NextDispatchEvent(const Event& last_event, |
| 94 scoped_ptr<Event>* new_event) | 94 scoped_ptr<Event>* new_event) |
| 95 OVERRIDE { | 95 OVERRIDE { |
| 96 NOTREACHED(); | 96 NOTREACHED(); |
| 97 return status_; | 97 return status_; |
| 98 } | 98 } |
| 99 | 99 |
| 100 private: | 100 private: |
| 101 EventRewriteStatus status_; | 101 EventRewriteStatus status_; |
| 102 EventType type_; | 102 EventType type_; |
| 103 }; | 103 }; |
| 104 | 104 |
| 105 // This EventRewriter runs a simple state machine; it is used to test | 105 // This EventRewriter runs a simple state machine; it is used to test |
| 106 // EVENT_REWRITE_DISPATCH_ANOTHER. | 106 // EVENT_REWRITE_DISPATCH_ANOTHER. |
| 107 class TestStateMachineEventRewriter : public EventRewriter { | 107 class TestStateMachineEventRewriter : public EventRewriter { |
| 108 public: | 108 public: |
| 109 TestStateMachineEventRewriter() : last_rewritten_event_(0), state_(0) {} | 109 TestStateMachineEventRewriter() : last_rewritten_event_(0), state_(0) {} |
| 110 void AddRule(int from_state, EventType from_type, | 110 void AddRule(int from_state, EventType from_type, |
| 111 int to_state, EventType to_type, EventRewriteStatus to_status) { | 111 int to_state, EventType to_type, EventRewriteStatus to_status) { |
| 112 RewriteResult r = {to_state, to_type, to_status}; | 112 RewriteResult r = {to_state, to_type, to_status}; |
| 113 rules_.insert(std::pair<RewriteCase, RewriteResult>( | 113 rules_.insert(std::pair<RewriteCase, RewriteResult>( |
| 114 RewriteCase(from_state, from_type), r)); | 114 RewriteCase(from_state, from_type), r)); |
| 115 } | 115 } |
| 116 virtual EventRewriteStatus RewriteEvent(const Event& event, | 116 virtual EventRewriteStatus RewriteEvent(Event* event, |
| 117 scoped_ptr<Event>* rewritten_event) | 117 scoped_ptr<Event>* rewritten_event) |
| 118 OVERRIDE { |
| 119 return Rewrite(*event, rewritten_event); |
| 120 } |
| 121 virtual EventRewriteStatus NextDispatchEvent(const Event& last_event, |
| 122 scoped_ptr<Event>* new_event) |
| 118 OVERRIDE { | 123 OVERRIDE { |
| 124 EXPECT_TRUE(last_rewritten_event_); |
| 125 const TestEvent* arg_last = static_cast<const TestEvent*>(&last_event); |
| 126 EXPECT_EQ(last_rewritten_event_->unique_id(), arg_last->unique_id()); |
| 127 const TestEvent* arg_new = static_cast<const TestEvent*>(new_event->get()); |
| 128 EXPECT_FALSE(arg_new && arg_last->unique_id() == arg_new->unique_id()); |
| 129 return Rewrite(last_event, new_event); |
| 130 } |
| 131 |
| 132 private: |
| 133 EventRewriteStatus Rewrite(const Event& event, |
| 134 scoped_ptr<Event>* rewritten_event) { |
| 119 RewriteRules::iterator find = | 135 RewriteRules::iterator find = |
| 120 rules_.find(RewriteCase(state_, event.type())); | 136 rules_.find(RewriteCase(state_, event.type())); |
| 121 if (find == rules_.end()) | 137 if (find == rules_.end()) |
| 122 return EVENT_REWRITE_CONTINUE; | 138 return EVENT_REWRITE_CONTINUE; |
| 123 if ((find->second.status == EVENT_REWRITE_REWRITTEN) || | 139 if ((find->second.status == EVENT_REWRITE_REWRITTEN) || |
| 124 (find->second.status == EVENT_REWRITE_DISPATCH_ANOTHER)) { | 140 (find->second.status == EVENT_REWRITE_DISPATCH_ANOTHER)) { |
| 125 last_rewritten_event_ = new TestEvent(find->second.type); | 141 last_rewritten_event_ = new TestEvent(find->second.type); |
| 126 rewritten_event->reset(last_rewritten_event_); | 142 rewritten_event->reset(last_rewritten_event_); |
| 127 } else { | 143 } else { |
| 128 last_rewritten_event_ = 0; | 144 last_rewritten_event_ = 0; |
| 129 } | 145 } |
| 130 state_ = find->second.state; | 146 state_ = find->second.state; |
| 131 return find->second.status; | 147 return find->second.status; |
| 132 } | 148 } |
| 133 virtual EventRewriteStatus NextDispatchEvent(const Event& last_event, | |
| 134 scoped_ptr<Event>* new_event) | |
| 135 OVERRIDE { | |
| 136 EXPECT_TRUE(last_rewritten_event_); | |
| 137 const TestEvent* arg_last = static_cast<const TestEvent*>(&last_event); | |
| 138 EXPECT_EQ(last_rewritten_event_->unique_id(), arg_last->unique_id()); | |
| 139 const TestEvent* arg_new = static_cast<const TestEvent*>(new_event->get()); | |
| 140 EXPECT_FALSE(arg_new && arg_last->unique_id() == arg_new->unique_id()); | |
| 141 return RewriteEvent(last_event, new_event); | |
| 142 } | |
| 143 | |
| 144 private: | |
| 145 typedef std::pair<int, EventType> RewriteCase; | 149 typedef std::pair<int, EventType> RewriteCase; |
| 146 struct RewriteResult { | 150 struct RewriteResult { |
| 147 int state; | 151 int state; |
| 148 EventType type; | 152 EventType type; |
| 149 EventRewriteStatus status; | 153 EventRewriteStatus status; |
| 150 }; | 154 }; |
| 151 typedef std::map<RewriteCase, RewriteResult> RewriteRules; | 155 typedef std::map<RewriteCase, RewriteResult> RewriteRules; |
| 152 RewriteRules rules_; | 156 RewriteRules rules_; |
| 153 TestEvent* last_rewritten_event_; | 157 TestEvent* last_rewritten_event_; |
| 154 int state_; | 158 int state_; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 s.RemoveEventRewriter(&r3); | 226 s.RemoveEventRewriter(&r3); |
| 223 | 227 |
| 224 // Continue with the state-based rewriting. | 228 // Continue with the state-based rewriting. |
| 225 p.AddExpectedEvent(ET_MOUSE_RELEASED); | 229 p.AddExpectedEvent(ET_MOUSE_RELEASED); |
| 226 p.AddExpectedEvent(ET_KEY_RELEASED); | 230 p.AddExpectedEvent(ET_KEY_RELEASED); |
| 227 s.Send(ET_MOUSE_RELEASED); | 231 s.Send(ET_MOUSE_RELEASED); |
| 228 p.CheckAllReceived(); | 232 p.CheckAllReceived(); |
| 229 } | 233 } |
| 230 | 234 |
| 231 } // namespace ui | 235 } // namespace ui |
| OLD | NEW |