1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
// 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 <Cocoa/Cocoa.h>
#include "base/command_line.h"
#include "base/mac/scoped_nsobject.h"
#include "base/strings/sys_string_conversions.h"
#include "chrome/app/chrome_command_ids.h"
#import "chrome/browser/app_controller_mac.h"
#include "chrome/browser/extensions/extension_test_message_listener.h"
#include "chrome/browser/extensions/platform_app_browsertest_util.h"
#include "chrome/browser/extensions/shell_window_registry.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/host_desktop.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#import "chrome/common/chrome_switches.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/web_contents.h"
namespace {
class AppControllerPlatformAppBrowserTest
: public extensions::PlatformAppBrowserTest {
protected:
AppControllerPlatformAppBrowserTest()
: active_browser_list_(BrowserList::GetInstance(
chrome::GetActiveDesktop())) {
}
virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
PlatformAppBrowserTest::SetUpCommandLine(command_line);
command_line->AppendSwitchASCII(switches::kAppId,
"1234");
}
const BrowserList* active_browser_list_;
};
// Test that if only a platform app window is open and no browser windows are
// open then a reopen event does nothing.
IN_PROC_BROWSER_TEST_F(AppControllerPlatformAppBrowserTest,
PlatformAppReopenWithWindows) {
base::scoped_nsobject<AppController> ac([[AppController alloc] init]);
NSUInteger old_window_count = [[NSApp windows] count];
EXPECT_EQ(1u, active_browser_list_->size());
BOOL result = [ac applicationShouldHandleReopen:NSApp hasVisibleWindows:YES];
EXPECT_TRUE(result);
EXPECT_EQ(old_window_count, [[NSApp windows] count]);
EXPECT_EQ(1u, active_browser_list_->size());
}
// Test that focusing an app window changes the menu bar.
IN_PROC_BROWSER_TEST_F(AppControllerPlatformAppBrowserTest,
PlatformAppFocusUpdatesMenuBar) {
base::scoped_nsobject<AppController> app_controller(
[[AppController alloc] init]);
// Start two apps and wait for them to be launched.
ExtensionTestMessageListener listener_1("Launched", false);
const extensions::Extension* app_1 =
InstallAndLaunchPlatformApp("minimal_id");
ASSERT_TRUE(listener_1.WaitUntilSatisfied());
ExtensionTestMessageListener listener_2("Launched", false);
const extensions::Extension* app_2 =
InstallAndLaunchPlatformApp("minimal");
ASSERT_TRUE(listener_2.WaitUntilSatisfied());
NSMenu* main_menu = [NSApp mainMenu];
NSUInteger initial_menu_item_count = [[main_menu itemArray] count];
// When an app is focused, all Chrome menu items should be hidden, and a menu
// item for the app should be added.
apps::ShellWindow* app_1_shell_window =
extensions::ShellWindowRegistry::Get(profile())->
GetShellWindowsForApp(app_1->id()).front();
[[NSNotificationCenter defaultCenter]
postNotificationName:NSWindowDidBecomeMainNotification
object:app_1_shell_window->GetNativeWindow()];
NSArray* item_array = [main_menu itemArray];
EXPECT_EQ(initial_menu_item_count + 1, [item_array count]);
for (NSUInteger i = 0; i < initial_menu_item_count; ++i)
EXPECT_TRUE([[item_array objectAtIndex:i] isHidden]);
NSMenuItem* last_item = [item_array lastObject];
EXPECT_EQ(app_1->id(), base::SysNSStringToUTF8([last_item title]));
EXPECT_EQ(app_1->name(),
base::SysNSStringToUTF8([[last_item submenu] title]));
EXPECT_FALSE([last_item isHidden]);
// When another app is focused, the menu item for the app should change.
apps::ShellWindow* app_2_shell_window =
extensions::ShellWindowRegistry::Get(profile())->
GetShellWindowsForApp(app_2->id()).front();
[[NSNotificationCenter defaultCenter]
postNotificationName:NSWindowDidBecomeMainNotification
object:app_2_shell_window->GetNativeWindow()];
item_array = [main_menu itemArray];
EXPECT_EQ(initial_menu_item_count + 1, [item_array count]);
for (NSUInteger i = 0; i < initial_menu_item_count; ++i)
EXPECT_TRUE([[item_array objectAtIndex:i] isHidden]);
last_item = [item_array lastObject];
EXPECT_EQ(app_2->id(), base::SysNSStringToUTF8([last_item title]));
EXPECT_EQ(app_2->name(),
base::SysNSStringToUTF8([[last_item submenu] title]));
EXPECT_FALSE([last_item isHidden]);
// When Chrome is focused, the menu item for the app should be removed.
NSWindow* browser_native_window =
active_browser_list_->get(0)->window()->GetNativeWindow();
[[NSNotificationCenter defaultCenter]
postNotificationName:NSWindowDidBecomeMainNotification
object:browser_native_window];
item_array = [main_menu itemArray];
EXPECT_EQ(initial_menu_item_count, [item_array count]);
for (NSUInteger i = 0; i < initial_menu_item_count; ++i)
EXPECT_FALSE([[item_array objectAtIndex:i] isHidden]);
}
IN_PROC_BROWSER_TEST_F(AppControllerPlatformAppBrowserTest,
ActivationFocusesBrowserWindow) {
base::scoped_nsobject<AppController> app_controller(
[[AppController alloc] init]);
ExtensionTestMessageListener listener("Launched", false);
const extensions::Extension* app =
InstallAndLaunchPlatformApp("minimal");
ASSERT_TRUE(listener.WaitUntilSatisfied());
NSWindow* app_window = extensions::ShellWindowRegistry::Get(profile())->
GetShellWindowsForApp(app->id()).front()->GetNativeWindow();
NSWindow* browser_window = browser()->window()->GetNativeWindow();
EXPECT_LE([[NSApp orderedWindows] indexOfObject:app_window],
[[NSApp orderedWindows] indexOfObject:browser_window]);
[app_controller applicationShouldHandleReopen:NSApp
hasVisibleWindows:YES];
EXPECT_LE([[NSApp orderedWindows] indexOfObject:browser_window],
[[NSApp orderedWindows] indexOfObject:app_window]);
}
class AppControllerWebAppBrowserTest : public InProcessBrowserTest {
protected:
AppControllerWebAppBrowserTest()
: active_browser_list_(BrowserList::GetInstance(
chrome::GetActiveDesktop())) {
}
virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
command_line->AppendSwitchASCII(switches::kApp, GetAppURL());
}
std::string GetAppURL() const {
return "http://example.com/";
}
const BrowserList* active_browser_list_;
};
// Test that in web app mode a reopen event opens the app URL.
IN_PROC_BROWSER_TEST_F(AppControllerWebAppBrowserTest,
WebAppReopenWithNoWindows) {
base::scoped_nsobject<AppController> ac([[AppController alloc] init]);
EXPECT_EQ(1u, active_browser_list_->size());
BOOL result = [ac applicationShouldHandleReopen:NSApp hasVisibleWindows:NO];
EXPECT_FALSE(result);
EXPECT_EQ(2u, active_browser_list_->size());
Browser* browser = active_browser_list_->get(0);
GURL current_url =
browser->tab_strip_model()->GetActiveWebContents()->GetURL();
EXPECT_EQ(GetAppURL(), current_url.spec());
}
} // namespace
|