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 <map>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/api/management/management_api.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/extensions/launch_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/test_management_policy.h"
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/extension_test_message_listener.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Manifest;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Find a browser other than |browser|.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* FindOtherBrowser(Browser* browser) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* found = NULL;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done(); it.Next()) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*it == browser)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    found = *it;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return found;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionManagementApiTest : public ExtensionApiTest {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionApiTest::SetUpCommandLine(command_line);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kEnablePanels);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void LoadExtensions() {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath basedir = test_data_dir_.AppendASCII("management");
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // Load 5 enabled items.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoadNamedExtension(basedir, "enabled_extension");
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoadNamedExtension(basedir, "enabled_app");
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoadNamedExtension(basedir, "description");
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoadNamedExtension(basedir, "permissions");
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    LoadNamedExtension(basedir, "short_name");
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Load 2 disabled items.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoadNamedExtension(basedir, "disabled_extension");
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DisableExtension(extension_ids_["disabled_extension"]);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoadNamedExtension(basedir, "disabled_app");
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DisableExtension(extension_ids_["disabled_app"]);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an app, and wait for a message from app "management/launch_on_install"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // indicating that the new app has been launched.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadAndWaitForLaunch(const std::string& app_path,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            std::string* out_app_id) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionTestMessageListener launched_app("launched app", false);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(app_path)));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out_app_id)
768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      *out_app_id = last_loaded_extension_id();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(launched_app.WaitUntilSatisfied());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LoadNamedExtension(const base::FilePath& path,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::string& name) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension = LoadExtension(path.AppendASCII(name));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_ids_[name] = extension->id();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void InstallNamedExtension(const base::FilePath& path,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const std::string& name,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             Manifest::Location install_source) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension = InstallExtension(path.AppendASCII(name), 1,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  install_source);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_ids_[name] = extension->id();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maps installed extension names to their IDs.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, std::string> extension_ids_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, Basics) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtensions();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath basedir = test_data_dir_.AppendASCII("management");
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InstallNamedExtension(basedir, "internal_extension", Manifest::INTERNAL);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallNamedExtension(basedir, "external_extension",
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        Manifest::EXTERNAL_PREF);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallNamedExtension(basedir, "admin_extension",
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        Manifest::EXTERNAL_POLICY_DOWNLOAD);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest("management/test", "basics.html"));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, NoPermission) {
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  LoadExtensions();
117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest("management/no_permission", "test.html"));
118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled: http://crbug.com/174411
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_Uninstall DISABLED_Uninstall
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_Uninstall Uninstall
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, MAYBE_Uninstall) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtensions();
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Confirmation dialog will be shown for uninstallations except for self.
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::ManagementUninstallFunction::SetAutoConfirmForTest(true);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest("management/test", "uninstall.html"));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, CreateAppShortcut) {
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LoadExtensions();
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::FilePath basedir = test_data_dir_.AppendASCII("management");
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  LoadNamedExtension(basedir, "packaged_app");
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  extensions::ManagementCreateAppShortcutFunction::SetAutoConfirmForTest(true);
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest("management/test",
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                  "createAppShortcut.html"));
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, GenerateAppForLink) {
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  LoadExtensions();
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest("management/test",
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                  "generateAppForLink.html"));
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Fails often on Windows dbg bots. http://crbug.com/177163
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN)
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_ManagementPolicyAllowed DISABLED_ManagementPolicyAllowed
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_ManagementPolicyAllowed ManagementPolicyAllowed
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // defined(OS_WIN)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests actions on extensions when no management policy is in place.
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest,
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       MAYBE_ManagementPolicyAllowed) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtensions();
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::ManagementUninstallFunction::SetAutoConfirmForTest(true);
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service->GetExtensionById(extension_ids_["enabled_extension"],
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        false));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that all actions are allowed.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionSystem::Get(
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->profile())->management_policy()->UnregisterAllProviders();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest("management/management_policy",
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  "allowed.html"));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last thing the test does is uninstall the "enabled_extension".
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(service->GetExtensionById(extension_ids_["enabled_extension"],
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         true));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Fails often on Windows dbg bots. http://crbug.com/177163
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN)
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_ManagementPolicyProhibited DISABLED_ManagementPolicyProhibited
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_ManagementPolicyProhibited ManagementPolicyProhibited
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // defined(OS_WIN)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests actions on extensions when management policy prohibits those actions.
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest,
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       MAYBE_ManagementPolicyProhibited) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtensions();
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service->GetExtensionById(extension_ids_["enabled_extension"],
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        false));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prohibit status changes.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ManagementPolicy* policy = extensions::ExtensionSystem::Get(
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->profile())->management_policy();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy->UnregisterAllProviders();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::TestManagementPolicyProvider provider(
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy->RegisterProvider(&provider);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest("management/management_policy",
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  "prohibited.html"));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled. See http://crbug.com/176023
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, DISABLED_LaunchPanelApp) {
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an extension that calls launchApp() on any app that gets
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // installed.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener launcher_loaded("launcher loaded", false);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("management/launch_on_install")));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launcher_loaded.WaitUntilSatisfied());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an app with app.launch.container = "panel".
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_id;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadAndWaitForLaunch("management/launch_app_panel", &app_id);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(HasFatalFailure());  // Stop the test if any ASSERT failed.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the app's browser.  Check that it is a popup.
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* app_browser = FindOtherBrowser(browser());
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(app_browser->is_type_popup());
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(app_browser->is_app());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the app panel.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver signal(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_BROWSER_CLOSED,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<Browser>(app_browser));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::CloseWindow(app_browser);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signal.Wait();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unload the extension.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(app_id);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile(),
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(service->GetExtensionById(app_id, true));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a pref indicating that the user wants to launch in a regular tab.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should be ignored, because panel apps always load in a popup.
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::SetLaunchType(service, app_id, extensions::LAUNCH_TYPE_REGULAR);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load the extension again.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_id_new;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadAndWaitForLaunch("management/launch_app_panel", &app_id_new);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(HasFatalFailure());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the ID changed, then the pref will not apply to the app.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(app_id, app_id_new);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the app's browser.  Apps that should load in a panel ignore
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // prefs, so we should still see the launch in a popup.
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_browser = FindOtherBrowser(browser());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(app_browser->is_type_popup());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(app_browser->is_app());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Disabled: http://crbug.com/230165
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN)
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_LaunchTabApp DISABLED_LaunchTabApp
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_LaunchTabApp LaunchTabApp
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, MAYBE_LaunchTabApp) {
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an extension that calls launchApp() on any app that gets
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // installed.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener launcher_loaded("launcher loaded", false);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("management/launch_on_install")));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launcher_loaded.WaitUntilSatisfied());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Code below assumes that the test starts with a single browser window
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hosting one tab.
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile(),
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, browser()->tab_strip_model()->count());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an app with app.launch.container = "tab".
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_id;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadAndWaitForLaunch("management/launch_app_tab", &app_id);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(HasFatalFailure());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the app opened in a new tab of the existing browser.
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile(),
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2, browser()->tab_strip_model()->count());
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unload the extension.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(app_id);
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile(),
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(service->GetExtensionById(app_id, true));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a pref indicating that the user wants to launch in a window.
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::SetLaunchType(service, app_id, extensions::LAUNCH_TYPE_WINDOW);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_id_new;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadAndWaitForLaunch("management/launch_app_tab", &app_id_new);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(HasFatalFailure());
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the ID changed, then the pref will not apply to the app.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(app_id, app_id_new);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // App windows are not yet implemented on mac os.  We should fall back
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to a normal tab.
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile(),
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2, browser()->tab_strip_model()->count());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the app's browser.  Opening in a new window will create
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a new browser.
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* app_browser = FindOtherBrowser(browser());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(app_browser->is_app());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, LaunchType) {
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LoadExtensions();
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FilePath basedir = test_data_dir_.AppendASCII("management");
330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LoadNamedExtension(basedir, "packaged_app");
331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest("management/test", "launchType.html"));
333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ExtensionManagementApiStreamlinedAppsTest
336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : public ExtensionManagementApiTest {
337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ExtensionManagementApiTest::SetUpCommandLine(command_line);
340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    command_line->AppendSwitch(switches::kEnableStreamlinedHostedApps);
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementApiStreamlinedAppsTest, LaunchType) {
345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LoadExtensions();
346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FilePath basedir = test_data_dir_.AppendASCII("management");
347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LoadNamedExtension(basedir, "packaged_app");
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest("management/test",
350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  "launchType.html?streamlined-hosted-apps"));
351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
352