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" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/declarative_user_script_master.h" 11558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/extensions/error_console/error_console.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_management.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/extensions/install_verifier.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/extensions/shared_module_service.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/event_router.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_pref_value_map.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_pref_value_map_factory.h" 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_prefs.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_prefs_factory.h" 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_registry.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/extensions_browser_client.h" 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/info_map.h" 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/management_policy.h" 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/process_manager.h" 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/quota_service.h" 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/runtime_data.h" 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/state_store.h" 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/value_store/testing_value_store.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestExtensionSystem::TestExtensionSystem(Profile* profile) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_(profile), 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) value_store_(NULL), 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) info_map_(new InfoMap()), 43e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch error_console_(new ErrorConsole(profile)), 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) quota_service_(new QuotaService()) {} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestExtensionSystem::~TestExtensionSystem() { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestExtensionSystem::Shutdown() { 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (extension_service_) 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension_service_->Shutdown(); 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) process_manager_.reset(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TestExtensionSystem::CreateProcessManager() { 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) process_manager_.reset(ProcessManager::Create(profile_)); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TestExtensionSystem::SetProcessManager(ProcessManager* manager) { 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) process_manager_.reset(manager); 611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ExtensionPrefs* TestExtensionSystem::CreateExtensionPrefs( 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine* command_line, 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& install_directory) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool extensions_disabled = 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line && command_line->HasSwitch(switches::kDisableExtensions); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that the GetPrefs() creates a TestingPrefService, therefore 7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the extension controlled pref values set in ExtensionPrefs 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are not reflected in the pref service. One would need to 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // inject a new ExtensionPrefStore(extension_pref_value_map, false). 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ExtensionPrefs* extension_prefs = ExtensionPrefs::Create( 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetPrefs(), 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_directory, 771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ExtensionPrefValueMapFactory::GetForBrowserContext(profile_), 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ExtensionsBrowserClient::Get()->CreateAppSorting().Pass(), 79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch extensions_disabled, 80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch std::vector<ExtensionPrefsObserver*>()); 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ExtensionPrefsFactory::GetInstance()->SetInstanceForTesting( 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) profile_, 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) extension_prefs); 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return extension_prefs; 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ExtensionService* TestExtensionSystem::CreateExtensionService( 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const CommandLine* command_line, 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& install_directory, 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool autoupdate_enabled) { 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!ExtensionPrefs::Get(profile_)) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateExtensionPrefs(command_line, install_directory); 93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch install_verifier_.reset( 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new InstallVerifier(ExtensionPrefs::Get(profile_), profile_)); 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The ownership of |value_store_| is immediately transferred to state_store_, 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // but we keep a naked pointer to the TestingValueStore. 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<TestingValueStore> value_store(new TestingValueStore()); 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) value_store_ = value_store.get(); 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) state_store_.reset( 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new StateStore(profile_, value_store.PassAs<ValueStore>())); 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) blacklist_.reset(new Blacklist(ExtensionPrefs::Get(profile_))); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) management_policy_.reset(new ManagementPolicy()); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) management_policy_->RegisterProvider( 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionManagementFactory::GetForBrowserContext(profile_) 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->GetProvider()); 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) runtime_data_.reset(new RuntimeData(ExtensionRegistry::Get(profile_))); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_service_.reset(new ExtensionService(profile_, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_directory, 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ExtensionPrefs::Get(profile_), 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) blacklist_.get(), 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autoupdate_enabled, 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) true, 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &ready_)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_service_->ClearProvidersForTesting(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_service_.get(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionService* TestExtensionSystem::extension_service() { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_service_.get(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)RuntimeData* TestExtensionSystem::runtime_data() { 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return runtime_data_.get(); 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ManagementPolicy* TestExtensionSystem::management_policy() { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return management_policy_.get(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestExtensionSystem::SetExtensionService(ExtensionService* service) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_service_.reset(service); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)SharedUserScriptMaster* TestExtensionSystem::shared_user_script_master() { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ProcessManager* TestExtensionSystem::process_manager() { 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return process_manager_.get(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StateStore* TestExtensionSystem::state_store() { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return state_store_.get(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StateStore* TestExtensionSystem::rules_store() { 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return state_store_.get(); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InfoMap* TestExtensionSystem::info_map() { return info_map_.get(); } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LazyBackgroundTaskQueue* 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestExtensionSystem::lazy_background_task_queue() { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TestExtensionSystem::SetEventRouter(scoped_ptr<EventRouter> event_router) { 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) event_router_.reset(event_router.release()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)EventRouter* TestExtensionSystem::event_router() { return event_router_.get(); } 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciWarningService* TestExtensionSystem::warning_service() { 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Blacklist* TestExtensionSystem::blacklist() { 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return blacklist_.get(); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochErrorConsole* TestExtensionSystem::error_console() { 173558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return error_console_.get(); 174558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 175558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InstallVerifier* TestExtensionSystem::install_verifier() { 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return install_verifier_.get(); 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuotaService* TestExtensionSystem::quota_service() { 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return quota_service_.get(); 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const OneShotEvent& TestExtensionSystem::ready() const { 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ready_; 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ContentVerifier* TestExtensionSystem::content_verifier() { 189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return NULL; 190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)scoped_ptr<ExtensionSet> TestExtensionSystem::GetDependentExtensions( 193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension) { 194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return extension_service()->shared_module_service()->GetDependentExtensions( 195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension); 196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)DeclarativeUserScriptMaster* 1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TestExtensionSystem::GetDeclarativeUserScriptMasterByExtension( 2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const ExtensionId& extension_id) { 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(ready().is_signaled()); 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DeclarativeUserScriptMaster* master = NULL; 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ScopedVector<DeclarativeUserScriptMaster>::iterator it = 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declarative_user_script_masters_.begin(); 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it != declarative_user_script_masters_.end(); 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++it) { 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if ((*it)->extension_id() == extension_id) { 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci master = *it; 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!master) { 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci master = new DeclarativeUserScriptMaster(profile_, extension_id); 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci declarative_user_script_masters_.push_back(master); 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return master; 2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* TestExtensionSystem::Build(content::BrowserContext* profile) { 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new TestExtensionSystem(static_cast<Profile*>(profile)); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 225