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" 82385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "apps/native_app_window.h" 94311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "apps/shell_window_registry.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/tabs/tabs_api.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/apps/chrome_shell_window_delegate.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/extensions/application_launch.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; 234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochusing apps::ShellWindowRegistry; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace utils = extension_function_test_utils; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)PlatformAppBrowserTest::PlatformAppBrowserTest() { 312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ChromeShellWindowDelegate::DisableExternalOpenForTesting(); 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PlatformAppBrowserTest::SetUpCommandLine(CommandLine* command_line) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skips ExtensionApiTest::SetUpCommandLine. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionBrowserTest::SetUpCommandLine(command_line); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make event pages get suspended quicker. 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) command_line->AppendSwitchASCII(::switches::kEventPageIdleTime, "1"); 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) command_line->AppendSwitchASCII(::switches::kEventPageSuspendingTime, "1"); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Extension* PlatformAppBrowserTest::LoadAndLaunchPlatformApp( 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* name) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver app_loaded_observer( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir_.AppendASCII("platform_apps").AppendASCII(name)); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::OpenApplication(chrome::AppLaunchParams(browser()->profile(), 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_misc::LAUNCH_NONE, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NEW_WINDOW)); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_loaded_observer.Wait(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Extension* PlatformAppBrowserTest::InstallAndLaunchPlatformApp( 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* name) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver app_loaded_observer( 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = InstallExtension( 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir_.AppendASCII("platform_apps").AppendASCII(name), 1); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::OpenApplication(chrome::AppLaunchParams(browser()->profile(), 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_misc::LAUNCH_NONE, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NEW_WINDOW)); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_loaded_observer.Wait(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* PlatformAppBrowserTest::GetFirstShellWindowWebContents() { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellWindow* window = GetFirstShellWindow(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window->web_contents(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellWindow* PlatformAppBrowserTest::GetFirstShellWindow() { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellWindowRegistry* app_registry = 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellWindowRegistry::Get(browser()->profile()); 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ShellWindowRegistry::ShellWindowList& shell_windows = 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_registry->shell_windows(); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShellWindowRegistry::const_iterator iter = shell_windows.begin(); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (iter != shell_windows.end()) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *iter; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t PlatformAppBrowserTest::RunGetWindowsFunctionForExtension( 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension) { 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<WindowsGetAllFunction> function = new WindowsGetAllFunction(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_extension(extension); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::ListValue> result(utils::ToList( 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utils::RunFunctionAndReturnSingleResult(function.get(), 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[]", 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()))); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result->GetSize(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PlatformAppBrowserTest::RunGetWindowFunctionForExtension( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_id, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension) { 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<WindowsGetFunction> function = new WindowsGetFunction(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_extension(extension); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utils::RunFunction( 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function.get(), 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("[%u]", window_id), 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utils::NONE); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return function->GetResultList() != NULL; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t PlatformAppBrowserTest::GetShellWindowCount() { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ShellWindowRegistry::Get(browser()->profile())-> 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_windows().size(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PlatformAppBrowserTest::ClearCommandLineArgs() { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::StringVector args = command_line->GetArgs(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::StringVector argv = command_line->argv(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < args.size(); i++) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argv.pop_back(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->InitFromArgv(argv); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PlatformAppBrowserTest::SetCommandLineArg(const std::string& test_file) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommandLineArgs(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_doc(test_data_dir_.AppendASCII(test_file)); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_doc = test_doc.NormalizePathSeparators(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendArgPath(test_doc); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellWindow* PlatformAppBrowserTest::CreateShellWindow( 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension) { 1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return CreateShellWindowFromParams(extension, ShellWindow::CreateParams()); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShellWindow* PlatformAppBrowserTest::CreateShellWindowFromParams( 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension, const ShellWindow::CreateParams& params) { 1572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ShellWindow* window = new ShellWindow(browser()->profile(), 1582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch new ChromeShellWindowDelegate(), 1592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen 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