focus_tracker_unittest.mm revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import <Cocoa/Cocoa.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/mac/scoped_nsobject.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import "ui/base/cocoa/focus_tracker.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#import "ui/gfx/test/ui_cocoa_test_helper.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FocusTrackerTest : public ui::CocoaTest { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::CocoaTest::SetUp(); 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<NSView> view( 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch [[NSView alloc] initWithFrame:NSZeroRect]); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) viewA_ = view.get(); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [[test_window() contentView] addSubview:viewA_]; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view.reset([[NSView alloc] initWithFrame:NSZeroRect]); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) viewB_ = view.get(); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [[test_window() contentView] addSubview:viewB_]; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSView* viewA_; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSView* viewB_; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FocusTrackerTest, SaveRestore) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSWindow* window = test_window(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE([window makeFirstResponder:viewA_]); 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<FocusTracker> tracker( 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [[FocusTracker alloc] initWithWindow:window]); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give focus to |viewB_|, then try and restore it to view1. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE([window makeFirstResponder:viewB_]); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE([tracker restoreFocusInWindow:window]); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(viewA_, [window firstResponder]); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FocusTrackerTest, SaveRestoreWithTextView) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Valgrind will complain if the text field has zero size. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSRect frame = NSMakeRect(0, 0, 100, 20); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSWindow* window = test_window(); 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<NSTextField> text( 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch [[NSTextField alloc] initWithFrame:frame]); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [[window contentView] addSubview:text]; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE([window makeFirstResponder:text]); 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<FocusTracker> tracker( 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch [[FocusTracker alloc] initWithWindow:window]); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give focus to |viewB_|, then try and restore it to the text field. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE([window makeFirstResponder:viewB_]); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE([tracker restoreFocusInWindow:window]); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE([[window firstResponder] isKindOfClass:[NSTextView class]]); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FocusTrackerTest, DontRestoreToViewNotInWindow) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSWindow* window = test_window(); 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<NSView> viewC( 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch [[NSView alloc] initWithFrame:NSZeroRect]); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [[window contentView] addSubview:viewC]; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE([window makeFirstResponder:viewC]); 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<FocusTracker> tracker( 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [[FocusTracker alloc] initWithWindow:window]); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give focus to |viewB_|, then remove viewC from the hierarchy and try 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to restore focus. The restore should fail. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE([window makeFirstResponder:viewB_]); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [viewC removeFromSuperview]; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE([tracker restoreFocusInWindow:window]); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FocusTrackerTest, DontRestoreFocusToViewInDifferentWindow) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSWindow* window = test_window(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE([window makeFirstResponder:viewA_]); 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<FocusTracker> tracker( 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [[FocusTracker alloc] initWithWindow:window]); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give focus to |viewB_|, then try and restore focus in a different 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window. It is ok to pass a nil NSWindow here because we only use 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it for direct comparison. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE([window makeFirstResponder:viewB_]); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE([tracker restoreFocusInWindow:nil]); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 94