// Copyright (c) 2011 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. #import <Cocoa/Cocoa.h> #include "base/memory/scoped_nsobject.h" #import "chrome/browser/ui/cocoa/cocoa_test_helper.h" #import "chrome/browser/ui/cocoa/focus_tracker.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" namespace { class FocusTrackerTest : public CocoaTest { public: virtual void SetUp() { CocoaTest::SetUp(); scoped_nsobject<NSView> view([[NSView alloc] initWithFrame:NSZeroRect]); viewA_ = view.get(); [[test_window() contentView] addSubview:viewA_]; view.reset([[NSView alloc] initWithFrame:NSZeroRect]); viewB_ = view.get(); [[test_window() contentView] addSubview:viewB_]; } protected: NSView* viewA_; NSView* viewB_; }; TEST_F(FocusTrackerTest, SaveRestore) { NSWindow* window = test_window(); ASSERT_TRUE([window makeFirstResponder:viewA_]); scoped_nsobject<FocusTracker> tracker( [[FocusTracker alloc] initWithWindow:window]); // Give focus to |viewB_|, then try and restore it to view1. ASSERT_TRUE([window makeFirstResponder:viewB_]); EXPECT_TRUE([tracker restoreFocusInWindow:window]); EXPECT_EQ(viewA_, [window firstResponder]); } TEST_F(FocusTrackerTest, SaveRestoreWithTextView) { // Valgrind will complain if the text field has zero size. NSRect frame = NSMakeRect(0, 0, 100, 20); NSWindow* window = test_window(); scoped_nsobject<NSTextField> text([[NSTextField alloc] initWithFrame:frame]); [[window contentView] addSubview:text]; ASSERT_TRUE([window makeFirstResponder:text]); scoped_nsobject<FocusTracker> tracker([[FocusTracker alloc] initWithWindow:window]); // Give focus to |viewB_|, then try and restore it to the text field. ASSERT_TRUE([window makeFirstResponder:viewB_]); EXPECT_TRUE([tracker restoreFocusInWindow:window]); EXPECT_TRUE([[window firstResponder] isKindOfClass:[NSTextView class]]); } TEST_F(FocusTrackerTest, DontRestoreToViewNotInWindow) { NSWindow* window = test_window(); scoped_nsobject<NSView> viewC([[NSView alloc] initWithFrame:NSZeroRect]); [[window contentView] addSubview:viewC]; ASSERT_TRUE([window makeFirstResponder:viewC]); scoped_nsobject<FocusTracker> tracker( [[FocusTracker alloc] initWithWindow:window]); // Give focus to |viewB_|, then remove viewC from the hierarchy and try // to restore focus. The restore should fail. ASSERT_TRUE([window makeFirstResponder:viewB_]); [viewC removeFromSuperview]; EXPECT_FALSE([tracker restoreFocusInWindow:window]); } TEST_F(FocusTrackerTest, DontRestoreFocusToViewInDifferentWindow) { NSWindow* window = test_window(); ASSERT_TRUE([window makeFirstResponder:viewA_]); scoped_nsobject<FocusTracker> tracker( [[FocusTracker alloc] initWithWindow:window]); // Give focus to |viewB_|, then try and restore focus in a different // window. It is ok to pass a nil NSWindow here because we only use // it for direct comparison. ASSERT_TRUE([window makeFirstResponder:viewB_]); EXPECT_FALSE([tracker restoreFocusInWindow:nil]); } } // namespace