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

Side by Side Diff: ui/aura_shell/shell_accelerator_controller_unittest.cc

Issue 8833012: Fix the issue of ShellAcceleratorFilter sending accelerators twice for character keys. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Win test failure Created 9 years 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | ui/aura_shell/shell_accelerator_filter.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/aura/event.h"
6 #include "ui/aura/root_window.h"
7 #include "ui/aura/test/test_window_delegate.h"
8 #include "ui/aura/test/test_windows.h"
5 #include "ui/aura_shell/shell.h" 9 #include "ui/aura_shell/shell.h"
6 #include "ui/aura_shell/shell_accelerator_controller.h" 10 #include "ui/aura_shell/shell_accelerator_controller.h"
11 #include "ui/aura_shell/shell_window_ids.h"
7 #include "ui/aura_shell/test/aura_shell_test_base.h" 12 #include "ui/aura_shell/test/aura_shell_test_base.h"
8 13
14 #if defined(USE_X11)
15 #include <X11/Xlib.h>
16 #include "ui/base/x/x11_util.h"
17 #endif
18
9 namespace aura_shell { 19 namespace aura_shell {
10 namespace test { 20 namespace test {
11 21
12 namespace { 22 namespace {
13 class TestTarget : public ui::AcceleratorTarget { 23 class TestTarget : public ui::AcceleratorTarget {
14 public: 24 public:
15 TestTarget() : accelerator_pressed_(false) {}; 25 TestTarget() : accelerator_pressed_count_(0) {};
16 virtual ~TestTarget() {}; 26 virtual ~TestTarget() {};
17 27
18 bool accelerator_pressed() const { 28 int accelerator_pressed_count() const {
19 return accelerator_pressed_; 29 return accelerator_pressed_count_;
20 } 30 }
21 31
22 void set_accelerator_pressed(bool accelerator_pressed) { 32 void set_accelerator_pressed_count(int accelerator_pressed_count) {
23 accelerator_pressed_ = accelerator_pressed; 33 accelerator_pressed_count_ = accelerator_pressed_count;
24 } 34 }
25 35
26 // Overridden from ui::AcceleratorTarget: 36 // Overridden from ui::AcceleratorTarget:
27 virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE; 37 virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE;
28 38
29 private: 39 private:
30 bool accelerator_pressed_; 40 int accelerator_pressed_count_;
31 }; 41 };
32 42
33 bool TestTarget::AcceleratorPressed(const ui::Accelerator& accelerator) { 43 bool TestTarget::AcceleratorPressed(const ui::Accelerator& accelerator) {
34 set_accelerator_pressed(true); 44 ++accelerator_pressed_count_;
35 return true; 45 return true;
36 } 46 }
37 47
38 } // namespace 48 } // namespace
39 49
40 class ShellAcceleratorControllerTest : public AuraShellTestBase { 50 class ShellAcceleratorControllerTest : public AuraShellTestBase {
41 public: 51 public:
42 ShellAcceleratorControllerTest() {}; 52 ShellAcceleratorControllerTest() {};
43 virtual ~ShellAcceleratorControllerTest() {}; 53 virtual ~ShellAcceleratorControllerTest() {};
44 54
45 static ShellAcceleratorController* GetController(); 55 static ShellAcceleratorController* GetController();
46
47 // testing::Test:
48 // virtual void SetUp() OVERRIDE;
49 // virtual void TearDown() OVERRIDE;
50 }; 56 };
51 57
52 ShellAcceleratorController* ShellAcceleratorControllerTest::GetController() { 58 ShellAcceleratorController* ShellAcceleratorControllerTest::GetController() {
53 return Shell::GetInstance()->accelerator_controller(); 59 return Shell::GetInstance()->accelerator_controller();
54 } 60 }
55 61
56 // void ShellAcceleratorControllerTest::SetUp() {
57 // AuraShellTestBase::SetUp();
58 // }
59
60 // void ShellAcceleratorControllerTest::TearDown() {
61 // AuraShellTestBase::TearDown();
62 // }
63
64 TEST_F(ShellAcceleratorControllerTest, Register) { 62 TEST_F(ShellAcceleratorControllerTest, Register) {
65 const ui::Accelerator accelerator_a(ui::VKEY_A, false, false, false); 63 const ui::Accelerator accelerator_a(ui::VKEY_A, false, false, false);
66 TestTarget target; 64 TestTarget target;
67 GetController()->Register(accelerator_a, &target); 65 GetController()->Register(accelerator_a, &target);
68 66
69 // The registered accelerator is processed. 67 // The registered accelerator is processed.
70 EXPECT_TRUE(GetController()->Process(accelerator_a)); 68 EXPECT_TRUE(GetController()->Process(accelerator_a));
71 EXPECT_TRUE(target.accelerator_pressed()); 69 EXPECT_EQ(1, target.accelerator_pressed_count());
72 } 70 }
73 71
74 TEST_F(ShellAcceleratorControllerTest, RegisterMultipleTarget) { 72 TEST_F(ShellAcceleratorControllerTest, RegisterMultipleTarget) {
75 const ui::Accelerator accelerator_a(ui::VKEY_A, false, false, false); 73 const ui::Accelerator accelerator_a(ui::VKEY_A, false, false, false);
76 TestTarget target1; 74 TestTarget target1;
77 GetController()->Register(accelerator_a, &target1); 75 GetController()->Register(accelerator_a, &target1);
78 TestTarget target2; 76 TestTarget target2;
79 GetController()->Register(accelerator_a, &target2); 77 GetController()->Register(accelerator_a, &target2);
80 78
81 // If multiple targets are registered with the same accelerator, the target 79 // If multiple targets are registered with the same accelerator, the target
82 // registered later processes the accelerator. 80 // registered later processes the accelerator.
83 EXPECT_TRUE(GetController()->Process(accelerator_a)); 81 EXPECT_TRUE(GetController()->Process(accelerator_a));
84 EXPECT_FALSE(target1.accelerator_pressed()); 82 EXPECT_EQ(0, target1.accelerator_pressed_count());
85 EXPECT_TRUE(target2.accelerator_pressed()); 83 EXPECT_EQ(1, target2.accelerator_pressed_count());
86 } 84 }
87 85
88 TEST_F(ShellAcceleratorControllerTest, Unregister) { 86 TEST_F(ShellAcceleratorControllerTest, Unregister) {
89 const ui::Accelerator accelerator_a(ui::VKEY_A, false, false, false); 87 const ui::Accelerator accelerator_a(ui::VKEY_A, false, false, false);
90 TestTarget target; 88 TestTarget target;
91 GetController()->Register(accelerator_a, &target); 89 GetController()->Register(accelerator_a, &target);
92 const ui::Accelerator accelerator_b(ui::VKEY_B, false, false, false); 90 const ui::Accelerator accelerator_b(ui::VKEY_B, false, false, false);
93 GetController()->Register(accelerator_b, &target); 91 GetController()->Register(accelerator_b, &target);
94 92
95 // Unregistering a different accelerator does not affect the other 93 // Unregistering a different accelerator does not affect the other
96 // accelerator. 94 // accelerator.
97 GetController()->Unregister(accelerator_b, &target); 95 GetController()->Unregister(accelerator_b, &target);
98 EXPECT_TRUE(GetController()->Process(accelerator_a)); 96 EXPECT_TRUE(GetController()->Process(accelerator_a));
99 EXPECT_TRUE(target.accelerator_pressed()); 97 EXPECT_EQ(1, target.accelerator_pressed_count());
100 98
101 // The unregistered accelerator is no longer processed. 99 // The unregistered accelerator is no longer processed.
102 target.set_accelerator_pressed(false); 100 target.set_accelerator_pressed_count(0);
103 GetController()->Unregister(accelerator_a, &target); 101 GetController()->Unregister(accelerator_a, &target);
104 EXPECT_FALSE(GetController()->Process(accelerator_a)); 102 EXPECT_FALSE(GetController()->Process(accelerator_a));
105 EXPECT_FALSE(target.accelerator_pressed()); 103 EXPECT_EQ(0, target.accelerator_pressed_count());
106 } 104 }
107 105
108 TEST_F(ShellAcceleratorControllerTest, UnregisterAll) { 106 TEST_F(ShellAcceleratorControllerTest, UnregisterAll) {
109 const ui::Accelerator accelerator_a(ui::VKEY_A, false, false, false); 107 const ui::Accelerator accelerator_a(ui::VKEY_A, false, false, false);
110 TestTarget target1; 108 TestTarget target1;
111 GetController()->Register(accelerator_a, &target1); 109 GetController()->Register(accelerator_a, &target1);
112 const ui::Accelerator accelerator_b(ui::VKEY_B, false, false, false); 110 const ui::Accelerator accelerator_b(ui::VKEY_B, false, false, false);
113 GetController()->Register(accelerator_b, &target1); 111 GetController()->Register(accelerator_b, &target1);
114 const ui::Accelerator accelerator_c(ui::VKEY_C, false, false, false); 112 const ui::Accelerator accelerator_c(ui::VKEY_C, false, false, false);
115 TestTarget target2; 113 TestTarget target2;
116 GetController()->Register(accelerator_c, &target2); 114 GetController()->Register(accelerator_c, &target2);
117 GetController()->UnregisterAll(&target1); 115 GetController()->UnregisterAll(&target1);
118 116
119 // All the accelerators registered for |target1| are no longer processed. 117 // All the accelerators registered for |target1| are no longer processed.
120 EXPECT_FALSE(GetController()->Process(accelerator_a)); 118 EXPECT_FALSE(GetController()->Process(accelerator_a));
121 EXPECT_FALSE(GetController()->Process(accelerator_b)); 119 EXPECT_FALSE(GetController()->Process(accelerator_b));
122 EXPECT_FALSE(target1.accelerator_pressed()); 120 EXPECT_EQ(0, target1.accelerator_pressed_count());
123 121
124 // UnregisterAll with a different target does not affect the other target. 122 // UnregisterAll with a different target does not affect the other target.
125 EXPECT_TRUE(GetController()->Process(accelerator_c)); 123 EXPECT_TRUE(GetController()->Process(accelerator_c));
126 EXPECT_TRUE(target2.accelerator_pressed()); 124 EXPECT_EQ(1, target2.accelerator_pressed_count());
127 } 125 }
128 126
129 TEST_F(ShellAcceleratorControllerTest, Process) { 127 TEST_F(ShellAcceleratorControllerTest, Process) {
130 const ui::Accelerator accelerator_a(ui::VKEY_A, false, false, false); 128 const ui::Accelerator accelerator_a(ui::VKEY_A, false, false, false);
131 TestTarget target1; 129 TestTarget target1;
132 GetController()->Register(accelerator_a, &target1); 130 GetController()->Register(accelerator_a, &target1);
133 131
134 // The registered accelerator is processed. 132 // The registered accelerator is processed.
135 EXPECT_TRUE(GetController()->Process(accelerator_a)); 133 EXPECT_TRUE(GetController()->Process(accelerator_a));
136 EXPECT_TRUE(target1.accelerator_pressed()); 134 EXPECT_EQ(1, target1.accelerator_pressed_count());
137 135
138 // The non-registered accelerator is not processed. 136 // The non-registered accelerator is not processed.
139 const ui::Accelerator accelerator_b(ui::VKEY_B, false, false, false); 137 const ui::Accelerator accelerator_b(ui::VKEY_B, false, false, false);
140 EXPECT_FALSE(GetController()->Process(accelerator_b)); 138 EXPECT_FALSE(GetController()->Process(accelerator_b));
141 } 139 }
142 140
141 #if defined(OS_WIN) || defined(USE_X11)
142 TEST_F(ShellAcceleratorControllerTest, ProcessOnce) {
143 // A focused window must exist for accelerators to be processed.
144 aura::Window* default_container =
145 aura_shell::Shell::GetInstance()->GetContainer(
146 internal::kShellWindowId_DefaultContainer);
147 aura::Window* window = aura::test::CreateTestWindowWithDelegate(
148 new aura::test::TestWindowDelegate,
149 -1,
150 gfx::Rect(),
151 default_container);
152 window->Activate();
153
154 const ui::Accelerator accelerator_a(ui::VKEY_A, false, false, false);
155 TestTarget target;
156 GetController()->Register(accelerator_a, &target);
157
158 // The accelerator is processed only once.
159 #if defined(OS_WIN)
160 MSG msg1 = { NULL, WM_KEYDOWN, ui::VKEY_A, 0 };
161 aura::KeyEvent key_event1(msg1, false);
162 EXPECT_TRUE(aura::RootWindow::GetInstance()->DispatchKeyEvent(&key_event1));
163
164 MSG msg2 = { NULL, WM_CHAR, L'A', 0 };
165 aura::KeyEvent key_event2(msg2, true);
166 EXPECT_FALSE(aura::RootWindow::GetInstance()->DispatchKeyEvent(&key_event2));
167
168 MSG msg3 = { NULL, WM_KEYUP, ui::VKEY_A, 0 };
169 aura::KeyEvent key_event3(msg3, false);
170 EXPECT_FALSE(aura::RootWindow::GetInstance()->DispatchKeyEvent(&key_event3));
171 #elif defined(USE_X11)
172 XEvent key_event;
173 ui::InitXKeyEventForTesting(ui::ET_KEY_PRESSED,
174 ui::VKEY_A,
175 0,
176 &key_event);
177 EXPECT_TRUE(aura::RootWindow::GetInstance()->GetDispatcher()->Dispatch(
178 &key_event));
179 #endif
180 EXPECT_EQ(1, target.accelerator_pressed_count());
181 }
182 #endif
183
143 TEST_F(ShellAcceleratorControllerTest, GlobalAccelerators) { 184 TEST_F(ShellAcceleratorControllerTest, GlobalAccelerators) {
144 // TODO(mazda): Uncomment the followings once they are implemented. 185 // TODO(mazda): Uncomment the followings once they are implemented.
145 // CycleBackward 186 // CycleBackward
146 // EXPECT_TRUE(GetController()->Process( 187 // EXPECT_TRUE(GetController()->Process(
147 // ui::Accelerator(ui::VKEY_TAB, true, false, true))); 188 // ui::Accelerator(ui::VKEY_TAB, true, false, true)));
148 // CycleForwrard 189 // CycleForwrard
149 // EXPECT_TRUE(GetController()->Process( 190 // EXPECT_TRUE(GetController()->Process(
150 // ui::Accelerator(ui::VKEY_TAB, false, false, true))); 191 // ui::Accelerator(ui::VKEY_TAB, false, false, true)));
151 // TakeScreenshot 192 // TakeScreenshot
152 // EXPECT_TRUE(GetController()->Process( 193 // EXPECT_TRUE(GetController()->Process(
153 // ui::Accelerator(ui::VKEY_F5, false, true, false))); 194 // ui::Accelerator(ui::VKEY_F5, false, true, false)));
154 // EXPECT_TRUE(GetController()->Process( 195 // EXPECT_TRUE(GetController()->Process(
155 // ui::Accelerator(ui::VKEY_PRINT, false, false, false))); 196 // ui::Accelerator(ui::VKEY_PRINT, false, false, false)));
156 #if !defined(NDEBUG) 197 #if !defined(NDEBUG)
157 // RotateScreen 198 // RotateScreen
158 EXPECT_TRUE(GetController()->Process( 199 EXPECT_TRUE(GetController()->Process(
159 ui::Accelerator(ui::VKEY_HOME, false, true, false))); 200 ui::Accelerator(ui::VKEY_HOME, false, true, false)));
160 #if !defined(OS_LINUX) 201 #if !defined(OS_LINUX)
161 // ToggleDesktopFullScreen (not implemented yet on Linux) 202 // ToggleDesktopFullScreen (not implemented yet on Linux)
162 EXPECT_TRUE(GetController()->Process( 203 EXPECT_TRUE(GetController()->Process(
163 ui::Accelerator(ui::VKEY_F11, false, true, false))); 204 ui::Accelerator(ui::VKEY_F11, false, true, false)));
164 #endif 205 #endif
165 #endif 206 #endif
166 } 207 }
167 208
168 } // namespace test 209 } // namespace test
169 } // namespace aura_shell 210 } // namespace aura_shell
OLDNEW
« no previous file with comments | « no previous file | ui/aura_shell/shell_accelerator_filter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698