// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_SPECIAL_STORAGE_POLICY_H_ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_SPECIAL_STORAGE_POLICY_H_ #include #include #include "base/synchronization/lock.h" #include "chrome/common/extensions/extension_set.h" #include "googleurl/src/gurl.h" #include "webkit/quota/special_storage_policy.h" class CookieSettings; namespace extensions { class Extension; } // Special rights are granted to 'extensions' and 'applications'. The // storage subsystems and the browsing data remover query this interface // to determine which origins have these rights. class ExtensionSpecialStoragePolicy : public quota::SpecialStoragePolicy { public: explicit ExtensionSpecialStoragePolicy(CookieSettings* cookie_settings); // quota::SpecialStoragePolicy methods used by storage subsystems and the // browsing data remover. These methods are safe to call on any thread. virtual bool IsStorageProtected(const GURL& origin) OVERRIDE; virtual bool IsStorageUnlimited(const GURL& origin) OVERRIDE; virtual bool IsStorageSessionOnly(const GURL& origin) OVERRIDE; virtual bool IsInstalledApp(const GURL& origin) OVERRIDE; virtual bool IsFileHandler(const std::string& extension_id) OVERRIDE; virtual bool HasSessionOnlyOrigins() OVERRIDE; // Methods used by the ExtensionService to populate this class. void GrantRightsForExtension(const extensions::Extension* extension); void RevokeRightsForExtension(const extensions::Extension* extension); void RevokeRightsForAllExtensions(); // Decides whether the storage for |extension|'s web extent needs protection. bool NeedsProtection(const extensions::Extension* extension); // Returns the set of extensions protecting this origin. The caller does not // take ownership of the return value. const ExtensionSet* ExtensionsProtectingOrigin(const GURL& origin); protected: virtual ~ExtensionSpecialStoragePolicy(); private: class SpecialCollection { public: SpecialCollection(); ~SpecialCollection(); bool Contains(const GURL& origin); const ExtensionSet* ExtensionsContaining(const GURL& origin); bool ContainsExtension(const std::string& extension_id); void Add(const extensions::Extension* extension); void Remove(const extensions::Extension* extension); void Clear(); private: typedef std::map CachedResults; void ClearCache(); ExtensionSet extensions_; CachedResults cached_results_; }; void NotifyChanged(); base::Lock lock_; // Synchronize all access to the collections. SpecialCollection protected_apps_; SpecialCollection installed_apps_; SpecialCollection unlimited_extensions_; SpecialCollection file_handler_extensions_; SpecialCollection web_intent_extensions_; scoped_refptr cookie_settings_; }; #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_SPECIAL_STORAGE_POLICY_H_