test_extension_system.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/test_extension_system.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/blacklist.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/event_router.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_info_map.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_pref_value_map.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_pref_value_map_factory.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/extensions/extension_prefs.h"
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/extensions/extension_prefs_factory.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_process_manager.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/management_policy.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/standard_management_policy_provider.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/state_store.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/user_script_master.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/value_store/testing_value_store.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestExtensionSystem::TestExtensionSystem(Profile* profile)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : profile_(profile),
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      value_store_(NULL),
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      info_map_(new ExtensionInfoMap()) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestExtensionSystem::~TestExtensionSystem() {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestExtensionSystem::Shutdown() {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_process_manager_.reset();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestExtensionSystem::CreateExtensionProcessManager() {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_process_manager_.reset(ExtensionProcessManager::Create(profile_));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestExtensionSystem::CreateSocketManager() {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that we're intentionally creating the socket manager on the wrong
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread (not the IO thread). This is because we don't want to presume or
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // require that there be an IO thread in a lightweight test context. If we do
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need thread-specific behavior someday, we'll probably need something like
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CreateSocketManagerOnThreadForTesting(thread_id). But not today.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::ID id;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(BrowserThread::GetCurrentThreadIdentifier(&id));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_manager_.reset(new ApiResourceManager<Socket>(id));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ExtensionPrefs* TestExtensionSystem::CreateExtensionPrefs(
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CommandLine* command_line,
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& install_directory) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool extensions_disabled =
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_line && command_line->HasSwitch(switches::kDisableExtensions);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that the GetPrefs() creates a TestingPrefService, therefore
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // the extension controlled pref values set in ExtensionPrefs
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are not reflected in the pref service. One would need to
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // inject a new ExtensionPrefStore(extension_pref_value_map, false).
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExtensionPrefs* extension_prefs = ExtensionPrefs::Create(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_->GetPrefs(),
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      install_directory,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionPrefValueMapFactory::GetForProfile(profile_),
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions_disabled);
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ExtensionPrefsFactory::GetInstance()->SetInstanceForTesting(
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        profile_,
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        extension_prefs);
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return extension_prefs;
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ExtensionService* TestExtensionSystem::CreateExtensionService(
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const CommandLine* command_line,
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& install_directory,
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool autoupdate_enabled) {
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!ExtensionPrefs::Get(profile_))
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CreateExtensionPrefs(command_line, install_directory);
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The ownership of |value_store_| is immediately transferred to state_store_,
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // but we keep a naked pointer to the TestingValueStore.
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  value_store_ = new TestingValueStore();
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  state_store_.reset(new StateStore(profile_, value_store_));
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  blacklist_.reset(new Blacklist(ExtensionPrefs::Get(profile_)));
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  standard_management_policy_provider_.reset(
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      new StandardManagementPolicyProvider(ExtensionPrefs::Get(profile_)));
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  management_policy_.reset(new ManagementPolicy());
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  management_policy_->RegisterProvider(
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      standard_management_policy_provider_.get());
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_service_.reset(new ExtensionService(profile_,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                command_line,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                install_directory,
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                ExtensionPrefs::Get(profile_),
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                blacklist_.get(),
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                autoupdate_enabled,
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                true,
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                &ready_));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_service_->ClearProvidersForTesting();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return extension_service_.get();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionService* TestExtensionSystem::extension_service() {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return extension_service_.get();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ManagementPolicy* TestExtensionSystem::management_policy() {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return management_policy_.get();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestExtensionSystem::SetExtensionService(ExtensionService* service) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_service_.reset(service);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UserScriptMaster* TestExtensionSystem::user_script_master() {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionProcessManager* TestExtensionSystem::process_manager() {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return extension_process_manager_.get();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StateStore* TestExtensionSystem::state_store() {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return state_store_.get();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StateStore* TestExtensionSystem::rules_store() {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return state_store_.get();
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionInfoMap* TestExtensionSystem::info_map() {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return info_map_.get();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LazyBackgroundTaskQueue*
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestExtensionSystem::lazy_background_task_queue() {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EventRouter* TestExtensionSystem::event_router() {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RulesRegistryService* TestExtensionSystem::rules_registry_service() {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ApiResourceManager<SerialConnection>*
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestExtensionSystem::serial_connection_manager() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ApiResourceManager<Socket>*TestExtensionSystem::socket_manager() {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return socket_manager_.get();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ApiResourceManager<UsbDeviceResource>*
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestExtensionSystem::usb_device_resource_manager() {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionWarningService* TestExtensionSystem::warning_service() {
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return NULL;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Blacklist* TestExtensionSystem::blacklist() {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return blacklist_.get();
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const OneShotEvent& TestExtensionSystem::ready() const {
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return ready_;
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)BrowserContextKeyedService* TestExtensionSystem::Build(
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* profile) {
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return new TestExtensionSystem(static_cast<Profile*>(profile));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
188