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