Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / extensions / browser / api / storage / storage_api.h
1 // Copyright 2014 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 EXTENSIONS_BROWSER_API_STORAGE_STORAGE_API_H_
6 #define EXTENSIONS_BROWSER_API_STORAGE_STORAGE_API_H_
7
8 #include "base/compiler_specific.h"
9 #include "base/memory/ref_counted.h"
10 #include "extensions/browser/api/storage/settings_namespace.h"
11 #include "extensions/browser/api/storage/settings_observer.h"
12 #include "extensions/browser/extension_function.h"
13 #include "extensions/browser/value_store/value_store.h"
14
15 namespace extensions {
16
17 // Superclass of all settings functions.
18 class SettingsFunction : public UIThreadExtensionFunction {
19  protected:
20   SettingsFunction();
21   ~SettingsFunction() override;
22
23   // ExtensionFunction:
24   bool ShouldSkipQuotaLimiting() const override;
25   ResponseAction Run() override;
26
27   // Extension settings function implementations should do their work here.
28   // The StorageFrontend makes sure this is posted to the appropriate thread.
29   virtual ResponseValue RunWithStorage(ValueStore* storage) = 0;
30
31   // Handles the |result| of a read function.
32   // - If the result succeeded, this will set |result_| and return.
33   // - If |result| failed with a ValueStore::CORRUPTION error, this will call
34   //   RestoreStorageAndRetry(), and return that result.
35   // - If the |result| failed with a different error, this will set |error_|
36   //   and return.
37   ResponseValue UseReadResult(ValueStore::ReadResult result,
38                               ValueStore* storage);
39
40   // Handles the |result| of a write function.
41   // - If the result succeeded, this will set |result_| and return.
42   // - If |result| failed with a ValueStore::CORRUPTION error, this will call
43   //   RestoreStorageAndRetry(), and return that result.
44   // - If the |result| failed with a different error, this will set |error_|
45   //   and return.
46   // This will also send out a change notification, if appropriate.
47   ResponseValue UseWriteResult(ValueStore::WriteResult result,
48                                ValueStore* storage);
49
50  private:
51   // Called via PostTask from Run. Calls RunWithStorage and then
52   // SendResponse with its success value.
53   void AsyncRunWithStorage(ValueStore* storage);
54
55   // Called if we encounter a ValueStore error. If the error is due to
56   // corruption, tries to restore the ValueStore and re-run the API function.
57   // If the storage cannot be restored or was due to some other error, then sets
58   // error and returns. This also sets the |tried_restoring_storage_| flag to
59   // ensure we don't enter a loop.
60   ResponseValue HandleError(const ValueStore::Error& error,
61                             ValueStore* storage);
62
63   // The settings namespace the call was for.  For example, SYNC if the API
64   // call was chrome.settings.experimental.sync..., LOCAL if .local, etc.
65   settings_namespace::Namespace settings_namespace_;
66
67   // A flag indicating whether or not we have tried to restore storage. We
68   // should only ever try once (per API call) in order to avoid entering a loop.
69   bool tried_restoring_storage_;
70
71   // Observers, cached so that it's only grabbed from the UI thread.
72   scoped_refptr<SettingsObserverList> observers_;
73 };
74
75 class StorageStorageAreaGetFunction : public SettingsFunction {
76  public:
77   DECLARE_EXTENSION_FUNCTION("storage.get", STORAGE_GET)
78
79  protected:
80   ~StorageStorageAreaGetFunction() override {}
81
82   // SettingsFunction:
83   ResponseValue RunWithStorage(ValueStore* storage) override;
84 };
85
86 class StorageStorageAreaSetFunction : public SettingsFunction {
87  public:
88   DECLARE_EXTENSION_FUNCTION("storage.set", STORAGE_SET)
89
90  protected:
91   ~StorageStorageAreaSetFunction() override {}
92
93   // SettingsFunction:
94   ResponseValue RunWithStorage(ValueStore* storage) override;
95
96   // ExtensionFunction:
97   void GetQuotaLimitHeuristics(QuotaLimitHeuristics* heuristics) const override;
98 };
99
100 class StorageStorageAreaRemoveFunction : public SettingsFunction {
101  public:
102   DECLARE_EXTENSION_FUNCTION("storage.remove", STORAGE_REMOVE)
103
104  protected:
105   ~StorageStorageAreaRemoveFunction() override {}
106
107   // SettingsFunction:
108   ResponseValue RunWithStorage(ValueStore* storage) override;
109
110   // ExtensionFunction:
111   void GetQuotaLimitHeuristics(QuotaLimitHeuristics* heuristics) const override;
112 };
113
114 class StorageStorageAreaClearFunction : public SettingsFunction {
115  public:
116   DECLARE_EXTENSION_FUNCTION("storage.clear", STORAGE_CLEAR)
117
118  protected:
119   ~StorageStorageAreaClearFunction() override {}
120
121   // SettingsFunction:
122   ResponseValue RunWithStorage(ValueStore* storage) override;
123
124   // ExtensionFunction:
125   void GetQuotaLimitHeuristics(QuotaLimitHeuristics* heuristics) const override;
126 };
127
128 class StorageStorageAreaGetBytesInUseFunction : public SettingsFunction {
129  public:
130   DECLARE_EXTENSION_FUNCTION("storage.getBytesInUse", STORAGE_GETBYTESINUSE)
131
132  protected:
133   ~StorageStorageAreaGetBytesInUseFunction() override {}
134
135   // SettingsFunction:
136   ResponseValue RunWithStorage(ValueStore* storage) override;
137 };
138
139 }  // namespace extensions
140
141 #endif  // EXTENSIONS_BROWSER_API_STORAGE_STORAGE_API_H_