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/memory/scoped_nsobject.h" 8 #include "base/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/in_process_browser_test.h" 17 #include "googleurl/src/gurl.h" 18 #include "testing/gtest/include/gtest/gtest.h" 19 #import "testing/gtest_mac.h" 20 21 typedef InProcessBrowserTest WindowAppleScriptTest; 22 23 // Create a window in default/normal mode. 24 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, DefaultCreation) { 25 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|. 34 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, CreationWithNoProfile) { 35 scoped_nsobject<WindowAppleScript> aWindow( 36 [[WindowAppleScript alloc] initWithProfile:NULL]); 37 EXPECT_FALSE(aWindow.get()); 38 } 39 40 // Create a window with a particular profile. 41 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, CreationWithProfile) { 42 Profile* defaultProfile = [[NSApp delegate] defaultProfile]; 43 scoped_nsobject<WindowAppleScript> aWindow( 44 [[WindowAppleScript alloc] initWithProfile:defaultProfile]); 45 EXPECT_TRUE(aWindow.get()); 46 EXPECT_TRUE([aWindow.get() uniqueID]); 47 } 48 49 // Create a window with no |Browser*|. 50 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, CreationWithNoBrowser) { 51 scoped_nsobject<WindowAppleScript> aWindow( 52 [[WindowAppleScript alloc] initWithBrowser:NULL]); 53 EXPECT_FALSE(aWindow.get()); 54 } 55 56 // Create a window with |Browser*| already present. 57 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, CreationWithBrowser) { 58 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. 65 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, Tabs) { 66 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. 77 IN_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 scoped_nsobject<TabAppleScript> aTab([[TabAppleScript alloc] init]); 82 scoped_nsobject<NSNumber> var([[aTab.get() uniqueID] copy]); 83 [aTab.get() setURL:@"http://google.com"]; 84 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 99 IN_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 scoped_nsobject<TabAppleScript> aTab([[TabAppleScript alloc] init]); 104 scoped_nsobject<NSNumber> var([[aTab.get() uniqueID] copy]); 105 [aTab.get() setURL:@"http://google.com"]; 106 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. 120 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, InsertAndDeleteTabs) { 121 scoped_nsobject<WindowAppleScript> aWindow( 122 [[WindowAppleScript alloc] initWithBrowser:browser()]); 123 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. 145 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, NSWindowTest) { 146 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. 157 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, ActiveTab) { 158 scoped_nsobject<WindowAppleScript> aWindow( 159 [[WindowAppleScript alloc] initWithBrowser:browser()]); 160 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. 170 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, WindowOrder) { 171 scoped_nsobject<WindowAppleScript> window2( 172 [[WindowAppleScript alloc] initWithBrowser:browser()]); 173 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