1 // Copyright 2013 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 #include "chrome/browser/apps/app_browsertest_util.h"
6
7 #include "apps/app_window_contents.h"
8 #include "apps/app_window_registry.h"
9 #include "apps/ui/native_app_window.h"
10 #include "base/command_line.h"
11 #include "base/strings/stringprintf.h"
12 #include "chrome/browser/extensions/api/tabs/tabs_api.h"
13 #include "chrome/browser/extensions/extension_function_test_utils.h"
14 #include "chrome/browser/extensions/extension_test_message_listener.h"
15 #include "chrome/browser/ui/apps/chrome_app_window_delegate.h"
16 #include "chrome/browser/ui/browser.h"
17 #include "chrome/browser/ui/extensions/application_launch.h"
18 #include "content/public/browser/notification_service.h"
19 #include "content/public/test/browser_test_utils.h"
20 #include "content/public/test/test_utils.h"
21 #include "extensions/common/switches.h"
22
23 using apps::AppWindow;
24 using apps::AppWindowRegistry;
25 using content::WebContents;
26
27 namespace {
28
29 const char kAppWindowTestApp[] = "app_window/generic";
30
31 } // namespace
32
33 namespace utils = extension_function_test_utils;
34
35 namespace extensions {
36
PlatformAppBrowserTest()37 PlatformAppBrowserTest::PlatformAppBrowserTest() {
38 ChromeAppWindowDelegate::DisableExternalOpenForTesting();
39 }
40
SetUpCommandLine(CommandLine * command_line)41 void PlatformAppBrowserTest::SetUpCommandLine(CommandLine* command_line) {
42 // Skips ExtensionApiTest::SetUpCommandLine.
43 ExtensionBrowserTest::SetUpCommandLine(command_line);
44
45 // Make event pages get suspended quicker.
46 command_line->AppendSwitchASCII(switches::kEventPageIdleTime, "1000");
47 command_line->AppendSwitchASCII(switches::kEventPageSuspendingTime, "1000");
48 }
49
50 // static
GetFirstAppWindowForBrowser(Browser * browser)51 AppWindow* PlatformAppBrowserTest::GetFirstAppWindowForBrowser(
52 Browser* browser) {
53 AppWindowRegistry* app_registry = AppWindowRegistry::Get(browser->profile());
54 const AppWindowRegistry::AppWindowList& app_windows =
55 app_registry->app_windows();
56
57 AppWindowRegistry::const_iterator iter = app_windows.begin();
58 if (iter != app_windows.end())
59 return *iter;
60
61 return NULL;
62 }
63
LoadAndLaunchPlatformApp(const char * name,ExtensionTestMessageListener * listener)64 const Extension* PlatformAppBrowserTest::LoadAndLaunchPlatformApp(
65 const char* name,
66 ExtensionTestMessageListener* listener) {
67 DCHECK(listener);
68 const Extension* extension = LoadExtension(
69 test_data_dir_.AppendASCII("platform_apps").AppendASCII(name));
70 EXPECT_TRUE(extension);
71
72 LaunchPlatformApp(extension);
73
74 EXPECT_TRUE(listener->WaitUntilSatisfied()) << "'" << listener->message()
75 << "' message was not receieved";
76
77 return extension;
78 }
79
LoadAndLaunchPlatformApp(const char * name,const std::string & message)80 const Extension* PlatformAppBrowserTest::LoadAndLaunchPlatformApp(
81 const char* name,
82 const std::string& message) {
83 ExtensionTestMessageListener launched_listener(message, false);
84 const Extension* extension =
85 LoadAndLaunchPlatformApp(name, &launched_listener);
86
87 return extension;
88 }
89
InstallPlatformApp(const char * name)90 const Extension* PlatformAppBrowserTest::InstallPlatformApp(
91 const char* name) {
92 const Extension* extension = InstallExtension(
93 test_data_dir_.AppendASCII("platform_apps").AppendASCII(name), 1);
94 EXPECT_TRUE(extension);
95
96 return extension;
97 }
98
InstallAndLaunchPlatformApp(const char * name)99 const Extension* PlatformAppBrowserTest::InstallAndLaunchPlatformApp(
100 const char* name) {
101 content::WindowedNotificationObserver app_loaded_observer(
102 content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
103 content::NotificationService::AllSources());
104
105 const Extension* extension = InstallPlatformApp(name);
106
107 LaunchPlatformApp(extension);
108
109 app_loaded_observer.Wait();
110
111 return extension;
112 }
113
LaunchPlatformApp(const Extension * extension)114 void PlatformAppBrowserTest::LaunchPlatformApp(const Extension* extension) {
115 OpenApplication(AppLaunchParams(
116 browser()->profile(), extension, LAUNCH_CONTAINER_NONE, NEW_WINDOW));
117 }
118
GetFirstAppWindowWebContents()119 WebContents* PlatformAppBrowserTest::GetFirstAppWindowWebContents() {
120 AppWindow* window = GetFirstAppWindow();
121 if (window)
122 return window->web_contents();
123
124 return NULL;
125 }
126
GetFirstAppWindow()127 AppWindow* PlatformAppBrowserTest::GetFirstAppWindow() {
128 return GetFirstAppWindowForBrowser(browser());
129 }
130
GetFirstAppWindowForApp(const std::string & app_id)131 apps::AppWindow* PlatformAppBrowserTest::GetFirstAppWindowForApp(
132 const std::string& app_id) {
133 AppWindowRegistry* app_registry =
134 AppWindowRegistry::Get(browser()->profile());
135 const AppWindowRegistry::AppWindowList& app_windows =
136 app_registry->GetAppWindowsForApp(app_id);
137
138 AppWindowRegistry::const_iterator iter = app_windows.begin();
139 if (iter != app_windows.end())
140 return *iter;
141
142 return NULL;
143 }
144
RunGetWindowsFunctionForExtension(const Extension * extension)145 size_t PlatformAppBrowserTest::RunGetWindowsFunctionForExtension(
146 const Extension* extension) {
147 scoped_refptr<WindowsGetAllFunction> function = new WindowsGetAllFunction();
148 function->set_extension(extension);
149 scoped_ptr<base::ListValue> result(utils::ToList(
150 utils::RunFunctionAndReturnSingleResult(function.get(),
151 "[]",
152 browser())));
153 return result->GetSize();
154 }
155
RunGetWindowFunctionForExtension(int window_id,const Extension * extension)156 bool PlatformAppBrowserTest::RunGetWindowFunctionForExtension(
157 int window_id,
158 const Extension* extension) {
159 scoped_refptr<WindowsGetFunction> function = new WindowsGetFunction();
160 function->set_extension(extension);
161 utils::RunFunction(
162 function.get(),
163 base::StringPrintf("[%u]", window_id),
164 browser(),
165 utils::NONE);
166 return function->GetResultList() != NULL;
167 }
168
GetAppWindowCount()169 size_t PlatformAppBrowserTest::GetAppWindowCount() {
170 return AppWindowRegistry::Get(browser()->profile())->app_windows().size();
171 }
172
GetAppWindowCountForApp(const std::string & app_id)173 size_t PlatformAppBrowserTest::GetAppWindowCountForApp(
174 const std::string& app_id) {
175 return AppWindowRegistry::Get(browser()->profile())
176 ->GetAppWindowsForApp(app_id)
177 .size();
178 }
179
ClearCommandLineArgs()180 void PlatformAppBrowserTest::ClearCommandLineArgs() {
181 CommandLine* command_line = CommandLine::ForCurrentProcess();
182 CommandLine::StringVector args = command_line->GetArgs();
183 CommandLine::StringVector argv = command_line->argv();
184 for (size_t i = 0; i < args.size(); i++)
185 argv.pop_back();
186 command_line->InitFromArgv(argv);
187 }
188
SetCommandLineArg(const std::string & test_file)189 void PlatformAppBrowserTest::SetCommandLineArg(const std::string& test_file) {
190 ClearCommandLineArgs();
191 CommandLine* command_line = CommandLine::ForCurrentProcess();
192 base::FilePath test_doc(test_data_dir_.AppendASCII(test_file));
193 test_doc = test_doc.NormalizePathSeparators();
194 command_line->AppendArgPath(test_doc);
195 }
196
CreateAppWindow(const Extension * extension)197 AppWindow* PlatformAppBrowserTest::CreateAppWindow(const Extension* extension) {
198 return CreateAppWindowFromParams(extension, AppWindow::CreateParams());
199 }
200
CreateAppWindowFromParams(const Extension * extension,const AppWindow::CreateParams & params)201 AppWindow* PlatformAppBrowserTest::CreateAppWindowFromParams(
202 const Extension* extension,
203 const AppWindow::CreateParams& params) {
204 AppWindow* window = new AppWindow(
205 browser()->profile(), new ChromeAppWindowDelegate(), extension);
206 window->Init(
207 GURL(std::string()), new apps::AppWindowContentsImpl(window), params);
208 return window;
209 }
210
CloseAppWindow(AppWindow * window)211 void PlatformAppBrowserTest::CloseAppWindow(AppWindow* window) {
212 content::WebContentsDestroyedWatcher destroyed_watcher(
213 window->web_contents());
214 window->GetBaseWindow()->Close();
215 destroyed_watcher.Wait();
216 }
217
CallAdjustBoundsToBeVisibleOnScreenForAppWindow(AppWindow * window,const gfx::Rect & cached_bounds,const gfx::Rect & cached_screen_bounds,const gfx::Rect & current_screen_bounds,const gfx::Size & minimum_size,gfx::Rect * bounds)218 void PlatformAppBrowserTest::CallAdjustBoundsToBeVisibleOnScreenForAppWindow(
219 AppWindow* window,
220 const gfx::Rect& cached_bounds,
221 const gfx::Rect& cached_screen_bounds,
222 const gfx::Rect& current_screen_bounds,
223 const gfx::Size& minimum_size,
224 gfx::Rect* bounds) {
225 window->AdjustBoundsToBeVisibleOnScreen(cached_bounds,
226 cached_screen_bounds,
227 current_screen_bounds,
228 minimum_size,
229 bounds);
230 }
231
CreateTestAppWindow(const std::string & window_create_options)232 apps::AppWindow* PlatformAppBrowserTest::CreateTestAppWindow(
233 const std::string& window_create_options) {
234 ExtensionTestMessageListener launched_listener("launched", true);
235 ExtensionTestMessageListener loaded_listener("window_loaded", false);
236
237 // Load and launch the test app.
238 const Extension* extension =
239 LoadAndLaunchPlatformApp(kAppWindowTestApp, &launched_listener);
240 EXPECT_TRUE(extension);
241 EXPECT_TRUE(launched_listener.WaitUntilSatisfied());
242
243 // Send the options for window creation.
244 launched_listener.Reply(window_create_options);
245
246 // Wait for the window to be opened and loaded.
247 EXPECT_TRUE(loaded_listener.WaitUntilSatisfied());
248
249 EXPECT_EQ(1U, GetAppWindowCount());
250 AppWindow* app_window = GetFirstAppWindow();
251 return app_window;
252 }
253
SetUpCommandLine(CommandLine * command_line)254 void ExperimentalPlatformAppBrowserTest::SetUpCommandLine(
255 CommandLine* command_line) {
256 PlatformAppBrowserTest::SetUpCommandLine(command_line);
257 command_line->AppendSwitch(switches::kEnableExperimentalExtensionApis);
258 }
259
260 } // namespace extensions
261