• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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