// Copyright (c) 2012 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 "chrome/browser/ui/cocoa/browser_window_controller.h" #import "base/mac/mac_util.h" #include "base/run_loop.h" #include "base/utf_string_conversions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/cocoa/browser_window_cocoa.h" #import "chrome/browser/ui/cocoa/browser/avatar_button_controller.h" #include "chrome/test/base/in_process_browser_test.h" #if !defined(MAC_OS_X_VERSION_10_7) || \ MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 enum { NSWindowDocumentVersionsButton = 6, NSWindowFullScreenButton }; #endif // MAC_OS_X_VERSION_10_7 typedef InProcessBrowserTest BrowserWindowControllerTest; void CreateProfileCallback(const base::Closure& quit_closure, Profile* profile, Profile::CreateStatus status) { EXPECT_TRUE(profile); EXPECT_NE(Profile::CREATE_STATUS_FAIL, status); // This will be called multiple times. Wait until the profile is initialized // fully to quit the loop. if (status == Profile::CREATE_STATUS_INITIALIZED) quit_closure.Run(); } // Tests that adding the first profile moves the Lion fullscreen button over // correctly. IN_PROC_BROWSER_TEST_F(BrowserWindowControllerTest, ProfileAvatarFullscreenButton) { if (base::mac::IsOSSnowLeopard()) return; // Initialize the locals. ProfileManager* profile_manager = g_browser_process->profile_manager(); ASSERT_TRUE(profile_manager); NSWindow* window = browser()->window()->GetNativeWindow(); ASSERT_TRUE(window); BrowserWindowController* controller = static_cast(browser()->window())->cocoa_controller(); // With only one profile, the fullscreen button should be visible, but the // avatar button should not. EXPECT_EQ(1u, profile_manager->GetNumberOfProfiles()); NSButton* fullscreen_button = [window standardWindowButton:NSWindowFullScreenButton]; EXPECT_TRUE(fullscreen_button); EXPECT_FALSE([fullscreen_button isHidden]); AvatarButtonController* avatar_controller = [controller avatarButtonController]; NSView* avatar = [avatar_controller view]; EXPECT_TRUE(avatar); EXPECT_TRUE([avatar isHidden]); // Create a profile asynchronously and run the loop until its creation // is complete. base::RunLoop run_loop; ProfileManager::CreateCallback create_callback = base::Bind(&CreateProfileCallback, run_loop.QuitClosure()); profile_manager->CreateProfileAsync( profile_manager->user_data_dir().Append("test"), create_callback, ASCIIToUTF16("avatar_test"), string16()); run_loop.Run(); // There should now be two profiles, and the avatar button and fullscreen // button are both visible. EXPECT_EQ(2u, profile_manager->GetNumberOfProfiles()); EXPECT_FALSE([avatar isHidden]); EXPECT_FALSE([fullscreen_button isHidden]); EXPECT_EQ([avatar window], [fullscreen_button window]); // Make sure the visual order of the buttons is correct and that they don't // overlap. NSRect avatar_frame = [avatar frame]; NSRect fullscreen_frame = [fullscreen_button frame]; EXPECT_LT(NSMinX(fullscreen_frame), NSMinX(avatar_frame)); EXPECT_LT(NSMaxX(fullscreen_frame), NSMinX(avatar_frame)); }