Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: chrome/browser/chromeos/accessibility/select_to_speak_event_handler_unittest.cc

Issue 2493923002: Select-to-speak event handler (Closed)
Patch Set: Fix presubmit warning Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/accessibility/select_to_speak_event_handler.h"
6
7 #include <set>
8
9 #include "ash/shell.h"
10 #include "ash/test/ash_test_base.h"
11 #include "ash/test/ash_test_helper.h"
12 #include "ash/test/ash_test_views_delegate.h"
13 #include "base/macros.h"
14 #include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h"
15 #include "chrome/test/base/testing_profile.h"
16 #include "ui/aura/window.h"
17 #include "ui/events/event.h"
18 #include "ui/events/event_constants.h"
19 #include "ui/events/test/event_generator.h"
20 #include "ui/views/views_delegate.h"
21
22 using chromeos::SelectToSpeakEventHandler;
23
24 namespace {
25
26 // Records all key events.
27 class EventCapturer : public ui::EventHandler {
28 public:
29 EventCapturer() {}
30 ~EventCapturer() override {}
31
32 void Reset() {
33 last_key_event_.reset(nullptr);
34 last_mouse_event_.reset(nullptr);
35 }
36
37 ui::KeyEvent* last_key_event() { return last_key_event_.get(); }
38 ui::MouseEvent* last_mouse_event() { return last_mouse_event_.get(); }
39
40 private:
41 void OnMouseEvent(ui::MouseEvent* event) override {
42 last_mouse_event_.reset(new ui::MouseEvent(*event));
43 }
44 void OnKeyEvent(ui::KeyEvent* event) override {
45 last_key_event_.reset(new ui::KeyEvent(*event));
46 }
47
48 std::unique_ptr<ui::KeyEvent> last_key_event_;
49 std::unique_ptr<ui::MouseEvent> last_mouse_event_;
50
51 DISALLOW_COPY_AND_ASSIGN(EventCapturer);
52 };
53
54 class SelectToSpeakAccessibilityEventDelegate
55 : public ash::test::TestAccessibilityEventDelegate {
56 public:
57 SelectToSpeakAccessibilityEventDelegate() {}
58 ~SelectToSpeakAccessibilityEventDelegate() override {}
59
60 void Reset() { events_captured_.clear(); }
61
62 bool CapturedAXEvent(ui::AXEvent event_type) {
63 return events_captured_.find(event_type) != events_captured_.end();
64 }
65
66 // Overriden from TestAccessibilityEventDelegate.
67 void NotifyAccessibilityEvent(views::View* view,
68 ui::AXEvent event_type) override {
69 events_captured_.insert(event_type);
70 }
71
72 private:
73 std::set<ui::AXEvent> events_captured_;
74
75 DISALLOW_COPY_AND_ASSIGN(SelectToSpeakAccessibilityEventDelegate);
76 };
77
78 class SelectToSpeakEventHandlerTest : public ash::test::AshTestBase {
79 public:
80 SelectToSpeakEventHandlerTest()
81 : generator_(nullptr),
82 select_to_speak_event_handler_(new SelectToSpeakEventHandler()) {}
83
84 void SetUp() override {
85 ash::test::AshTestBase::SetUp();
86 event_delegate_.reset(new SelectToSpeakAccessibilityEventDelegate());
87 ash_test_helper()->views_delegate()->set_test_accessibility_event_delegate(
88 event_delegate_.get());
89 generator_ = &AshTestBase::GetEventGenerator();
90 CurrentContext()->AddPreTargetHandler(select_to_speak_event_handler_.get());
91 CurrentContext()->AddPreTargetHandler(&event_capturer_);
92 AutomationManagerAura::GetInstance()->Enable(&profile_);
93 }
94
95 void TearDown() override {
96 CurrentContext()->RemovePreTargetHandler(
97 select_to_speak_event_handler_.get());
98 CurrentContext()->RemovePreTargetHandler(&event_capturer_);
99 generator_ = nullptr;
100 ash::test::AshTestBase::TearDown();
101 }
102
103 protected:
104 ui::test::EventGenerator* generator_;
105 EventCapturer event_capturer_;
106 TestingProfile profile_;
107 std::unique_ptr<SelectToSpeakAccessibilityEventDelegate> event_delegate_;
108
109 private:
110 std::unique_ptr<SelectToSpeakEventHandler> select_to_speak_event_handler_;
111
112 DISALLOW_COPY_AND_ASSIGN(SelectToSpeakEventHandlerTest);
113 };
114
115 } // namespace
116
117 TEST_F(SelectToSpeakEventHandlerTest, PressAndReleaseSearchNotHandled) {
118 // If the user presses and releases the Search key, with no mouse
119 // presses, the key events won't be handled by the SelectToSpeakEventHandler
120 // and the normal behavior will occur.
121
122 EXPECT_FALSE(event_capturer_.last_key_event());
123
124 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
125 ASSERT_TRUE(event_capturer_.last_key_event());
126 EXPECT_FALSE(event_capturer_.last_key_event()->handled());
127
128 event_capturer_.Reset();
129 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
130 ASSERT_TRUE(event_capturer_.last_key_event());
131 EXPECT_FALSE(event_capturer_.last_key_event()->handled());
132 }
133
134 TEST_F(SelectToSpeakEventHandlerTest, SearchPlusClick) {
135 // If the user holds the Search key and then clicks the mouse button,
136 // the mouse events and the key release event get hancled by the
137 // SelectToSpeakEventHandler, and accessibility events are generated.
138
139 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
140 ASSERT_TRUE(event_capturer_.last_key_event());
141 EXPECT_FALSE(event_capturer_.last_key_event()->handled());
142
143 generator_->set_current_location(gfx::Point(100, 12));
144 generator_->PressLeftButton();
145 EXPECT_FALSE(event_capturer_.last_mouse_event());
146
147 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED));
148
149 generator_->ReleaseLeftButton();
150 EXPECT_FALSE(event_capturer_.last_mouse_event());
151
152 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED));
153
154 event_capturer_.Reset();
155 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
156 EXPECT_FALSE(event_capturer_.last_key_event());
157 }
158
159 TEST_F(SelectToSpeakEventHandlerTest, SearchPlusClickTwice) {
160 // Same as SearchPlusClick, above, but test that the user can keep
161 // holding down Search and click again.
162
163 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
164 ASSERT_TRUE(event_capturer_.last_key_event());
165 EXPECT_FALSE(event_capturer_.last_key_event()->handled());
166
167 generator_->set_current_location(gfx::Point(100, 12));
168 generator_->PressLeftButton();
169 EXPECT_FALSE(event_capturer_.last_mouse_event());
170 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED));
171
172 generator_->ReleaseLeftButton();
173 EXPECT_FALSE(event_capturer_.last_mouse_event());
174 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED));
175
176 event_delegate_->Reset();
177 EXPECT_FALSE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED));
178 EXPECT_FALSE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED));
179
180 generator_->PressLeftButton();
181 EXPECT_FALSE(event_capturer_.last_mouse_event());
182 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED));
183
184 generator_->ReleaseLeftButton();
185 EXPECT_FALSE(event_capturer_.last_mouse_event());
186 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED));
187
188 event_capturer_.Reset();
189 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
190 EXPECT_FALSE(event_capturer_.last_key_event());
191 }
192
193 TEST_F(SelectToSpeakEventHandlerTest, SearchPlusMouseThenCancel) {
194 // If the user holds the Search key and then presses the mouse button,
195 // but then releases the Search key first while the mouse is still down,
196 // a cancel AX event is sent and the subsequent mouse up is canceled too.
197
198 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
199 ASSERT_TRUE(event_capturer_.last_key_event());
200 EXPECT_FALSE(event_capturer_.last_key_event()->handled());
201
202 generator_->set_current_location(gfx::Point(100, 12));
203 generator_->PressLeftButton();
204 EXPECT_FALSE(event_capturer_.last_mouse_event());
205 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED));
206
207 event_capturer_.Reset();
208 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
209 EXPECT_FALSE(event_capturer_.last_key_event());
210
211 EXPECT_TRUE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_CANCELED));
212
213 generator_->ReleaseLeftButton();
214 EXPECT_FALSE(event_capturer_.last_mouse_event());
215 }
216
217 TEST_F(SelectToSpeakEventHandlerTest, SearchPlusKeyIgnoresClicks) {
218 // If the user presses the Search key and then some other key,
219 // we should assume the user does not want select-to-speak, and
220 // click events should be ignored.
221
222 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
223 ASSERT_TRUE(event_capturer_.last_key_event());
224 EXPECT_FALSE(event_capturer_.last_key_event()->handled());
225
226 generator_->PressKey(ui::VKEY_I, ui::EF_COMMAND_DOWN);
227 ASSERT_TRUE(event_capturer_.last_key_event());
228 EXPECT_FALSE(event_capturer_.last_key_event()->handled());
229
230 generator_->set_current_location(gfx::Point(100, 12));
231 generator_->PressLeftButton();
232 ASSERT_TRUE(event_capturer_.last_mouse_event());
233 EXPECT_FALSE(event_capturer_.last_mouse_event()->handled());
234
235 EXPECT_FALSE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED));
236
237 generator_->ReleaseLeftButton();
238 ASSERT_TRUE(event_capturer_.last_mouse_event());
239 EXPECT_FALSE(event_capturer_.last_mouse_event()->handled());
240
241 EXPECT_FALSE(event_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED));
242
243 event_capturer_.Reset();
244 generator_->ReleaseKey(ui::VKEY_I, ui::EF_COMMAND_DOWN);
245 ASSERT_TRUE(event_capturer_.last_key_event());
246 EXPECT_FALSE(event_capturer_.last_key_event()->handled());
247
248 event_capturer_.Reset();
249 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
250 ASSERT_TRUE(event_capturer_.last_key_event());
251 EXPECT_FALSE(event_capturer_.last_key_event()->handled());
252 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698