1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
8 #include "base/strings/utf_string_conversions.h"
9 #include "ui/base/accelerators/accelerator.h"
10 #include "ui/events/keycodes/keyboard_codes.h"
11 #include "ui/views/accessible_pane_view.h"
12 #include "ui/views/controls/button/label_button.h"
13 #include "ui/views/controls/textfield/textfield.h"
14 #include "ui/views/focus/focus_manager_factory.h"
15 #include "ui/views/focus/focus_manager_test.h"
16 #include "ui/views/focus/widget_focus_manager.h"
17 #include "ui/views/widget/widget.h"
20 #include "ui/aura/client/focus_client.h"
21 #include "ui/aura/window.h"
26 void FocusNativeView(gfx::NativeView view) {
28 aura::client::GetFocusClient(view)->FocusWindow(view);
36 enum FocusTestEventType {
41 struct FocusTestEvent {
42 FocusTestEvent(FocusTestEventType type, int view_id)
47 FocusTestEventType type;
51 class SimpleTestView : public View {
53 SimpleTestView(std::vector<FocusTestEvent>* event_list, int view_id)
54 : event_list_(event_list) {
59 virtual void OnFocus() OVERRIDE {
60 event_list_->push_back(FocusTestEvent(ON_FOCUS, id()));
63 virtual void OnBlur() OVERRIDE {
64 event_list_->push_back(FocusTestEvent(ON_BLUR, id()));
68 std::vector<FocusTestEvent>* event_list_;
71 // Tests that the appropriate Focus related methods are called when a View
73 TEST_F(FocusManagerTest, ViewFocusCallbacks) {
74 std::vector<FocusTestEvent> event_list;
75 const int kView1ID = 1;
76 const int kView2ID = 2;
78 SimpleTestView* view1 = new SimpleTestView(&event_list, kView1ID);
79 SimpleTestView* view2 = new SimpleTestView(&event_list, kView2ID);
80 GetContentsView()->AddChildView(view1);
81 GetContentsView()->AddChildView(view2);
83 view1->RequestFocus();
84 ASSERT_EQ(1, static_cast<int>(event_list.size()));
85 EXPECT_EQ(ON_FOCUS, event_list[0].type);
86 EXPECT_EQ(kView1ID, event_list[0].view_id);
89 view2->RequestFocus();
90 ASSERT_EQ(2, static_cast<int>(event_list.size()));
91 EXPECT_EQ(ON_BLUR, event_list[0].type);
92 EXPECT_EQ(kView1ID, event_list[0].view_id);
93 EXPECT_EQ(ON_FOCUS, event_list[1].type);
94 EXPECT_EQ(kView2ID, event_list[1].view_id);
97 GetFocusManager()->ClearFocus();
98 ASSERT_EQ(1, static_cast<int>(event_list.size()));
99 EXPECT_EQ(ON_BLUR, event_list[0].type);
100 EXPECT_EQ(kView2ID, event_list[0].view_id);
103 TEST_F(FocusManagerTest, FocusChangeListener) {
104 View* view1 = new View();
105 view1->SetFocusable(true);
106 View* view2 = new View();
107 view2->SetFocusable(true);
108 GetContentsView()->AddChildView(view1);
109 GetContentsView()->AddChildView(view2);
111 TestFocusChangeListener listener;
112 AddFocusChangeListener(&listener);
114 // Required for VS2010: http://connect.microsoft.com/VisualStudio/feedback/details/520043/error-converting-from-null-to-a-pointer-type-in-std-pair
115 views::View* null_view = NULL;
117 view1->RequestFocus();
118 ASSERT_EQ(1, static_cast<int>(listener.focus_changes().size()));
119 EXPECT_TRUE(listener.focus_changes()[0] == ViewPair(null_view, view1));
120 listener.ClearFocusChanges();
122 view2->RequestFocus();
123 ASSERT_EQ(1, static_cast<int>(listener.focus_changes().size()));
124 EXPECT_TRUE(listener.focus_changes()[0] == ViewPair(view1, view2));
125 listener.ClearFocusChanges();
127 GetFocusManager()->ClearFocus();
128 ASSERT_EQ(1, static_cast<int>(listener.focus_changes().size()));
129 EXPECT_TRUE(listener.focus_changes()[0] == ViewPair(view2, null_view));
132 TEST_F(FocusManagerTest, WidgetFocusChangeListener) {
133 TestWidgetFocusChangeListener widget_listener;
134 AddWidgetFocusChangeListener(&widget_listener);
136 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
137 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
138 params.bounds = gfx::Rect(10, 10, 100, 100);
139 params.parent = GetWidget()->GetNativeView();
141 scoped_ptr<Widget> widget1(new Widget);
142 widget1->Init(params);
145 scoped_ptr<Widget> widget2(new Widget);
146 widget2->Init(params);
149 widget_listener.ClearFocusChanges();
150 gfx::NativeView native_view1 = widget1->GetNativeView();
151 FocusNativeView(native_view1);
152 ASSERT_EQ(2, static_cast<int>(widget_listener.focus_changes().size()));
153 EXPECT_EQ(native_view1, widget_listener.focus_changes()[0].second);
154 EXPECT_EQ(native_view1, widget_listener.focus_changes()[1].second);
156 widget_listener.ClearFocusChanges();
157 gfx::NativeView native_view2 = widget2->GetNativeView();
158 FocusNativeView(native_view2);
159 ASSERT_EQ(2, static_cast<int>(widget_listener.focus_changes().size()));
160 EXPECT_EQ(NativeViewPair(native_view1, native_view2),
161 widget_listener.focus_changes()[0]);
162 EXPECT_EQ(NativeViewPair(native_view1, native_view2),
163 widget_listener.focus_changes()[1]);
166 // Counts accelerator calls.
167 class TestAcceleratorTarget : public ui::AcceleratorTarget {
169 explicit TestAcceleratorTarget(bool process_accelerator)
170 : accelerator_count_(0),
171 process_accelerator_(process_accelerator),
172 can_handle_accelerators_(true) {}
174 virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE {
175 ++accelerator_count_;
176 return process_accelerator_;
179 virtual bool CanHandleAccelerators() const OVERRIDE {
180 return can_handle_accelerators_;
183 int accelerator_count() const { return accelerator_count_; }
185 void set_can_handle_accelerators(bool can_handle_accelerators) {
186 can_handle_accelerators_ = can_handle_accelerators;
190 int accelerator_count_; // number of times that the accelerator is activated
191 bool process_accelerator_; // return value of AcceleratorPressed
192 bool can_handle_accelerators_; // return value of CanHandleAccelerators
194 DISALLOW_COPY_AND_ASSIGN(TestAcceleratorTarget);
197 TEST_F(FocusManagerTest, CallsNormalAcceleratorTarget) {
198 FocusManager* focus_manager = GetFocusManager();
199 ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE);
200 ui::Accelerator escape_accelerator(ui::VKEY_ESCAPE, ui::EF_NONE);
202 TestAcceleratorTarget return_target(true);
203 TestAcceleratorTarget escape_target(true);
204 EXPECT_EQ(return_target.accelerator_count(), 0);
205 EXPECT_EQ(escape_target.accelerator_count(), 0);
207 focus_manager->GetCurrentTargetForAccelerator(return_accelerator));
209 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator));
212 focus_manager->RegisterAccelerator(return_accelerator,
213 ui::AcceleratorManager::kNormalPriority,
215 focus_manager->RegisterAccelerator(escape_accelerator,
216 ui::AcceleratorManager::kNormalPriority,
219 // Checks if the correct target is registered.
220 EXPECT_EQ(&return_target,
221 focus_manager->GetCurrentTargetForAccelerator(return_accelerator));
222 EXPECT_EQ(&escape_target,
223 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator));
225 // Hitting the return key.
226 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator));
227 EXPECT_EQ(return_target.accelerator_count(), 1);
228 EXPECT_EQ(escape_target.accelerator_count(), 0);
230 // Hitting the escape key.
231 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator));
232 EXPECT_EQ(return_target.accelerator_count(), 1);
233 EXPECT_EQ(escape_target.accelerator_count(), 1);
235 // Register another target for the return key.
236 TestAcceleratorTarget return_target2(true);
237 EXPECT_EQ(return_target2.accelerator_count(), 0);
238 focus_manager->RegisterAccelerator(return_accelerator,
239 ui::AcceleratorManager::kNormalPriority,
241 EXPECT_EQ(&return_target2,
242 focus_manager->GetCurrentTargetForAccelerator(return_accelerator));
244 // Hitting the return key; return_target2 has the priority.
245 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator));
246 EXPECT_EQ(return_target.accelerator_count(), 1);
247 EXPECT_EQ(return_target2.accelerator_count(), 1);
249 // Register a target that does not process the accelerator event.
250 TestAcceleratorTarget return_target3(false);
251 EXPECT_EQ(return_target3.accelerator_count(), 0);
252 focus_manager->RegisterAccelerator(return_accelerator,
253 ui::AcceleratorManager::kNormalPriority,
255 EXPECT_EQ(&return_target3,
256 focus_manager->GetCurrentTargetForAccelerator(return_accelerator));
258 // Hitting the return key.
259 // Since the event handler of return_target3 returns false, return_target2
260 // should be called too.
261 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator));
262 EXPECT_EQ(return_target.accelerator_count(), 1);
263 EXPECT_EQ(return_target2.accelerator_count(), 2);
264 EXPECT_EQ(return_target3.accelerator_count(), 1);
266 // Unregister return_target2.
267 focus_manager->UnregisterAccelerator(return_accelerator, &return_target2);
268 EXPECT_EQ(&return_target3,
269 focus_manager->GetCurrentTargetForAccelerator(return_accelerator));
271 // Hitting the return key. return_target3 and return_target should be called.
272 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator));
273 EXPECT_EQ(return_target.accelerator_count(), 2);
274 EXPECT_EQ(return_target2.accelerator_count(), 2);
275 EXPECT_EQ(return_target3.accelerator_count(), 2);
277 // Unregister targets.
278 focus_manager->UnregisterAccelerator(return_accelerator, &return_target);
279 focus_manager->UnregisterAccelerator(return_accelerator, &return_target3);
280 focus_manager->UnregisterAccelerator(escape_accelerator, &escape_target);
282 // Now there is no target registered.
284 focus_manager->GetCurrentTargetForAccelerator(return_accelerator));
286 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator));
288 // Hitting the return key and the escape key. Nothing should happen.
289 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator));
290 EXPECT_EQ(return_target.accelerator_count(), 2);
291 EXPECT_EQ(return_target2.accelerator_count(), 2);
292 EXPECT_EQ(return_target3.accelerator_count(), 2);
293 EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator));
294 EXPECT_EQ(escape_target.accelerator_count(), 1);
297 TEST_F(FocusManagerTest, HighPriorityHandlers) {
298 FocusManager* focus_manager = GetFocusManager();
299 ui::Accelerator escape_accelerator(ui::VKEY_ESCAPE, ui::EF_NONE);
301 TestAcceleratorTarget escape_target_high(true);
302 TestAcceleratorTarget escape_target_normal(true);
303 EXPECT_EQ(escape_target_high.accelerator_count(), 0);
304 EXPECT_EQ(escape_target_normal.accelerator_count(), 0);
306 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator));
307 EXPECT_FALSE(focus_manager->HasPriorityHandler(escape_accelerator));
309 // Register high priority target.
310 focus_manager->RegisterAccelerator(escape_accelerator,
311 ui::AcceleratorManager::kHighPriority,
312 &escape_target_high);
313 EXPECT_EQ(&escape_target_high,
314 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator));
315 EXPECT_TRUE(focus_manager->HasPriorityHandler(escape_accelerator));
317 // Hit the escape key.
318 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator));
319 EXPECT_EQ(escape_target_high.accelerator_count(), 1);
320 EXPECT_EQ(escape_target_normal.accelerator_count(), 0);
322 // Add a normal priority target and make sure it doesn't see the key.
323 focus_manager->RegisterAccelerator(escape_accelerator,
324 ui::AcceleratorManager::kNormalPriority,
325 &escape_target_normal);
327 // Checks if the correct target is registered (same as before, the high
329 EXPECT_EQ(&escape_target_high,
330 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator));
331 EXPECT_TRUE(focus_manager->HasPriorityHandler(escape_accelerator));
333 // Hit the escape key.
334 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator));
335 EXPECT_EQ(escape_target_high.accelerator_count(), 2);
336 EXPECT_EQ(escape_target_normal.accelerator_count(), 0);
338 // Unregister the high priority accelerator.
339 focus_manager->UnregisterAccelerator(escape_accelerator, &escape_target_high);
340 EXPECT_EQ(&escape_target_normal,
341 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator));
342 EXPECT_FALSE(focus_manager->HasPriorityHandler(escape_accelerator));
344 // Hit the escape key.
345 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator));
346 EXPECT_EQ(escape_target_high.accelerator_count(), 2);
347 EXPECT_EQ(escape_target_normal.accelerator_count(), 1);
349 // Add the high priority target back and make sure it starts seeing the key.
350 focus_manager->RegisterAccelerator(escape_accelerator,
351 ui::AcceleratorManager::kHighPriority,
352 &escape_target_high);
353 EXPECT_EQ(&escape_target_high,
354 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator));
355 EXPECT_TRUE(focus_manager->HasPriorityHandler(escape_accelerator));
357 // Hit the escape key.
358 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator));
359 EXPECT_EQ(escape_target_high.accelerator_count(), 3);
360 EXPECT_EQ(escape_target_normal.accelerator_count(), 1);
362 // Unregister the normal priority accelerator.
363 focus_manager->UnregisterAccelerator(
364 escape_accelerator, &escape_target_normal);
365 EXPECT_EQ(&escape_target_high,
366 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator));
367 EXPECT_TRUE(focus_manager->HasPriorityHandler(escape_accelerator));
369 // Hit the escape key.
370 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator));
371 EXPECT_EQ(escape_target_high.accelerator_count(), 4);
372 EXPECT_EQ(escape_target_normal.accelerator_count(), 1);
374 // Unregister the high priority accelerator.
375 focus_manager->UnregisterAccelerator(escape_accelerator, &escape_target_high);
377 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator));
378 EXPECT_FALSE(focus_manager->HasPriorityHandler(escape_accelerator));
380 // Hit the escape key (no change, no targets registered).
381 EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator));
382 EXPECT_EQ(escape_target_high.accelerator_count(), 4);
383 EXPECT_EQ(escape_target_normal.accelerator_count(), 1);
386 TEST_F(FocusManagerTest, CallsEnabledAcceleratorTargetsOnly) {
387 FocusManager* focus_manager = GetFocusManager();
388 ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE);
390 TestAcceleratorTarget return_target1(true);
391 TestAcceleratorTarget return_target2(true);
393 focus_manager->RegisterAccelerator(return_accelerator,
394 ui::AcceleratorManager::kNormalPriority,
396 focus_manager->RegisterAccelerator(return_accelerator,
397 ui::AcceleratorManager::kNormalPriority,
399 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator));
400 EXPECT_EQ(0, return_target1.accelerator_count());
401 EXPECT_EQ(1, return_target2.accelerator_count());
403 // If CanHandleAccelerators() return false, FocusManager shouldn't call
404 // AcceleratorPressed().
405 return_target2.set_can_handle_accelerators(false);
406 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator));
407 EXPECT_EQ(1, return_target1.accelerator_count());
408 EXPECT_EQ(1, return_target2.accelerator_count());
410 // If no accelerator targets are enabled, ProcessAccelerator() should fail.
411 return_target1.set_can_handle_accelerators(false);
412 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator));
413 EXPECT_EQ(1, return_target1.accelerator_count());
414 EXPECT_EQ(1, return_target2.accelerator_count());
416 // Enabling the target again causes the accelerators to be processed again.
417 return_target1.set_can_handle_accelerators(true);
418 return_target2.set_can_handle_accelerators(true);
419 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator));
420 EXPECT_EQ(1, return_target1.accelerator_count());
421 EXPECT_EQ(2, return_target2.accelerator_count());
424 // Unregisters itself when its accelerator is invoked.
425 class SelfUnregisteringAcceleratorTarget : public ui::AcceleratorTarget {
427 SelfUnregisteringAcceleratorTarget(ui::Accelerator accelerator,
428 FocusManager* focus_manager)
429 : accelerator_(accelerator),
430 focus_manager_(focus_manager),
431 accelerator_count_(0) {
434 virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE {
435 ++accelerator_count_;
436 focus_manager_->UnregisterAccelerator(accelerator, this);
440 virtual bool CanHandleAccelerators() const OVERRIDE {
444 int accelerator_count() const { return accelerator_count_; }
447 ui::Accelerator accelerator_;
448 FocusManager* focus_manager_;
449 int accelerator_count_;
451 DISALLOW_COPY_AND_ASSIGN(SelfUnregisteringAcceleratorTarget);
454 TEST_F(FocusManagerTest, CallsSelfDeletingAcceleratorTarget) {
455 FocusManager* focus_manager = GetFocusManager();
456 ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE);
457 SelfUnregisteringAcceleratorTarget target(return_accelerator, focus_manager);
458 EXPECT_EQ(target.accelerator_count(), 0);
460 focus_manager->GetCurrentTargetForAccelerator(return_accelerator));
462 // Register the target.
463 focus_manager->RegisterAccelerator(return_accelerator,
464 ui::AcceleratorManager::kNormalPriority,
467 focus_manager->GetCurrentTargetForAccelerator(return_accelerator));
469 // Hitting the return key. The target will be unregistered.
470 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator));
471 EXPECT_EQ(target.accelerator_count(), 1);
473 focus_manager->GetCurrentTargetForAccelerator(return_accelerator));
475 // Hitting the return key again; nothing should happen.
476 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator));
477 EXPECT_EQ(target.accelerator_count(), 1);
480 class FocusManagerDtorTest : public FocusManagerTest {
482 typedef std::vector<std::string> DtorTrackVector;
484 class FocusManagerDtorTracked : public FocusManager {
486 FocusManagerDtorTracked(Widget* widget, DtorTrackVector* dtor_tracker)
487 : FocusManager(widget, NULL /* delegate */),
488 dtor_tracker_(dtor_tracker) {
491 virtual ~FocusManagerDtorTracked() {
492 dtor_tracker_->push_back("FocusManagerDtorTracked");
495 DtorTrackVector* dtor_tracker_;
498 DISALLOW_COPY_AND_ASSIGN(FocusManagerDtorTracked);
501 class TestFocusManagerFactory : public FocusManagerFactory {
503 explicit TestFocusManagerFactory(DtorTrackVector* dtor_tracker)
504 : dtor_tracker_(dtor_tracker) {
507 virtual FocusManager* CreateFocusManager(Widget* widget,
508 bool desktop_widget) OVERRIDE {
509 return new FocusManagerDtorTracked(widget, dtor_tracker_);
513 DtorTrackVector* dtor_tracker_;
514 DISALLOW_COPY_AND_ASSIGN(TestFocusManagerFactory);
517 class LabelButtonDtorTracked : public LabelButton {
519 LabelButtonDtorTracked(const base::string16& text,
520 DtorTrackVector* dtor_tracker)
521 : LabelButton(NULL, text),
522 dtor_tracker_(dtor_tracker) {
523 SetStyle(STYLE_BUTTON);
525 virtual ~LabelButtonDtorTracked() {
526 dtor_tracker_->push_back("LabelButtonDtorTracked");
529 DtorTrackVector* dtor_tracker_;
532 class WindowDtorTracked : public Widget {
534 explicit WindowDtorTracked(DtorTrackVector* dtor_tracker)
535 : dtor_tracker_(dtor_tracker) {
538 virtual ~WindowDtorTracked() {
539 dtor_tracker_->push_back("WindowDtorTracked");
542 DtorTrackVector* dtor_tracker_;
545 virtual void SetUp() {
546 ViewsTestBase::SetUp();
547 FocusManagerFactory::Install(new TestFocusManagerFactory(&dtor_tracker_));
548 // Create WindowDtorTracked that uses FocusManagerDtorTracked.
549 Widget* widget = new WindowDtorTracked(&dtor_tracker_);
550 Widget::InitParams params;
551 params.delegate = this;
552 params.bounds = gfx::Rect(0, 0, 100, 100);
553 widget->Init(params);
555 tracked_focus_manager_ =
556 static_cast<FocusManagerDtorTracked*>(GetFocusManager());
560 virtual void TearDown() {
561 FocusManagerFactory::Install(NULL);
562 ViewsTestBase::TearDown();
565 FocusManager* tracked_focus_manager_;
566 DtorTrackVector dtor_tracker_;
569 #if !defined(USE_AURA)
570 TEST_F(FocusManagerDtorTest, FocusManagerDestructedLast) {
571 // Setup views hierarchy.
572 GetContentsView()->AddChildView(new Textfield());
573 GetContentsView()->AddChildView(new LabelButtonDtorTracked(
574 base::ASCIIToUTF16("button"), &dtor_tracker_));
577 GetWidget()->Close();
578 RunPendingMessages();
580 // Test window, button and focus manager should all be destructed.
581 ASSERT_EQ(3, static_cast<int>(dtor_tracker_.size()));
583 // Focus manager should be the last one to destruct.
584 ASSERT_STREQ("FocusManagerDtorTracked", dtor_tracker_[2].c_str());
590 class FocusInAboutToRequestFocusFromTabTraversalView : public View {
592 FocusInAboutToRequestFocusFromTabTraversalView() : view_to_focus_(NULL) {}
594 void set_view_to_focus(View* view) { view_to_focus_ = view; }
596 virtual void AboutToRequestFocusFromTabTraversal(bool reverse) OVERRIDE {
597 view_to_focus_->RequestFocus();
601 views::View* view_to_focus_;
603 DISALLOW_COPY_AND_ASSIGN(FocusInAboutToRequestFocusFromTabTraversalView);
607 // Verifies a focus change done during a call to
608 // AboutToRequestFocusFromTabTraversal() is honored.
609 TEST_F(FocusManagerTest, FocusInAboutToRequestFocusFromTabTraversal) {
610 // Create 3 views focuses the 3 and advances to the second. The 2nd views
611 // implementation of AboutToRequestFocusFromTabTraversal() focuses the first.
612 views::View* v1 = new View;
613 v1->SetFocusable(true);
614 GetContentsView()->AddChildView(v1);
616 FocusInAboutToRequestFocusFromTabTraversalView* v2 =
617 new FocusInAboutToRequestFocusFromTabTraversalView;
618 v2->SetFocusable(true);
619 v2->set_view_to_focus(v1);
620 GetContentsView()->AddChildView(v2);
622 views::View* v3 = new View;
623 v3->SetFocusable(true);
624 GetContentsView()->AddChildView(v3);
627 GetWidget()->GetFocusManager()->AdvanceFocus(true);
628 EXPECT_TRUE(v1->HasFocus());
631 TEST_F(FocusManagerTest, RotatePaneFocus) {
632 views::AccessiblePaneView* pane1 = new AccessiblePaneView();
633 GetContentsView()->AddChildView(pane1);
635 views::View* v1 = new View;
636 v1->SetFocusable(true);
637 pane1->AddChildView(v1);
639 views::View* v2 = new View;
640 v2->SetFocusable(true);
641 pane1->AddChildView(v2);
643 views::AccessiblePaneView* pane2 = new AccessiblePaneView();
644 GetContentsView()->AddChildView(pane2);
646 views::View* v3 = new View;
647 v3->SetFocusable(true);
648 pane2->AddChildView(v3);
650 views::View* v4 = new View;
651 v4->SetFocusable(true);
652 pane2->AddChildView(v4);
654 std::vector<views::View*> panes;
655 panes.push_back(pane1);
656 panes.push_back(pane2);
657 SetAccessiblePanes(panes);
659 FocusManager* focus_manager = GetWidget()->GetFocusManager();
661 // Advance forwards. Focus should stay trapped within each pane.
662 EXPECT_TRUE(focus_manager->RotatePaneFocus(
663 FocusManager::kForward, FocusManager::kWrap));
664 EXPECT_EQ(v1, focus_manager->GetFocusedView());
665 focus_manager->AdvanceFocus(false);
666 EXPECT_EQ(v2, focus_manager->GetFocusedView());
667 focus_manager->AdvanceFocus(false);
668 EXPECT_EQ(v1, focus_manager->GetFocusedView());
670 EXPECT_TRUE(focus_manager->RotatePaneFocus(
671 FocusManager::kForward, FocusManager::kWrap));
672 EXPECT_EQ(v3, focus_manager->GetFocusedView());
673 focus_manager->AdvanceFocus(false);
674 EXPECT_EQ(v4, focus_manager->GetFocusedView());
675 focus_manager->AdvanceFocus(false);
676 EXPECT_EQ(v3, focus_manager->GetFocusedView());
678 EXPECT_TRUE(focus_manager->RotatePaneFocus(
679 FocusManager::kForward, FocusManager::kWrap));
680 EXPECT_EQ(v1, focus_manager->GetFocusedView());
682 // Advance backwards.
683 EXPECT_TRUE(focus_manager->RotatePaneFocus(
684 FocusManager::kBackward, FocusManager::kWrap));
685 EXPECT_EQ(v3, focus_manager->GetFocusedView());
687 EXPECT_TRUE(focus_manager->RotatePaneFocus(
688 FocusManager::kBackward, FocusManager::kWrap));
689 EXPECT_EQ(v1, focus_manager->GetFocusedView());
691 // Advance without wrap. When it gets to the end of the list of
692 // panes, RotatePaneFocus should return false but the current
693 // focused view shouldn't change.
694 EXPECT_TRUE(focus_manager->RotatePaneFocus(
695 FocusManager::kForward, FocusManager::kNoWrap));
696 EXPECT_EQ(v3, focus_manager->GetFocusedView());
698 EXPECT_FALSE(focus_manager->RotatePaneFocus(
699 FocusManager::kForward, FocusManager::kNoWrap));
700 EXPECT_EQ(v3, focus_manager->GetFocusedView());
703 // Verifies the stored focus view tracks the focused view.
704 TEST_F(FocusManagerTest, ImplicitlyStoresFocus) {
705 views::View* v1 = new View;
706 v1->SetFocusable(true);
707 GetContentsView()->AddChildView(v1);
709 views::View* v2 = new View;
710 v2->SetFocusable(true);
711 GetContentsView()->AddChildView(v2);
713 // Verify a focus request on |v1| implicitly updates the stored focus view.
715 EXPECT_TRUE(v1->HasFocus());
716 EXPECT_EQ(v1, GetWidget()->GetFocusManager()->GetStoredFocusView());
718 // Verify a focus request on |v2| implicitly updates the stored focus view.
720 EXPECT_TRUE(v2->HasFocus());
721 EXPECT_EQ(v2, GetWidget()->GetFocusManager()->GetStoredFocusView());
726 class FocusManagerArrowKeyTraversalTest : public FocusManagerTest {
728 FocusManagerArrowKeyTraversalTest()
729 : previous_arrow_key_traversal_enabled_(false) {
731 virtual ~FocusManagerArrowKeyTraversalTest() {}
733 // FocusManagerTest overrides:
734 virtual void SetUp() OVERRIDE {
735 FocusManagerTest::SetUp();
737 previous_arrow_key_traversal_enabled_ =
738 FocusManager::arrow_key_traversal_enabled();
740 virtual void TearDown() OVERRIDE {
741 FocusManager::set_arrow_key_traversal_enabled(
742 previous_arrow_key_traversal_enabled_);
743 FocusManagerTest::TearDown();
747 bool previous_arrow_key_traversal_enabled_;
749 DISALLOW_COPY_AND_ASSIGN(FocusManagerArrowKeyTraversalTest);
754 TEST_F(FocusManagerArrowKeyTraversalTest, ArrowKeyTraversal) {
755 FocusManager* focus_manager = GetFocusManager();
756 const ui::KeyEvent left_key(
757 ui::ET_KEY_PRESSED, ui::VKEY_LEFT, ui::EF_NONE, false);
758 const ui::KeyEvent right_key(
759 ui::ET_KEY_PRESSED, ui::VKEY_RIGHT, ui::EF_NONE, false);
760 const ui::KeyEvent up_key(
761 ui::ET_KEY_PRESSED, ui::VKEY_UP, ui::EF_NONE, false);
762 const ui::KeyEvent down_key(
763 ui::ET_KEY_PRESSED, ui::VKEY_DOWN, ui::EF_NONE, false);
765 std::vector<views::View*> v;
766 for (size_t i = 0; i < 2; ++i) {
767 views::View* view = new View;
768 view->SetFocusable(true);
769 GetContentsView()->AddChildView(view);
773 // Arrow key traversal is off and arrow key does not change focus.
774 FocusManager::set_arrow_key_traversal_enabled(false);
775 v[0]->RequestFocus();
776 focus_manager->OnKeyEvent(right_key);
777 EXPECT_EQ(v[0], focus_manager->GetFocusedView());
778 focus_manager->OnKeyEvent(left_key);
779 EXPECT_EQ(v[0], focus_manager->GetFocusedView());
780 focus_manager->OnKeyEvent(down_key);
781 EXPECT_EQ(v[0], focus_manager->GetFocusedView());
782 focus_manager->OnKeyEvent(up_key);
783 EXPECT_EQ(v[0], focus_manager->GetFocusedView());
785 // Turn on arrow key traversal.
786 FocusManager::set_arrow_key_traversal_enabled(true);
787 v[0]->RequestFocus();
788 focus_manager->OnKeyEvent(right_key);
789 EXPECT_EQ(v[1], focus_manager->GetFocusedView());
790 focus_manager->OnKeyEvent(left_key);
791 EXPECT_EQ(v[0], focus_manager->GetFocusedView());
792 focus_manager->OnKeyEvent(down_key);
793 EXPECT_EQ(v[1], focus_manager->GetFocusedView());
794 focus_manager->OnKeyEvent(up_key);
795 EXPECT_EQ(v[0], focus_manager->GetFocusedView());
798 TEST_F(FocusManagerTest, StoreFocusedView) {
800 GetFocusManager()->SetFocusedView(&view);
801 GetFocusManager()->StoreFocusedView(false);
802 EXPECT_TRUE(GetFocusManager()->RestoreFocusedView());
803 EXPECT_EQ(&view, GetFocusManager()->GetStoredFocusView());
805 // Repeat with |true|.
806 GetFocusManager()->SetFocusedView(&view);
807 GetFocusManager()->StoreFocusedView(true);
808 EXPECT_TRUE(GetFocusManager()->RestoreFocusedView());
809 EXPECT_EQ(&view, GetFocusManager()->GetStoredFocusView());
814 // Trivial WidgetDelegate implementation that allows setting return value of
815 // ShouldAdvanceFocusToTopLevelWidget().
816 class AdvanceFocusWidgetDelegate : public WidgetDelegate {
818 explicit AdvanceFocusWidgetDelegate(Widget* widget)
820 should_advance_focus_to_parent_(false) {}
821 virtual ~AdvanceFocusWidgetDelegate() {}
823 void set_should_advance_focus_to_parent(bool value) {
824 should_advance_focus_to_parent_ = value;
827 // WidgetDelegate overrides:
828 virtual bool ShouldAdvanceFocusToTopLevelWidget() const OVERRIDE {
829 return should_advance_focus_to_parent_;
831 virtual Widget* GetWidget() OVERRIDE { return widget_; }
832 virtual const Widget* GetWidget() const OVERRIDE { return widget_; }
836 bool should_advance_focus_to_parent_;
838 DISALLOW_COPY_AND_ASSIGN(AdvanceFocusWidgetDelegate);
843 // Verifies focus wrapping happens in the same widget.
844 TEST_F(FocusManagerTest, AdvanceFocusStaysInWidget) {
845 // Add |widget_view| as a child of the Widget.
846 View* widget_view = new View;
847 widget_view->SetFocusable(true);
848 widget_view->SetBounds(20, 0, 20, 20);
849 GetContentsView()->AddChildView(widget_view);
851 // Create a widget with two views, focus the second.
852 scoped_ptr<AdvanceFocusWidgetDelegate> delegate;
853 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
854 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
856 params.bounds = gfx::Rect(10, 10, 100, 100);
857 params.parent = GetWidget()->GetNativeView();
859 delegate.reset(new AdvanceFocusWidgetDelegate(&child_widget));
860 params.delegate = delegate.get();
861 child_widget.Init(params);
862 View* view1 = new View;
863 view1->SetFocusable(true);
864 view1->SetBounds(0, 0, 20, 20);
865 View* view2 = new View;
866 view2->SetFocusable(true);
867 view2->SetBounds(20, 0, 20, 20);
868 child_widget.client_view()->AddChildView(view1);
869 child_widget.client_view()->AddChildView(view2);
871 view2->RequestFocus();
872 EXPECT_EQ(view2, GetFocusManager()->GetFocusedView());
874 // Advance focus backwards, which should focus the first.
875 GetFocusManager()->AdvanceFocus(false);
876 EXPECT_EQ(view1, GetFocusManager()->GetFocusedView());
878 // Focus forward to |view2|.
879 GetFocusManager()->AdvanceFocus(true);
880 EXPECT_EQ(view2, GetFocusManager()->GetFocusedView());
882 // And forward again, wrapping back to |view1|.
883 GetFocusManager()->AdvanceFocus(true);
884 EXPECT_EQ(view1, GetFocusManager()->GetFocusedView());
886 // Allow focus to go to the parent, and focus backwards which should now move
887 // up |widget_view| (in the parent).
888 delegate->set_should_advance_focus_to_parent(true);
889 GetFocusManager()->AdvanceFocus(true);
890 EXPECT_EQ(widget_view, GetFocusManager()->GetFocusedView());