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(¬ification_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(¬ification_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