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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind_helpers.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_test_message_listener.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/external_policy_loader.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/updater/extension_downloader.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/updater/extension_updater.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/test/net/url_request_prepackaged_interceptor.h"
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "extensions/browser/extension_host.h"
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_prefs.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_registry.h"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/pref_names.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using extensions::ExtensionRegistry;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Manifest;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionManagementTest : public ExtensionBrowserTest {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method that returns whether the extension is at the given version.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This calls version(), which must be defined in the extension's bg page,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as well as asking the extension itself.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that 'version' here means something different than the version field
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the extension's manifest. We use the version as reported by the
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // background page to test how overinstalling crx files with the same
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // manifest version works.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExtensionAtVersion(const Extension* extension,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& expected_version) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test that the extension's version from the manifest and reported by the
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // background page is correct.  This is to ensure that the processes are in
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // sync with the Extension.
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extensions::ProcessManager* manager =
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extensions::ExtensionSystem::Get(browser()->profile())->
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            process_manager();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::ExtensionHost* ext_host =
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        manager->GetBackgroundHostForExtension(extension->id());
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ext_host);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ext_host)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string version_from_bg;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool exec = content::ExecuteScriptAndExtractString(
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ext_host->render_view_host(), "version()", &version_from_bg);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(exec);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!exec)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (version_from_bg != expected_version ||
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extension->VersionString() != expected_version)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Times out sometimes on Linux.  http://crbug.com/89727
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_InstallSameVersion DISABLED_InstallSameVersion
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_InstallSameVersion InstallSameVersion
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that installing the same version overwrites.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, MAYBE_InstallSameVersion) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = InstallExtension(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("install/install.crx"), 1);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath old_path = extension->path();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install an extension with the same version. The previous install should be
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // overwritten.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = InstallExtension(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("install/install_same_version.crx"), 0);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath new_path = extension->path();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsExtensionAtVersion(extension, "1.0"));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(old_path.value(), new_path.value());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, InstallOlderVersion) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = InstallExtension(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("install/install.crx"), 1);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(InstallExtension(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("install/install_older_version.crx"), 0));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsExtensionAtVersion(extension, "1.0"));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, InstallThenCancel) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = InstallExtension(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("install/install.crx"), 1);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel this install.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(StartInstallButCancel(
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("install/install_v2.crx")));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsExtensionAtVersion(extension, "1.0"));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/141913
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_InstallRequiresConfirm DISABLED_InstallRequiresConfirm
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_InstallRequiresConfirm InstallRequiresConfirm
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, MAYBE_InstallRequiresConfirm) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installing the extension without an auto confirming UI should result in
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it being disabled, since good.crx has permissions that require approval.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id = "ldnnhddmnhbkjipkidpdiheffobcpfmf";
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(InstallExtension(test_data_dir_.AppendASCII("good.crx"), 0));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(service->GetExtensionById(id, true));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(id);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the install should succeed when the permissions are accepted.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(InstallExtensionWithUIAutoConfirm(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("good.crx"), 1, browser()));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(id);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that disabling and re-enabling an extension works.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, DisableEnable) {
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  extensions::ProcessManager* manager =
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::ExtensionSystem::Get(browser()->profile())->process_manager();
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExtensionRegistry* registry = ExtensionRegistry::Get(browser()->profile());
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t size_before = registry->enabled_extensions().size();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an extension, expect the background page to be available.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string extension_id = "bjafgdebaacbbbecmhlhpofkepfkgcpa";
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("good").AppendASCII("Extensions")
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    .AppendASCII(extension_id)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    .AppendASCII("1.0")));
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(size_before + 1, registry->enabled_extensions().size());
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry->disabled_extensions().size());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager->GetBackgroundHostForExtension(extension_id));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After disabling, the background page should go away.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableExtension(extension_id);
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(size_before, registry->enabled_extensions().size());
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1u, registry->disabled_extensions().size());
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager->GetBackgroundHostForExtension(extension_id));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And bring it back.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnableExtension(extension_id);
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(size_before + 1, registry->enabled_extensions().size());
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry->disabled_extensions().size());
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager->GetBackgroundHostForExtension(extension_id));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used for testing notifications sent during extension updates.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotificationListener : public content::NotificationObserver {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationListener() : started_(false), finished_(false) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int types[] = {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_EXTENSION_UPDATING_STARTED,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_EXTENSION_UPDATE_FOUND
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < arraysize(types); i++) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      registrar_.Add(
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this, types[i], content::NotificationService::AllSources());
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~NotificationListener() {}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool started() { return started_; }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool finished() { return finished_; }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::set<std::string>& updates() { return updates_; }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset() {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    started_ = false;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    finished_ = false;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    updates_.clear();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implements content::NotificationObserver interface.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case chrome::NOTIFICATION_EXTENSION_UPDATING_STARTED: {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_FALSE(started_);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        started_ = true;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case chrome::NOTIFICATION_EXTENSION_UPDATE_FOUND: {
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::string& id =
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            content::Details<extensions::UpdateDetails>(details)->id;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        updates_.insert(id);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnFinished() {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(finished_);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    finished_ = true;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Did we see EXTENSION_UPDATING_STARTED?
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool started_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Did we see EXTENSION_UPDATING_FINISHED?
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool finished_;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of extension id's we've seen via EXTENSION_UPDATE_FOUND.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> updates_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails consistently on Windows XP, see: http://crbug.com/120640.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AutoUpdate DISABLED_AutoUpdate
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/103371 and http://crbug.com/120640.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ADDRESS_SANITIZER)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AutoUpdate DISABLED_AutoUpdate
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AutoUpdate AutoUpdate
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests extension autoupdate.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, MAYBE_AutoUpdate) {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationListener notification_listener;
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath basedir = test_data_dir_.AppendASCII("autoupdate");
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This interceptor gets requests on the IO thread.
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLFetcher::SetEnableInterceptionForTests(true);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://localhost/autoupdate/manifest"),
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      basedir.AppendASCII("manifest_v2.xml"));
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          basedir.AppendASCII("v2.crx"));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install version 1 of the extension.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener listener1("v1 installed", false);
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExtensionRegistry* registry = ExtensionRegistry::Get(browser()->profile());
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t size_before = registry->enabled_extensions().size();
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(registry->disabled_extensions().is_empty());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension =
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallExtension(basedir.AppendASCII("v1.crx"), 1);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener1.WaitUntilSatisfied();
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(size_before + 1, registry->enabled_extensions().size());
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("ogjcoiohnmldgjemafoockdghcjciccf", extension->id());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0", extension->VersionString());
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionUpdater::CheckParams params;
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.callback =
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&NotificationListener::OnFinished,
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(&notification_listener));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run autoupdate and make sure version 2 of the extension was installed.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener listener2("v2 installed", false);
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service->updater()->CheckNow(params);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForExtensionInstall());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener2.WaitUntilSatisfied();
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(size_before + 1, registry->enabled_extensions().size());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ogjcoiohnmldgjemafoockdghcjciccf", false);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("2.0", extension->VersionString());
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(notification_listener.started());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(notification_listener.finished());
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ContainsKey(notification_listener.updates(),
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "ogjcoiohnmldgjemafoockdghcjciccf"));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_listener.Reset();
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try doing an update to version 3, which has been incorrectly
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // signed. This should fail.
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://localhost/autoupdate/manifest"),
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      basedir.AppendASCII("manifest_v3.xml"));
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v3.crx"),
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     basedir.AppendASCII("v3.crx"));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service->updater()->CheckNow(params);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForExtensionInstallError());
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(notification_listener.started());
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(notification_listener.finished());
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ContainsKey(notification_listener.updates(),
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "ogjcoiohnmldgjemafoockdghcjciccf"));
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the extension state is the same as before.
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(size_before + 1, registry->enabled_extensions().size());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ogjcoiohnmldgjemafoockdghcjciccf", false);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("2.0", extension->VersionString());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails consistently on Windows XP, see: http://crbug.com/120640.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AutoUpdateDisabledExtensions DISABLED_AutoUpdateDisabledExtensions
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ADDRESS_SANITIZER)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AutoUpdateDisabledExtensions DISABLED_AutoUpdateDisabledExtensions
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AutoUpdateDisabledExtensions AutoUpdateDisabledExtensions
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests extension autoupdate.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MAYBE_AutoUpdateDisabledExtensions) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationListener notification_listener;
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath basedir = test_data_dir_.AppendASCII("autoupdate");
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This interceptor gets requests on the IO thread.
341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLFetcher::SetEnableInterceptionForTests(true);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://localhost/autoupdate/manifest"),
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      basedir.AppendASCII("manifest_v2.xml"));
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     basedir.AppendASCII("v2.crx"));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install version 1 of the extension.
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener listener1("v1 installed", false);
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExtensionRegistry* registry = ExtensionRegistry::Get(browser()->profile());
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t enabled_size_before = registry->enabled_extensions().size();
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t disabled_size_before = registry->disabled_extensions().size();
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension =
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallExtension(basedir.AppendASCII("v1.crx"), 1);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener1.WaitUntilSatisfied();
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableExtension(extension->id());
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(disabled_size_before + 1, registry->disabled_extensions().size());
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(enabled_size_before, registry->enabled_extensions().size());
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("ogjcoiohnmldgjemafoockdghcjciccf", extension->id());
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0", extension->VersionString());
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionUpdater::CheckParams params;
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.callback =
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&NotificationListener::OnFinished,
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(&notification_listener));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener listener2("v2 installed", false);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run autoupdate and make sure version 2 of the extension was installed but
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is still disabled.
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service->updater()->CheckNow(params);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForExtensionInstall());
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(disabled_size_before + 1, registry->disabled_extensions().size());
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(enabled_size_before, registry->enabled_extensions().size());
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ogjcoiohnmldgjemafoockdghcjciccf", true);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(service->GetExtensionById(
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ogjcoiohnmldgjemafoockdghcjciccf", false));
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("2.0", extension->VersionString());
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The extension should have not made the callback because it is disabled.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When we enabled it, it should then make the callback.
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(listener2.was_satisfied());
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnableExtension(extension->id());
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener2.WaitUntilSatisfied();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(notification_listener.started());
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(notification_listener.finished());
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ContainsKey(notification_listener.updates(),
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "ogjcoiohnmldgjemafoockdghcjciccf"));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_listener.Reset();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, ExternalUrlUpdate) {
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kExtensionId = "ogjcoiohnmldgjemafoockdghcjciccf";
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionUpdater::CheckParams params;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath basedir = test_data_dir_.AppendASCII("autoupdate");
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This interceptor gets requests on the IO thread.
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLFetcher::SetEnableInterceptionForTests(true);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://localhost/autoupdate/manifest"),
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      basedir.AppendASCII("manifest_v2.xml"));
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     basedir.AppendASCII("v2.crx"));
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExtensionRegistry* registry = ExtensionRegistry::Get(browser()->profile());
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t size_before = registry->enabled_extensions().size();
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(registry->disabled_extensions().is_empty());
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::PendingExtensionManager* pending_extension_manager =
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service->pending_extension_manager();
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The code that reads external_extensions.json uses this method to inform
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the ExtensionService of an extension to download.  Using the real code
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is race-prone, because instantating the ExtensionService starts a read
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of external_extensions.json before this test function starts.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pending_extension_manager->AddFromExternalUpdateUrl(
429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      kExtensionId,
430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      std::string(),
431effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GURL("http://localhost/autoupdate/manifest"),
432effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Manifest::EXTERNAL_PREF_DOWNLOAD,
433effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Extension::NO_FLAGS,
434effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      false));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run autoupdate and make sure version 2 of the extension was installed.
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service->updater()->CheckNow(params);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForExtensionInstall());
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(size_before + 1, registry->enabled_extensions().size());
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = service->GetExtensionById(kExtensionId, false);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("2.0", extension->VersionString());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstalling the extension should set a pref that keeps the extension from
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being installed again the next time external_extensions.json is read.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(kExtensionId);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  extensions::ExtensionPrefs* extension_prefs =
450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      extensions::ExtensionPrefs::Get(browser()->profile());
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension_prefs->IsExternalExtensionUninstalled(kExtensionId))
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Uninstalling should set kill bit on externaly installed extension.";
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to install the extension again from an external source. It should fail
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because of the killbit.
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pending_extension_manager->AddFromExternalUpdateUrl(
457effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      kExtensionId,
458effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      std::string(),
459effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GURL("http://localhost/autoupdate/manifest"),
460effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Manifest::EXTERNAL_PREF_DOWNLOAD,
461effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      Extension::NO_FLAGS,
462effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      false));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pending_extension_manager->IsIdPending(kExtensionId))
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "External reinstall of a killed extension shouldn't work.";
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension_prefs->IsExternalExtensionUninstalled(kExtensionId))
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "External reinstall of a killed extension should leave it killed.";
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installing from non-external source.
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(basedir.AppendASCII("v2.crx"), 1));
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(extension_prefs->IsExternalExtensionUninstalled(kExtensionId))
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Reinstalling should clear the kill bit.";
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstalling from a non-external source should not set the kill bit.
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(kExtensionId);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(extension_prefs->IsExternalExtensionUninstalled(kExtensionId))
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Uninstalling non-external extension should not set kill bit.";
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kForceInstallNotEmptyHelp =
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A policy may already be controlling the list of force-installed "
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "extensions. Please remove all policy settings from your computer "
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "before running tests. E.g. from /etc/chromium/policies Linux or "
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "from the registry on Windows, etc.";
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/57378 for flakiness details.
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, ExternalPolicyRefresh) {
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kExtensionId = "ogjcoiohnmldgjemafoockdghcjciccf";
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath basedir = test_data_dir_.AppendASCII("autoupdate");
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This interceptor gets requests on the IO thread.
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLFetcher::SetEnableInterceptionForTests(true);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://localhost/autoupdate/manifest"),
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      basedir.AppendASCII("manifest_v2.xml"));
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     basedir.AppendASCII("v2.crx"));
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExtensionRegistry* registry = ExtensionRegistry::Get(browser()->profile());
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t size_before = registry->enabled_extensions().size();
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(registry->disabled_extensions().is_empty());
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = browser()->profile()->GetPrefs();
514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const base::DictionaryValue* forcelist =
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prefs->GetDictionary(extensions::pref_names::kInstallForceList);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(forcelist->empty()) << kForceInstallNotEmptyHelp;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set the policy as a user preference and fire notification observers.
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DictionaryPrefUpdate pref_update(prefs,
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     extensions::pref_names::kInstallForceList);
522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::DictionaryValue* forcelist = pref_update.Get();
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::ExternalPolicyLoader::AddExtension(
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        forcelist, kExtensionId, "http://localhost/autoupdate/manifest");
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if the extension got installed.
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForExtensionInstall());
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(size_before + 1, registry->enabled_extensions().size());
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = service->GetExtensionById(kExtensionId, false);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("2.0", extension->VersionString());
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::EXTERNAL_POLICY_DOWNLOAD, extension->location());
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to disable and uninstall the extension which should fail.
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableExtension(kExtensionId);
5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(size_before + 1, registry->enabled_extensions().size());
5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry->disabled_extensions().size());
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(kExtensionId);
5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(size_before + 1, registry->enabled_extensions().size());
5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry->disabled_extensions().size());
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try to disable it through the management api, again failing.
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener listener1("ready", false);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("management/uninstall_extension")));
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(listener1.WaitUntilSatisfied());
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(size_before + 2, registry->enabled_extensions().size());
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, registry->disabled_extensions().size());
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that emptying the list triggers uninstall.
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prefs->ClearPref(extensions::pref_names::kInstallForceList);
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(size_before + 1, registry->enabled_extensions().size());
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(service->GetExtensionById(kExtensionId, true));
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/103371 and http://crbug.com/120640.
5587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(ADDRESS_SANITIZER) || defined(OS_WIN)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PolicyOverridesUserInstall DISABLED_PolicyOverridesUserInstall
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PolicyOverridesUserInstall PolicyOverridesUserInstall
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MAYBE_PolicyOverridesUserInstall) {
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExtensionRegistry* registry = ExtensionRegistry::Get(browser()->profile());
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kExtensionId = "ogjcoiohnmldgjemafoockdghcjciccf";
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionUpdater::CheckParams params;
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service->updater()->set_default_check_params(params);
5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t size_before = registry->enabled_extensions().size();
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath basedir = test_data_dir_.AppendASCII("autoupdate");
5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(registry->disabled_extensions().is_empty());
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This interceptor gets requests on the IO thread.
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLFetcher::SetEnableInterceptionForTests(true);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://localhost/autoupdate/manifest"),
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      basedir.AppendASCII("manifest_v2.xml"));
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     basedir.AppendASCII("v2.crx"));
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the policy is initially empty.
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = browser()->profile()->GetPrefs();
588eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const base::DictionaryValue* forcelist =
5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prefs->GetDictionary(extensions::pref_names::kInstallForceList);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(forcelist->empty()) << kForceInstallNotEmptyHelp;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // User install of the extension.
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(basedir.AppendASCII("v2.crx"), 1));
5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(size_before + 1, registry->enabled_extensions().size());
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = service->GetExtensionById(kExtensionId, false);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::INTERNAL, extension->location());
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service->IsExtensionEnabled(kExtensionId));
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup the force install policy. It should override the location.
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DictionaryPrefUpdate pref_update(prefs,
6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     extensions::pref_names::kInstallForceList);
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::ExternalPolicyLoader::AddExtension(
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pref_update.Get(), kExtensionId,
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "http://localhost/autoupdate/manifest");
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForExtensionInstall());
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(size_before + 1, registry->enabled_extensions().size());
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(kExtensionId, false);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::EXTERNAL_POLICY_DOWNLOAD, extension->location());
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service->IsExtensionEnabled(kExtensionId));
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the policy, and verify that the extension was uninstalled.
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(joaodasilva): it would be nicer if the extension was kept instead,
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and reverted location to INTERNAL or whatever it was before the policy
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // was applied.
6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prefs->ClearPref(extensions::pref_names::kInstallForceList);
6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(size_before, registry->enabled_extensions().size());
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(kExtensionId, true);
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(extension);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // User install again, but have it disabled too before setting the policy.
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(basedir.AppendASCII("v2.crx"), 1));
6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(size_before + 1, registry->enabled_extensions().size());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(kExtensionId, false);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::INTERNAL, extension->location());
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service->IsExtensionEnabled(kExtensionId));
6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(registry->disabled_extensions().is_empty());
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableExtension(kExtensionId);
6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1u, registry->disabled_extensions().size());
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(kExtensionId, true);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(service->IsExtensionEnabled(kExtensionId));
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install the policy again. It should overwrite the extension's location,
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and force enable it too.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DictionaryPrefUpdate pref_update(prefs,
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     extensions::pref_names::kInstallForceList);
644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::DictionaryValue* forcelist = pref_update.Get();
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::ExternalPolicyLoader::AddExtension(
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        forcelist, kExtensionId, "http://localhost/autoupdate/manifest");
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForExtensionInstall());
6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(size_before + 1, registry->enabled_extensions().size());
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(kExtensionId, false);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::EXTERNAL_POLICY_DOWNLOAD, extension->location());
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service->IsExtensionEnabled(kExtensionId));
6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(registry->disabled_extensions().is_empty());
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
656