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 34 class ExtensionSyncService; 35 class GURL; 36 class HostContentSettingsMap; 37 class Profile; 38 39 namespace base { 40 class CommandLine; 41 class SequencedTaskRunner; 42 class Version; 43 } 44 45 namespace content { 46 class DevToolsAgentHost; 47 } 48 49 namespace extensions { 50 class ComponentLoader; 51 class CrxInstaller; 52 class ExtensionActionStorageManager; 53 class ExtensionDownloader; 54 class ExtensionDownloaderDelegate; 55 class ExtensionErrorController; 56 class ExtensionRegistry; 57 class ExtensionSystem; 58 class ExtensionUpdater; 59 class OneShotEvent; 60 class ExternalInstallManager; 61 class SharedModuleService; 62 class 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. 67 class 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. 175 class 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