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

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: Created 4 years, 1 month 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 "base/macros.h"
12 #include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h"
13 #include "chrome/test/base/testing_profile.h"
14 #include "ui/aura/window.h"
15 #include "ui/events/event.h"
16 #include "ui/events/event_constants.h"
17 #include "ui/events/test/event_generator.h"
18 #include "ui/views/test/test_views_delegate.h"
19 #include "ui/views/views_delegate.h"
20
21 using chromeos::SelectToSpeakEventHandler;
22
23 namespace {
24
25 // Records all key events.
26 class EventCapturer : public ui::EventHandler {
27 public:
28 EventCapturer() {}
29 ~EventCapturer() override {}
30
31 void Reset() {
32 last_key_event_.reset(nullptr);
33 last_mouse_event_.reset(nullptr);
34 }
35
36 ui::KeyEvent* last_key_event() { return last_key_event_.get(); }
37 ui::MouseEvent* last_mouse_event() { return last_mouse_event_.get(); }
38
39 private:
40 void OnMouseEvent(ui::MouseEvent* event) override {
41 last_mouse_event_.reset(new ui::MouseEvent(*event));
42 }
43 void OnKeyEvent(ui::KeyEvent* event) override {
44 last_key_event_.reset(new ui::KeyEvent(*event));
45 }
46
47 std::unique_ptr<ui::KeyEvent> last_key_event_;
48 std::unique_ptr<ui::MouseEvent> last_mouse_event_;
49
50 DISALLOW_COPY_AND_ASSIGN(EventCapturer);
51 };
52
53 class SelectToSpeakTestViewsDelegate : public views::TestViewsDelegate {
54 public:
55 SelectToSpeakTestViewsDelegate() {}
56 ~SelectToSpeakTestViewsDelegate() override {}
57
58 void Reset() { events_captured_.clear(); }
59
60 bool CapturedAXEvent(ui::AXEvent event_type) {
61 return events_captured_.find(event_type) != events_captured_.end();
62 }
63
64 // Overriden from TestViewsDelegate.
65 void NotifyAccessibilityEvent(views::View* view,
66 ui::AXEvent event_type) override {
67 events_captured_.insert(event_type);
68 }
69
70 private:
71 std::set<ui::AXEvent> events_captured_;
72
73 DISALLOW_COPY_AND_ASSIGN(SelectToSpeakTestViewsDelegate);
74 };
75
76 class SelectToSpeakEventHandlerTest : public ash::test::AshTestBase {
77 public:
78 SelectToSpeakEventHandlerTest()
79 : generator_(nullptr),
80 select_to_speak_event_handler_(new SelectToSpeakEventHandler()) {}
81
82 void SetUp() override {
83 ash::test::AshTestBase::SetUp();
84 views_delegate_.reset(new SelectToSpeakTestViewsDelegate);
85 generator_ = &AshTestBase::GetEventGenerator();
86 CurrentContext()->AddPreTargetHandler(select_to_speak_event_handler_.get());
87 CurrentContext()->AddPreTargetHandler(&event_capturer_);
88 AutomationManagerAura::GetInstance()->Enable(&profile_);
89 }
90
91 void TearDown() override {
92 CurrentContext()->RemovePreTargetHandler(
93 select_to_speak_event_handler_.get());
94 CurrentContext()->RemovePreTargetHandler(&event_capturer_);
95 generator_ = nullptr;
96 ash::test::AshTestBase::TearDown();
97 }
98
99 protected:
100 ui::test::EventGenerator* generator_;
101 EventCapturer event_capturer_;
102 TestingProfile profile_;
103 std::unique_ptr<SelectToSpeakTestViewsDelegate> views_delegate_;
104
105 private:
106 std::unique_ptr<SelectToSpeakEventHandler> select_to_speak_event_handler_;
107
108 DISALLOW_COPY_AND_ASSIGN(SelectToSpeakEventHandlerTest);
109 };
110
111 } // namespace
112
113 TEST_F(SelectToSpeakEventHandlerTest, PressAndReleaseSearchNotHandled) {
114 // If the user presses and releases the Search key, with no mouse
115 // presses, the key events won't be handled by the SelectToSpeakEventHandler
116 // and the normal behavior will occur.
117
118 EXPECT_FALSE(event_capturer_.last_key_event());
119
120 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
121 ASSERT_TRUE(event_capturer_.last_key_event());
122 EXPECT_FALSE(event_capturer_.last_key_event()->handled());
123
124 event_capturer_.Reset();
125 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
126 ASSERT_TRUE(event_capturer_.last_key_event());
127 EXPECT_FALSE(event_capturer_.last_key_event()->handled());
128 }
129
130 TEST_F(SelectToSpeakEventHandlerTest, SearchPlusClick) {
131 // If the user holds the Search key and then clicks the mouse button,
132 // the mouse events and the key release event get hancled by the
133 // SelectToSpeakEventHandler, and accessibility events are generated.
134
135 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
136 ASSERT_TRUE(event_capturer_.last_key_event());
137 EXPECT_FALSE(event_capturer_.last_key_event()->handled());
138
139 generator_->set_current_location(gfx::Point(100, 12));
140 generator_->PressLeftButton();
141 EXPECT_FALSE(event_capturer_.last_mouse_event());
142
143 EXPECT_TRUE(views_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED));
144
145 generator_->ReleaseLeftButton();
146 EXPECT_FALSE(event_capturer_.last_mouse_event());
147
148 EXPECT_TRUE(views_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED));
149
150 event_capturer_.Reset();
151 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
152 EXPECT_FALSE(event_capturer_.last_key_event());
153 }
154
155 TEST_F(SelectToSpeakEventHandlerTest, SearchPlusClickTwice) {
156 // Same as SearchPlusClick, above, but test that the user can keep
157 // holding down Search and click again.
158
159 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
160 ASSERT_TRUE(event_capturer_.last_key_event());
161 EXPECT_FALSE(event_capturer_.last_key_event()->handled());
162
163 generator_->set_current_location(gfx::Point(100, 12));
164 generator_->PressLeftButton();
165 EXPECT_FALSE(event_capturer_.last_mouse_event());
166 EXPECT_TRUE(views_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED));
167
168 generator_->ReleaseLeftButton();
169 EXPECT_FALSE(event_capturer_.last_mouse_event());
170 EXPECT_TRUE(views_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED));
171
172 views_delegate_->Reset();
173 EXPECT_FALSE(views_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED));
174 EXPECT_FALSE(views_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED));
175
176 generator_->PressLeftButton();
177 EXPECT_FALSE(event_capturer_.last_mouse_event());
178 EXPECT_TRUE(views_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED));
179
180 generator_->ReleaseLeftButton();
181 EXPECT_FALSE(event_capturer_.last_mouse_event());
182 EXPECT_TRUE(views_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_RELEASED));
183
184 event_capturer_.Reset();
185 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
186 EXPECT_FALSE(event_capturer_.last_key_event());
187 }
188
189 TEST_F(SelectToSpeakEventHandlerTest, SearchPlusMouseThenCancel) {
190 // If the user holds the Search key and then presses the mouse button,
191 // but then releases the Search key first while the mouse is still down,
192 // a cancel AX event is sent and the subsequent mouse up is canceled too.
193
194 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
195 ASSERT_TRUE(event_capturer_.last_key_event());
196 EXPECT_FALSE(event_capturer_.last_key_event()->handled());
197
198 generator_->set_current_location(gfx::Point(100, 12));
199 generator_->PressLeftButton();
200 EXPECT_FALSE(event_capturer_.last_mouse_event());
201 EXPECT_TRUE(views_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_PRESSED));
202
203 event_capturer_.Reset();
204 generator_->ReleaseKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
205 EXPECT_FALSE(event_capturer_.last_key_event());
206
207 EXPECT_TRUE(views_delegate_->CapturedAXEvent(ui::AX_EVENT_MOUSE_CANCELED));
208
209 generator_->ReleaseLeftButton();
210 EXPECT_FALSE(event_capturer_.last_mouse_event());
211 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698