Index: ash/wm/sticky_keys_unittest.cc |
diff --git a/ash/wm/sticky_keys_unittest.cc b/ash/wm/sticky_keys_unittest.cc |
deleted file mode 100644 |
index 41c2238eb4e94853e4fabbabadd95b5c2551d2c9..0000000000000000000000000000000000000000 |
--- a/ash/wm/sticky_keys_unittest.cc |
+++ /dev/null |
@@ -1,877 +0,0 @@ |
-// Copyright 2013 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/wm/sticky_keys.h" |
- |
-#include <X11/Xlib.h> |
-#undef None |
-#undef Bool |
-#undef RootWindow |
- |
-#include "ash/shell.h" |
-#include "ash/test/ash_test_base.h" |
-#include "base/bind.h" |
-#include "base/callback.h" |
-#include "base/memory/scoped_vector.h" |
-#include "ui/aura/root_window.h" |
-#include "ui/aura/window.h" |
-#include "ui/aura/window_tree_host_delegate.h" |
-#include "ui/events/event_handler.h" |
-#include "ui/events/test/events_test_utils_x11.h" |
-#include "ui/events/x/device_data_manager.h" |
- |
-namespace ash { |
- |
-namespace { |
- |
-// The device id of the test scroll device. |
-const unsigned int kScrollDeviceId = 1; |
- |
-} // namespace |
- |
-// Keeps a buffer of handled events. |
-class EventBuffer : public ui::EventHandler { |
- public: |
- EventBuffer() {} |
- virtual ~EventBuffer() {} |
- |
- void PopEvents(ScopedVector<ui::Event>* events) { |
- events->clear(); |
- events->swap(events_); |
- } |
- |
- private: |
- // ui::EventHandler overrides: |
- virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE { |
- events_.push_back(new ui::KeyEvent(*event)); |
- } |
- |
- virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { |
- if (event->IsMouseWheelEvent()) { |
- events_.push_back( |
- new ui::MouseWheelEvent(*static_cast<ui::MouseWheelEvent*>(event))); |
- } else { |
- events_.push_back(new ui::MouseEvent(event->native_event())); |
- } |
- } |
- |
- ScopedVector<ui::Event> events_; |
- |
- DISALLOW_COPY_AND_ASSIGN(EventBuffer); |
-}; |
- |
-// A testable and StickyKeysHandler. |
-class MockStickyKeysHandlerDelegate : |
- public StickyKeysHandler::StickyKeysHandlerDelegate { |
- public: |
- class Delegate { |
- public: |
- virtual aura::Window* GetExpectedTarget() = 0; |
- virtual void OnShortcutPressed() = 0; |
- |
- protected: |
- virtual ~Delegate() {} |
- }; |
- |
- MockStickyKeysHandlerDelegate(Delegate* delegate) : delegate_(delegate) {} |
- |
- virtual ~MockStickyKeysHandlerDelegate() {} |
- |
- // StickyKeysHandler override. |
- virtual void DispatchKeyEvent(ui::KeyEvent* event, |
- aura::Window* target) OVERRIDE { |
- ASSERT_EQ(delegate_->GetExpectedTarget(), target); |
- |
- // Detect a special shortcut when it is dispatched. This shortcut will |
- // not be hit in the LOCKED state as this case does not involve the |
- // delegate. |
- if (event->type() == ui::ET_KEY_PRESSED && |
- event->key_code() == ui::VKEY_J && |
- event->flags() | ui::EF_CONTROL_DOWN) { |
- delegate_->OnShortcutPressed(); |
- } |
- |
- events_.push_back(new ui::KeyEvent(*event)); |
- } |
- |
- virtual void DispatchMouseEvent(ui::MouseEvent* event, |
- aura::Window* target) OVERRIDE { |
- ASSERT_EQ(delegate_->GetExpectedTarget(), target); |
- events_.push_back( |
- new ui::MouseEvent(*event, target, target->GetRootWindow())); |
- } |
- |
- virtual void DispatchScrollEvent(ui::ScrollEvent* event, |
- aura::Window* target) OVERRIDE { |
- events_.push_back(new ui::ScrollEvent(event->native_event())); |
- } |
- |
- // Returns the count of dispatched events. |
- size_t GetEventCount() const { |
- return events_.size(); |
- } |
- |
- // Returns the |index|-th dispatched event. |
- const ui::Event* GetEvent(size_t index) const { |
- return events_[index]; |
- } |
- |
- // Clears all previously dispatched events. |
- void ClearEvents() { |
- events_.clear(); |
- } |
- |
- private: |
- ScopedVector<ui::Event> events_; |
- Delegate* delegate_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MockStickyKeysHandlerDelegate); |
-}; |
- |
-class StickyKeysTest : public test::AshTestBase, |
- public MockStickyKeysHandlerDelegate::Delegate { |
- protected: |
- StickyKeysTest() |
- : target_(NULL), |
- root_window_(NULL) {} |
- |
- virtual void SetUp() OVERRIDE { |
- test::AshTestBase::SetUp(); |
- |
- // |target_| owned by root window of shell. It is still safe to delete |
- // it ourselves. |
- target_ = CreateTestWindowInShellWithId(0); |
- root_window_ = target_->GetRootWindow(); |
- } |
- |
- virtual void TearDown() OVERRIDE { |
- test::AshTestBase::TearDown(); |
- } |
- |
- // Overridden from MockStickyKeysHandlerDelegate::Delegate: |
- virtual aura::Window* GetExpectedTarget() OVERRIDE { |
- return target_ ? target_ : root_window_; |
- } |
- |
- virtual void OnShortcutPressed() OVERRIDE { |
- if (target_) { |
- delete target_; |
- target_ = NULL; |
- } |
- } |
- |
- ui::KeyEvent* GenerateKey(bool is_key_press, ui::KeyboardCode code) { |
- scoped_xevent_.InitKeyEvent( |
- is_key_press ? ui::ET_KEY_PRESSED : ui::ET_KEY_RELEASED, |
- code, |
- 0); |
- ui::KeyEvent* event = new ui::KeyEvent(scoped_xevent_, false); |
- ui::Event::DispatcherApi dispatcher(event); |
- dispatcher.set_target(target_); |
- return event; |
- } |
- |
- ui::MouseEvent* GenerateMouseEvent(bool is_button_press) { |
- scoped_xevent_.InitButtonEvent( |
- is_button_press ? ui::ET_MOUSE_PRESSED : ui::ET_MOUSE_RELEASED, 0); |
- ui::MouseEvent* event = new ui::MouseEvent(scoped_xevent_); |
- ui::Event::DispatcherApi dispatcher(event); |
- dispatcher.set_target(target_); |
- return event; |
- } |
- |
- ui::MouseWheelEvent* GenerateMouseWheelEvent(int wheel_delta) { |
- EXPECT_NE(0, wheel_delta); |
- scoped_xevent_.InitMouseWheelEvent(wheel_delta, 0); |
- ui::MouseWheelEvent* event = new ui::MouseWheelEvent(scoped_xevent_); |
- ui::Event::DispatcherApi dispatcher(event); |
- dispatcher.set_target(target_); |
- return event; |
- } |
- |
- ui::ScrollEvent* GenerateScrollEvent(int scroll_delta) { |
- scoped_xevent_.InitScrollEvent(kScrollDeviceId, // deviceid |
- 0, // x_offset |
- scroll_delta, // y_offset |
- 0, // x_offset_ordinal |
- scroll_delta, // y_offset_ordinal |
- 2); // finger_count |
- ui::ScrollEvent* event = new ui::ScrollEvent(scoped_xevent_); |
- ui::Event::DispatcherApi dispatcher(event); |
- dispatcher.set_target(target_); |
- return event; |
- } |
- |
- ui::ScrollEvent* GenerateFlingScrollEvent(int fling_delta, |
- bool is_cancel) { |
- scoped_xevent_.InitFlingScrollEvent( |
- kScrollDeviceId, // deviceid |
- 0, // x_velocity |
- fling_delta, // y_velocity |
- 0, // x_velocity_ordinal |
- fling_delta, // y_velocity_ordinal |
- is_cancel); // is_cancel |
- ui::ScrollEvent* event = new ui::ScrollEvent(scoped_xevent_); |
- ui::Event::DispatcherApi dispatcher(event); |
- dispatcher.set_target(target_); |
- return event; |
- } |
- |
- // Creates a synthesized KeyEvent that is not backed by a native event. |
- ui::KeyEvent* GenerateSynthesizedKeyEvent( |
- bool is_key_press, ui::KeyboardCode code) { |
- ui::KeyEvent* event = new ui::KeyEvent( |
- is_key_press ? ui::ET_KEY_PRESSED : ui::ET_MOUSE_RELEASED, |
- code, 0, true); |
- ui::Event::DispatcherApi dispatcher(event); |
- dispatcher.set_target(target_); |
- return event; |
- } |
- |
- // Creates a synthesized MouseEvent that is not backed by a native event. |
- ui::MouseEvent* GenerateSynthesizedMouseEvent(bool is_button_press) { |
- ui::MouseEvent* event = new ui::MouseEvent( |
- is_button_press ? ui::ET_MOUSE_PRESSED : ui::ET_MOUSE_RELEASED, |
- gfx::Point(0, 0), |
- gfx::Point(0, 0), |
- ui::EF_LEFT_MOUSE_BUTTON, |
- ui::EF_LEFT_MOUSE_BUTTON); |
- ui::Event::DispatcherApi dispatcher(event); |
- dispatcher.set_target(target_); |
- return event; |
- } |
- |
- void SendActivateStickyKeyPattern(StickyKeysHandler* handler, |
- ui::KeyboardCode key_code) { |
- scoped_ptr<ui::KeyEvent> ev; |
- ev.reset(GenerateKey(true, key_code)); |
- handler->HandleKeyEvent(ev.get()); |
- ev.reset(GenerateKey(false, key_code)); |
- handler->HandleKeyEvent(ev.get()); |
- } |
- |
- void SendActivateStickyKeyPattern(aura::RootWindowHostDelegate* delegate, |
- ui::KeyboardCode key_code) { |
- scoped_ptr<ui::KeyEvent> ev; |
- ev.reset(GenerateKey(true, key_code)); |
- delegate->OnHostKeyEvent(ev.get()); |
- ev.reset(GenerateKey(false, key_code)); |
- delegate->OnHostKeyEvent(ev.get()); |
- } |
- |
- aura::Window* target() { return target_; } |
- |
- private: |
- // Owned by root window of shell, but we can still delete |target_| safely. |
- aura::Window* target_; |
- // The root window of |target_|. Not owned. |
- aura::Window* root_window_; |
- |
- // Used to construct the various X events. |
- ui::ScopedXI2Event scoped_xevent_; |
- |
- DISALLOW_COPY_AND_ASSIGN(StickyKeysTest); |
-}; |
- |
-TEST_F(StickyKeysTest, BasicOneshotScenarioTest) { |
- scoped_ptr<ui::KeyEvent> ev; |
- MockStickyKeysHandlerDelegate* mock_delegate = |
- new MockStickyKeysHandlerDelegate(this); |
- StickyKeysHandler sticky_key(ui::EF_SHIFT_DOWN, mock_delegate); |
- |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- |
- // By typing Shift key, internal state become ENABLED. |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_SHIFT); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- ev.reset(GenerateKey(true, ui::VKEY_A)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- |
- // Next keyboard event is shift modified. |
- EXPECT_TRUE(ev->flags() & ui::EF_SHIFT_DOWN); |
- |
- ev.reset(GenerateKey(false, ui::VKEY_A)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- // Making sure Shift up keyboard event is dispatched. |
- ASSERT_EQ(2U, mock_delegate->GetEventCount()); |
- EXPECT_EQ(ui::ET_KEY_PRESSED, mock_delegate->GetEvent(0)->type()); |
- EXPECT_EQ(ui::VKEY_A, |
- static_cast<const ui::KeyEvent*>(mock_delegate->GetEvent(0)) |
- ->key_code()); |
- EXPECT_EQ(ui::ET_KEY_RELEASED, mock_delegate->GetEvent(1)->type()); |
- EXPECT_EQ(ui::VKEY_SHIFT, |
- static_cast<const ui::KeyEvent*>(mock_delegate->GetEvent(1)) |
- ->key_code()); |
- |
- // Enabled state is one shot, so next key event should not be shift modified. |
- ev.reset(GenerateKey(true, ui::VKEY_A)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_FALSE(ev->flags() & ui::EF_SHIFT_DOWN); |
- |
- ev.reset(GenerateKey(false, ui::VKEY_A)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_FALSE(ev->flags() & ui::EF_SHIFT_DOWN); |
-} |
- |
-TEST_F(StickyKeysTest, BasicLockedScenarioTest) { |
- scoped_ptr<ui::KeyEvent> ev; |
- MockStickyKeysHandlerDelegate* mock_delegate = |
- new MockStickyKeysHandlerDelegate(this); |
- StickyKeysHandler sticky_key(ui::EF_SHIFT_DOWN, mock_delegate); |
- |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- |
- // By typing shift key, internal state become ENABLED. |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_SHIFT); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- // By typing shift key again, internal state become LOCKED. |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_SHIFT); |
- EXPECT_EQ(StickyKeysHandler::LOCKED, sticky_key.current_state()); |
- |
- // All keyboard events including keyUp become shift modified. |
- ev.reset(GenerateKey(true, ui::VKEY_A)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_SHIFT_DOWN); |
- |
- ev.reset(GenerateKey(false, ui::VKEY_A)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_SHIFT_DOWN); |
- |
- // Locked state keeps after normal keyboard event. |
- EXPECT_EQ(StickyKeysHandler::LOCKED, sticky_key.current_state()); |
- |
- ev.reset(GenerateKey(true, ui::VKEY_B)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_SHIFT_DOWN); |
- |
- ev.reset(GenerateKey(false, ui::VKEY_B)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_SHIFT_DOWN); |
- |
- EXPECT_EQ(StickyKeysHandler::LOCKED, sticky_key.current_state()); |
- |
- // By typing shift key again, internal state become back to DISABLED. |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_SHIFT); |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
-} |
- |
-TEST_F(StickyKeysTest, NonTargetModifierTest) { |
- scoped_ptr<ui::KeyEvent> ev; |
- MockStickyKeysHandlerDelegate* mock_delegate = |
- new MockStickyKeysHandlerDelegate(this); |
- StickyKeysHandler sticky_key(ui::EF_SHIFT_DOWN, mock_delegate); |
- |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- |
- // Non target modifier key does not affect internal state |
- ev.reset(GenerateKey(true, ui::VKEY_MENU)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- |
- ev.reset(GenerateKey(false, ui::VKEY_MENU)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_SHIFT); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- // Non target modifier key does not affect internal state |
- ev.reset(GenerateKey(true, ui::VKEY_MENU)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- ev.reset(GenerateKey(false, ui::VKEY_MENU)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_SHIFT); |
- EXPECT_EQ(StickyKeysHandler::LOCKED, sticky_key.current_state()); |
- |
- // Non target modifier key does not affect internal state |
- ev.reset(GenerateKey(true, ui::VKEY_MENU)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_EQ(StickyKeysHandler::LOCKED, sticky_key.current_state()); |
- |
- ev.reset(GenerateKey(false, ui::VKEY_MENU)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_EQ(StickyKeysHandler::LOCKED, sticky_key.current_state()); |
-} |
- |
-TEST_F(StickyKeysTest, NormalShortcutTest) { |
- // Sticky keys should not be enabled if we perform a normal shortcut. |
- scoped_ptr<ui::KeyEvent> ev; |
- MockStickyKeysHandlerDelegate* mock_delegate = |
- new MockStickyKeysHandlerDelegate(this); |
- StickyKeysHandler sticky_key(ui::EF_CONTROL_DOWN, mock_delegate); |
- |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- |
- // Perform ctrl+n shortcut. |
- ev.reset(GenerateKey(true, ui::VKEY_CONTROL)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- ev.reset(GenerateKey(true, ui::VKEY_N)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- ev.reset(GenerateKey(false, ui::VKEY_N)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- |
- // Sticky keys should not be enabled afterwards. |
- ev.reset(GenerateKey(false, ui::VKEY_CONTROL)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
-} |
- |
-TEST_F(StickyKeysTest, NormalModifiedClickTest) { |
- scoped_ptr<ui::KeyEvent> kev; |
- scoped_ptr<ui::MouseEvent> mev; |
- MockStickyKeysHandlerDelegate* mock_delegate = |
- new MockStickyKeysHandlerDelegate(this); |
- StickyKeysHandler sticky_key(ui::EF_CONTROL_DOWN, mock_delegate); |
- |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- |
- // Perform ctrl+click. |
- kev.reset(GenerateKey(true, ui::VKEY_CONTROL)); |
- sticky_key.HandleKeyEvent(kev.get()); |
- mev.reset(GenerateMouseEvent(true)); |
- sticky_key.HandleMouseEvent(mev.get()); |
- mev.reset(GenerateMouseEvent(false)); |
- sticky_key.HandleMouseEvent(mev.get()); |
- |
- // Sticky keys should not be enabled afterwards. |
- kev.reset(GenerateKey(false, ui::VKEY_CONTROL)); |
- sticky_key.HandleKeyEvent(kev.get()); |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
-} |
- |
-TEST_F(StickyKeysTest, NormalModifiedScrollTest) { |
- ui::SetUpScrollDeviceForTest(kScrollDeviceId); |
- |
- scoped_ptr<ui::KeyEvent> kev; |
- scoped_ptr<ui::ScrollEvent> sev; |
- MockStickyKeysHandlerDelegate* mock_delegate = |
- new MockStickyKeysHandlerDelegate(this); |
- StickyKeysHandler sticky_key(ui::EF_CONTROL_DOWN, mock_delegate); |
- |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- |
- // Perform ctrl+scroll. |
- kev.reset(GenerateKey(true, ui::VKEY_CONTROL)); |
- sev.reset(GenerateFlingScrollEvent(0, true)); |
- sticky_key.HandleScrollEvent(sev.get()); |
- sev.reset(GenerateScrollEvent(10)); |
- sticky_key.HandleScrollEvent(sev.get()); |
- sev.reset(GenerateFlingScrollEvent(10, false)); |
- sticky_key.HandleScrollEvent(sev.get()); |
- |
- // Sticky keys should not be enabled afterwards. |
- kev.reset(GenerateKey(false, ui::VKEY_CONTROL)); |
- sticky_key.HandleKeyEvent(kev.get()); |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
-} |
- |
-TEST_F(StickyKeysTest, MouseEventOneshot) { |
- scoped_ptr<ui::MouseEvent> ev; |
- scoped_ptr<ui::KeyEvent> kev; |
- MockStickyKeysHandlerDelegate* mock_delegate = |
- new MockStickyKeysHandlerDelegate(this); |
- StickyKeysHandler sticky_key(ui::EF_CONTROL_DOWN, mock_delegate); |
- |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_CONTROL); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- // We should still be in the ENABLED state until we get the mouse |
- // release event. |
- ev.reset(GenerateMouseEvent(true)); |
- sticky_key.HandleMouseEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- ev.reset(GenerateMouseEvent(false)); |
- sticky_key.HandleMouseEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- |
- // Making sure modifier key release event is dispatched in the right order. |
- ASSERT_EQ(2u, mock_delegate->GetEventCount()); |
- EXPECT_EQ(ui::ET_MOUSE_RELEASED, mock_delegate->GetEvent(0)->type()); |
- EXPECT_EQ(ui::ET_KEY_RELEASED, mock_delegate->GetEvent(1)->type()); |
- EXPECT_EQ(ui::VKEY_CONTROL, |
- static_cast<const ui::KeyEvent*>(mock_delegate->GetEvent(1)) |
- ->key_code()); |
- |
- // Enabled state is one shot, so next click should not be control modified. |
- ev.reset(GenerateMouseEvent(true)); |
- sticky_key.HandleMouseEvent(ev.get()); |
- EXPECT_FALSE(ev->flags() & ui::EF_CONTROL_DOWN); |
- |
- ev.reset(GenerateMouseEvent(false)); |
- sticky_key.HandleMouseEvent(ev.get()); |
- EXPECT_FALSE(ev->flags() & ui::EF_CONTROL_DOWN); |
-} |
- |
-TEST_F(StickyKeysTest, MouseEventLocked) { |
- scoped_ptr<ui::MouseEvent> ev; |
- scoped_ptr<ui::KeyEvent> kev; |
- MockStickyKeysHandlerDelegate* mock_delegate = |
- new MockStickyKeysHandlerDelegate(this); |
- StickyKeysHandler sticky_key(ui::EF_CONTROL_DOWN, mock_delegate); |
- |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- |
- // Pressing modifier key twice should make us enter lock state. |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_CONTROL); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_CONTROL); |
- EXPECT_EQ(StickyKeysHandler::LOCKED, sticky_key.current_state()); |
- |
- // Mouse events should not disable locked mode. |
- for (int i = 0; i < 3; ++i) { |
- ev.reset(GenerateMouseEvent(true)); |
- sticky_key.HandleMouseEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_CONTROL_DOWN); |
- ev.reset(GenerateMouseEvent(false)); |
- sticky_key.HandleMouseEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(StickyKeysHandler::LOCKED, sticky_key.current_state()); |
- } |
- |
- // Test with mouse wheel. |
- for (int i = 0; i < 3; ++i) { |
- ev.reset(GenerateMouseWheelEvent(ui::MouseWheelEvent::kWheelDelta)); |
- sticky_key.HandleMouseEvent(ev.get()); |
- ev.reset(GenerateMouseWheelEvent(-ui::MouseWheelEvent::kWheelDelta)); |
- sticky_key.HandleMouseEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(StickyKeysHandler::LOCKED, sticky_key.current_state()); |
- } |
- |
- // Test mixed case with mouse events and key events. |
- ev.reset(GenerateMouseWheelEvent(ui::MouseWheelEvent::kWheelDelta)); |
- sticky_key.HandleMouseEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_CONTROL_DOWN); |
- kev.reset(GenerateKey(true, ui::VKEY_N)); |
- sticky_key.HandleKeyEvent(kev.get()); |
- EXPECT_TRUE(kev->flags() & ui::EF_CONTROL_DOWN); |
- kev.reset(GenerateKey(false, ui::VKEY_N)); |
- sticky_key.HandleKeyEvent(kev.get()); |
- EXPECT_TRUE(kev->flags() & ui::EF_CONTROL_DOWN); |
- |
- EXPECT_EQ(StickyKeysHandler::LOCKED, sticky_key.current_state()); |
-} |
- |
-TEST_F(StickyKeysTest, ScrollEventOneshot) { |
- ui::SetUpScrollDeviceForTest(kScrollDeviceId); |
- // Disable Australlian scrolling. |
- ui::DeviceDataManager::GetInstance()->set_natural_scroll_enabled(true); |
- |
- scoped_ptr<ui::ScrollEvent> ev; |
- scoped_ptr<ui::KeyEvent> kev; |
- MockStickyKeysHandlerDelegate* mock_delegate = |
- new MockStickyKeysHandlerDelegate(this); |
- StickyKeysHandler sticky_key(ui::EF_CONTROL_DOWN, mock_delegate); |
- |
- int scroll_deltas[] = {-10, 10}; |
- for (int i = 0; i < 2; ++i) { |
- mock_delegate->ClearEvents(); |
- |
- // Enable sticky keys. |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_CONTROL); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- // Test a scroll sequence. Sticky keys should only be disabled at the end |
- // of the scroll sequence. Fling cancel event starts the scroll sequence. |
- ev.reset(GenerateFlingScrollEvent(0, true)); |
- sticky_key.HandleScrollEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- // Scrolls should all be modified but not disable sticky keys. |
- for (int j = 0; j < 3; ++j) { |
- ev.reset(GenerateScrollEvent(scroll_deltas[i])); |
- sticky_key.HandleScrollEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- } |
- |
- // Fling start event ends scroll sequence. |
- ev.reset(GenerateFlingScrollEvent(scroll_deltas[i], false)); |
- sticky_key.HandleScrollEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- |
- ASSERT_EQ(2U, mock_delegate->GetEventCount()); |
- EXPECT_EQ(ui::ET_SCROLL_FLING_START, mock_delegate->GetEvent(0)->type()); |
- EXPECT_FLOAT_EQ(scroll_deltas[i], |
- static_cast<const ui::ScrollEvent*>( |
- mock_delegate->GetEvent(0))->y_offset()); |
- EXPECT_EQ(ui::ET_KEY_RELEASED, mock_delegate->GetEvent(1)->type()); |
- EXPECT_EQ(ui::VKEY_CONTROL, |
- static_cast<const ui::KeyEvent*>(mock_delegate->GetEvent(1)) |
- ->key_code()); |
- } |
-} |
- |
-TEST_F(StickyKeysTest, ScrollDirectionChanged) { |
- ui::SetUpScrollDeviceForTest(kScrollDeviceId); |
- // Disable Australlian scrolling. |
- ui::DeviceDataManager::GetInstance()->set_natural_scroll_enabled(true); |
- |
- scoped_ptr<ui::ScrollEvent> ev; |
- scoped_ptr<ui::KeyEvent> kev; |
- MockStickyKeysHandlerDelegate* mock_delegate = |
- new MockStickyKeysHandlerDelegate(this); |
- StickyKeysHandler sticky_key(ui::EF_CONTROL_DOWN, mock_delegate); |
- |
- // Test direction change with both boundary value and negative value. |
- const int direction_change_values[2] = {0, -10}; |
- for (int i = 0; i < 2; ++i) { |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_CONTROL); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- // Fling cancel starts scroll sequence. |
- ev.reset(GenerateFlingScrollEvent(0, true)); |
- sticky_key.HandleScrollEvent(ev.get()); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- // Test that changing directions in a scroll sequence will |
- // return sticky keys to DISABLED state. |
- for (int j = 0; j < 3; ++j) { |
- ev.reset(GenerateScrollEvent(10)); |
- sticky_key.HandleScrollEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- } |
- |
- ev.reset(GenerateScrollEvent(direction_change_values[i])); |
- sticky_key.HandleScrollEvent(ev.get()); |
- EXPECT_FALSE(ev->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- } |
-} |
- |
-TEST_F(StickyKeysTest, ScrollEventLocked) { |
- ui::SetUpScrollDeviceForTest(kScrollDeviceId); |
- // Disable Australlian scrolling. |
- ui::DeviceDataManager::GetInstance()->set_natural_scroll_enabled(true); |
- |
- scoped_ptr<ui::ScrollEvent> ev; |
- scoped_ptr<ui::KeyEvent> kev; |
- MockStickyKeysHandlerDelegate* mock_delegate = |
- new MockStickyKeysHandlerDelegate(this); |
- StickyKeysHandler sticky_key(ui::EF_CONTROL_DOWN, mock_delegate); |
- |
- // Lock sticky keys. |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_CONTROL); |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_CONTROL); |
- EXPECT_EQ(StickyKeysHandler::LOCKED, sticky_key.current_state()); |
- |
- // Test scroll events are correctly modified in locked state. |
- for (int i = 0; i < 5; ++i) { |
- // Fling cancel starts scroll sequence. |
- ev.reset(GenerateFlingScrollEvent(0, true)); |
- sticky_key.HandleScrollEvent(ev.get()); |
- |
- ev.reset(GenerateScrollEvent(10)); |
- sticky_key.HandleScrollEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_CONTROL_DOWN); |
- ev.reset(GenerateScrollEvent(-10)); |
- sticky_key.HandleScrollEvent(ev.get()); |
- EXPECT_TRUE(ev->flags() & ui::EF_CONTROL_DOWN); |
- |
- // Fling start ends scroll sequence. |
- ev.reset(GenerateFlingScrollEvent(-10, false)); |
- sticky_key.HandleScrollEvent(ev.get()); |
- } |
- |
- EXPECT_EQ(StickyKeysHandler::LOCKED, sticky_key.current_state()); |
-} |
- |
-TEST_F(StickyKeysTest, EventTargetDestroyed) { |
- scoped_ptr<ui::KeyEvent> ev; |
- MockStickyKeysHandlerDelegate* mock_delegate = |
- new MockStickyKeysHandlerDelegate(this); |
- StickyKeysHandler sticky_key(ui::EF_CONTROL_DOWN, mock_delegate); |
- |
- target()->Focus(); |
- |
- // Go into ENABLED state. |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_CONTROL); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- // CTRL+J is a special shortcut that will destroy the event target. |
- ev.reset(GenerateKey(true, ui::VKEY_J)); |
- sticky_key.HandleKeyEvent(ev.get()); |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- EXPECT_FALSE(target()); |
-} |
- |
-TEST_F(StickyKeysTest, SynthesizedEvents) { |
- // Non-native, internally generated events should be properly handled |
- // by sticky keys. |
- MockStickyKeysHandlerDelegate* mock_delegate = |
- new MockStickyKeysHandlerDelegate(this); |
- StickyKeysHandler sticky_key(ui::EF_CONTROL_DOWN, mock_delegate); |
- |
- // Test non-native key events. |
- scoped_ptr<ui::KeyEvent> kev; |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_CONTROL); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- kev.reset(GenerateSynthesizedKeyEvent(true, ui::VKEY_K)); |
- sticky_key.HandleKeyEvent(kev.get()); |
- EXPECT_TRUE(kev->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- |
- kev.reset(GenerateSynthesizedKeyEvent(false, ui::VKEY_K)); |
- sticky_key.HandleKeyEvent(kev.get()); |
- EXPECT_FALSE(kev->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
- |
- // Test non-native mouse events. |
- SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_CONTROL); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- scoped_ptr<ui::MouseEvent> mev; |
- mev.reset(GenerateSynthesizedMouseEvent(true)); |
- sticky_key.HandleMouseEvent(mev.get()); |
- EXPECT_TRUE(mev->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(StickyKeysHandler::ENABLED, sticky_key.current_state()); |
- |
- mev.reset(GenerateSynthesizedMouseEvent(false)); |
- sticky_key.HandleMouseEvent(mev.get()); |
- EXPECT_TRUE(mev->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(StickyKeysHandler::DISABLED, sticky_key.current_state()); |
-} |
- |
-TEST_F(StickyKeysTest, KeyEventDispatchImpl) { |
- // Test the actual key event dispatch implementation. |
- EventBuffer buffer; |
- ScopedVector<ui::Event> events; |
- aura::RootWindowHostDelegate* delegate = Shell::GetPrimaryRootWindow() |
- ->GetDispatcher()->AsRootWindowHostDelegate(); |
- Shell::GetInstance()->AddPreTargetHandler(&buffer); |
- Shell::GetInstance()->sticky_keys()->Enable(true); |
- |
- SendActivateStickyKeyPattern(delegate, ui::VKEY_CONTROL); |
- scoped_ptr<ui::KeyEvent> ev; |
- buffer.PopEvents(&events); |
- |
- // Test key press event is correctly modified and modifier release |
- // event is sent. |
- ev.reset(GenerateKey(true, ui::VKEY_C)); |
- delegate->OnHostKeyEvent(ev.get()); |
- buffer.PopEvents(&events); |
- EXPECT_EQ(2u, events.size()); |
- EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); |
- EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); |
- EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
- EXPECT_EQ(ui::VKEY_CONTROL, |
- static_cast<ui::KeyEvent*>(events[1])->key_code()); |
- |
- // Test key release event is not modified. |
- ev.reset(GenerateKey(false, ui::VKEY_C)); |
- delegate->OnHostKeyEvent(ev.get()); |
- buffer.PopEvents(&events); |
- EXPECT_EQ(1u, events.size()); |
- EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type()); |
- EXPECT_EQ(ui::VKEY_C, |
- static_cast<ui::KeyEvent*>(events[0])->key_code()); |
- EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
- |
- Shell::GetInstance()->RemovePreTargetHandler(&buffer); |
-} |
- |
-TEST_F(StickyKeysTest, MouseEventDispatchImpl) { |
- // Test the actual sticky mouse event dispatch implementation. |
- EventBuffer buffer; |
- ScopedVector<ui::Event> events; |
- aura::RootWindowHostDelegate* delegate = Shell::GetPrimaryRootWindow() |
- ->GetDispatcher()->AsRootWindowHostDelegate(); |
- Shell::GetInstance()->AddPreTargetHandler(&buffer); |
- Shell::GetInstance()->sticky_keys()->Enable(true); |
- |
- scoped_ptr<ui::MouseEvent> ev; |
- SendActivateStickyKeyPattern(delegate, ui::VKEY_CONTROL); |
- buffer.PopEvents(&events); |
- |
- // Test mouse press event is correctly modified. |
- ev.reset(GenerateMouseEvent(true)); |
- delegate->OnHostMouseEvent(ev.get()); |
- buffer.PopEvents(&events); |
- EXPECT_EQ(1u, events.size()); |
- EXPECT_EQ(ui::ET_MOUSE_PRESSED, events[0]->type()); |
- EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
- |
- // Test mouse release event is correctly modified and modifier release |
- // event is sent. |
- ev.reset(GenerateMouseEvent(false)); |
- delegate->OnHostMouseEvent(ev.get()); |
- buffer.PopEvents(&events); |
- EXPECT_EQ(2u, events.size()); |
- EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type()); |
- EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
- EXPECT_EQ(ui::VKEY_CONTROL, |
- static_cast<ui::KeyEvent*>(events[1])->key_code()); |
- |
- Shell::GetInstance()->RemovePreTargetHandler(&buffer); |
-} |
- |
-TEST_F(StickyKeysTest, MouseWheelEventDispatchImpl) { |
- // Test the actual mouse wheel event dispatch implementation. |
- EventBuffer buffer; |
- ScopedVector<ui::Event> events; |
- aura::RootWindowHostDelegate* delegate = Shell::GetPrimaryRootWindow() |
- ->GetDispatcher()->AsRootWindowHostDelegate(); |
- Shell::GetInstance()->AddPreTargetHandler(&buffer); |
- Shell::GetInstance()->sticky_keys()->Enable(true); |
- |
- scoped_ptr<ui::MouseWheelEvent> ev; |
- SendActivateStickyKeyPattern(delegate, ui::VKEY_CONTROL); |
- buffer.PopEvents(&events); |
- |
- // Test positive mouse wheel event is correctly modified and modifier release |
- // event is sent. |
- ev.reset(GenerateMouseWheelEvent(ui::MouseWheelEvent::kWheelDelta)); |
- delegate->OnHostMouseEvent(ev.get()); |
- buffer.PopEvents(&events); |
- EXPECT_EQ(2u, events.size()); |
- EXPECT_TRUE(events[0]->IsMouseWheelEvent()); |
- EXPECT_EQ(ui::MouseWheelEvent::kWheelDelta, |
- static_cast<ui::MouseWheelEvent*>(events[0])->y_offset()); |
- EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
- EXPECT_EQ(ui::VKEY_CONTROL, |
- static_cast<ui::KeyEvent*>(events[1])->key_code()); |
- |
- // Test negative mouse wheel event is correctly modified and modifier release |
- // event is sent. |
- SendActivateStickyKeyPattern(delegate, ui::VKEY_CONTROL); |
- buffer.PopEvents(&events); |
- |
- ev.reset(GenerateMouseWheelEvent(-ui::MouseWheelEvent::kWheelDelta)); |
- delegate->OnHostMouseEvent(ev.get()); |
- buffer.PopEvents(&events); |
- EXPECT_EQ(2u, events.size()); |
- EXPECT_TRUE(events[0]->IsMouseWheelEvent()); |
- EXPECT_EQ(-ui::MouseWheelEvent::kWheelDelta, |
- static_cast<ui::MouseWheelEvent*>(events[0])->y_offset()); |
- EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
- EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
- EXPECT_EQ(ui::VKEY_CONTROL, |
- static_cast<ui::KeyEvent*>(events[1])->key_code()); |
- |
- Shell::GetInstance()->RemovePreTargetHandler(&buffer); |
-} |
- |
-} // namespace ash |