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

Unified 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: Remove ui/events/* changes. 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_unittest.cc
diff --git a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_unittest.cc b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..9180bd6fe1ac343b8f31569bef4964878e45ae98
--- /dev/null
+++ b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_unittest.cc
@@ -0,0 +1,146 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/shell.h"
+#include "ash/test/ash_test_base.h"
+#include "chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/events/event.h"
+#include "ui/events/event_constants.h"
+#include "ui/events/keycodes/keyboard_codes.h"
+#include "ui/events/test/event_generator.h"
+
+// Records all key events.
+class EventCapturer : public ui::EventHandler {
+ public:
+ EventCapturer() {}
+ ~EventCapturer() override {}
+
+ void Reset() { events_.clear(); }
+
+ void OnEvent(ui::Event* event) override {
+ if (event->IsKeyEvent())
+ events_.push_back(new ui::KeyEvent(static_cast<ui::KeyEvent&>(*event)));
+ }
+
+ const ScopedVector<ui::KeyEvent>& captured_events() const { return events_; }
+
+ private:
+ ScopedVector<ui::KeyEvent> events_;
+
+ DISALLOW_COPY_AND_ASSIGN(EventCapturer);
+};
+
+class SpokenFeedbackEventRewriterTest
+ : public ash::test::AshTestBase,
+ public SpokenFeedbackEventRewriterDelegate {
+ public:
+ SpokenFeedbackEventRewriterTest()
+ : spoken_feedback_event_rewriter_(new SpokenFeedbackEventRewriter(this)),
+ is_spoken_feedback_enabled_(false),
+ dispatch_result_(false) {}
+
+ void SetUp() override {
+ ash::test::AshTestBase::SetUp();
+ CurrentContext()->AddPreTargetHandler(&event_capturer_);
+ CurrentContext()->GetHost()->GetEventSource()->AddEventRewriter(
+ spoken_feedback_event_rewriter_.get());
+ generator_.reset(new ui::test::EventGenerator(CurrentContext()));
+ }
+
+ void TearDown() override {
+ generator_.reset();
+ CurrentContext()->GetHost()->GetEventSource()->RemoveEventRewriter(
+ spoken_feedback_event_rewriter_.get());
+ CurrentContext()->RemovePreTargetHandler(&event_capturer_);
+ ash::test::AshTestBase::TearDown();
+ }
+
+ protected:
+ scoped_ptr<ui::test::EventGenerator> generator_;
+ EventCapturer event_capturer_;
+
+ void set_is_spoken_feedback_enabled(bool enabled) {
+ is_spoken_feedback_enabled_ = enabled;
+ }
+
+ void set_dispatch_result(bool result) { dispatch_result_ = result; }
+
+ private:
+ // SpokenFeedbackEventRewriterDelegate:
+ bool IsSpokenFeedbackEnabled() const override {
+ return is_spoken_feedback_enabled_;
+ }
+
+ bool DispatchKeyToChromeVox(ui::KeyEvent key_event) override {
+ return dispatch_result_;
+ }
+
+ scoped_ptr<SpokenFeedbackEventRewriter> spoken_feedback_event_rewriter_;
+ bool is_spoken_feedback_enabled_;
+ bool dispatch_result_;
+
+ DISALLOW_COPY_AND_ASSIGN(SpokenFeedbackEventRewriterTest);
+};
+
+TEST_F(SpokenFeedbackEventRewriterTest, PressAndReleaseCvoxKeys) {
+ // Mock ChromeVox enabled.
+ set_is_spoken_feedback_enabled(true);
+
+ // Send Search+Shift.
+ generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
+ ASSERT_EQ(1U, event_capturer_.captured_events().size());
+ generator_->PressKey(ui::VKEY_SHIFT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
+ ASSERT_EQ(2U, event_capturer_.captured_events().size());
+
+ // Mock successful commands lookup and dispatch.
+ set_dispatch_result(true);
+
+ // Send the right arrow key, which gets successfully looked up and dispatched
+ // as a ChromeVox command, so the event gets discarded.
+ generator_->PressKey(ui::VKEY_RIGHT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
+ ASSERT_EQ(2U, event_capturer_.captured_events().size());
+
+ event_capturer_.Reset();
+
+ // Released keys previously captured get eaten even without successful
+ // dispatch.
+ set_dispatch_result(false);
+ generator_->ReleaseKey(ui::VKEY_RIGHT,
+ ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
+ ASSERT_EQ(0U, event_capturer_.captured_events().size());
+
+ // Modifiers were not discarded, so we let them continue.
+ generator_->ReleaseKey(ui::VKEY_SHIFT, ui::EF_COMMAND_DOWN);
+ generator_->ReleaseKey(ui::VKEY_LWIN, 0);
+ ASSERT_EQ(2U, event_capturer_.captured_events().size());
+}
+
+TEST_F(SpokenFeedbackEventRewriterTest, KeysNotEatenWithChromeVoxDisabled) {
+ // Send Search+Shift+Right.
+ generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
+ ASSERT_EQ(1U, event_capturer_.captured_events().size());
+ generator_->PressKey(ui::VKEY_SHIFT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
+ ASSERT_EQ(2U, event_capturer_.captured_events().size());
+
+ // Mock successful commands lookup and dispatch; shouldn't matter either way.
+ set_dispatch_result(true);
+ generator_->PressKey(ui::VKEY_RIGHT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
+ ASSERT_EQ(3U, event_capturer_.captured_events().size());
+
+ // Released keys shouldn't get eaten.
+ set_dispatch_result(false);
+ generator_->ReleaseKey(ui::VKEY_RIGHT,
+ ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
+ generator_->ReleaseKey(ui::VKEY_SHIFT, ui::EF_COMMAND_DOWN);
+ generator_->ReleaseKey(ui::VKEY_LWIN, 0);
+ ASSERT_EQ(6U, event_capturer_.captured_events().size());
+
+ // Try releasing more keys.
+ generator_->ReleaseKey(ui::VKEY_RIGHT, 0);
+ generator_->ReleaseKey(ui::VKEY_SHIFT, 0);
+ generator_->ReleaseKey(ui::VKEY_LWIN, 0);
+ ASSERT_EQ(9U, event_capturer_.captured_events().size());
+}

Powered by Google App Engine
This is Rietveld 408576698