15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_extension_system.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/file_path.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/browser_context.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/notification_details.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/notification_service.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/notification_source.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/api/app_runtime/app_runtime_api.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/event_router.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_prefs.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_registry.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/info_map.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/lazy_background_task_queue.h" 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/notification_types.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/process_manager.h" 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/quota_service.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/runtime_data.h" 26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "extensions/common/file_util.h" 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::BrowserContext; 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::BrowserThread; 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace extensions { 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ShellExtensionSystem::ShellExtensionSystem(BrowserContext* browser_context) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : browser_context_(browser_context) { 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ShellExtensionSystem::~ShellExtensionSystem() { 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ShellExtensionSystem::LoadApp(const base::FilePath& app_dir) { 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // app_shell only supports unpacked extensions. 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // NOTE: If you add packed extension support consider removing the flag 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // FOLLOW_SYMLINKS_ANYWHERE below. Packed extensions should not have symlinks. 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CHECK(base::DirectoryExists(app_dir)) << app_dir.AsUTF8Unsafe(); 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int load_flags = Extension::FOLLOW_SYMLINKS_ANYWHERE; 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string load_error; 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_ = file_util::LoadExtension( 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) app_dir, Manifest::COMMAND_LINE, load_flags, &load_error); 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!extension_.get()) { 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LOG(ERROR) << "Loading extension at " << app_dir.value() 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) << " failed with: " << load_error; 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) app_id_ = extension_->id(); 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(jamescook): We may want to do some of these things here: 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // * Create a PermissionsUpdater. 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // * Call PermissionsUpdater::GrantActivePermissions(). 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // * Call ExtensionService::SatisfyImports(). 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // * Call ExtensionPrefs::OnExtensionInstalled(). 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // * Send NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED. 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionRegistry::Get(browser_context_)->AddEnabled(extension_); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RegisterExtensionWithRequestContexts(extension_.get()); 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NotificationService::current()->Notify( 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Source<BrowserContext>(browser_context_), 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::Details<const Extension>(extension_.get())); 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Inform the rest of the extensions system to start. 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ready_.Signal(); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NotificationService::current()->Notify( 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED, 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Source<BrowserContext>(browser_context_), 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NotificationService::NoDetails()); 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ShellExtensionSystem::LaunchApp() { 82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Send the onLaunched event. 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(extension_.get()); 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AppRuntimeEventRouter::DispatchOnLaunchedEvent(browser_context_, 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extension_.get()); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellExtensionSystem::Shutdown() { 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellExtensionSystem::InitForRegularProfile(bool extensions_enabled) { 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) runtime_data_.reset( 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new RuntimeData(ExtensionRegistry::Get(browser_context_))); 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) lazy_background_task_queue_.reset( 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new LazyBackgroundTaskQueue(browser_context_)); 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event_router_.reset( 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new EventRouter(browser_context_, ExtensionPrefs::Get(browser_context_))); 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process_manager_.reset(ProcessManager::Create(browser_context_)); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) quota_service_.reset(new QuotaService); 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ExtensionService* ShellExtensionSystem::extension_service() { 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)RuntimeData* ShellExtensionSystem::runtime_data() { 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return runtime_data_.get(); 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ManagementPolicy* ShellExtensionSystem::management_policy() { 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)SharedUserScriptMaster* ShellExtensionSystem::shared_user_script_master() { 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProcessManager* ShellExtensionSystem::process_manager() { 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return process_manager_.get(); 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)StateStore* ShellExtensionSystem::state_store() { 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)StateStore* ShellExtensionSystem::rules_store() { 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)InfoMap* ShellExtensionSystem::info_map() { 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!info_map_.get()) 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info_map_ = new InfoMap; 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return info_map_.get(); 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)LazyBackgroundTaskQueue* ShellExtensionSystem::lazy_background_task_queue() { 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return lazy_background_task_queue_.get(); 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)EventRouter* ShellExtensionSystem::event_router() { 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return event_router_.get(); 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciWarningService* ShellExtensionSystem::warning_service() { 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Blacklist* ShellExtensionSystem::blacklist() { 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ErrorConsole* ShellExtensionSystem::error_console() { 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)InstallVerifier* ShellExtensionSystem::install_verifier() { 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuotaService* ShellExtensionSystem::quota_service() { 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return quota_service_.get(); 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellExtensionSystem::RegisterExtensionWithRequestContexts( 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Extension* extension) { 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::IO, 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FROM_HERE, 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&InfoMap::AddExtension, 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info_map(), 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) make_scoped_refptr(extension), 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Time::Now(), 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false, 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false)); 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellExtensionSystem::UnregisterExtensionWithRequestContexts( 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& extension_id, 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const UnloadedExtensionInfo::Reason reason) { 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const OneShotEvent& ShellExtensionSystem::ready() const { 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ready_; 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ContentVerifier* ShellExtensionSystem::content_verifier() { 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return NULL; 187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)scoped_ptr<ExtensionSet> ShellExtensionSystem::GetDependentExtensions( 190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension) { 191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<ExtensionSet> empty(new ExtensionSet()); 192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return empty.PassAs<ExtensionSet>(); 193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)DeclarativeUserScriptMaster* 1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ShellExtensionSystem::GetDeclarativeUserScriptMasterByExtension( 1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const ExtensionId& extension_id) { 1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return NULL; 1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace extensions 202