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

Side by Side Diff: views/focus/focus_manager_unittest.cc

Issue 159046: Implementing accelerators for Linux toolkit_views (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 4 months 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 | « views/focus/focus_manager.cc ('k') | views/view.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) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 // Disabled right now as this won't work on BuildBots right now as this test 5 // Disabled right now as this won't work on BuildBots right now as this test
6 // require the box it runs on to be unlocked (and no screen-savers). 6 // require the box it runs on to be unlocked (and no screen-savers).
7 // The test actually simulates mouse and key events, so if the screen is locked, 7 // The test actually simulates mouse and key events, so if the screen is locked,
8 // the events don't go to the Chrome window. 8 // the events don't go to the Chrome window.
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 10
11 #include "app/resource_bundle.h" 11 #include "app/resource_bundle.h"
12 #include "base/gfx/rect.h" 12 #include "base/gfx/rect.h"
13 #include "base/keyboard_codes.h"
13 #include "base/string_util.h" 14 #include "base/string_util.h"
14 #include "third_party/skia/include/core/SkColor.h" 15 #include "third_party/skia/include/core/SkColor.h"
15 #include "views/background.h" 16 #include "views/background.h"
16 #include "views/border.h" 17 #include "views/border.h"
17 #include "views/controls/button/checkbox.h" 18 #include "views/controls/button/checkbox.h"
18 #include "views/controls/button/native_button.h" 19 #include "views/controls/button/native_button.h"
19 #include "views/controls/button/radio_button.h" 20 #include "views/controls/button/radio_button.h"
20 #include "views/controls/combobox/combobox.h" 21 #include "views/controls/combobox/combobox.h"
21 #include "views/controls/combobox/native_combobox_wrapper.h" 22 #include "views/controls/combobox/native_combobox_wrapper.h"
22 #include "views/controls/label.h" 23 #include "views/controls/label.h"
23 #include "views/controls/link.h" 24 #include "views/controls/link.h"
25 #if defined(OS_WIN)
24 #include "views/controls/native_control.h" 26 #include "views/controls/native_control.h"
25 #include "views/controls/scroll_view.h" 27 #include "views/controls/scroll_view.h"
26 #include "views/controls/tabbed_pane/native_tabbed_pane_wrapper.h" 28 #include "views/controls/tabbed_pane/native_tabbed_pane_wrapper.h"
27 #include "views/controls/tabbed_pane/tabbed_pane.h" 29 #include "views/controls/tabbed_pane/tabbed_pane.h"
28 #include "views/controls/textfield/textfield.h" 30 #include "views/controls/textfield/textfield.h"
29 #include "views/widget/accelerator_handler.h" 31 #endif
32 #include "views/focus/accelerator_handler.h"
30 #include "views/widget/root_view.h" 33 #include "views/widget/root_view.h"
34 #include "views/window/window.h"
35 #include "views/window/window_delegate.h"
36
37 #if defined(OS_WIN)
31 #include "views/widget/widget_win.h" 38 #include "views/widget/widget_win.h"
32 #include "views/window/window_delegate.h"
33 #include "views/window/window_win.h" 39 #include "views/window/window_win.h"
40 #else
41 #include "views/window/window_gtk.h"
42 #endif
34 43
35 namespace views { 44 namespace views {
36 45
46 #if defined(OS_WIN)
37 static const int kWindowWidth = 600; 47 static const int kWindowWidth = 600;
38 static const int kWindowHeight = 500; 48 static const int kWindowHeight = 500;
39 49
40 static int count = 1; 50 static int count = 1;
41 51
42 static const int kTopCheckBoxID = count++; // 1 52 static const int kTopCheckBoxID = count++; // 1
43 static const int kLeftContainerID = count++; 53 static const int kLeftContainerID = count++;
44 static const int kAppleLabelID = count++; 54 static const int kAppleLabelID = count++;
45 static const int kAppleTextfieldID = count++; 55 static const int kAppleTextfieldID = count++;
46 static const int kOrangeLabelID = count++; // 5 56 static const int kOrangeLabelID = count++; // 5
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 static const int kStyleTextEditID = count++; 96 static const int kStyleTextEditID = count++;
87 97
88 static const int kSearchContainerID = count++; 98 static const int kSearchContainerID = count++;
89 static const int kSearchTextfieldID = count++; 99 static const int kSearchTextfieldID = count++;
90 static const int kSearchButtonID = count++; 100 static const int kSearchButtonID = count++;
91 static const int kHelpLinkID = count++; // 45 101 static const int kHelpLinkID = count++; // 45
92 102
93 static const int kThumbnailContainerID = count++; 103 static const int kThumbnailContainerID = count++;
94 static const int kThumbnailStarID = count++; 104 static const int kThumbnailStarID = count++;
95 static const int kThumbnailSuperStarID = count++; 105 static const int kThumbnailSuperStarID = count++;
106 #endif
96 107
97 class FocusManagerTest; 108 class FocusManagerTest : public testing::Test, public WindowDelegate {
109 public:
110 FocusManagerTest()
111 : window_(NULL),
112 content_view_(NULL),
113 focus_change_listener_(NULL) {
114 #if defined(OS_WIN)
115 OleInitialize(NULL);
116 #endif
117 }
98 118
119 ~FocusManagerTest() {
120 #if defined(OS_WIN)
121 OleUninitialize();
122 #endif
123 }
124
125 virtual void SetUp() {
126 window_ = Window::CreateChromeWindow(NULL, bounds(), this);
127 InitContentView();
128 window_->Show();
129 }
130
131 virtual void TearDown() {
132 if (focus_change_listener_)
133 GetFocusManager()->RemoveFocusChangeListener(focus_change_listener_);
134 // window_->CloseNow();
135 window_->Close();
136
137 // Flush the message loop to make Purify happy.
138 message_loop()->RunAllPending();
139 }
140
141 FocusManager* GetFocusManager() {
142 #if defined(OS_WIN)
143 return static_cast<WindowWin*>(window_)->GetFocusManager();
144 #elif defined(OS_LINUX)
145 return static_cast<WindowGtk*>(window_)->GetFocusManager();
146 #elif
147 NOTIMPLEMENTED();
148 #endif
149 }
150
151 // WindowDelegate Implementation.
152 virtual View* GetContentsView() {
153 if (!content_view_)
154 content_view_ = new View();
155 return content_view_;
156 }
157
158 virtual void InitContentView() {
159 }
160
161 protected:
162 virtual gfx::Rect bounds() {
163 return gfx::Rect(0, 0, 500, 500);
164 }
165
166 #if defined(OS_WIN)
167 // Mocks activating/deactivating the window.
168 void SimulateActivateWindow() {
169 ::SendMessage(window_->GetNativeWindow(), WM_ACTIVATE, WA_ACTIVE, NULL);
170 }
171 void SimulateDeactivateWindow() {
172 ::SendMessage(window_->GetNativeWindow(), WM_ACTIVATE, WA_INACTIVE, NULL);
173 }
174 #endif
175
176 MessageLoopForUI* message_loop() { return &message_loop_; }
177
178 Window* window_;
179 View* content_view_;
180
181 void AddFocusChangeListener(FocusChangeListener* listener) {
182 ASSERT_FALSE(focus_change_listener_);
183 focus_change_listener_ = listener;
184 GetFocusManager()->AddFocusChangeListener(listener);
185 }
186
187 private:
188 FocusChangeListener* focus_change_listener_;
189 MessageLoopForUI message_loop_;
190
191 DISALLOW_COPY_AND_ASSIGN(FocusManagerTest);
192 };
193
194 #if defined(OS_WIN)
99 // BorderView is a NativeControl that creates a tab control as its child and 195 // BorderView is a NativeControl that creates a tab control as its child and
100 // takes a View to add as the child of the tab control. The tab control is used 196 // takes a View to add as the child of the tab control. The tab control is used
101 // to give a nice background for the view. At some point we'll have a real 197 // to give a nice background for the view. At some point we'll have a real
102 // wrapper for TabControl, and this can be nuked in favor of it. 198 // wrapper for TabControl, and this can be nuked in favor of it.
103 // Taken from keyword_editor_view.cc. 199 // Taken from keyword_editor_view.cc.
104 // It is interesting in our test as it is a native control containing another 200 // It is interesting in our test as it is a native control containing another
105 // RootView. 201 // RootView.
106 class BorderView : public NativeControl { 202 class BorderView : public NativeControl {
107 public: 203 public:
108 explicit BorderView(View* child) : child_(child) { 204 explicit BorderView(View* child) : child_(child) {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 272
177 class DummyComboboxModel : public Combobox::Model { 273 class DummyComboboxModel : public Combobox::Model {
178 public: 274 public:
179 virtual int GetItemCount(Combobox* source) { return 10; } 275 virtual int GetItemCount(Combobox* source) { return 10; }
180 276
181 virtual std::wstring GetItemAt(Combobox* source, int index) { 277 virtual std::wstring GetItemAt(Combobox* source, int index) {
182 return L"Item " + IntToWString(index); 278 return L"Item " + IntToWString(index);
183 } 279 }
184 }; 280 };
185 281
186 class FocusManagerTest : public testing::Test, public WindowDelegate {
187 public:
188 FocusManagerTest()
189 : window_(NULL),
190 focus_change_listener_(NULL),
191 content_view_(NULL) {
192 OleInitialize(NULL);
193 }
194
195 ~FocusManagerTest() {
196 OleUninitialize();
197 }
198
199 virtual void SetUp() {
200 window_ = static_cast<WindowWin*>(
201 Window::CreateChromeWindow(NULL, bounds(), this));
202 InitContentView();
203 window_->Show();
204 }
205
206 virtual void TearDown() {
207 if (focus_change_listener_)
208 GetFocusManager()->RemoveFocusChangeListener(focus_change_listener_);
209 window_->CloseNow();
210
211 // Flush the message loop to make Purify happy.
212 message_loop()->RunAllPending();
213 }
214
215 FocusManager* GetFocusManager() {
216 return FocusManager::GetFocusManagerForNativeView(
217 window_->GetNativeWindow());
218 }
219
220 // WindowDelegate Implementation.
221 virtual View* GetContentsView() {
222 if (!content_view_)
223 content_view_ = new View();
224 return content_view_;
225 }
226
227 virtual void InitContentView() {
228 }
229
230 protected:
231 virtual gfx::Rect bounds() {
232 return gfx::Rect(0, 0, 500, 500);
233 }
234
235 // Mocks activating/deactivating the window.
236 void SimulateActivateWindow() {
237 ::SendMessage(window_->GetNativeWindow(), WM_ACTIVATE, WA_ACTIVE, NULL);
238 }
239 void SimulateDeactivateWindow() {
240 ::SendMessage(window_->GetNativeWindow(), WM_ACTIVATE, WA_INACTIVE, NULL);
241 }
242
243 MessageLoopForUI* message_loop() { return &message_loop_; }
244
245 WindowWin* window_;
246 View* content_view_;
247
248 void AddFocusChangeListener(FocusChangeListener* listener) {
249 ASSERT_FALSE(focus_change_listener_);
250 focus_change_listener_ = listener;
251 GetFocusManager()->AddFocusChangeListener(listener);
252 }
253
254 private:
255 FocusChangeListener* focus_change_listener_;
256 MessageLoopForUI message_loop_;
257
258 DISALLOW_COPY_AND_ASSIGN(FocusManagerTest);
259 };
260
261 class FocusTraversalTest : public FocusManagerTest { 282 class FocusTraversalTest : public FocusManagerTest {
262 public: 283 public:
263 ~FocusTraversalTest(); 284 ~FocusTraversalTest();
264 285
265 virtual void InitContentView(); 286 virtual void InitContentView();
266 287
267 protected: 288 protected:
268 FocusTraversalTest(); 289 FocusTraversalTest();
269 290
270 virtual gfx::Rect bounds() { 291 virtual gfx::Rect bounds() {
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after
968 for (int j = arraysize(kTraversalIDs) - 1; j >= 0; --j) { 989 for (int j = arraysize(kTraversalIDs) - 1; j >= 0; --j) {
969 GetFocusManager()->AdvanceFocus(true); 990 GetFocusManager()->AdvanceFocus(true);
970 focused_view = GetFocusManager()->GetFocusedView(); 991 focused_view = GetFocusManager()->GetFocusedView();
971 EXPECT_TRUE(focused_view != NULL); 992 EXPECT_TRUE(focused_view != NULL);
972 if (focused_view) 993 if (focused_view)
973 EXPECT_EQ(kTraversalIDs[j], focused_view->GetID()); 994 EXPECT_EQ(kTraversalIDs[j], focused_view->GetID());
974 } 995 }
975 } 996 }
976 } 997 }
977 998
999 #endif // WIN_OS
1000
978 // Counts accelerator calls. 1001 // Counts accelerator calls.
979 class TestAcceleratorTarget : public AcceleratorTarget { 1002 class TestAcceleratorTarget : public AcceleratorTarget {
980 public: 1003 public:
981 explicit TestAcceleratorTarget(bool process_accelerator) 1004 explicit TestAcceleratorTarget(bool process_accelerator)
982 : accelerator_count_(0), process_accelerator_(process_accelerator) {} 1005 : accelerator_count_(0), process_accelerator_(process_accelerator) {}
983 1006
984 virtual bool AcceleratorPressed(const Accelerator& accelerator) { 1007 virtual bool AcceleratorPressed(const Accelerator& accelerator) {
985 ++accelerator_count_; 1008 ++accelerator_count_;
986 return process_accelerator_; 1009 return process_accelerator_;
987 } 1010 }
988 1011
989 int accelerator_count() const { return accelerator_count_; } 1012 int accelerator_count() const { return accelerator_count_; }
990 1013
991 private: 1014 private:
992 int accelerator_count_; // number of times that the accelerator is activated 1015 int accelerator_count_; // number of times that the accelerator is activated
993 bool process_accelerator_; // return value of AcceleratorPressed 1016 bool process_accelerator_; // return value of AcceleratorPressed
994 1017
995 DISALLOW_COPY_AND_ASSIGN(TestAcceleratorTarget); 1018 DISALLOW_COPY_AND_ASSIGN(TestAcceleratorTarget);
996 }; 1019 };
997 1020
998 TEST_F(FocusManagerTest, CallsNormalAcceleratorTarget) { 1021 TEST_F(FocusManagerTest, CallsNormalAcceleratorTarget) {
999 FocusManager* focus_manager = GetFocusManager(); 1022 FocusManager* focus_manager = GetFocusManager();
1000 Accelerator return_accelerator(VK_RETURN, false, false, false); 1023 Accelerator return_accelerator(base::VKEY_RETURN, false, false, false);
1001 Accelerator escape_accelerator(VK_ESCAPE, false, false, false); 1024 Accelerator escape_accelerator(base::VKEY_ESCAPE, false, false, false);
1002 1025
1003 TestAcceleratorTarget return_target(true); 1026 TestAcceleratorTarget return_target(true);
1004 TestAcceleratorTarget escape_target(true); 1027 TestAcceleratorTarget escape_target(true);
1005 EXPECT_EQ(return_target.accelerator_count(), 0); 1028 EXPECT_EQ(return_target.accelerator_count(), 0);
1006 EXPECT_EQ(escape_target.accelerator_count(), 0); 1029 EXPECT_EQ(escape_target.accelerator_count(), 0);
1007 EXPECT_EQ(NULL, 1030 EXPECT_EQ(NULL,
1008 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); 1031 focus_manager->GetCurrentTargetForAccelerator(return_accelerator));
1009 EXPECT_EQ(NULL, 1032 EXPECT_EQ(NULL,
1010 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); 1033 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator));
1011 1034
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
1108 private: 1131 private:
1109 Accelerator accelerator_; 1132 Accelerator accelerator_;
1110 FocusManager* focus_manager_; 1133 FocusManager* focus_manager_;
1111 int accelerator_count_; 1134 int accelerator_count_;
1112 1135
1113 DISALLOW_COPY_AND_ASSIGN(SelfUnregisteringAcceleratorTarget); 1136 DISALLOW_COPY_AND_ASSIGN(SelfUnregisteringAcceleratorTarget);
1114 }; 1137 };
1115 1138
1116 TEST_F(FocusManagerTest, CallsSelfDeletingAcceleratorTarget) { 1139 TEST_F(FocusManagerTest, CallsSelfDeletingAcceleratorTarget) {
1117 FocusManager* focus_manager = GetFocusManager(); 1140 FocusManager* focus_manager = GetFocusManager();
1118 Accelerator return_accelerator(VK_RETURN, false, false, false); 1141 Accelerator return_accelerator(base::VKEY_RETURN, false, false, false);
1119 SelfUnregisteringAcceleratorTarget target(return_accelerator, focus_manager); 1142 SelfUnregisteringAcceleratorTarget target(return_accelerator, focus_manager);
1120 EXPECT_EQ(target.accelerator_count(), 0); 1143 EXPECT_EQ(target.accelerator_count(), 0);
1121 EXPECT_EQ(NULL, 1144 EXPECT_EQ(NULL,
1122 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); 1145 focus_manager->GetCurrentTargetForAccelerator(return_accelerator));
1123 1146
1124 // Register the target. 1147 // Register the target.
1125 focus_manager->RegisterAccelerator(return_accelerator, &target); 1148 focus_manager->RegisterAccelerator(return_accelerator, &target);
1126 EXPECT_EQ(&target, 1149 EXPECT_EQ(&target,
1127 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); 1150 focus_manager->GetCurrentTargetForAccelerator(return_accelerator));
1128 1151
1129 // Hitting the return key. The target will be unregistered. 1152 // Hitting the return key. The target will be unregistered.
1130 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); 1153 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator));
1131 EXPECT_EQ(target.accelerator_count(), 1); 1154 EXPECT_EQ(target.accelerator_count(), 1);
1132 EXPECT_EQ(NULL, 1155 EXPECT_EQ(NULL,
1133 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); 1156 focus_manager->GetCurrentTargetForAccelerator(return_accelerator));
1134 1157
1135 // Hitting the return key again; nothing should happen. 1158 // Hitting the return key again; nothing should happen.
1136 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 1159 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator));
1137 EXPECT_EQ(target.accelerator_count(), 1); 1160 EXPECT_EQ(target.accelerator_count(), 1);
1138 } 1161 }
1139 1162
1140 } // namespace views 1163 } // namespace views
OLDNEW
« no previous file with comments | « views/focus/focus_manager.cc ('k') | views/view.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698