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