| Index: ui/events/ozone/evdev/event_converter_evdev_impl_unittest.cc
|
| diff --git a/ui/events/ozone/evdev/event_converter_evdev_impl_unittest.cc b/ui/events/ozone/evdev/event_converter_evdev_impl_unittest.cc
|
| index 5f90badc74adfc3d6c18ae5ccd8adf752636cb62..c1c6a55bce92d2903c640489a60a29025836239c 100644
|
| --- a/ui/events/ozone/evdev/event_converter_evdev_impl_unittest.cc
|
| +++ b/ui/events/ozone/evdev/event_converter_evdev_impl_unittest.cc
|
| @@ -2,14 +2,13 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include <linux/input.h>
|
| -
|
| #include "base/bind.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/memory/scoped_vector.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "ui/events/event.h"
|
| +#include "ui/events/keycodes/dom3/dom_code.h"
|
| #include "ui/events/keycodes/keyboard_codes.h"
|
| #include "ui/events/ozone/device/device_manager.h"
|
| #include "ui/events/ozone/evdev/cursor_delegate_evdev.h"
|
| @@ -19,6 +18,8 @@
|
| #include "ui/events/ozone/evdev/keyboard_evdev.h"
|
| #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
|
|
|
| +#include <linux/input.h>
|
| +
|
| namespace ui {
|
|
|
| const char kTestDevicePath[] = "/dev/input/test-device";
|
| @@ -127,6 +128,10 @@ class EventConverterEvdevImplTest : public testing::Test {
|
| return static_cast<ui::MouseEvent*>(ev);
|
| }
|
|
|
| + void ClearDispatchedEvents() {
|
| + dispatched_events_.clear();
|
| + }
|
| +
|
| void DestroyDevice() { device_.reset(); }
|
|
|
| private:
|
| @@ -531,3 +536,102 @@ TEST_F(EventConverterEvdevImplTest, ShouldReleaseKeysOnSynDropped) {
|
| EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
|
| EXPECT_EQ(ui::VKEY_A, event->key_code());
|
| }
|
| +
|
| +// Test that SetAllowedKeys() causes events for non-allowed keys to be dropped.
|
| +TEST_F(EventConverterEvdevImplTest, SetAllowedKeys) {
|
| + ui::MockEventConverterEvdevImpl* dev = device();
|
| + struct input_event mock_kernel_queue[] = {
|
| + {{0, 0}, EV_KEY, KEY_A, 1},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| +
|
| + {{0, 0}, EV_KEY, KEY_A, 0},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| +
|
| + {{0, 0}, EV_KEY, KEY_POWER, 1},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| +
|
| + {{0, 0}, EV_KEY, KEY_POWER, 0},
|
| + {{0, 0}, EV_KEY, SYN_REPORT, 0},
|
| + };
|
| +
|
| + dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
|
| +
|
| + ASSERT_EQ(4u, size());
|
| + ui::KeyEvent* event = dispatched_event(0);
|
| + EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
|
| + EXPECT_EQ(ui::VKEY_A, event->key_code());
|
| + event = dispatched_event(1);
|
| + EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
|
| + EXPECT_EQ(ui::VKEY_A, event->key_code());
|
| + event = dispatched_event(2);
|
| + EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
|
| + EXPECT_EQ(ui::VKEY_POWER, event->key_code());
|
| + event = dispatched_event(3);
|
| + EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
|
| + EXPECT_EQ(ui::VKEY_POWER, event->key_code());
|
| +
|
| + ClearDispatchedEvents();
|
| + scoped_ptr<std::set<ui::DomCode>> allowed_keys(new std::set<ui::DomCode>);
|
| + allowed_keys->insert(ui::DomCode::POWER);
|
| + dev->SetAllowedKeys(allowed_keys.Pass());
|
| + dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
|
| +
|
| + ASSERT_EQ(2u, size());
|
| + event = dispatched_event(0);
|
| + EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
|
| + EXPECT_EQ(ui::VKEY_POWER, event->key_code());
|
| + event = dispatched_event(1);
|
| + EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
|
| + EXPECT_EQ(ui::VKEY_POWER, event->key_code());
|
| +
|
| + ClearDispatchedEvents();
|
| + dev->AllowAllKeys();
|
| + dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
|
| +
|
| + event = dispatched_event(0);
|
| + EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
|
| + EXPECT_EQ(ui::VKEY_A, event->key_code());
|
| + event = dispatched_event(1);
|
| + EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
|
| + EXPECT_EQ(ui::VKEY_A, event->key_code());
|
| + event = dispatched_event(2);
|
| + EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
|
| + EXPECT_EQ(ui::VKEY_POWER, event->key_code());
|
| + event = dispatched_event(3);
|
| + EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
|
| + EXPECT_EQ(ui::VKEY_POWER, event->key_code());
|
| +}
|
| +
|
| +// Test that if a non-allowed key is pressed when SetAllowedKeys() is called
|
| +// that the non-allowed key is released.
|
| +TEST_F(EventConverterEvdevImplTest, SetAllowedKeysBlockedKeyPressed) {
|
| + ui::MockEventConverterEvdevImpl* dev = device();
|
| +
|
| + struct input_event key_press[] = {
|
| + {{0, 0}, EV_KEY, KEY_A, 1},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + };
|
| + struct input_event key_release[] = {
|
| + {{0, 0}, EV_KEY, KEY_A, 0},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + };
|
| +
|
| + dev->ProcessEvents(key_press, arraysize(key_press));
|
| + ASSERT_EQ(1u, size());
|
| + ui::KeyEvent* event = dispatched_event(0);
|
| + EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
|
| +
|
| + // Block all key events. Calling SetAllowKeys() should dispatch a synthetic
|
| + // key release for VKEY_A.
|
| + ClearDispatchedEvents();
|
| + scoped_ptr<std::set<ui::DomCode>> allowed_keys(new std::set<ui::DomCode>);
|
| + dev->SetAllowedKeys(allowed_keys.Pass());
|
| + ASSERT_EQ(1u, size());
|
| + event = dispatched_event(0);
|
| + EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
|
| +
|
| + // The real key release should be dropped, whenever it comes.
|
| + ClearDispatchedEvents();
|
| + dev->ProcessEvents(key_release, arraysize(key_release));
|
| + ASSERT_EQ(0u, size());
|
| +}
|
|
|