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