| 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 |