15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_SPECIAL_STORAGE_POLICY_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_EXTENSION_SPECIAL_STORAGE_POLICY_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/special_storage_policy.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CookieSettings;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Special rights are granted to 'extensions' and 'applications'. The
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// storage subsystems and the browsing data remover query this interface
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to determine which origins have these rights.
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class ExtensionSpecialStoragePolicy : public storage::SpecialStoragePolicy {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ExtensionSpecialStoragePolicy(CookieSettings* cookie_settings);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // storage::SpecialStoragePolicy methods used by storage subsystems and the
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browsing data remover. These methods are safe to call on any thread.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsStorageProtected(const GURL& origin) OVERRIDE;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsStorageUnlimited(const GURL& origin) OVERRIDE;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsStorageSessionOnly(const GURL& origin) OVERRIDE;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool CanQueryDiskSize(const GURL& origin) OVERRIDE;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsFileHandler(const std::string& extension_id) OVERRIDE;
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual bool HasIsolatedStorage(const GURL& origin) OVERRIDE;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HasSessionOnlyOrigins() OVERRIDE;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Methods used by the ExtensionService to populate this class.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GrantRightsForExtension(const extensions::Extension* extension);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RevokeRightsForExtension(const extensions::Extension* extension);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RevokeRightsForAllExtensions();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Decides whether the storage for |extension|'s web extent needs protection.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool NeedsProtection(const extensions::Extension* extension);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the set of extensions protecting this origin. The caller does not
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // take ownership of the return value.
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const extensions::ExtensionSet* ExtensionsProtectingOrigin(
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const GURL& origin);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionSpecialStoragePolicy();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class SpecialCollection {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SpecialCollection();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~SpecialCollection();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool Contains(const GURL& origin);
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const extensions::ExtensionSet* ExtensionsContaining(const GURL& origin);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool ContainsExtension(const std::string& extension_id);
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool Add(const extensions::Extension* extension);
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool Remove(const extensions::Extension* extension);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Clear();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    typedef std::map<GURL, extensions::ExtensionSet*> CachedResults;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void ClearCache();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    extensions::ExtensionSet extensions_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CachedResults cached_results_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void NotifyGranted(const GURL& origin, int change_flags);
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void NotifyRevoked(const GURL& origin, int change_flags);
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void NotifyCleared();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Lock lock_;  // Synchronize all access to the collections.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SpecialCollection protected_apps_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SpecialCollection installed_apps_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SpecialCollection unlimited_extensions_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SpecialCollection file_handler_extensions_;
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SpecialCollection isolated_extensions_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieSettings> cookie_settings_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_SPECIAL_STORAGE_POLICY_H_
91