Chromium Code Reviews| 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..dca9a5b07ae020df5017f91bbaa48f0d91c987d7 |
| --- /dev/null |
| +++ b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_unittest.cc |
| @@ -0,0 +1,142 @@ |
| +// 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/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_); |
| + generator_.reset(new ui::test::EventGenerator(CurrentContext())); |
| + 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.
|
| + } |
| + |
| + 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.
|
| + generator_.reset(); |
| + 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()); |
| +} |