OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "chrome/browser/chromeos/accessibility/select_to_speak_event_handler.h" | 5 #include "chrome/browser/chromeos/accessibility/select_to_speak_event_handler.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "ash/shell.h" | 9 #include "ash/shell.h" |
10 #include "ash/test/ash_test_base.h" | 10 #include "ash/test/ash_test_base.h" |
11 #include "ash/test/ash_test_helper.h" | 11 #include "ash/test/ash_test_helper.h" |
12 #include "ash/test/ash_test_views_delegate.h" | 12 #include "ash/test/ash_test_views_delegate.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "chrome/browser/chromeos/accessibility/speech_monitor.h" | |
15 #include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h" | 14 #include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h" |
16 #include "chrome/test/base/testing_profile.h" | 15 #include "chrome/test/base/testing_profile.h" |
17 #include "ui/aura/window.h" | 16 #include "ui/aura/window.h" |
18 #include "ui/events/event.h" | 17 #include "ui/events/event.h" |
19 #include "ui/events/event_constants.h" | 18 #include "ui/events/event_constants.h" |
20 #include "ui/events/test/event_generator.h" | 19 #include "ui/events/test/event_generator.h" |
21 #include "ui/views/views_delegate.h" | |
22 | 20 |
23 using chromeos::SelectToSpeakEventHandler; | 21 using chromeos::SelectToSpeakEventHandler; |
24 | 22 |
25 namespace { | 23 namespace { |
26 | 24 |
27 // Records all key events. | 25 // Records all key events. |
28 class EventCapturer : public ui::EventHandler { | 26 class EventCapturer : public ui::EventHandler { |
29 public: | 27 public: |
30 EventCapturer() {} | 28 EventCapturer() {} |
31 ~EventCapturer() override {} | 29 ~EventCapturer() override {} |
(...skipping 13 matching lines...) Expand all Loading... |
45 void OnKeyEvent(ui::KeyEvent* event) override { | 43 void OnKeyEvent(ui::KeyEvent* event) override { |
46 last_key_event_.reset(new ui::KeyEvent(*event)); | 44 last_key_event_.reset(new ui::KeyEvent(*event)); |
47 } | 45 } |
48 | 46 |
49 std::unique_ptr<ui::KeyEvent> last_key_event_; | 47 std::unique_ptr<ui::KeyEvent> last_key_event_; |
50 std::unique_ptr<ui::MouseEvent> last_mouse_event_; | 48 std::unique_ptr<ui::MouseEvent> last_mouse_event_; |
51 | 49 |
52 DISALLOW_COPY_AND_ASSIGN(EventCapturer); | 50 DISALLOW_COPY_AND_ASSIGN(EventCapturer); |
53 }; | 51 }; |
54 | 52 |
55 class SelectToSpeakAccessibilityEventDelegate | 53 class SelectToSpeakMouseEventDelegate |
56 : public ash::test::TestAccessibilityEventDelegate { | 54 : public chromeos::SelectToSpeakForwardedEventDelegateForTesting { |
57 public: | 55 public: |
58 SelectToSpeakAccessibilityEventDelegate() {} | 56 SelectToSpeakMouseEventDelegate() {} |
59 ~SelectToSpeakAccessibilityEventDelegate() override {} | |
60 | 57 |
61 void Reset() { events_captured_.clear(); } | 58 void Reset() { events_captured_.clear(); } |
62 | 59 |
63 bool CapturedAXEvent(ui::AXEvent event_type) { | 60 bool CapturedMouseEvent(ui::EventType event_type) { |
64 return events_captured_.find(event_type) != events_captured_.end(); | 61 return events_captured_.find(event_type) != events_captured_.end(); |
65 } | 62 } |
66 | 63 |
67 // Overriden from TestAccessibilityEventDelegate. | 64 // Overriden from SelectToSpeakForwardedEventDelegateForTesting |
68 void NotifyAccessibilityEvent(views::View* view, | 65 void OnForwardEventToSelectToSpeakExtension( |
69 ui::AXEvent event_type) override { | 66 const ui::MouseEvent& event) override { |
70 events_captured_.insert(event_type); | 67 events_captured_.insert(event.type()); |
71 } | 68 } |
72 | 69 |
73 private: | 70 private: |
74 std::set<ui::AXEvent> events_captured_; | 71 std::set<ui::EventType> events_captured_; |
75 | 72 |
76 DISALLOW_COPY_AND_ASSIGN(SelectToSpeakAccessibilityEventDelegate); | 73 DISALLOW_COPY_AND_ASSIGN(SelectToSpeakMouseEventDelegate); |
77 }; | 74 }; |
78 | 75 |
79 class SelectToSpeakEventHandlerTest : public ash::test::AshTestBase { | 76 class SelectToSpeakEventHandlerTest : public ash::test::AshTestBase { |
80 public: | 77 public: |
81 SelectToSpeakEventHandlerTest() | 78 SelectToSpeakEventHandlerTest() |
82 : generator_(nullptr), | 79 : generator_(nullptr), |
83 select_to_speak_event_handler_(new SelectToSpeakEventHandler()) {} | 80 select_to_speak_event_handler_(new SelectToSpeakEventHandler()) {} |
84 | 81 |
85 void SetUp() override { | 82 void SetUp() override { |
86 ash::test::AshTestBase::SetUp(); | 83 ash::test::AshTestBase::SetUp(); |
87 event_delegate_.reset(new SelectToSpeakAccessibilityEventDelegate()); | 84 mouse_event_delegate_.reset(new SelectToSpeakMouseEventDelegate()); |
88 ash_test_helper() | 85 select_to_speak_event_handler_->CaptureForwardedEventsForTesting( |
89 ->test_views_delegate() | 86 mouse_event_delegate_.get()); |
90 ->set_test_accessibility_event_delegate(event_delegate_.get()); | |
91 generator_ = &AshTestBase::GetEventGenerator(); | 87 generator_ = &AshTestBase::GetEventGenerator(); |
92 CurrentContext()->AddPreTargetHandler(select_to_speak_event_handler_.get()); | 88 CurrentContext()->AddPreTargetHandler(select_to_speak_event_handler_.get()); |
93 CurrentContext()->AddPreTargetHandler(&event_capturer_); | 89 CurrentContext()->AddPreTargetHandler(&event_capturer_); |
94 AutomationManagerAura::GetInstance()->Enable(&profile_); | 90 AutomationManagerAura::GetInstance()->Enable(&profile_); |
95 } | 91 } |
96 | 92 |
97 void TearDown() override { | 93 void TearDown() override { |
98 CurrentContext()->RemovePreTargetHandler( | 94 CurrentContext()->RemovePreTargetHandler( |
99 select_to_speak_event_handler_.get()); | 95 select_to_speak_event_handler_.get()); |
100 CurrentContext()->RemovePreTargetHandler(&event_capturer_); | 96 CurrentContext()->RemovePreTargetHandler(&event_capturer_); |
101 generator_ = nullptr; | 97 generator_ = nullptr; |
102 ash::test::AshTestBase::TearDown(); | 98 ash::test::AshTestBase::TearDown(); |
103 } | 99 } |
104 | 100 |
105 protected: | 101 protected: |
106 ui::test::EventGenerator* generator_; | 102 ui::test::EventGenerator* generator_; |
107 EventCapturer event_capturer_; | 103 EventCapturer event_capturer_; |
108 TestingProfile profile_; | 104 TestingProfile profile_; |
109 std::unique_ptr<SelectToSpeakAccessibilityEventDelegate> event_delegate_; | 105 std::unique_ptr<SelectToSpeakMouseEventDelegate> mouse_event_delegate_; |
110 | 106 |
111 private: | 107 private: |
112 std::unique_ptr<SelectToSpeakEventHandler> select_to_speak_event_handler_; | 108 std::unique_ptr<SelectToSpeakEventHandler> select_to_speak_event_handler_; |
113 | 109 |
114 DISALLOW_COPY_AND_ASSIGN(SelectToSpeakEventHandlerTest); | 110 DISALLOW_COPY_AND_ASSIGN(SelectToSpeakEventHandlerTest); |
115 }; | 111 }; |
116 | 112 |
117 } // namespace | 113 } // namespace |
118 | 114 |
119 namespace chromeos { | 115 namespace chromeos { |
120 | 116 |
121 TEST_F(SelectToSpeakEventHandlerTest, PressAndReleaseSearchNotHandled) { | 117 TEST_F(SelectToSpeakEventHandlerTest, PressAndReleaseSearchNotHandled) { |
122 // If the user presses and releases the Search key, with no mouse | 118 // If the user presses and releases the Search key, with no mouse |
123 // presses, the key events won't be handled by the SelectToSpeakEventHandler | 119 // presses, the key events won't be handled by the SelectToSpeakEventHandler |
124 // and the normal behavior will occur. | 120 // and the normal behavior will occur. |
125 | 121 |
126 EXPECT_FALSE(event_capturer_.last_key_event()); | 122 EXPECT_FALSE(event_capturer_.last_key_event()); |
127 | 123 |
128 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | 124 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); |
129 ASSERT_TRUE(event_capturer_.last_key_event()); | 125 ASSERT_TRUE(event_capturer_.last_key_event()); |
130 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); | 126 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); |
131 | 127 |
132 event_capturer_.Reset(); | 128 event_capturer_.Reset(); |
133 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | 129 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); |
134 ASSERT_TRUE(event_capturer_.last_key_event()); | 130 ASSERT_TRUE(event_capturer_.last_key_event()); |
135 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); | 131 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); |
136 } | 132 } |
137 | 133 |
| 134 // Note: when running these tests locally on desktop Linux, you may need |
| 135 // to use xvfb-run, otherwise simulating the Search key press may not work. |
138 TEST_F(SelectToSpeakEventHandlerTest, SearchPlusClick) { | 136 TEST_F(SelectToSpeakEventHandlerTest, SearchPlusClick) { |
139 // If the user holds the Search key and then clicks the mouse button, | 137 // If the user holds the Search key and then clicks the mouse button, |
140 // the mouse events and the key release event get hancled by the | 138 // the mouse events and the key release event get handled by the |
141 // SelectToSpeakEventHandler, and accessibility events are generated. | 139 // SelectToSpeakEventHandler, and mouse events are forwarded to the extension. |
142 | 140 |
143 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | 141 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); |
144 ASSERT_TRUE(event_capturer_.last_key_event()); | 142 ASSERT_TRUE(event_capturer_.last_key_event()); |
145 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); | 143 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); |
146 | 144 |
147 generator_->set_current_location(gfx::Point(100, 12)); | 145 generator_->set_current_location(gfx::Point(100, 12)); |
148 generator_->PressLeftButton(); | 146 generator_->PressLeftButton(); |
149 EXPECT_FALSE(event_capturer_.last_mouse_event()); | 147 EXPECT_FALSE(event_capturer_.last_mouse_event()); |
150 | 148 |
151 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED)); | 149 EXPECT_TRUE(mouse_event_delegate_->CapturedMouseEvent(ui::ET_MOUSE_PRESSED)); |
152 | 150 |
153 generator_->ReleaseLeftButton(); | 151 generator_->ReleaseLeftButton(); |
154 EXPECT_FALSE(event_capturer_.last_mouse_event()); | 152 EXPECT_FALSE(event_capturer_.last_mouse_event()); |
155 | 153 |
156 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED)); | 154 EXPECT_TRUE(mouse_event_delegate_->CapturedMouseEvent(ui::ET_MOUSE_RELEASED)); |
157 | 155 |
158 event_capturer_.Reset(); | 156 event_capturer_.Reset(); |
159 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | 157 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); |
160 EXPECT_FALSE(event_capturer_.last_key_event()); | 158 EXPECT_FALSE(event_capturer_.last_key_event()); |
161 } | 159 } |
162 | 160 |
163 TEST_F(SelectToSpeakEventHandlerTest, RepeatSearchKey) { | 161 TEST_F(SelectToSpeakEventHandlerTest, RepeatSearchKey) { |
164 // Holding the Search key may generate key repeat events. Make sure it's | 162 // Holding the Search key may generate key repeat events. Make sure it's |
165 // still treated as if the search key is down. | 163 // still treated as if the search key is down. |
166 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | 164 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); |
167 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | 165 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); |
168 | 166 |
169 generator_->set_current_location(gfx::Point(100, 12)); | 167 generator_->set_current_location(gfx::Point(100, 12)); |
170 generator_->PressLeftButton(); | 168 generator_->PressLeftButton(); |
171 EXPECT_FALSE(event_capturer_.last_mouse_event()); | 169 EXPECT_FALSE(event_capturer_.last_mouse_event()); |
172 | 170 |
173 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED)); | 171 EXPECT_TRUE(mouse_event_delegate_->CapturedMouseEvent(ui::ET_MOUSE_PRESSED)); |
174 | 172 |
175 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | 173 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); |
176 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | 174 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); |
177 | 175 |
178 generator_->ReleaseLeftButton(); | 176 generator_->ReleaseLeftButton(); |
179 EXPECT_FALSE(event_capturer_.last_mouse_event()); | 177 EXPECT_FALSE(event_capturer_.last_mouse_event()); |
180 | 178 |
181 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED)); | 179 EXPECT_TRUE(mouse_event_delegate_->CapturedMouseEvent(ui::ET_MOUSE_RELEASED)); |
182 | 180 |
183 event_capturer_.Reset(); | 181 event_capturer_.Reset(); |
184 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | 182 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); |
185 EXPECT_FALSE(event_capturer_.last_key_event()); | 183 EXPECT_FALSE(event_capturer_.last_key_event()); |
186 } | 184 } |
187 | 185 |
188 TEST_F(SelectToSpeakEventHandlerTest, SearchPlusClickTwice) { | 186 TEST_F(SelectToSpeakEventHandlerTest, SearchPlusClickTwice) { |
189 // Same as SearchPlusClick, above, but test that the user can keep | 187 // Same as SearchPlusClick, above, but test that the user can keep |
190 // holding down Search and click again. | 188 // holding down Search and click again. |
191 | 189 |
192 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | 190 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); |
193 ASSERT_TRUE(event_capturer_.last_key_event()); | 191 ASSERT_TRUE(event_capturer_.last_key_event()); |
194 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); | 192 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); |
195 | 193 |
196 generator_->set_current_location(gfx::Point(100, 12)); | 194 generator_->set_current_location(gfx::Point(100, 12)); |
197 generator_->PressLeftButton(); | 195 generator_->PressLeftButton(); |
198 EXPECT_FALSE(event_capturer_.last_mouse_event()); | 196 EXPECT_FALSE(event_capturer_.last_mouse_event()); |
199 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED)); | 197 EXPECT_TRUE(mouse_event_delegate_->CapturedMouseEvent(ui::ET_MOUSE_PRESSED)); |
200 | 198 |
201 generator_->ReleaseLeftButton(); | 199 generator_->ReleaseLeftButton(); |
202 EXPECT_FALSE(event_capturer_.last_mouse_event()); | 200 EXPECT_FALSE(event_capturer_.last_mouse_event()); |
203 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED)); | 201 EXPECT_TRUE(mouse_event_delegate_->CapturedMouseEvent(ui::ET_MOUSE_RELEASED)); |
204 | 202 |
205 event_delegate_->Reset(); | 203 mouse_event_delegate_->Reset(); |
206 EXPECT_FALSE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED)); | 204 EXPECT_FALSE(mouse_event_delegate_->CapturedMouseEvent(ui::ET_MOUSE_PRESSED)); |
207 EXPECT_FALSE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED)); | 205 EXPECT_FALSE( |
| 206 mouse_event_delegate_->CapturedMouseEvent(ui::ET_MOUSE_RELEASED)); |
208 | 207 |
209 generator_->PressLeftButton(); | 208 generator_->PressLeftButton(); |
210 EXPECT_FALSE(event_capturer_.last_mouse_event()); | 209 EXPECT_FALSE(event_capturer_.last_mouse_event()); |
211 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED)); | 210 EXPECT_TRUE(mouse_event_delegate_->CapturedMouseEvent(ui::ET_MOUSE_PRESSED)); |
212 | 211 |
213 generator_->ReleaseLeftButton(); | 212 generator_->ReleaseLeftButton(); |
214 EXPECT_FALSE(event_capturer_.last_mouse_event()); | 213 EXPECT_FALSE(event_capturer_.last_mouse_event()); |
215 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED)); | 214 EXPECT_TRUE(mouse_event_delegate_->CapturedMouseEvent(ui::ET_MOUSE_RELEASED)); |
216 | 215 |
217 event_capturer_.Reset(); | 216 event_capturer_.Reset(); |
218 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | 217 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); |
219 EXPECT_FALSE(event_capturer_.last_key_event()); | 218 EXPECT_FALSE(event_capturer_.last_key_event()); |
220 } | 219 } |
221 | 220 |
222 TEST_F(SelectToSpeakEventHandlerTest, SearchPlusKeyIgnoresClicks) { | 221 TEST_F(SelectToSpeakEventHandlerTest, SearchPlusKeyIgnoresClicks) { |
223 // If the user presses the Search key and then some other key, | 222 // If the user presses the Search key and then some other key, |
224 // we should assume the user does not want select-to-speak, and | 223 // we should assume the user does not want select-to-speak, and |
225 // click events should be ignored. | 224 // click events should be ignored. |
226 | 225 |
227 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | 226 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); |
228 ASSERT_TRUE(event_capturer_.last_key_event()); | 227 ASSERT_TRUE(event_capturer_.last_key_event()); |
229 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); | 228 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); |
230 | 229 |
231 generator_->PressKey(ui::VKEY_I, ui::EF_COMMAND_DOWN); | 230 generator_->PressKey(ui::VKEY_I, ui::EF_COMMAND_DOWN); |
232 ASSERT_TRUE(event_capturer_.last_key_event()); | 231 ASSERT_TRUE(event_capturer_.last_key_event()); |
233 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); | 232 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); |
234 | 233 |
235 generator_->set_current_location(gfx::Point(100, 12)); | 234 generator_->set_current_location(gfx::Point(100, 12)); |
236 generator_->PressLeftButton(); | 235 generator_->PressLeftButton(); |
237 ASSERT_TRUE(event_capturer_.last_mouse_event()); | 236 ASSERT_TRUE(event_capturer_.last_mouse_event()); |
238 EXPECT_FALSE(event_capturer_.last_mouse_event()->handled()); | 237 EXPECT_FALSE(event_capturer_.last_mouse_event()->handled()); |
239 | 238 |
240 EXPECT_FALSE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED)); | 239 EXPECT_FALSE(mouse_event_delegate_->CapturedMouseEvent(ui::ET_MOUSE_PRESSED)); |
241 | 240 |
242 generator_->ReleaseLeftButton(); | 241 generator_->ReleaseLeftButton(); |
243 ASSERT_TRUE(event_capturer_.last_mouse_event()); | 242 ASSERT_TRUE(event_capturer_.last_mouse_event()); |
244 EXPECT_FALSE(event_capturer_.last_mouse_event()->handled()); | 243 EXPECT_FALSE(event_capturer_.last_mouse_event()->handled()); |
245 | 244 |
246 EXPECT_FALSE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED)); | 245 EXPECT_FALSE( |
| 246 mouse_event_delegate_->CapturedMouseEvent(ui::ET_MOUSE_RELEASED)); |
247 | 247 |
248 event_capturer_.Reset(); | 248 event_capturer_.Reset(); |
249 generator_->ReleaseKey(ui::VKEY_I, ui::EF_COMMAND_DOWN); | 249 generator_->ReleaseKey(ui::VKEY_I, ui::EF_COMMAND_DOWN); |
250 ASSERT_TRUE(event_capturer_.last_key_event()); | 250 ASSERT_TRUE(event_capturer_.last_key_event()); |
251 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); | 251 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); |
252 | 252 |
253 event_capturer_.Reset(); | 253 event_capturer_.Reset(); |
254 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | 254 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); |
255 ASSERT_TRUE(event_capturer_.last_key_event()); | 255 ASSERT_TRUE(event_capturer_.last_key_event()); |
256 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); | 256 EXPECT_FALSE(event_capturer_.last_key_event()->handled()); |
257 } | 257 } |
258 | 258 |
259 TEST_F(SelectToSpeakEventHandlerTest, TappingControlStopsSpeech) { | |
260 SpeechMonitor monitor; | |
261 EXPECT_FALSE(monitor.DidStop()); | |
262 generator_->PressKey(ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN); | |
263 generator_->ReleaseKey(ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN); | |
264 EXPECT_TRUE(monitor.DidStop()); | |
265 } | |
266 | |
267 TEST_F(SelectToSpeakEventHandlerTest, TappingSearchStopsSpeech) { | |
268 SpeechMonitor monitor; | |
269 EXPECT_FALSE(monitor.DidStop()); | |
270 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | |
271 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN); | |
272 EXPECT_TRUE(monitor.DidStop()); | |
273 } | |
274 | |
275 TEST_F(SelectToSpeakEventHandlerTest, TappingShiftDoesNotStopSpeech) { | |
276 SpeechMonitor monitor; | |
277 generator_->PressKey(ui::VKEY_SHIFT, ui::EF_SHIFT_DOWN); | |
278 generator_->ReleaseKey(ui::VKEY_SHIFT, ui::EF_SHIFT_DOWN); | |
279 EXPECT_FALSE(monitor.DidStop()); | |
280 } | |
281 | |
282 TEST_F(SelectToSpeakEventHandlerTest, PressingControlZDoesNotStopSpeech) { | |
283 SpeechMonitor monitor; | |
284 generator_->PressKey(ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN); | |
285 generator_->PressKey(ui::VKEY_Z, ui::EF_CONTROL_DOWN); | |
286 generator_->ReleaseKey(ui::VKEY_Z, ui::EF_CONTROL_DOWN); | |
287 generator_->ReleaseKey(ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN); | |
288 EXPECT_FALSE(monitor.DidStop()); | |
289 } | |
290 | |
291 } // namespace chromeos | 259 } // namespace chromeos |
OLD | NEW |