| 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());
|
| +}
|
|
|