1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_EXTENSIONS_PLUGIN_MANAGER_H_
6#define CHROME_BROWSER_EXTENSIONS_PLUGIN_MANAGER_H_
7
8#include <set>
9#include <string>
10
11#include "base/scoped_observer.h"
12#include "extensions/browser/browser_context_keyed_api_factory.h"
13#include "extensions/browser/extension_registry_observer.h"
14#include "extensions/common/manifest_handlers/nacl_modules_handler.h"
15
16class GURL;
17class Profile;
18
19namespace content {
20class BrowserContext;
21}
22
23namespace extensions {
24class ExtensionRegistry;
25
26class PluginManager : public BrowserContextKeyedAPI,
27                      public ExtensionRegistryObserver {
28 public:
29  explicit PluginManager(content::BrowserContext* context);
30  virtual ~PluginManager();
31
32  // BrowserContextKeyedAPI implementation.
33  static BrowserContextKeyedAPIFactory<PluginManager>* GetFactoryInstance();
34
35 private:
36  friend class BrowserContextKeyedAPIFactory<PluginManager>;
37
38#if !defined(DISABLE_NACL)
39
40  // We implement some Pepper plug-ins using NaCl to take advantage of NaCl's
41  // strong sandbox. Typically, these NaCl modules are stored in extensions
42  // and registered here. Not all NaCl modules need to register for a MIME
43  // type, just the ones that are responsible for rendering a particular MIME
44  // type, like application/pdf. Note: We only register NaCl modules in the
45  // browser process.
46  void RegisterNaClModule(const NaClModuleInfo& info);
47  void UnregisterNaClModule(const NaClModuleInfo& info);
48
49  // Call UpdatePluginListWithNaClModules() after registering or unregistering
50  // a NaCl module to see those changes reflected in the PluginList.
51  void UpdatePluginListWithNaClModules();
52
53  extensions::NaClModuleInfo::List::iterator FindNaClModule(const GURL& url);
54
55#endif  // !defined(DISABLE_NACL)
56
57  // ExtensionRegistryObserver implementation.
58  virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
59                                 const Extension* extension) OVERRIDE;
60  virtual void OnExtensionUnloaded(
61      content::BrowserContext* browser_context,
62      const Extension* extension,
63      UnloadedExtensionInfo::Reason reason) OVERRIDE;
64
65  // BrowserContextKeyedAPI implementation.
66  static const char* service_name() { return "PluginManager"; }
67  static const bool kServiceIsNULLWhileTesting = true;
68
69  extensions::NaClModuleInfo::List nacl_module_list_;
70
71  Profile* profile_;
72
73  // Listen to extension load, unloaded notifications.
74  ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
75      extension_registry_observer_;
76};
77
78}  // namespace extensions
79
80#endif  // CHROME_BROWSER_EXTENSIONS_PLUGIN_MANAGER_H_
81