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

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: 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());
sadrul 2015/06/24 18:31:02 Can this just do CurrentContext()->GetHost()->GetE
David Tseng 2015/06/24 19:09:54 Done.
49 }
50
51 void TearDown() override {
sadrul 2015/06/24 18:31:02 I think you should remove the rewriter here too?
David Tseng 2015/06/24 19:09:54 Done.
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.
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
97 // Send the right arrow key, which gets successfully looked up and dispatched
98 // as a ChromeVox command, so the event gets discarded.
99 generator_->PressKey(ui::VKEY_RIGHT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
100 ASSERT_EQ(2U, event_capturer_.captured_events().size());
101
102 event_capturer_.Reset();
103
104 // Released keys previously captured get eaten even without successful
105 // dispatch.
106 set_dispatch_result(false);
107 generator_->ReleaseKey(ui::VKEY_RIGHT,
108 ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
109 ASSERT_EQ(0U, event_capturer_.captured_events().size());
110
111 // Modifiers were not discarded, so we let them continue.
112 generator_->ReleaseKey(ui::VKEY_SHIFT, ui::EF_COMMAND_DOWN);
113 generator_->ReleaseKey(ui::VKEY_LWIN, 0);
114 ASSERT_EQ(2U, event_capturer_.captured_events().size());
115 }
116
117 TEST_F(SpokenFeedbackEventRewriterTest, KeysNotEatenWithChromeVoxDisabled) {
118 // Send Search+Shift+Right.
119 generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
120 ASSERT_EQ(1U, event_capturer_.captured_events().size());
121 generator_->PressKey(ui::VKEY_SHIFT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
122 ASSERT_EQ(2U, event_capturer_.captured_events().size());
123
124 // Mock successful commands lookup and dispatch; shouldn't matter either way.
125 set_dispatch_result(true);
126 generator_->PressKey(ui::VKEY_RIGHT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
127 ASSERT_EQ(3U, event_capturer_.captured_events().size());
128
129 // Released keys shouldn't get eaten.
130 set_dispatch_result(false);
131 generator_->ReleaseKey(ui::VKEY_RIGHT,
132 ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
133 generator_->ReleaseKey(ui::VKEY_SHIFT, ui::EF_COMMAND_DOWN);
134 generator_->ReleaseKey(ui::VKEY_LWIN, 0);
135 ASSERT_EQ(6U, event_capturer_.captured_events().size());
136
137 // Try releasing more keys.
138 generator_->ReleaseKey(ui::VKEY_RIGHT, 0);
139 generator_->ReleaseKey(ui::VKEY_SHIFT, 0);
140 generator_->ReleaseKey(ui::VKEY_LWIN, 0);
141 ASSERT_EQ(9U, event_capturer_.captured_events().size());
142 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698