1// Copyright (c) 2012 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_EXTENSION_SERVICE_H_
6#define CHROME_BROWSER_EXTENSIONS_EXTENSION_SERVICE_H_
7
8#include <map>
9#include <set>
10#include <string>
11#include <vector>
12
13#include "base/compiler_specific.h"
14#include "base/files/file_path.h"
15#include "base/gtest_prod_util.h"
16#include "base/memory/ref_counted.h"
17#include "base/memory/weak_ptr.h"
18#include "base/strings/string16.h"
19#include "chrome/browser/extensions/blacklist.h"
20#include "chrome/browser/extensions/extension_management.h"
21#include "chrome/browser/extensions/pending_extension_manager.h"
22#include "content/public/browser/notification_observer.h"
23#include "content/public/browser/notification_registrar.h"
24#include "extensions/browser/external_provider_interface.h"
25#include "extensions/browser/install_flag.h"
26#include "extensions/browser/management_policy.h"
27#include "extensions/browser/process_manager.h"
28#include "extensions/browser/uninstall_reason.h"
29#include "extensions/common/extension.h"
30#include "extensions/common/extension_set.h"
31#include "extensions/common/manifest.h"
32#include "sync/api/string_ordinal.h"
33
34class ExtensionSyncService;
35class GURL;
36class HostContentSettingsMap;
37class Profile;
38
39namespace base {
40class CommandLine;
41class SequencedTaskRunner;
42class Version;
43}
44
45namespace content {
46class DevToolsAgentHost;
47}
48
49namespace extensions {
50class ComponentLoader;
51class CrxInstaller;
52class ExtensionActionStorageManager;
53class ExtensionDownloader;
54class ExtensionDownloaderDelegate;
55class ExtensionErrorController;
56class ExtensionRegistry;
57class ExtensionSystem;
58class ExtensionUpdater;
59class OneShotEvent;
60class ExternalInstallManager;
61class SharedModuleService;
62class UpdateObserver;
63}  // namespace extensions
64
65// This is an interface class to encapsulate the dependencies that
66// various classes have on ExtensionService. This allows easy mocking.
67class ExtensionServiceInterface
68    : public base::SupportsWeakPtr<ExtensionServiceInterface> {
69 public:
70  virtual ~ExtensionServiceInterface() {}
71
72  // DEPRECATED: Use ExtensionRegistry::enabled_extensions() instead.
73  //
74  // ExtensionRegistry also has the disabled, terminated and blacklisted sets.
75  virtual const extensions::ExtensionSet* extensions() const = 0;
76
77  // Gets the object managing the set of pending extensions.
78  virtual extensions::PendingExtensionManager* pending_extension_manager() = 0;
79
80  // Installs an update with the contents from |extension_path|. Returns true if
81  // the install can be started. Sets |out_crx_installer| to the installer if
82  // one was started.
83  // TODO(aa): This method can be removed. ExtensionUpdater could use
84  // CrxInstaller directly instead.
85  virtual bool UpdateExtension(
86      const std::string& id,
87      const base::FilePath& path,
88      bool file_ownership_passed,
89      extensions::CrxInstaller** out_crx_installer) = 0;
90
91  // DEPRECATED. Use ExtensionRegistry instead.
92  //
93  // Looks up an extension by its ID.
94  //
95  // If |include_disabled| is false then this will only include enabled
96  // extensions. Use instead:
97  //
98  //   ExtensionRegistry::enabled_extensions().GetByID(id).
99  //
100  // If |include_disabled| is true then this will also include disabled and
101  // blacklisted extensions (not terminated extensions). Use instead:
102  //
103  //   ExtensionRegistry::GetExtensionById(
104  //         id, ExtensionRegistry::ENABLED |
105  //             ExtensionRegistry::DISABLED |
106  //             ExtensionRegistry::BLACKLISTED)
107  //
108  // Or don't, because it's probably not something you ever need to know.
109  virtual const extensions::Extension* GetExtensionById(
110      const std::string& id,
111      bool include_disabled) const = 0;
112
113  // DEPRECATED: Use ExtensionRegistry instead.
114  //
115  // Looks up an extension by ID, regardless of whether it's enabled,
116  // disabled, blacklisted, or terminated. Use instead:
117  //
118  //   ExtensionRegistry::GetExtensionById(id, ExtensionRegistry::EVERYTHING).
119  virtual const extensions::Extension* GetInstalledExtension(
120      const std::string& id) const = 0;
121
122  // Returns an update for an extension with the specified id, if installation
123  // of that update was previously delayed because the extension was in use. If
124  // no updates are pending for the extension returns NULL.
125  virtual const extensions::Extension* GetPendingExtensionUpdate(
126      const std::string& extension_id) const = 0;
127
128  // Finishes installation of an update for an extension with the specified id,
129  // when installation of that extension was previously delayed because the
130  // extension was in use.
131  virtual void FinishDelayedInstallation(const std::string& extension_id) = 0;
132
133  // Returns true if the extension with the given |extension_id| is enabled.
134  // This will return a valid answer even if the extension is not loaded yet.
135  virtual bool IsExtensionEnabled(const std::string& extension_id) const = 0;
136
137  // Go through each extension and unload those that are not allowed to run by
138  // management policy providers (ie. network admin and Google-managed
139  // blacklist).
140  virtual void CheckManagementPolicy() = 0;
141
142  // Safe to call multiple times in a row.
143  //
144  // TODO(akalin): Remove this method (and others) once we refactor
145  // themes sync to not use it directly.
146  virtual void CheckForUpdatesSoon() = 0;
147
148  // Adds |extension| to this ExtensionService and notifies observers that the
149  // extensions have been loaded.
150  virtual void AddExtension(const extensions::Extension* extension) = 0;
151
152  // Check if we have preferences for the component extension and, if not or if
153  // the stored version differs, install the extension (without requirements
154  // checking) before calling AddExtension.
155  virtual void AddComponentExtension(
156      const extensions::Extension* extension) = 0;
157
158  // Unload the specified extension.
159  virtual void UnloadExtension(
160      const std::string& extension_id,
161      extensions::UnloadedExtensionInfo::Reason reason) = 0;
162
163  // Remove the specified component extension.
164  virtual void RemoveComponentExtension(const std::string& extension_id) = 0;
165
166  // Whether the extension service is ready.
167  virtual bool is_ready() = 0;
168
169  // Returns task runner for crx installation file I/O operations.
170  virtual base::SequencedTaskRunner* GetFileTaskRunner() = 0;
171};
172
173// Manages installed and running Chromium extensions. An instance is shared
174// between normal and incognito profiles.
175class ExtensionService
176    : public ExtensionServiceInterface,
177      public extensions::ExternalProviderInterface::VisitorInterface,
178      public content::NotificationObserver,
179      public extensions::Blacklist::Observer,
180      public extensions::ExtensionManagement::Observer {
181 public:
182  // Attempts to uninstall an extension from a given ExtensionService. Returns
183  // true iff the target extension exists.
184  static bool UninstallExtensionHelper(ExtensionService* extensions_service,
185                                       const std::string& extension_id,
186                                       extensions::UninstallReason reason);
187
188  // Constructor stores pointers to |profile| and |extension_prefs| but
189  // ownership remains at caller.
190  ExtensionService(Profile* profile,
191                   const base::CommandLine* command_line,
192                   const base::FilePath& install_directory,
193                   extensions::ExtensionPrefs* extension_prefs,
194                   extensions::Blacklist* blacklist,
195                   bool autoupdate_enabled,
196                   bool extensions_enabled,
197                   extensions::OneShotEvent* ready);
198
199  virtual ~ExtensionService();
200
201  // ExtensionServiceInterface implementation.
202  //
203  // NOTE: Many of these methods are DEPRECATED. See the interface for details.
204  virtual const extensions::ExtensionSet* extensions() const OVERRIDE;
205  virtual extensions::PendingExtensionManager*
206      pending_extension_manager() OVERRIDE;
207  virtual const extensions::Extension* GetExtensionById(
208      const std::string& id, bool include_disabled) const OVERRIDE;
209  virtual const extensions::Extension* GetInstalledExtension(
210      const std::string& id) const OVERRIDE;
211  virtual bool UpdateExtension(
212      const std::string& id,
213      const base::FilePath& extension_path,
214      bool file_ownership_passed,
215      extensions::CrxInstaller** out_crx_installer) OVERRIDE;
216  virtual bool IsExtensionEnabled(
217      const std::string& extension_id) const OVERRIDE;
218  virtual void UnloadExtension(
219      const std::string& extension_id,
220      extensions::UnloadedExtensionInfo::Reason reason) OVERRIDE;
221  virtual void RemoveComponentExtension(const std::string& extension_id)
222      OVERRIDE;
223  virtual void AddExtension(const extensions::Extension* extension) OVERRIDE;
224  virtual void AddComponentExtension(const extensions::Extension* extension)
225      OVERRIDE;
226  virtual const extensions::Extension* GetPendingExtensionUpdate(
227      const std::string& extension_id) const OVERRIDE;
228  virtual void FinishDelayedInstallation(
229     const std::string& extension_id) OVERRIDE;
230  virtual void CheckManagementPolicy() OVERRIDE;
231  virtual void CheckForUpdatesSoon() OVERRIDE;
232  virtual bool is_ready() OVERRIDE;
233  virtual base::SequencedTaskRunner* GetFileTaskRunner() OVERRIDE;
234
235  // ExternalProvider::Visitor implementation.
236  // Exposed for testing.
237  virtual bool OnExternalExtensionFileFound(
238      const std::string& id,
239      const base::Version* version,
240      const base::FilePath& path,
241      extensions::Manifest::Location location,
242      int creation_flags,
243      bool mark_acknowledged) OVERRIDE;
244  virtual bool OnExternalExtensionUpdateUrlFound(
245      const std::string& id,
246      const std::string& install_parameter,
247      const GURL& update_url,
248      extensions::Manifest::Location location,
249      int creation_flags,
250      bool mark_acknowledged) OVERRIDE;
251  virtual void OnExternalProviderReady(
252      const extensions::ExternalProviderInterface* provider) OVERRIDE;
253
254  // ExtensionManagement::Observer implementation:
255  virtual void OnExtensionManagementSettingsChanged() OVERRIDE;
256
257  // Initialize and start all installed extensions.
258  void Init();
259
260  // Called when the associated Profile is going to be destroyed.
261  void Shutdown();
262
263  // Reloads the specified extension, sending the onLaunched() event to it if it
264  // currently has any window showing.
265  // Allows noisy failures.
266  // NOTE: Reloading an extension can invalidate |extension_id| and Extension
267  // pointers for the given extension. Consider making a copy of |extension_id|
268  // first and retrieving a new Extension pointer afterwards.
269  void ReloadExtension(const std::string& extension_id);
270
271  // Suppresses noisy failures.
272  void ReloadExtensionWithQuietFailure(const std::string& extension_id);
273
274  // Uninstalls the specified extension. Callers should only call this method
275  // with extensions that exist. |reason| lets the caller specify why the
276  // extension is uninstalled.
277  //
278  // If the return value is true, |deletion_done_callback| is invoked when data
279  // deletion is done or at least is scheduled.
280  virtual bool UninstallExtension(const std::string& extension_id,
281                                  extensions::UninstallReason reason,
282                                  const base::Closure& deletion_done_callback,
283                                  base::string16* error);
284
285  // Enables the extension.  If the extension is already enabled, does
286  // nothing.
287  virtual void EnableExtension(const std::string& extension_id);
288
289  // Disables the extension.  If the extension is already disabled, or
290  // cannot be disabled, does nothing.
291  virtual void DisableExtension(
292      const std::string& extension_id,
293      extensions::Extension::DisableReason disable_reason);
294
295  // Disable non-default and non-managed extensions with ids not in
296  // |except_ids|. Default extensions are those from the Web Store with
297  // |was_installed_by_default| flag.
298  void DisableUserExtensions(const std::vector<std::string>& except_ids);
299
300  // Updates the |extension|'s granted permissions lists to include all
301  // permissions in the |extension|'s manifest and re-enables the
302  // extension.
303  void GrantPermissionsAndEnableExtension(
304      const extensions::Extension* extension);
305
306  // Updates the |extension|'s granted permissions lists to include all
307  // permissions in the |extensions|'s manifest.
308  void GrantPermissions(const extensions::Extension* extension);
309
310  // Check for updates (or potentially new extensions from external providers)
311  void CheckForExternalUpdates();
312
313  // Called when the initial extensions load has completed.
314  virtual void OnLoadedInstalledExtensions();
315
316  // Informs the service that an extension's files are in place for loading.
317  //
318  // |extension|     the extension
319  // |page_ordinal|  the location of the extension in the app launcher
320  // |install_flags| a bitmask of extensions::InstallFlags
321  void OnExtensionInstalled(const extensions::Extension* extension,
322                            const syncer::StringOrdinal& page_ordinal,
323                            int install_flags);
324  void OnExtensionInstalled(const extensions::Extension* extension,
325                            const syncer::StringOrdinal& page_ordinal) {
326    OnExtensionInstalled(extension,
327                         page_ordinal,
328                         static_cast<int>(extensions::kInstallFlagNone));
329  }
330
331  // Checks for delayed installation for all pending installs.
332  void MaybeFinishDelayedInstallations();
333
334  // Promotes an ephemeral app to a regular installed app. Ephemeral apps
335  // are already installed in extension system (albiet transiently) and only
336  // need to be exposed in the UI. Set |is_from_sync| to true if the
337  // install was initiated via sync.
338  void PromoteEphemeralApp(
339      const extensions::Extension* extension, bool is_from_sync);
340
341  // ExtensionHost of background page calls this method right after its render
342  // view has been created.
343  void DidCreateRenderViewForBackgroundPage(extensions::ExtensionHost* host);
344
345  // Changes sequenced task runner for crx installation tasks to |task_runner|.
346  void SetFileTaskRunnerForTesting(
347      const scoped_refptr<base::SequencedTaskRunner>& task_runner);
348
349  // Postpone installations so that we don't have to worry about race
350  // conditions.
351  void OnGarbageCollectIsolatedStorageStart();
352
353  // Restart any extension installs which were delayed for isolated storage
354  // garbage collection.
355  void OnGarbageCollectIsolatedStorageFinished();
356
357  // Record a histogram using the PermissionMessage enum values for each
358  // permission in |e|.
359  // NOTE: If this is ever called with high frequency, the implementation may
360  // need to be made more efficient.
361  static void RecordPermissionMessagesHistogram(
362      const extensions::Extension* extension, const char* histogram);
363
364  // Unloads the given extension and mark the extension as terminated. This
365  // doesn't notify the user that the extension was terminated, if such a
366  // notification is desired the calling code is responsible for doing that.
367  void TerminateExtension(const std::string& extension_id);
368
369  // Register self and content settings API with the specified map.
370  void RegisterContentSettings(
371      HostContentSettingsMap* host_content_settings_map);
372
373  // Adds/Removes update observers.
374  void AddUpdateObserver(extensions::UpdateObserver* observer);
375  void RemoveUpdateObserver(extensions::UpdateObserver* observer);
376
377  //////////////////////////////////////////////////////////////////////////////
378  // Simple Accessors
379
380  // Returns a WeakPtr to the ExtensionService.
381  base::WeakPtr<ExtensionService> AsWeakPtr() { return base::AsWeakPtr(this); }
382
383  // Returns profile_ as a BrowserContext.
384  content::BrowserContext* GetBrowserContext() const;
385
386  bool extensions_enabled() const { return extensions_enabled_; }
387  void set_extensions_enabled(bool enabled) { extensions_enabled_ = enabled; }
388
389  const base::FilePath& install_directory() const { return install_directory_; }
390
391  const extensions::ExtensionSet* delayed_installs() const {
392    return &delayed_installs_;
393  }
394
395  bool show_extensions_prompts() const { return show_extensions_prompts_; }
396  void set_show_extensions_prompts(bool show_extensions_prompts) {
397    show_extensions_prompts_ = show_extensions_prompts;
398  }
399
400  Profile* profile() { return profile_; }
401
402  void set_extension_sync_service(
403      ExtensionSyncService* extension_sync_service) {
404    extension_sync_service_ = extension_sync_service;
405  }
406
407  // Note that this may return NULL if autoupdate is not turned on.
408  extensions::ExtensionUpdater* updater() { return updater_.get(); }
409
410  extensions::ComponentLoader* component_loader() {
411    return component_loader_.get();
412  }
413
414  bool browser_terminating() const { return browser_terminating_; }
415
416  extensions::SharedModuleService* shared_module_service() {
417    return shared_module_service_.get();
418  }
419
420  extensions::ExternalInstallManager* external_install_manager() {
421    return external_install_manager_.get();
422  }
423
424  //////////////////////////////////////////////////////////////////////////////
425  // For Testing
426
427  // Unload all extensions. Does not send notifications.
428  void UnloadAllExtensionsForTest();
429
430  // Reloads all extensions. Does not notify that extensions are ready.
431  void ReloadExtensionsForTest();
432
433  // Clear all ExternalProviders.
434  void ClearProvidersForTesting();
435
436  // Adds an ExternalProviderInterface for the service to use during testing.
437  // Takes ownership of |test_provider|.
438  void AddProviderForTesting(
439      extensions::ExternalProviderInterface* test_provider);
440
441  // Simulate an extension being blacklisted for tests.
442  void BlacklistExtensionForTest(const std::string& extension_id);
443
444#if defined(UNIT_TEST)
445  void TrackTerminatedExtensionForTest(const extensions::Extension* extension) {
446    TrackTerminatedExtension(extension);
447  }
448
449  void FinishInstallationForTest(const extensions::Extension* extension) {
450    FinishInstallation(extension, false /* not ephemeral */);
451  }
452#endif
453
454  void set_browser_terminating_for_test(bool value) {
455    browser_terminating_ = value;
456  }
457
458  // By default ExtensionService will wait with installing an updated extension
459  // until the extension is idle. Tests might not like this behavior, so you can
460  // disable it with this method.
461  void set_install_updates_when_idle_for_test(bool value) {
462    install_updates_when_idle_ = value;
463  }
464
465  // Set a callback to be called when all external providers are ready and their
466  // extensions have been installed.
467  void set_external_updates_finished_callback_for_test(
468      const base::Closure& callback) {
469    external_updates_finished_callback_ = callback;
470  }
471
472
473 private:
474  // Creates an ExtensionDownloader for use by the updater.
475  scoped_ptr<extensions::ExtensionDownloader> CreateExtensionDownloader(
476      extensions::ExtensionDownloaderDelegate* delegate);
477
478  // Reloads the specified extension, sending the onLaunched() event to it if it
479  // currently has any window showing. |be_noisy| determines whether noisy
480  // failures are allowed for unpacked extension installs.
481  void ReloadExtensionImpl(const std::string& extension_id, bool be_noisy);
482
483  // content::NotificationObserver implementation:
484  virtual void Observe(int type,
485                       const content::NotificationSource& source,
486                       const content::NotificationDetails& details) OVERRIDE;
487
488  // extensions::Blacklist::Observer implementation.
489  virtual void OnBlacklistUpdated() OVERRIDE;
490
491  // Similar to FinishInstallation, but first checks if there still is an update
492  // pending for the extension, and makes sure the extension is still idle.
493  void MaybeFinishDelayedInstallation(const std::string& extension_id);
494
495  // For the extension in |version_path| with |id|, check to see if it's an
496  // externally managed extension.  If so, uninstall it.
497  void CheckExternalUninstall(const std::string& id);
498
499  // Populates greylist_.
500  void LoadGreylistFromPrefs();
501
502  // Signals *ready_ and sends a notification to the listeners.
503  void SetReadyAndNotifyListeners();
504
505  // Returns true if all the external extension providers are ready.
506  bool AreAllExternalProvidersReady() const;
507
508  // Called once all external providers are ready. Checks for unclaimed
509  // external extensions.
510  void OnAllExternalProvidersReady();
511
512  // Adds the given extension to the list of terminated extensions if
513  // it is not already there and unloads it.
514  void TrackTerminatedExtension(const extensions::Extension* extension);
515
516  // Removes the extension with the given id from the list of
517  // terminated extensions if it is there.
518  void UntrackTerminatedExtension(const std::string& id);
519
520  // Update preferences for a new or updated extension; notify observers that
521  // the extension is installed, e.g., to update event handlers on background
522  // pages; and perform other extension install tasks before calling
523  // AddExtension.
524  // |install_flags| is a bitmask of extensions::InstallFlags.
525  void AddNewOrUpdatedExtension(const extensions::Extension* extension,
526                                extensions::Extension::State initial_state,
527                                int install_flags,
528                                const syncer::StringOrdinal& page_ordinal,
529                                const std::string& install_parameter);
530
531  // Handles sending notification that |extension| was loaded.
532  void NotifyExtensionLoaded(const extensions::Extension* extension);
533
534  // Handles sending notification that |extension| was unloaded.
535  void NotifyExtensionUnloaded(
536      const extensions::Extension* extension,
537      extensions::UnloadedExtensionInfo::Reason reason);
538
539  // Common helper to finish installing the given extension. |was_ephemeral|
540  // should be true if the extension was previously installed and ephemeral.
541  void FinishInstallation(const extensions::Extension* extension,
542                          bool was_ephemeral);
543
544  // Disables the extension if the privilege level has increased
545  // (e.g., due to an upgrade).
546  void CheckPermissionsIncrease(const extensions::Extension* extension,
547                                bool is_extension_installed);
548
549  // Helper that updates the active extension list used for crash reporting.
550  void UpdateActiveExtensionsInCrashReporter();
551
552  // Helper to determine whether we should initially enable an installed
553  // (or upgraded) extension.
554  bool ShouldEnableOnInstall(const extensions::Extension* extension);
555
556  // Helper to determine if updating an extensions should proceed immediately,
557  // or if we should delay the update until further notice.
558  bool ShouldDelayExtensionUpdate(const std::string& extension_id,
559                                  bool install_immediately) const;
560
561  // Manages the blacklisted extensions, intended as callback from
562  // Blacklist::GetBlacklistedIDs.
563  void ManageBlacklist(
564      const extensions::Blacklist::BlacklistStateMap& blacklisted_ids);
565
566  // Add extensions in |blocked| to blacklisted_extensions, remove extensions
567  // that are neither in |blocked|, nor in |unchanged|.
568  void UpdateBlockedExtensions(const extensions::ExtensionIdSet& blocked,
569                               const extensions::ExtensionIdSet& unchanged);
570
571  void UpdateGreylistedExtensions(
572      const extensions::ExtensionIdSet& greylist,
573      const extensions::ExtensionIdSet& unchanged,
574      const extensions::Blacklist::BlacklistStateMap& state_map);
575
576  // Used only by test code.
577  void UnloadAllExtensionsInternal();
578
579  // Disable apps & extensions now to stop them from running after a profile
580  // has been conceptually deleted. Don't wait for full browser shutdown and
581  // the actual profile objects to be destroyed.
582  void OnProfileDestructionStarted();
583
584  // Called on file task runner thread to uninstall extension.
585  static void UninstallExtensionOnFileThread(
586      const std::string& id,
587      Profile* profile,
588      const base::FilePath& install_dir,
589      const base::FilePath& extension_path);
590
591  // The normal profile associated with this ExtensionService.
592  Profile* profile_;
593
594  // The ExtensionSystem for the profile above.
595  extensions::ExtensionSystem* system_;
596
597  // Preferences for the owning profile.
598  extensions::ExtensionPrefs* extension_prefs_;
599
600  // Blacklist for the owning profile.
601  extensions::Blacklist* blacklist_;
602
603  // The ExtensionSyncService that is used by this ExtensionService.
604  ExtensionSyncService* extension_sync_service_;
605
606  // Sets of enabled/disabled/terminated/blacklisted extensions. Not owned.
607  extensions::ExtensionRegistry* registry_;
608
609  // Set of greylisted extensions. These extensions are disabled if they are
610  // already installed in Chromium at the time when they are added to
611  // the greylist. Unlike blacklisted extensions, greylisted ones are visible
612  // to the user and if user re-enables such an extension, they remain enabled.
613  //
614  // These extensions should appear in registry_.
615  extensions::ExtensionSet greylist_;
616
617  // The list of extension installs delayed for various reasons.  The reason
618  // for delayed install is stored in ExtensionPrefs. These are not part of
619  // ExtensionRegistry because they are not yet installed.
620  extensions::ExtensionSet delayed_installs_;
621
622  // Hold the set of pending extensions.
623  extensions::PendingExtensionManager pending_extension_manager_;
624
625  // The full path to the directory where extensions are installed.
626  base::FilePath install_directory_;
627
628  // Whether or not extensions are enabled.
629  bool extensions_enabled_;
630
631  // Whether to notify users when they attempt to install an extension.
632  bool show_extensions_prompts_;
633
634  // Whether to delay installing of extension updates until the extension is
635  // idle.
636  bool install_updates_when_idle_;
637
638  // Signaled when all extensions are loaded.
639  extensions::OneShotEvent* const ready_;
640
641  // Our extension updater, if updates are turned on.
642  scoped_ptr<extensions::ExtensionUpdater> updater_;
643
644  // Map unloaded extensions' ids to their paths. When a temporarily loaded
645  // extension is unloaded, we lose the information about it and don't have
646  // any in the extension preferences file.
647  typedef std::map<std::string, base::FilePath> UnloadedExtensionPathMap;
648  UnloadedExtensionPathMap unloaded_extension_paths_;
649
650  // Map of DevToolsAgentHost instances that are detached,
651  // waiting for an extension to be reloaded.
652  typedef std::map<std::string, scoped_refptr<content::DevToolsAgentHost> >
653      OrphanedDevTools;
654  OrphanedDevTools orphaned_dev_tools_;
655
656  content::NotificationRegistrar registrar_;
657
658  // Keeps track of loading and unloading component extensions.
659  scoped_ptr<extensions::ComponentLoader> component_loader_;
660
661  // A collection of external extension providers.  Each provider reads
662  // a source of external extension information.  Examples include the
663  // windows registry and external_extensions.json.
664  extensions::ProviderCollection external_extension_providers_;
665
666  // Set to true by OnExternalExtensionUpdateUrlFound() when an external
667  // extension URL is found, and by CheckForUpdatesSoon() when an update check
668  // has to wait for the external providers.  Used in
669  // OnAllExternalProvidersReady() to determine if an update check is needed to
670  // install pending extensions.
671  bool update_once_all_providers_are_ready_;
672
673  // A callback to be called when all external providers are ready and their
674  // extensions have been installed. Normally this is a null callback, but
675  // is used in external provider related tests.
676  base::Closure external_updates_finished_callback_;
677
678  // Set when the browser is terminating. Prevents us from installing or
679  // updating additional extensions and allows in-progress installations to
680  // decide to abort.
681  bool browser_terminating_;
682
683  // Set to true to delay all new extension installations. Acts as a lock to
684  // allow background processing of garbage collection of on-disk state without
685  // needing to worry about race conditions caused by extension installation and
686  // reinstallation.
687  bool installs_delayed_for_gc_;
688
689  // Set to true if this is the first time this ExtensionService has run.
690  // Used for specially handling external extensions that are installed the
691  // first time.
692  bool is_first_run_;
693
694  // Store the ids of reloading extensions. We use this to re-enable extensions
695  // which were disabled for a reload.
696  std::set<std::string> reloading_extensions_;
697
698  // A set of the extension ids currently being terminated. We use this to
699  // avoid trying to unload the same extension twice.
700  std::set<std::string> extensions_being_terminated_;
701
702  // The controller for the UI that alerts the user about any blacklisted
703  // extensions.
704  scoped_ptr<extensions::ExtensionErrorController> error_controller_;
705
706  // The manager for extensions that were externally installed that is
707  // responsible for prompting the user about suspicious extensions.
708  scoped_ptr<extensions::ExternalInstallManager> external_install_manager_;
709
710  // Sequenced task runner for extension related file operations.
711  scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
712
713  scoped_ptr<extensions::ExtensionActionStorageManager>
714      extension_action_storage_manager_;
715  scoped_ptr<extensions::ManagementPolicy::Provider>
716      shared_module_policy_provider_;
717
718  // The SharedModuleService used to check for import dependencies.
719  scoped_ptr<extensions::SharedModuleService> shared_module_service_;
720
721  ObserverList<extensions::UpdateObserver, true> update_observers_;
722
723  FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest,
724                           DestroyingProfileClearsExtensions);
725  FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest, SetUnsetBlacklistInPrefs);
726  FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest,
727                           BlacklistedExtensionWillNotInstall);
728  FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest,
729                           UnloadBlacklistedExtensionPolicy);
730  FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest,
731                           WillNotLoadBlacklistedExtensionsFromDirectory);
732  FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest, ReloadBlacklistedExtension);
733  FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest, BlacklistedInPrefsFromStartup);
734  FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest,
735                           GreylistedExtensionDisabled);
736  FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest,
737                           GreylistDontEnableManuallyDisabled);
738  FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest,
739                           GreylistUnknownDontChange);
740
741  DISALLOW_COPY_AND_ASSIGN(ExtensionService);
742};
743
744#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_SERVICE_H_
745