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_PREFS_H_ 6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_PREFS_H_ 7 8 #include <set> 9 #include <string> 10 #include <vector> 11 12 #include "base/memory/linked_ptr.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/time/time.h" 15 #include "base/values.h" 16 #include "chrome/browser/extensions/blacklist.h" 17 #include "chrome/browser/extensions/extension_scoped_prefs.h" 18 #include "chrome/browser/prefs/scoped_user_pref_update.h" 19 #include "chrome/common/extensions/extension.h" 20 #include "components/browser_context_keyed_service/browser_context_keyed_service.h" 21 #include "extensions/common/url_pattern_set.h" 22 #include "sync/api/string_ordinal.h" 23 24 class ExtensionPrefValueMap; 25 class ExtensionSorting; 26 class PrefService; 27 class Profile; 28 29 namespace user_prefs { 30 class PrefRegistrySyncable; 31 } 32 33 namespace extensions { 34 class ContentSettingsStore; 35 class ExtensionPrefsUninstallExtension; 36 class URLPatternSet; 37 38 // Class for managing global and per-extension preferences. 39 // 40 // This class distinguishes the following kinds of preferences: 41 // - global preferences: 42 // internal state for the extension system in general, not associated 43 // with an individual extension, such as lastUpdateTime. 44 // - per-extension preferences: 45 // meta-preferences describing properties of the extension like 46 // installation time, whether the extension is enabled, etc. 47 // - extension controlled preferences: 48 // browser preferences that an extension controls. For example, an 49 // extension could use the proxy API to specify the browser's proxy 50 // preference. Extension-controlled preferences are stored in 51 // PrefValueStore::extension_prefs(), which this class populates and 52 // maintains as the underlying extensions change. 53 class ExtensionPrefs : public ExtensionScopedPrefs, 54 public BrowserContextKeyedService { 55 public: 56 // Key name for a preference that keeps track of per-extension settings. This 57 // is a dictionary object read from the Preferences file, keyed off of 58 // extension ids. 59 static const char kExtensionsPref[]; 60 61 // Key for what version chrome was last time the extension prefs were loaded. 62 static const char kExtensionsLastChromeVersion[]; 63 64 typedef std::vector<linked_ptr<ExtensionInfo> > ExtensionsInfo; 65 66 // Vector containing identifiers for preferences. 67 typedef std::set<std::string> PrefKeySet; 68 69 // This enum is used for the launch type the user wants to use for an 70 // application. 71 // Do not remove items or re-order this enum as it is used in preferences 72 // and histograms. 73 enum LaunchType { 74 LAUNCH_PINNED, 75 LAUNCH_REGULAR, 76 LAUNCH_FULLSCREEN, 77 LAUNCH_WINDOW, 78 79 // Launch an app in the in the way a click on the NTP would, 80 // if no user pref were set. Update this constant to change 81 // the default for the NTP and chrome.management.launchApp(). 82 LAUNCH_DEFAULT = LAUNCH_REGULAR 83 }; 84 85 // This enum is used to store the reason an extension's install has been 86 // delayed. Do not remove items or re-order this enum as it is used in 87 // preferences. 88 enum DelayReason { 89 DELAY_REASON_NONE = 0, 90 DELAY_REASON_GC = 1, 91 DELAY_REASON_WAIT_FOR_IDLE = 2, 92 DELAY_REASON_WAIT_FOR_IMPORTS = 3, 93 }; 94 95 96 // Creates base::Time classes. The default implementation is just to return 97 // the current time, but tests can inject alternative implementations. 98 class TimeProvider { 99 public: 100 TimeProvider(); 101 102 virtual ~TimeProvider(); 103 104 // By default, returns the current time (base::Time::Now()). 105 virtual base::Time GetCurrentTime() const; 106 107 private: 108 DISALLOW_COPY_AND_ASSIGN(TimeProvider); 109 }; 110 111 // A wrapper around a ScopedUserPrefUpdate, which allows us to access the 112 // entry of a particular key for an extension. Use this if you need a mutable 113 // record of a dictionary or list in the current settings. Otherwise, prefer 114 // ReadPrefAsT() and UpdateExtensionPref() methods. 115 template <typename T, base::Value::Type type_enum_value> 116 class ScopedUpdate { 117 public: 118 ScopedUpdate(ExtensionPrefs* prefs, 119 const std::string& extension_id, 120 const std::string& key); 121 virtual ~ScopedUpdate(); 122 123 // Returns a mutable value for the key (ownership remains with the prefs), 124 // if one exists. Otherwise, returns NULL. 125 virtual T* Get(); 126 127 // Creates and returns a mutable value for the key (the prefs own the new 128 // value), if one does not already exist. Otherwise, returns the current 129 // value. 130 virtual T* Create(); 131 132 private: 133 DISALLOW_COPY_AND_ASSIGN(ScopedUpdate); 134 135 DictionaryPrefUpdate update_; 136 const std::string extension_id_; 137 const std::string key_; 138 }; 139 typedef ScopedUpdate<base::DictionaryValue, base::Value::TYPE_DICTIONARY> 140 ScopedDictionaryUpdate; 141 typedef ScopedUpdate<base::ListValue, base::Value::TYPE_LIST> 142 ScopedListUpdate; 143 144 // Creates and initializes an ExtensionPrefs object. 145 // Does not take ownership of |prefs| and |extension_pref_value_map|. 146 // If |extensions_disabled| is true, extension controlled preferences and 147 // content settings do not become effective. 148 static ExtensionPrefs* Create( 149 PrefService* prefs, 150 const base::FilePath& root_dir, 151 ExtensionPrefValueMap* extension_pref_value_map, 152 bool extensions_disabled); 153 154 // A version of Create which allows injection of a custom base::Time provider. 155 // Use this as needed for testing. 156 static ExtensionPrefs* Create( 157 PrefService* prefs, 158 const base::FilePath& root_dir, 159 ExtensionPrefValueMap* extension_pref_value_map, 160 bool extensions_disabled, 161 scoped_ptr<TimeProvider> time_provider); 162 163 virtual ~ExtensionPrefs(); 164 165 // Convenience function to get the ExtensionPrefs for a Profile. 166 static ExtensionPrefs* Get(Profile* profile); 167 168 // Returns all installed extensions from extension preferences provided by 169 // |pref_service|. This is exposed for ProtectedPrefsWatcher because it needs 170 // access to the extension ID list before the ExtensionService is initialized. 171 static ExtensionIdList GetExtensionsFrom(const PrefService* pref_service); 172 173 // Returns true if the specified external extension was uninstalled by the 174 // user. 175 bool IsExternalExtensionUninstalled(const std::string& id) const; 176 177 // Checks whether |extension_id| is disabled. If there's no state pref for 178 // the extension, this will return false. Generally you should use 179 // ExtensionService::IsExtensionEnabled instead. 180 bool IsExtensionDisabled(const std::string& id) const; 181 182 // Get/Set the order that the browser actions appear in the toolbar. 183 ExtensionIdList GetToolbarOrder(); 184 void SetToolbarOrder(const ExtensionIdList& extension_ids); 185 186 // Called when an extension is installed, so that prefs get created. 187 // If |page_ordinal| is an invalid ordinal, then a page will be found 188 // for the App. 189 void OnExtensionInstalled(const Extension* extension, 190 Extension::State initial_state, 191 Blacklist::BlacklistState blacklist_state, 192 const syncer::StringOrdinal& page_ordinal); 193 194 // Called when an extension is uninstalled, so that prefs get cleaned up. 195 void OnExtensionUninstalled(const std::string& extension_id, 196 const Manifest::Location& location, 197 bool external_uninstall); 198 199 // Called to change the extension's state when it is enabled/disabled. 200 void SetExtensionState(const std::string& extension_id, Extension::State); 201 202 // Populates |out| with the ids of all installed extensions. 203 void GetExtensions(ExtensionIdList* out); 204 205 // ExtensionScopedPrefs methods: 206 virtual void UpdateExtensionPref(const std::string& id, 207 const std::string& key, 208 base::Value* value) OVERRIDE; 209 210 virtual void DeleteExtensionPrefs(const std::string& id) OVERRIDE; 211 212 virtual bool ReadPrefAsBoolean(const std::string& extension_id, 213 const std::string& pref_key, 214 bool* out_value) const OVERRIDE; 215 216 virtual bool ReadPrefAsInteger(const std::string& extension_id, 217 const std::string& pref_key, 218 int* out_value) const OVERRIDE; 219 220 virtual bool ReadPrefAsString(const std::string& extension_id, 221 const std::string& pref_key, 222 std::string* out_value) const OVERRIDE; 223 224 virtual bool ReadPrefAsList(const std::string& extension_id, 225 const std::string& pref_key, 226 const base::ListValue** out_value) const OVERRIDE; 227 228 virtual bool ReadPrefAsDictionary( 229 const std::string& extension_id, 230 const std::string& pref_key, 231 const base::DictionaryValue** out_value) const OVERRIDE; 232 233 virtual bool HasPrefForExtension(const std::string& extension_id) const 234 OVERRIDE; 235 236 // Did the extension ask to escalate its permission during an upgrade? 237 bool DidExtensionEscalatePermissions(const std::string& id); 238 239 // If |did_escalate| is true, the preferences for |extension| will be set to 240 // require the install warning when the user tries to enable. 241 void SetDidExtensionEscalatePermissions( 242 const Extension* extension, 243 bool did_escalate); 244 245 // Getter and setters for disabled reason. 246 int GetDisableReasons(const std::string& extension_id); 247 void AddDisableReason(const std::string& extension_id, 248 Extension::DisableReason disable_reason); 249 void RemoveDisableReason(const std::string& extension_id, 250 Extension::DisableReason disable_reason); 251 void ClearDisableReasons(const std::string& extension_id); 252 253 // Gets the set of extensions that have been blacklisted in prefs. 254 std::set<std::string> GetBlacklistedExtensions(); 255 256 // Sets whether the extension with |id| is blacklisted. 257 void SetExtensionBlacklisted(const std::string& extension_id, 258 bool is_blacklisted); 259 260 // Returns the version string for the currently installed extension, or 261 // the empty string if not found. 262 std::string GetVersionString(const std::string& extension_id); 263 264 // Re-writes the extension manifest into the prefs. 265 // Called to change the extension's manifest when it's re-localized. 266 void UpdateManifest(const Extension* extension); 267 268 // Returns extension path based on extension ID, or empty FilePath on error. 269 base::FilePath GetExtensionPath(const std::string& extension_id); 270 271 // Returns base extensions install directory. 272 const base::FilePath& install_directory() const { return install_directory_; } 273 274 // Returns whether the extension with |id| has its blacklist bit set. 275 // 276 // WARNING: this only checks the extension's entry in prefs, so by definition 277 // can only check extensions that prefs knows about. There may be other 278 // sources of blacklist information, such as safebrowsing. You probably want 279 // to use Blacklist::GetBlacklistedIDs rather than this method. 280 bool IsExtensionBlacklisted(const std::string& id) const; 281 282 // Increment the count of how many times we prompted the user to acknowledge 283 // the given extension, and return the new count. 284 int IncrementAcknowledgePromptCount(const std::string& extension_id); 285 286 // Whether the user has acknowledged an external extension. 287 bool IsExternalExtensionAcknowledged(const std::string& extension_id); 288 void AcknowledgeExternalExtension(const std::string& extension_id); 289 290 // Whether the user has acknowledged a blacklisted extension. 291 bool IsBlacklistedExtensionAcknowledged(const std::string& extension_id); 292 void AcknowledgeBlacklistedExtension(const std::string& extension_id); 293 294 // Whether the external extension was installed during the first run 295 // of this profile. 296 bool IsExternalInstallFirstRun(const std::string& extension_id); 297 void SetExternalInstallFirstRun(const std::string& extension_id); 298 299 // Returns true if the extension notification code has already run for the 300 // first time for this profile. Currently we use this flag to mean that any 301 // extensions that would trigger notifications should get silently 302 // acknowledged. This is a fuse. Calling it the first time returns false. 303 // Subsequent calls return true. It's not possible through an API to ever 304 // reset it. Don't call it unless you mean it! 305 bool SetAlertSystemFirstRun(); 306 307 // Checks if extensions are blacklisted by default, by policy. 308 // The ManagementPolicy::Provider methods also take this into account, and 309 // should be used instead when the extension ID is known. 310 bool ExtensionsBlacklistedByDefault() const; 311 312 // Returns the last value set via SetLastPingDay. If there isn't such a 313 // pref, the returned Time will return true for is_null(). 314 base::Time LastPingDay(const std::string& extension_id) const; 315 316 // The time stored is based on the server's perspective of day start time, not 317 // the client's. 318 void SetLastPingDay(const std::string& extension_id, const base::Time& time); 319 320 // Similar to the 2 above, but for the extensions blacklist. 321 base::Time BlacklistLastPingDay() const; 322 void SetBlacklistLastPingDay(const base::Time& time); 323 324 // Similar to LastPingDay/SetLastPingDay, but for sending "days since active" 325 // ping. 326 base::Time LastActivePingDay(const std::string& extension_id); 327 void SetLastActivePingDay(const std::string& extension_id, 328 const base::Time& time); 329 330 // A bit we use for determining if we should send the "days since active" 331 // ping. A value of true means the item has been active (launched) since the 332 // last update check. 333 bool GetActiveBit(const std::string& extension_id); 334 void SetActiveBit(const std::string& extension_id, bool active); 335 336 // Returns the granted permission set for the extension with |extension_id|, 337 // and NULL if no preferences were found for |extension_id|. 338 // This passes ownership of the returned set to the caller. 339 PermissionSet* GetGrantedPermissions(const std::string& extension_id); 340 341 // Adds |permissions| to the granted permissions set for the extension with 342 // |extension_id|. The new granted permissions set will be the union of 343 // |permissions| and the already granted permissions. 344 void AddGrantedPermissions(const std::string& extension_id, 345 const PermissionSet* permissions); 346 347 // As above, but subtracts the given |permissions| from the granted set. 348 void RemoveGrantedPermissions(const std::string& extension_id, 349 const PermissionSet* permissions); 350 351 // Gets the active permission set for the specified extension. This may 352 // differ from the permissions in the manifest due to the optional 353 // permissions API. This passes ownership of the set to the caller. 354 PermissionSet* GetActivePermissions(const std::string& extension_id); 355 356 // Sets the active |permissions| for the extension with |extension_id|. 357 void SetActivePermissions(const std::string& extension_id, 358 const PermissionSet* permissions); 359 360 // Records whether or not this extension is currently running. 361 void SetExtensionRunning(const std::string& extension_id, bool is_running); 362 363 // Returns whether or not this extension is marked as running. This is used to 364 // restart apps across browser restarts. 365 bool IsExtensionRunning(const std::string& extension_id); 366 367 // Set/Get whether or not the app is active. Used to force a launch of apps 368 // that don't handle onRestarted() on a restart. We can only safely do that if 369 // the app was active when it was last running. 370 void SetIsActive(const std::string& extension_id, bool is_active); 371 bool IsActive(const std::string& extension_id); 372 373 // Returns true if the user enabled this extension to be loaded in incognito 374 // mode. 375 // 376 // IMPORTANT: you probably want to use ExtensionService::IsIncognitoEnabled 377 // instead of this method. 378 bool IsIncognitoEnabled(const std::string& extension_id); 379 void SetIsIncognitoEnabled(const std::string& extension_id, bool enabled); 380 381 // Returns true if the user has chosen to allow this extension to inject 382 // scripts into pages with file URLs. 383 bool AllowFileAccess(const std::string& extension_id); 384 void SetAllowFileAccess(const std::string& extension_id, bool allow); 385 bool HasAllowFileAccessSetting(const std::string& extension_id) const; 386 387 // Get the launch type preference. If no preference is set, return 388 // |default_pref_value|. 389 LaunchType GetLaunchType(const Extension* extension, 390 LaunchType default_pref_value); 391 392 void SetLaunchType(const std::string& extension_id, LaunchType launch_type); 393 394 // Find the right launch container based on the launch type. 395 // If |extension|'s prefs do not have a launch type set, then 396 // use |default_pref_value|. 397 extension_misc::LaunchContainer GetLaunchContainer( 398 const Extension* extension, 399 LaunchType default_pref_value); 400 401 // Saves ExtensionInfo for each installed extension with the path to the 402 // version directory and the location. Blacklisted extensions won't be saved 403 // and neither will external extensions the user has explicitly uninstalled. 404 // Caller takes ownership of returned structure. 405 scoped_ptr<ExtensionsInfo> GetInstalledExtensionsInfo() const; 406 407 // Returns the ExtensionInfo from the prefs for the given extension. If the 408 // extension is not present, NULL is returned. 409 scoped_ptr<ExtensionInfo> GetInstalledExtensionInfo( 410 const std::string& extension_id) const; 411 412 // We've downloaded an updated .crx file for the extension, but are waiting 413 // to install it. 414 void SetDelayedInstallInfo(const Extension* extension, 415 Extension::State initial_state, 416 Blacklist::BlacklistState blacklist_state, 417 DelayReason delay_reason, 418 const syncer::StringOrdinal& page_ordinal); 419 420 // Removes any delayed install information we have for the given 421 // |extension_id|. Returns true if there was info to remove; false otherwise. 422 bool RemoveDelayedInstallInfo(const std::string& extension_id); 423 424 // Update the prefs to finish the update for an extension. 425 bool FinishDelayedInstallInfo(const std::string& extension_id); 426 427 // Returns the ExtensionInfo from the prefs for delayed install information 428 // for |extension_id|, if we have any. Otherwise returns NULL. 429 scoped_ptr<ExtensionInfo> GetDelayedInstallInfo( 430 const std::string& extension_id) const; 431 432 DelayReason GetDelayedInstallReason(const std::string& extension_id) const; 433 434 // Returns information about all the extensions that have delayed install 435 // information. 436 scoped_ptr<ExtensionsInfo> GetAllDelayedInstallInfo() const; 437 438 // Returns true if the user repositioned the app on the app launcher via drag 439 // and drop. 440 bool WasAppDraggedByUser(const std::string& extension_id); 441 442 // Sets a flag indicating that the user repositioned the app on the app 443 // launcher by drag and dropping it. 444 void SetAppDraggedByUser(const std::string& extension_id); 445 446 // Returns true if there is an extension which controls the preference value 447 // for |pref_key| *and* it is specific to incognito mode. 448 bool HasIncognitoPrefValue(const std::string& pref_key); 449 450 // Returns the creation flags mask for the extension. 451 int GetCreationFlags(const std::string& extension_id) const; 452 453 // Returns the creation flags mask for a delayed install extension. 454 int GetDelayedInstallCreationFlags(const std::string& extension_id) const; 455 456 // Returns true if the extension was installed from the Chrome Web Store. 457 bool IsFromWebStore(const std::string& extension_id) const; 458 459 // Returns true if the extension was installed from an App generated from a 460 // bookmark. 461 bool IsFromBookmark(const std::string& extension_id) const; 462 463 // Returns true if the extension was installed as a default app. 464 bool WasInstalledByDefault(const std::string& extension_id) const; 465 466 // Helper method to acquire the installation time of an extension. 467 // Returns base::Time() if the installation time could not be parsed or 468 // found. 469 base::Time GetInstallTime(const std::string& extension_id) const; 470 471 static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 472 473 bool extensions_disabled() { return extensions_disabled_; } 474 475 ContentSettingsStore* content_settings_store() { 476 return content_settings_store_.get(); 477 } 478 479 // The underlying PrefService. 480 PrefService* pref_service() const { return prefs_; } 481 482 // The underlying ExtensionSorting. 483 ExtensionSorting* extension_sorting() const { 484 return extension_sorting_.get(); 485 } 486 487 // Describes the URLs that are able to install extensions. See 488 // prefs::kExtensionAllowedInstallSites for more information. 489 URLPatternSet GetAllowedInstallSites(); 490 491 // Schedules garbage collection of an extension's on-disk data on the next 492 // start of this ExtensionService. Applies only to extensions with isolated 493 // storage. 494 void SetNeedsStorageGarbageCollection(bool value); 495 bool NeedsStorageGarbageCollection(); 496 497 // Used by ShellWindowGeometryCache to persist its cache. These methods 498 // should not be called directly. 499 const base::DictionaryValue* GetGeometryCache( 500 const std::string& extension_id) const; 501 void SetGeometryCache(const std::string& extension_id, 502 scoped_ptr<base::DictionaryValue> cache); 503 504 private: 505 friend class ExtensionPrefsBlacklistedExtensions; // Unit test. 506 friend class ExtensionPrefsUninstallExtension; // Unit test. 507 508 // See the Create methods. 509 ExtensionPrefs(PrefService* prefs, 510 const base::FilePath& root_dir, 511 ExtensionPrefValueMap* extension_pref_value_map, 512 scoped_ptr<TimeProvider> time_provider, 513 bool extensions_disabled); 514 515 // Converts absolute paths in the pref to paths relative to the 516 // install_directory_. 517 void MakePathsRelative(); 518 519 // Converts internal relative paths to be absolute. Used for export to 520 // consumers who expect full paths. 521 void MakePathsAbsolute(base::DictionaryValue* dict); 522 523 // Helper function used by GetInstalledExtensionInfo() and 524 // GetDelayedInstallInfo() to construct an ExtensionInfo from the provided 525 // |extension| dictionary. 526 scoped_ptr<ExtensionInfo> GetInstalledInfoHelper( 527 const std::string& extension_id, 528 const base::DictionaryValue* extension) const; 529 530 // Interprets the list pref, |pref_key| in |extension_id|'s preferences, as a 531 // URLPatternSet. The |valid_schemes| specify how to parse the URLPatterns. 532 bool ReadPrefAsURLPatternSet(const std::string& extension_id, 533 const std::string& pref_key, 534 URLPatternSet* result, 535 int valid_schemes); 536 537 // Converts |new_value| to a list of strings and sets the |pref_key| pref 538 // belonging to |extension_id|. 539 void SetExtensionPrefURLPatternSet(const std::string& extension_id, 540 const std::string& pref_key, 541 const URLPatternSet& new_value); 542 543 // Read the boolean preference entry and return true if the preference exists 544 // and the preference's value is true; false otherwise. 545 bool ReadPrefAsBooleanAndReturn(const std::string& extension_id, 546 const std::string& key) const; 547 548 // Interprets |pref_key| in |extension_id|'s preferences as an 549 // PermissionSet, and passes ownership of the set to the caller. 550 PermissionSet* ReadPrefAsPermissionSet(const std::string& extension_id, 551 const std::string& pref_key); 552 553 // Converts the |new_value| to its value and sets the |pref_key| pref 554 // belonging to |extension_id|. 555 void SetExtensionPrefPermissionSet(const std::string& extension_id, 556 const std::string& pref_key, 557 const PermissionSet* new_value); 558 559 // Returns an immutable dictionary for extension |id|'s prefs, or NULL if it 560 // doesn't exist. 561 const base::DictionaryValue* GetExtensionPref(const std::string& id) const; 562 563 // Fix missing preference entries in the extensions that are were introduced 564 // in a later Chrome version. 565 void FixMissingPrefs(const ExtensionIdList& extension_ids); 566 567 // Installs the persistent extension preferences into |prefs_|'s extension 568 // pref store. Does nothing if extensions_disabled_ is true. 569 void InitPrefStore(); 570 571 // Migrates the permissions data in the pref store. 572 void MigratePermissions(const ExtensionIdList& extension_ids); 573 574 // Migrates the disable reasons from a single enum to a bit mask. 575 void MigrateDisableReasons(const ExtensionIdList& extension_ids); 576 577 // Checks whether there is a state pref for the extension and if so, whether 578 // it matches |check_state|. 579 bool DoesExtensionHaveState(const std::string& id, 580 Extension::State check_state) const; 581 582 // Helper function to Get/Set array of strings from/to prefs. 583 ExtensionIdList GetExtensionPrefAsVector(const char* pref); 584 void SetExtensionPrefFromVector(const char* pref, 585 const ExtensionIdList& extension_ids); 586 587 // Helper function to populate |extension_dict| with the values needed 588 // by a newly installed extension. Work is broken up between this 589 // function and FinishExtensionInfoPrefs() to accomodate delayed 590 // installations. 591 void PopulateExtensionInfoPrefs(const Extension* extension, 592 const base::Time install_time, 593 Extension::State initial_state, 594 Blacklist::BlacklistState blacklist_state, 595 base::DictionaryValue* extension_dict); 596 597 // Helper function to complete initialization of the values in 598 // |extension_dict| for an extension install. Also see 599 // PopulateExtensionInfoPrefs(). 600 void FinishExtensionInfoPrefs( 601 const std::string& extension_id, 602 const base::Time install_time, 603 bool needs_sort_ordinal, 604 const syncer::StringOrdinal& suggested_page_ordinal, 605 base::DictionaryValue* extension_dict); 606 607 // The pref service specific to this set of extension prefs. Owned by profile. 608 PrefService* prefs_; 609 610 // Base extensions install directory. 611 base::FilePath install_directory_; 612 613 // Weak pointer, owned by Profile. 614 ExtensionPrefValueMap* extension_pref_value_map_; 615 616 // Contains all the logic for handling the order for various extension 617 // properties. 618 scoped_ptr<ExtensionSorting> extension_sorting_; 619 620 scoped_refptr<ContentSettingsStore> content_settings_store_; 621 622 scoped_ptr<TimeProvider> time_provider_; 623 624 bool extensions_disabled_; 625 626 DISALLOW_COPY_AND_ASSIGN(ExtensionPrefs); 627 }; 628 629 } // namespace extensions 630 631 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_PREFS_H_ 632