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