extension_special_storage_policy.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Use of this source code is governed by a BSD-style license that can be
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// found in the LICENSE file.
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_SPECIAL_STORAGE_POLICY_H_
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define CHROME_BROWSER_EXTENSIONS_EXTENSION_SPECIAL_STORAGE_POLICY_H_
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <map>
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <string>
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "base/synchronization/lock.h"
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "extensions/common/extension_set.h"
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "url/gurl.h"
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "webkit/browser/quota/special_storage_policy.h"
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass CookieSettings;
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskinamespace extensions {
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass Extension;
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Special rights are granted to 'extensions' and 'applications'. The
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// storage subsystems and the browsing data remover query this interface
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// to determine which origins have these rights.
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass ExtensionSpecialStoragePolicy : public quota::SpecialStoragePolicy {
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public:
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  explicit ExtensionSpecialStoragePolicy(CookieSettings* cookie_settings);
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  // quota::SpecialStoragePolicy methods used by storage subsystems and the
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  // browsing data remover. These methods are safe to call on any thread.
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  virtual bool IsStorageProtected(const GURL& origin) OVERRIDE;
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  virtual bool IsStorageUnlimited(const GURL& origin) OVERRIDE;
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  virtual bool IsStorageSessionOnly(const GURL& origin) OVERRIDE;
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  virtual bool CanQueryDiskSize(const GURL& origin) OVERRIDE;
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  virtual bool IsFileHandler(const std::string& extension_id) OVERRIDE;
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  virtual bool HasIsolatedStorage(const GURL& origin) OVERRIDE;
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  virtual bool HasSessionOnlyOrigins() OVERRIDE;
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  // Methods used by the ExtensionService to populate this class.
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  void GrantRightsForExtension(const extensions::Extension* extension);
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  void RevokeRightsForExtension(const extensions::Extension* extension);
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  void RevokeRightsForAllExtensions();
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  // Decides whether the storage for |extension|'s web extent needs protection.
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  bool NeedsProtection(const extensions::Extension* extension);
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  // Returns the set of extensions protecting this origin. The caller does not
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  // take ownership of the return value.
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  const extensions::ExtensionSet* ExtensionsProtectingOrigin(
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski      const GURL& origin);
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski protected:
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  virtual ~ExtensionSpecialStoragePolicy();
54edc4664d60af1f124d05f0a2b6ba58b837630f51Alan Viverette
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private:
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  class SpecialCollection {
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski   public:
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SpecialCollection();
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ~SpecialCollection();
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool Contains(const GURL& origin);
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const extensions::ExtensionSet* ExtensionsContaining(const GURL& origin);
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool ContainsExtension(const std::string& extension_id);
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool Add(const extensions::Extension* extension);
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool Remove(const extensions::Extension* extension);
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void Clear();
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski   private:
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    typedef std::map<GURL, extensions::ExtensionSet*> CachedResults;
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void ClearCache();
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    extensions::ExtensionSet extensions_;
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    CachedResults cached_results_;
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  };
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  void NotifyGranted(const GURL& origin, int change_flags);
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  void NotifyRevoked(const GURL& origin, int change_flags);
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  void NotifyCleared();
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  base::Lock lock_;  // Synchronize all access to the collections.
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  SpecialCollection protected_apps_;
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  SpecialCollection installed_apps_;
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  SpecialCollection unlimited_extensions_;
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  SpecialCollection file_handler_extensions_;
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  SpecialCollection isolated_extensions_;
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski  scoped_refptr<CookieSettings> cookie_settings_;
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_SPECIAL_STORAGE_POLICY_H_
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski