platform_app_browsertest_util.cc revision a36e5920737c6adbddd3e43b760e5de8431db6e0
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/platform_app_browsertest_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "apps/app_window_contents.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/tabs/tabs_api.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/shell_window_registry.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/apps/chrome_shell_window_delegate.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/extensions/application_launch.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/extensions/native_app_window.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "extensions/common/switches.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing apps::ShellWindow; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace utils = extension_function_test_utils; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)PlatformAppBrowserTest::PlatformAppBrowserTest() { 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome::ChromeShellWindowDelegate::DisableExternalOpenForTesting(); 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PlatformAppBrowserTest::SetUpCommandLine(CommandLine* command_line) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skips ExtensionApiTest::SetUpCommandLine. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionBrowserTest::SetUpCommandLine(command_line); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make event pages get suspended quicker. 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) command_line->AppendSwitchASCII(::switches::kEventPageIdleTime, "1"); 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) command_line->AppendSwitchASCII(::switches::kEventPageSuspendingTime, "1"); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Extension* PlatformAppBrowserTest::LoadAndLaunchPlatformApp( 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* name) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver app_loaded_observer( 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension( 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir_.AppendASCII("platform_apps").AppendASCII(name)); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::OpenApplication(chrome::AppLaunchParams(browser()->profile(), 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_misc::LAUNCH_NONE, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NEW_WINDOW)); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_loaded_observer.Wait(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Extension* PlatformAppBrowserTest::InstallAndLaunchPlatformApp( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* name) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver app_loaded_observer( 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = InstallExtension( 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir_.AppendASCII("platform_apps").AppendASCII(name), 1); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::OpenApplication(chrome::AppLaunchParams(browser()->profile(), 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_misc::LAUNCH_NONE, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NEW_WINDOW)); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_loaded_observer.Wait(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* PlatformAppBrowserTest::GetFirstShellWindowWebContents() { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellWindow* window = GetFirstShellWindow(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window->web_contents(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellWindow* PlatformAppBrowserTest::GetFirstShellWindow() { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellWindowRegistry* app_registry = 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellWindowRegistry::Get(browser()->profile()); 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ShellWindowRegistry::ShellWindowList& shell_windows = 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_registry->shell_windows(); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShellWindowRegistry::const_iterator iter = shell_windows.begin(); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (iter != shell_windows.end()) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *iter; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t PlatformAppBrowserTest::RunGetWindowsFunctionForExtension( 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension) { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<WindowsGetAllFunction> function = new WindowsGetAllFunction(); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_extension(extension); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::ListValue> result(utils::ToList( 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utils::RunFunctionAndReturnSingleResult(function.get(), 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[]", 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()))); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result->GetSize(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PlatformAppBrowserTest::RunGetWindowFunctionForExtension( 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_id, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension) { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<WindowsGetFunction> function = new WindowsGetFunction(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_extension(extension); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utils::RunFunction( 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function.get(), 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%u]", window_id), 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utils::NONE); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return function->GetResultList() != NULL; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t PlatformAppBrowserTest::GetShellWindowCount() { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ShellWindowRegistry::Get(browser()->profile())-> 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_windows().size(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PlatformAppBrowserTest::ClearCommandLineArgs() { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::StringVector args = command_line->GetArgs(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::StringVector argv = command_line->argv(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < args.size(); i++) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argv.pop_back(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->InitFromArgv(argv); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PlatformAppBrowserTest::SetCommandLineArg(const std::string& test_file) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommandLineArgs(); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_doc(test_data_dir_.AppendASCII(test_file)); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_doc = test_doc.NormalizePathSeparators(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendArgPath(test_doc); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellWindow* PlatformAppBrowserTest::CreateShellWindow( 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension) { 1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return CreateShellWindowFromParams(extension, ShellWindow::CreateParams()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShellWindow* PlatformAppBrowserTest::CreateShellWindowFromParams( 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension, const ShellWindow::CreateParams& params) { 1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ShellWindow* window = new ShellWindow( 1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch browser()->profile(), 1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new chrome::ChromeShellWindowDelegate(), 1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch extension); 1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch window->Init(GURL(std::string()), 1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new apps::AppWindowContents(window), 1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch params); 1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return window; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PlatformAppBrowserTest::CloseShellWindow(ShellWindow* window) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver destroyed_observer( 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_WEB_CONTENTS_DESTROYED, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->GetBaseWindow()->Close(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destroyed_observer.Wait(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PlatformAppBrowserTest::CallAdjustBoundsToBeVisibleOnScreenForShellWindow( 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShellWindow* window, 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Rect& cached_bounds, 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Rect& cached_screen_bounds, 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Rect& current_screen_bounds, 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Size& minimum_size, 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Rect* bounds) { 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch window->AdjustBoundsToBeVisibleOnScreen(cached_bounds, 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cached_screen_bounds, 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch current_screen_bounds, 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch minimum_size, 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bounds); 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ExperimentalPlatformAppBrowserTest::SetUpCommandLine( 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandLine* command_line) { 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PlatformAppBrowserTest::SetUpCommandLine(command_line); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitch(switches::kEnableExperimentalExtensionApis); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 195