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"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_host.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_test_message_listener.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/external_policy_loader.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/updater/extension_downloader.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/updater/extension_updater.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/scoped_user_pref_update.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/test/net/url_request_prepackaged_interceptor.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Manifest;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionManagementTest : public ExtensionBrowserTest {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method that returns whether the extension is at the given version.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This calls version(), which must be defined in the extension's bg page,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as well as asking the extension itself.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that 'version' here means something different than the version field
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the extension's manifest. We use the version as reported by the
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // background page to test how overinstalling crx files with the same
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // manifest version works.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExtensionAtVersion(const Extension* extension,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& expected_version) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test that the extension's version from the manifest and reported by the
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // background page is correct.  This is to ensure that the processes are in
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // sync with the Extension.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionProcessManager* manager =
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extensions::ExtensionSystem::Get(browser()->profile())->
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            process_manager();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::ExtensionHost* ext_host =
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        manager->GetBackgroundHostForExtension(extension->id());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ext_host);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ext_host)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string version_from_bg;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool exec = content::ExecuteScriptAndExtractString(
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ext_host->render_view_host(), "version()", &version_from_bg);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(exec);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!exec)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (version_from_bg != expected_version ||
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extension->VersionString() != expected_version)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Times out sometimes on Linux.  http://crbug.com/89727
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_InstallSameVersion DISABLED_InstallSameVersion
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_InstallSameVersion InstallSameVersion
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that installing the same version overwrites.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, MAYBE_InstallSameVersion) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = InstallExtension(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("install/install.crx"), 1);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath old_path = extension->path();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install an extension with the same version. The previous install should be
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // overwritten.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = InstallExtension(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("install/install_same_version.crx"), 0);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath new_path = extension->path();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsExtensionAtVersion(extension, "1.0"));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(old_path.value(), new_path.value());
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, InstallOlderVersion) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = InstallExtension(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("install/install.crx"), 1);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(InstallExtension(
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("install/install_older_version.crx"), 0));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsExtensionAtVersion(extension, "1.0"));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, InstallThenCancel) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = InstallExtension(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("install/install.crx"), 1);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel this install.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(StartInstallButCancel(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("install/install_v2.crx")));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsExtensionAtVersion(extension, "1.0"));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/141913
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_InstallRequiresConfirm DISABLED_InstallRequiresConfirm
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_InstallRequiresConfirm InstallRequiresConfirm
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, MAYBE_InstallRequiresConfirm) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installing the extension without an auto confirming UI should result in
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it being disabled, since good.crx has permissions that require approval.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id = "ldnnhddmnhbkjipkidpdiheffobcpfmf";
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(InstallExtension(test_data_dir_.AppendASCII("good.crx"), 0));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(service->GetExtensionById(id, true));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(id);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the install should succeed when the permissions are accepted.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(InstallExtensionWithUIAutoConfirm(
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("good.crx"), 1, browser()));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(id);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that disabling and re-enabling an extension works.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, DisableEnable) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionProcessManager* manager =
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::ExtensionSystem::Get(browser()->profile())->process_manager();
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = service->extensions()->size();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an extension, expect the background page to be available.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string extension_id = "bjafgdebaacbbbecmhlhpofkepfkgcpa";
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("good").AppendASCII("Extensions")
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    .AppendASCII(extension_id)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    .AppendASCII("1.0")));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, service->extensions()->size());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, service->disabled_extensions()->size());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager->GetBackgroundHostForExtension(extension_id));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After disabling, the background page should go away.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableExtension(extension_id);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size_before, service->extensions()->size());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, service->disabled_extensions()->size());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager->GetBackgroundHostForExtension(extension_id));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And bring it back.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnableExtension(extension_id);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size_before + 1, service->extensions()->size());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, service->disabled_extensions()->size());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager->GetBackgroundHostForExtension(extension_id));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used for testing notifications sent during extension updates.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotificationListener : public content::NotificationObserver {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationListener() : started_(false), finished_(false) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int types[] = {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_EXTENSION_UPDATING_STARTED,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_EXTENSION_UPDATE_FOUND
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < arraysize(types); i++) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      registrar_.Add(
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this, types[i], content::NotificationService::AllSources());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~NotificationListener() {}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool started() { return started_; }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool finished() { return finished_; }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::set<std::string>& updates() { return updates_; }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset() {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    started_ = false;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    finished_ = false;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    updates_.clear();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implements content::NotificationObserver interface.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case chrome::NOTIFICATION_EXTENSION_UPDATING_STARTED: {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_FALSE(started_);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        started_ = true;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case chrome::NOTIFICATION_EXTENSION_UPDATE_FOUND: {
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::string& id =
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            content::Details<extensions::UpdateDetails>(details)->id;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        updates_.insert(id);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnFinished() {
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(finished_);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    finished_ = true;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Did we see EXTENSION_UPDATING_STARTED?
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool started_;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Did we see EXTENSION_UPDATING_FINISHED?
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool finished_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of extension id's we've seen via EXTENSION_UPDATE_FOUND.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> updates_;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails consistently on Windows XP, see: http://crbug.com/120640.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AutoUpdate DISABLED_AutoUpdate
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/103371 and http://crbug.com/120640.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ADDRESS_SANITIZER)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AutoUpdate DISABLED_AutoUpdate
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AutoUpdate AutoUpdate
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests extension autoupdate.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, MAYBE_AutoUpdate) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationListener notification_listener;
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath basedir = test_data_dir_.AppendASCII("autoupdate");
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This interceptor gets requests on the IO thread.
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLFetcher::SetEnableInterceptionForTests(true);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://localhost/autoupdate/manifest"),
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      basedir.AppendASCII("manifest_v2.xml"));
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          basedir.AppendASCII("v2.crx"));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install version 1 of the extension.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener listener1("v1 installed", false);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = service->extensions()->size();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(service->disabled_extensions()->is_empty());
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension =
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallExtension(basedir.AppendASCII("v1.crx"), 1);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener1.WaitUntilSatisfied();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, service->extensions()->size());
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("ogjcoiohnmldgjemafoockdghcjciccf", extension->id());
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0", extension->VersionString());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't want autoupdate blacklist checks.
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionUpdater::CheckParams params;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.check_blacklist = false;
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.callback =
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&NotificationListener::OnFinished,
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(&notification_listener));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run autoupdate and make sure version 2 of the extension was installed.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener listener2("v2 installed", false);
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service->updater()->CheckNow(params);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForExtensionInstall());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener2.WaitUntilSatisfied();
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, service->extensions()->size());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ogjcoiohnmldgjemafoockdghcjciccf", false);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("2.0", extension->VersionString());
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(notification_listener.started());
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(notification_listener.finished());
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ContainsKey(notification_listener.updates(),
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "ogjcoiohnmldgjemafoockdghcjciccf"));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_listener.Reset();
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try doing an update to version 3, which has been incorrectly
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // signed. This should fail.
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://localhost/autoupdate/manifest"),
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      basedir.AppendASCII("manifest_v3.xml"));
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v3.crx"),
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     basedir.AppendASCII("v3.crx"));
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service->updater()->CheckNow(params);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForExtensionInstallError());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(notification_listener.started());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(notification_listener.finished());
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ContainsKey(notification_listener.updates(),
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "ogjcoiohnmldgjemafoockdghcjciccf"));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the extension state is the same as before.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, service->extensions()->size());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ogjcoiohnmldgjemafoockdghcjciccf", false);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("2.0", extension->VersionString());
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails consistently on Windows XP, see: http://crbug.com/120640.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AutoUpdateDisabledExtensions DISABLED_AutoUpdateDisabledExtensions
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ADDRESS_SANITIZER)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AutoUpdateDisabledExtensions DISABLED_AutoUpdateDisabledExtensions
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_AutoUpdateDisabledExtensions AutoUpdateDisabledExtensions
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests extension autoupdate.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MAYBE_AutoUpdateDisabledExtensions) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationListener notification_listener;
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath basedir = test_data_dir_.AppendASCII("autoupdate");
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This interceptor gets requests on the IO thread.
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLFetcher::SetEnableInterceptionForTests(true);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://localhost/autoupdate/manifest"),
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      basedir.AppendASCII("manifest_v2.xml"));
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     basedir.AppendASCII("v2.crx"));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install version 1 of the extension.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener listener1("v1 installed", false);
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t enabled_size_before = service->extensions()->size();
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t disabled_size_before = service->disabled_extensions()->size();
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension =
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallExtension(basedir.AppendASCII("v1.crx"), 1);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener1.WaitUntilSatisfied();
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableExtension(extension->id());
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(disabled_size_before + 1, service->disabled_extensions()->size());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(enabled_size_before, service->extensions()->size());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("ogjcoiohnmldgjemafoockdghcjciccf", extension->id());
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("1.0", extension->VersionString());
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't want autoupdate blacklist checks.
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionUpdater::CheckParams params;
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.check_blacklist = false;
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.callback =
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&NotificationListener::OnFinished,
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(&notification_listener));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener listener2("v2 installed", false);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run autoupdate and make sure version 2 of the extension was installed but
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is still disabled.
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service->updater()->CheckNow(params);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForExtensionInstall());
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(disabled_size_before + 1, service->disabled_extensions()->size());
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(enabled_size_before, service->extensions()->size());
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ogjcoiohnmldgjemafoockdghcjciccf", true);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(service->GetExtensionById(
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ogjcoiohnmldgjemafoockdghcjciccf", false));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("2.0", extension->VersionString());
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The extension should have not made the callback because it is disabled.
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When we enabled it, it should then make the callback.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(listener2.was_satisfied());
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnableExtension(extension->id());
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener2.WaitUntilSatisfied();
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(notification_listener.started());
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(notification_listener.finished());
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ContainsKey(notification_listener.updates(),
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "ogjcoiohnmldgjemafoockdghcjciccf"));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_listener.Reset();
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ExternalUrlUpdate DISABLED_ExternalUrlUpdate
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ExternalUrlUpdate ExternalUrlUpdate
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, MAYBE_ExternalUrlUpdate) {
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kExtensionId = "ogjcoiohnmldgjemafoockdghcjciccf";
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't want autoupdate blacklist checks.
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionUpdater::CheckParams params;
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.check_blacklist = false;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath basedir = test_data_dir_.AppendASCII("autoupdate");
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This interceptor gets requests on the IO thread.
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLFetcher::SetEnableInterceptionForTests(true);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://localhost/autoupdate/manifest"),
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      basedir.AppendASCII("manifest_v2.xml"));
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     basedir.AppendASCII("v2.crx"));
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = service->extensions()->size();
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(service->disabled_extensions()->is_empty());
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::PendingExtensionManager* pending_extension_manager =
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service->pending_extension_manager();
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The code that reads external_extensions.json uses this method to inform
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the ExtensionService of an extension to download.  Using the real code
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is race-prone, because instantating the ExtensionService starts a read
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of external_extensions.json before this test function starts.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pending_extension_manager->AddFromExternalUpdateUrl(
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kExtensionId, GURL("http://localhost/autoupdate/manifest"),
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Manifest::EXTERNAL_PREF_DOWNLOAD));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run autoupdate and make sure version 2 of the extension was installed.
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service->updater()->CheckNow(params);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForExtensionInstall());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, service->extensions()->size());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = service->GetExtensionById(kExtensionId, false);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("2.0", extension->VersionString());
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstalling the extension should set a pref that keeps the extension from
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being installed again the next time external_extensions.json is read.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(kExtensionId);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionPrefs* extension_prefs = service->extension_prefs();
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension_prefs->IsExternalExtensionUninstalled(kExtensionId))
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Uninstalling should set kill bit on externaly installed extension.";
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to install the extension again from an external source. It should fail
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because of the killbit.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pending_extension_manager->AddFromExternalUpdateUrl(
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kExtensionId, GURL("http://localhost/autoupdate/manifest"),
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Manifest::EXTERNAL_PREF_DOWNLOAD));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pending_extension_manager->IsIdPending(kExtensionId))
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "External reinstall of a killed extension shouldn't work.";
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension_prefs->IsExternalExtensionUninstalled(kExtensionId))
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "External reinstall of a killed extension should leave it killed.";
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installing from non-external source.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(basedir.AppendASCII("v2.crx"), 1));
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(extension_prefs->IsExternalExtensionUninstalled(kExtensionId))
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Reinstalling should clear the kill bit.";
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstalling from a non-external source should not set the kill bit.
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(kExtensionId);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(extension_prefs->IsExternalExtensionUninstalled(kExtensionId))
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Uninstalling non-external extension should not set kill bit.";
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kForceInstallNotEmptyHelp =
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "A policy may already be controlling the list of force-installed "
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "extensions. Please remove all policy settings from your computer "
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "before running tests. E.g. from /etc/chromium/policies Linux or "
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "from the registry on Windows, etc.";
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/57378 for flakiness details.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, ExternalPolicyRefresh) {
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kExtensionId = "ogjcoiohnmldgjemafoockdghcjciccf";
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't want autoupdate blacklist checks.
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionUpdater::CheckParams params;
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.check_blacklist = false;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath basedir = test_data_dir_.AppendASCII("autoupdate");
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This interceptor gets requests on the IO thread.
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLFetcher::SetEnableInterceptionForTests(true);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://localhost/autoupdate/manifest"),
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      basedir.AppendASCII("manifest_v2.xml"));
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     basedir.AppendASCII("v2.crx"));
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = service->extensions()->size();
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(service->disabled_extensions()->is_empty());
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = browser()->profile()->GetPrefs();
514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const base::DictionaryValue* forcelist =
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs->GetDictionary(prefs::kExtensionInstallForceList);
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.
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DictionaryPrefUpdate pref_update(prefs, prefs::kExtensionInstallForceList);
521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::DictionaryValue* forcelist = pref_update.Get();
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::ExternalPolicyLoader::AddExtension(
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        forcelist, kExtensionId, "http://localhost/autoupdate/manifest");
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if the extension got installed.
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForExtensionInstall());
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, service->extensions()->size());
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = service->GetExtensionById(kExtensionId, false);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("2.0", extension->VersionString());
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::EXTERNAL_POLICY_DOWNLOAD, extension->location());
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to disable and uninstall the extension which should fail.
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableExtension(kExtensionId);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size_before + 1, service->extensions()->size());
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, service->disabled_extensions()->size());
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(kExtensionId);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size_before + 1, service->extensions()->size());
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, service->disabled_extensions()->size());
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try to disable it through the management api, again failing.
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionTestMessageListener listener1("ready", false);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("management/uninstall_extension")));
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(listener1.WaitUntilSatisfied());
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size_before + 2, service->extensions()->size());
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, service->disabled_extensions()->size());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that emptying the list triggers uninstall.
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs->ClearPref(prefs::kExtensionInstallForceList);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size_before + 1, service->extensions()->size());
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(service->GetExtensionById(kExtensionId, true));
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/103371 and http://crbug.com/120640.
5577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(ADDRESS_SANITIZER) || defined(OS_WIN)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PolicyOverridesUserInstall DISABLED_PolicyOverridesUserInstall
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PolicyOverridesUserInstall PolicyOverridesUserInstall
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionManagementTest,
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MAYBE_PolicyOverridesUserInstall) {
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kExtensionId = "ogjcoiohnmldgjemafoockdghcjciccf";
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionUpdater::CheckParams params;
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.check_blacklist = false;
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service->updater()->set_default_check_params(params);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = service->extensions()->size();
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath basedir = test_data_dir_.AppendASCII("autoupdate");
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(service->disabled_extensions()->is_empty());
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This interceptor gets requests on the IO thread.
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::URLLocalHostRequestPrepackagedInterceptor interceptor;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLFetcher::SetEnableInterceptionForTests(true);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://localhost/autoupdate/manifest"),
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      basedir.AppendASCII("manifest_v2.xml"));
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interceptor.SetResponseIgnoreQuery(GURL("http://localhost/autoupdate/v2.crx"),
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     basedir.AppendASCII("v2.crx"));
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the policy is initially empty.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = browser()->profile()->GetPrefs();
587eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const base::DictionaryValue* forcelist =
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs->GetDictionary(prefs::kExtensionInstallForceList);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(forcelist->empty()) << kForceInstallNotEmptyHelp;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // User install of the extension.
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(basedir.AppendASCII("v2.crx"), 1));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, service->extensions()->size());
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = service->GetExtensionById(kExtensionId, false);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::INTERNAL, extension->location());
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service->IsExtensionEnabled(kExtensionId));
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup the force install policy. It should override the location.
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DictionaryPrefUpdate pref_update(prefs, prefs::kExtensionInstallForceList);
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::ExternalPolicyLoader::AddExtension(
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pref_update.Get(), kExtensionId,
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "http://localhost/autoupdate/manifest");
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForExtensionInstall());
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, service->extensions()->size());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(kExtensionId, false);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::EXTERNAL_POLICY_DOWNLOAD, extension->location());
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service->IsExtensionEnabled(kExtensionId));
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the policy, and verify that the extension was uninstalled.
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(joaodasilva): it would be nicer if the extension was kept instead,
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and reverted location to INTERNAL or whatever it was before the policy
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // was applied.
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs->ClearPref(prefs::kExtensionInstallForceList);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before, service->extensions()->size());
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(kExtensionId, true);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(extension);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // User install again, but have it disabled too before setting the policy.
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(basedir.AppendASCII("v2.crx"), 1));
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, service->extensions()->size());
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(kExtensionId, false);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::INTERNAL, extension->location());
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service->IsExtensionEnabled(kExtensionId));
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service->disabled_extensions()->is_empty());
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableExtension(kExtensionId);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, service->disabled_extensions()->size());
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(kExtensionId, true);
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(service->IsExtensionEnabled(kExtensionId));
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install the policy again. It should overwrite the extension's location,
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and force enable it too.
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DictionaryPrefUpdate pref_update(prefs, prefs::kExtensionInstallForceList);
641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::DictionaryValue* forcelist = pref_update.Get();
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::ExternalPolicyLoader::AddExtension(
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        forcelist, kExtensionId, "http://localhost/autoupdate/manifest");
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(WaitForExtensionInstall());
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, service->extensions()->size());
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = service->GetExtensionById(kExtensionId, false);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension);
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(Manifest::EXTERNAL_POLICY_DOWNLOAD, extension->location());
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service->IsExtensionEnabled(kExtensionId));
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service->disabled_extensions()->is_empty());
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
653