1// Copyright (c) 2011 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. 4 5#import <Cocoa/Cocoa.h> 6 7#import "base/mac/scoped_nsobject.h" 8#include "base/strings/sys_string_conversions.h" 9#import "chrome/browser/app_controller_mac.h" 10#import "chrome/browser/chrome_browser_application_mac.h" 11#include "chrome/browser/profiles/profile.h" 12#import "chrome/browser/ui/cocoa/applescript/constants_applescript.h" 13#import "chrome/browser/ui/cocoa/applescript/error_applescript.h" 14#import "chrome/browser/ui/cocoa/applescript/tab_applescript.h" 15#import "chrome/browser/ui/cocoa/applescript/window_applescript.h" 16#include "chrome/test/base/in_process_browser_test.h" 17#include "testing/gtest/include/gtest/gtest.h" 18#import "testing/gtest_mac.h" 19#include "url/gurl.h" 20 21typedef InProcessBrowserTest WindowAppleScriptTest; 22 23// Create a window in default/normal mode. 24IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, DefaultCreation) { 25 base::scoped_nsobject<WindowAppleScript> aWindow( 26 [[WindowAppleScript alloc] init]); 27 EXPECT_TRUE(aWindow.get()); 28 NSString* mode = [aWindow.get() mode]; 29 EXPECT_NSEQ(AppleScript::kNormalWindowMode, 30 mode); 31} 32 33// Create a window with a |NULL profile|. 34IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, CreationWithNoProfile) { 35 base::scoped_nsobject<WindowAppleScript> aWindow( 36 [[WindowAppleScript alloc] initWithProfile:NULL]); 37 EXPECT_FALSE(aWindow.get()); 38} 39 40// Create a window with a particular profile. 41IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, CreationWithProfile) { 42 Profile* lastProfile = [[NSApp delegate] lastProfile]; 43 base::scoped_nsobject<WindowAppleScript> aWindow( 44 [[WindowAppleScript alloc] initWithProfile:lastProfile]); 45 EXPECT_TRUE(aWindow.get()); 46 EXPECT_TRUE([aWindow.get() uniqueID]); 47} 48 49// Create a window with no |Browser*|. 50IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, CreationWithNoBrowser) { 51 base::scoped_nsobject<WindowAppleScript> aWindow( 52 [[WindowAppleScript alloc] initWithBrowser:NULL]); 53 EXPECT_FALSE(aWindow.get()); 54} 55 56// Create a window with |Browser*| already present. 57IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, CreationWithBrowser) { 58 base::scoped_nsobject<WindowAppleScript> aWindow( 59 [[WindowAppleScript alloc] initWithBrowser:browser()]); 60 EXPECT_TRUE(aWindow.get()); 61 EXPECT_TRUE([aWindow.get() uniqueID]); 62} 63 64// Tabs within the window. 65IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, Tabs) { 66 base::scoped_nsobject<WindowAppleScript> aWindow( 67 [[WindowAppleScript alloc] initWithBrowser:browser()]); 68 NSArray* tabs = [aWindow.get() tabs]; 69 EXPECT_EQ(1U, [tabs count]); 70 TabAppleScript* tab1 = [tabs objectAtIndex:0]; 71 EXPECT_EQ([tab1 container], aWindow.get()); 72 EXPECT_NSEQ(AppleScript::kTabsProperty, 73 [tab1 containerProperty]); 74} 75 76// Insert a new tab. 77IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, InsertTab) { 78 // Emulate what applescript would do when creating a new tab. 79 // Emulates a script like |set var to make new tab with 80 // properties URL:"http://google.com"}|. 81 base::scoped_nsobject<TabAppleScript> aTab([[TabAppleScript alloc] init]); 82 base::scoped_nsobject<NSNumber> var([[aTab.get() uniqueID] copy]); 83 [aTab.get() setURL:@"http://google.com"]; 84 base::scoped_nsobject<WindowAppleScript> aWindow( 85 [[WindowAppleScript alloc] initWithBrowser:browser()]); 86 [aWindow.get() insertInTabs:aTab.get()]; 87 88 // Represents the tab after it is inserted. 89 TabAppleScript* tab = [[aWindow.get() tabs] objectAtIndex:1]; 90 EXPECT_EQ(GURL("http://google.com"), 91 GURL(base::SysNSStringToUTF8([tab URL]))); 92 EXPECT_EQ([tab container], aWindow.get()); 93 EXPECT_NSEQ(AppleScript::kTabsProperty, 94 [tab containerProperty]); 95 EXPECT_NSEQ(var.get(), [tab uniqueID]); 96} 97 98// Insert a new tab at a particular position 99IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, InsertTabAtPosition) { 100 // Emulate what applescript would do when creating a new tab. 101 // Emulates a script like |set var to make new tab with 102 // properties URL:"http://google.com"} at before tab 1|. 103 base::scoped_nsobject<TabAppleScript> aTab([[TabAppleScript alloc] init]); 104 base::scoped_nsobject<NSNumber> var([[aTab.get() uniqueID] copy]); 105 [aTab.get() setURL:@"http://google.com"]; 106 base::scoped_nsobject<WindowAppleScript> aWindow( 107 [[WindowAppleScript alloc] initWithBrowser:browser()]); 108 [aWindow.get() insertInTabs:aTab.get() atIndex:0]; 109 110 // Represents the tab after it is inserted. 111 TabAppleScript* tab = [[aWindow.get() tabs] objectAtIndex:0]; 112 EXPECT_EQ(GURL("http://google.com"), 113 GURL(base::SysNSStringToUTF8([tab URL]))); 114 EXPECT_EQ([tab container], aWindow.get()); 115 EXPECT_NSEQ(AppleScript::kTabsProperty, [tab containerProperty]); 116 EXPECT_NSEQ(var.get(), [tab uniqueID]); 117} 118 119// Inserting and deleting tabs. 120IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, InsertAndDeleteTabs) { 121 base::scoped_nsobject<WindowAppleScript> aWindow( 122 [[WindowAppleScript alloc] initWithBrowser:browser()]); 123 base::scoped_nsobject<TabAppleScript> aTab; 124 int count; 125 for (int i = 0; i < 5; ++i) { 126 for (int j = 0; j < 3; ++j) { 127 aTab.reset([[TabAppleScript alloc] init]); 128 [aWindow.get() insertInTabs:aTab.get()]; 129 } 130 count = 3 * i + 4; 131 EXPECT_EQ((int)[[aWindow.get() tabs] count], count); 132 } 133 134 count = (int)[[aWindow.get() tabs] count]; 135 for (int i = 0; i < 5; ++i) { 136 for(int j = 0; j < 3; ++j) { 137 [aWindow.get() removeFromTabsAtIndex:0]; 138 } 139 count = count - 3; 140 EXPECT_EQ((int)[[aWindow.get() tabs] count], count); 141 } 142} 143 144// Getting and setting values from the NSWindow. 145IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, NSWindowTest) { 146 base::scoped_nsobject<WindowAppleScript> aWindow( 147 [[WindowAppleScript alloc] initWithBrowser:browser()]); 148 [aWindow.get() setValue:[NSNumber numberWithBool:YES] 149 forKey:@"isMiniaturized"]; 150 EXPECT_TRUE([[aWindow.get() valueForKey:@"isMiniaturized"] boolValue]); 151 [aWindow.get() setValue:[NSNumber numberWithBool:NO] 152 forKey:@"isMiniaturized"]; 153 EXPECT_FALSE([[aWindow.get() valueForKey:@"isMiniaturized"] boolValue]); 154} 155 156// Getting and setting the active tab. 157IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, ActiveTab) { 158 base::scoped_nsobject<WindowAppleScript> aWindow( 159 [[WindowAppleScript alloc] initWithBrowser:browser()]); 160 base::scoped_nsobject<TabAppleScript> aTab([[TabAppleScript alloc] init]); 161 [aWindow.get() insertInTabs:aTab.get()]; 162 [aWindow.get() setActiveTabIndex:[NSNumber numberWithInt:2]]; 163 EXPECT_EQ(2, [[aWindow.get() activeTabIndex] intValue]); 164 TabAppleScript* tab2 = [[aWindow.get() tabs] objectAtIndex:1]; 165 EXPECT_NSEQ([[aWindow.get() activeTab] uniqueID], 166 [tab2 uniqueID]); 167} 168 169// Order of windows. 170IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, WindowOrder) { 171 base::scoped_nsobject<WindowAppleScript> window2( 172 [[WindowAppleScript alloc] initWithBrowser:browser()]); 173 base::scoped_nsobject<WindowAppleScript> window1( 174 [[WindowAppleScript alloc] init]); 175 EXPECT_EQ([window1.get() windowComparator:window2.get()], NSOrderedAscending); 176 EXPECT_EQ([window2.get() windowComparator:window1.get()], 177 NSOrderedDescending); 178} 179