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