1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/extensions/extension_apitest.h" 621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h" 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/extensions/extension_test_message_listener.h" 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 94a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/browser_list.h" 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/test/ui_test_utils.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace { 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Find a browser other than |browser|. 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowser* FindOtherBrowser(Browser* browser) { 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Browser* found = NULL; 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (BrowserList::const_iterator it = BrowserList::begin(); 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen it != BrowserList::end(); ++it) { 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (*it == browser) 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen continue; 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen found = *it; 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return found; 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass ExtensionManagementApiTest : public ExtensionApiTest { 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public: 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual void InstallExtensions() { 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen FilePath basedir = test_data_dir_.AppendASCII("management"); 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 35201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Load 4 enabled items. 36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(LoadExtension(basedir.AppendASCII("enabled_extension"))); 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(LoadExtension(basedir.AppendASCII("enabled_app"))); 38201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ASSERT_TRUE(LoadExtension(basedir.AppendASCII("description"))); 39201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ASSERT_TRUE(LoadExtension(basedir.AppendASCII("permissions"))); 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Load 2 disabled items. 4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ExtensionService* service = browser()->profile()->GetExtensionService(); 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(LoadExtension(basedir.AppendASCII("disabled_extension"))); 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen service->DisableExtension(last_loaded_extension_id_); 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(LoadExtension(basedir.AppendASCII("disabled_app"))); 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen service->DisableExtension(last_loaded_extension_id_); 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Load an app, and wait for a message from app "management/launch_on_install" 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // indicating that the new app has been launched. 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void LoadAndWaitForLaunch(const std::string& app_path, 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string* out_app_id) { 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionTestMessageListener launched_app("launched app", false); 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(app_path))); 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (out_app_id) 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *out_app_id = last_loaded_extension_id_; 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(launched_app.WaitUntilSatisfied()); 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenIN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, Basics) { 64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen InstallExtensions(); 65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(RunExtensionSubtest("management/test", "basics.html")); 66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenIN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, Uninstall) { 69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen InstallExtensions(); 70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(RunExtensionSubtest("management/test", "uninstall.html")); 71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, LaunchPanelApp) { 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionService* service = browser()->profile()->GetExtensionService(); 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Load an extension that calls launchApp() on any app that gets 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // installed. 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionTestMessageListener launcher_loaded("launcher loaded", false); 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(LoadExtension( 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen test_data_dir_.AppendASCII("management/launch_on_install"))); 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(launcher_loaded.WaitUntilSatisfied()); 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Load an app with app.launch.container = "panel". 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string app_id; 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LoadAndWaitForLaunch("management/launch_app_panel", &app_id); 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_FALSE(HasFatalFailure()); // Stop the test if any ASSERT failed. 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Find the app's browser. Check that it is a panel. 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(2u, BrowserList::GetBrowserCount(browser()->profile())); 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Browser* app_browser = FindOtherBrowser(browser()); 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(Browser::TYPE_APP_POPUP, app_browser->type()); 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Close the app panel. 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen app_browser->CloseWindow(); 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui_test_utils::WaitForNotificationFrom(NotificationType::BROWSER_CLOSED, 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Source<Browser>(app_browser)); 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Unload the extension. 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen UninstallExtension(app_id); 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile())); 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_FALSE(service->GetExtensionById(app_id, true)); 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Set a pref indicating that the user wants to launch in a regular tab. 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // This should be ignored, because panel apps always load in a panel. 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen service->extension_prefs()->SetLaunchType( 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen app_id, ExtensionPrefs::LAUNCH_REGULAR); 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Load the extension again. 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string app_id_new; 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LoadAndWaitForLaunch("management/launch_app_panel", &app_id_new); 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_FALSE(HasFatalFailure()); 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // If the ID changed, then the pref will not apply to the app. 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(app_id, app_id_new); 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Find the app's browser. Apps that should load in a panel ignore 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // prefs, so we should still see the launch in a panel. 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(2u, BrowserList::GetBrowserCount(browser()->profile())); 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen app_browser = FindOtherBrowser(browser()); 12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(Browser::TYPE_APP_POPUP, app_browser->type()); 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, LaunchTabApp) { 12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionService* service = browser()->profile()->GetExtensionService(); 12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Load an extension that calls launchApp() on any app that gets 12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // installed. 12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionTestMessageListener launcher_loaded("launcher loaded", false); 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(LoadExtension( 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen test_data_dir_.AppendASCII("management/launch_on_install"))); 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(launcher_loaded.WaitUntilSatisfied()); 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Code below assumes that the test starts with a single browser window 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // hosting one tab. 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile())); 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(1, browser()->tab_count()); 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Load an app with app.launch.container = "tab". 13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string app_id; 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LoadAndWaitForLaunch("management/launch_app_tab", &app_id); 14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_FALSE(HasFatalFailure()); 14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Check that the app opened in a new tab of the existing browser. 14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile())); 14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(2, browser()->tab_count()); 14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Unload the extension. 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen UninstallExtension(app_id); 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile())); 15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_FALSE(service->GetExtensionById(app_id, true)); 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Set a pref indicating that the user wants to launch in a window. 15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen service->extension_prefs()->SetLaunchType( 15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen app_id, ExtensionPrefs::LAUNCH_WINDOW); 15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string app_id_new; 15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LoadAndWaitForLaunch("management/launch_app_tab", &app_id_new); 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_FALSE(HasFatalFailure()); 15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // If the ID changed, then the pref will not apply to the app. 16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(app_id, app_id_new); 16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_MACOSX) 16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // App windows are not yet implemented on mac os. We should fall back 16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // to a normal tab. 16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile())); 16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(2, browser()->tab_count()); 16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#else 16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Find the app's browser. Opening in a new window will create 17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // a new browser. 17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(2u, BrowserList::GetBrowserCount(browser()->profile())); 17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Browser* app_browser = FindOtherBrowser(browser()); 17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(Browser::TYPE_APP, app_browser->type()); 17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif 17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 176