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

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

Issue 1185753008: Proposed alternative for supporting ChromeVox keyboard commands. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add tests. Created 5 years, 6 months 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 2015 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 "ash/shell.h"
6 #include "ash/test/ash_test_base.h"
7 #include "chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter.h "
8 #include "ui/aura/window.h"
9 #include "ui/events/event.h"
10 #include "ui/events/event_constants.h"
11 #include "ui/events/keycodes/keyboard_codes.h"
12 #include "ui/events/test/event_generator.h"
13
14 // Records all key events.
15 class EventCapturer : public ui::EventHandler {
16 public:
17 EventCapturer() {}
18 ~EventCapturer() override {}
19
20 void Reset() { events_.clear(); }
21
22 void OnEvent(ui::Event* event) override {
23 if (event->IsKeyEvent())
24 events_.push_back(new ui::KeyEvent(static_cast<ui::KeyEvent&>(*event)));
25 }
26
27 const ScopedVector<ui::KeyEvent>& captured_events() const { return events_; }
28
29 private:
30 ScopedVector<ui::KeyEvent> events_;
31
32 DISALLOW_COPY_AND_ASSIGN(EventCapturer);
33 };
34
35 class SpokenFeedbackEventRewriterTest
36 : public ash::test::AshTestBase,
37 public SpokenFeedbackEventRewriterDelegate {
38 public:
39 SpokenFeedbackEventRewriterTest()
40 : spoken_feedback_event_rewriter_(new SpokenFeedbackEventRewriter(this)),
41 is_spoken_feedback_enabled_(false),
42 dispatch_result_(false) {}
43
44 void SetUp() override {
45 ash::test::AshTestBase::SetUp();
46 CurrentContext()->AddPreTargetHandler(&event_capturer_);
47 generator_.reset(new ui::test::EventGenerator(CurrentContext()));
48 generator_->AddEventRewriter(spoken_feedback_event_rewriter_.get());
49 }
50
51 void TearDown() override {
52 generator_.reset();
53 CurrentContext()->RemovePreTargetHandler(&event_capturer_);
54 ash::test::AshTestBase::TearDown();
55 }
56
57 protected:
58 scoped_ptr<ui::test::EventGenerator> generator_;
59 EventCapturer event_capturer_;
60
61 void set_is_spoken_feedback_enabled(bool enabled) {
62 is_spoken_feedback_enabled_ = enabled;
63 }
64
65 void set_dispatch_result(bool result) { dispatch_result_ = result; }
66
67 private:
68 // SpokenFeedbackEventRewriterDelegate:
69 bool IsSpokenFeedbackEnabled() const override {
70 return is_spoken_feedback_enabled_;
71 }
72
73 bool DispatchKeyToChromeVox(ui::KeyEvent key_event) override {
74 return dispatch_result_;
75 }
76
77 scoped_ptr<SpokenFeedbackEventRewriter> spoken_feedback_event_rewriter_;
78 bool is_spoken_feedback_enabled_;
79 bool dispatch_result_;
80
81 DISALLOW_COPY_AND_ASSIGN(SpokenFeedbackEventRewriterTest);
82 };
83
84 TEST_F(SpokenFeedbackEventRewriterTest, PressAndReleaseCvoxKeys) {
85 // Mock ChromeVox enabled.
86 set_is_spoken_feedback_enabled(true);
87
88 // Send Search+Shift+Right.
dmazzoni 2015/06/23 17:11:17 Nit: this comment applies to the following block o
David Tseng 2015/06/23 17:51:29 Done.
89 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
90 ASSERT_EQ(1U, event_capturer_.captured_events().size());
91 generator_->PressKey(ui::VKEY_SHIFT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
92 ASSERT_EQ(2U, event_capturer_.captured_events().size());
93
94 // Mock successful commands lookup and dispatch.
95 set_dispatch_result(true);
96 generator_->PressKey(ui::VKEY_RIGHT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
97 ASSERT_EQ(2U, event_capturer_.captured_events().size());
dmazzoni 2015/06/23 17:11:17 To clarify, the Search and Shift keys did generate
David Tseng 2015/06/23 17:51:29 Yes.
98
99 event_capturer_.Reset();
100
101 // Released keys get eaten even without successful dispatch.
102 set_dispatch_result(false);
103 generator_->ReleaseKey(ui::VKEY_RIGHT, 0);
104 generator_->ReleaseKey(ui::VKEY_SHIFT, 2);
105 generator_->ReleaseKey(ui::VKEY_LWIN, 128);
dmazzoni 2015/06/23 17:11:17 nit: use constants instead of magic values like 12
David Tseng 2015/06/23 17:51:29 Done.
106 ASSERT_EQ(0U, event_capturer_.captured_events().size());
107
108 // Try releasing more keys.
109 generator_->ReleaseKey(ui::VKEY_RIGHT, 0);
110 generator_->ReleaseKey(ui::VKEY_SHIFT, 2);
111 generator_->ReleaseKey(ui::VKEY_LWIN, 128);
112 ASSERT_EQ(3U, event_capturer_.captured_events().size());
113 }
114 TEST_F(SpokenFeedbackEventRewriterTest, KeysNotEatenWithChromeVoxDisabled) {
dmazzoni 2015/06/23 17:11:17 nit: blank line before this new test
David Tseng 2015/06/23 17:51:28 Done.
115 // Send Search+Shift+Right.
116 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
117 ASSERT_EQ(1U, event_capturer_.captured_events().size());
118 generator_->PressKey(ui::VKEY_SHIFT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
119 ASSERT_EQ(2U, event_capturer_.captured_events().size());
120
121 // Mock successful commands lookup and dispatch; shouldn't matter either way.
122 set_dispatch_result(true);
123 generator_->PressKey(ui::VKEY_RIGHT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
124 ASSERT_EQ(3U, event_capturer_.captured_events().size());
125
126 // Released keys shouldn't get eaten.
127 set_dispatch_result(false);
128 generator_->ReleaseKey(ui::VKEY_RIGHT, 0);
129 generator_->ReleaseKey(ui::VKEY_SHIFT, 2);
130 generator_->ReleaseKey(ui::VKEY_LWIN, 128);
131 ASSERT_EQ(6U, event_capturer_.captured_events().size());
132
133 // Try releasing more keys.
134 generator_->ReleaseKey(ui::VKEY_RIGHT, 0);
135 generator_->ReleaseKey(ui::VKEY_SHIFT, 2);
136 generator_->ReleaseKey(ui::VKEY_LWIN, 128);
137 ASSERT_EQ(9U, event_capturer_.captured_events().size());
138 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698