Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / extensions / browser / api / storage / storage_api.h
blob0a750697bfc7db6535065b78f9aa98bfcab1651c
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.
5 #ifndef EXTENSIONS_BROWSER_API_STORAGE_STORAGE_API_H_
6 #define EXTENSIONS_BROWSER_API_STORAGE_STORAGE_API_H_
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"
15 namespace extensions {
17 // Superclass of all settings functions.
18 class SettingsFunction : public UIThreadExtensionFunction {
19 protected:
20 SettingsFunction();
21 ~SettingsFunction() override;
23 // ExtensionFunction:
24 bool ShouldSkipQuotaLimiting() const override;
25 ResponseAction Run() override;
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;
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);
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);
50 private:
51 // Called via PostTask from Run. Calls RunWithStorage and then
52 // SendResponse with its success value.
53 void AsyncRunWithStorage(ValueStore* storage);
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);
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_;
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_;
71 // Observers, cached so that it's only grabbed from the UI thread.
72 scoped_refptr<SettingsObserverList> observers_;
75 class StorageStorageAreaGetFunction : public SettingsFunction {
76 public:
77 DECLARE_EXTENSION_FUNCTION("storage.get", STORAGE_GET)
79 protected:
80 ~StorageStorageAreaGetFunction() override {}
82 // SettingsFunction:
83 ResponseValue RunWithStorage(ValueStore* storage) override;
86 class StorageStorageAreaSetFunction : public SettingsFunction {
87 public:
88 DECLARE_EXTENSION_FUNCTION("storage.set", STORAGE_SET)
90 protected:
91 ~StorageStorageAreaSetFunction() override {}
93 // SettingsFunction:
94 ResponseValue RunWithStorage(ValueStore* storage) override;
96 // ExtensionFunction:
97 void GetQuotaLimitHeuristics(QuotaLimitHeuristics* heuristics) const override;
100 class StorageStorageAreaRemoveFunction : public SettingsFunction {
101 public:
102 DECLARE_EXTENSION_FUNCTION("storage.remove", STORAGE_REMOVE)
104 protected:
105 ~StorageStorageAreaRemoveFunction() override {}
107 // SettingsFunction:
108 ResponseValue RunWithStorage(ValueStore* storage) override;
110 // ExtensionFunction:
111 void GetQuotaLimitHeuristics(QuotaLimitHeuristics* heuristics) const override;
114 class StorageStorageAreaClearFunction : public SettingsFunction {
115 public:
116 DECLARE_EXTENSION_FUNCTION("storage.clear", STORAGE_CLEAR)
118 protected:
119 ~StorageStorageAreaClearFunction() override {}
121 // SettingsFunction:
122 ResponseValue RunWithStorage(ValueStore* storage) override;
124 // ExtensionFunction:
125 void GetQuotaLimitHeuristics(QuotaLimitHeuristics* heuristics) const override;
128 class StorageStorageAreaGetBytesInUseFunction : public SettingsFunction {
129 public:
130 DECLARE_EXTENSION_FUNCTION("storage.getBytesInUse", STORAGE_GETBYTESINUSE)
132 protected:
133 ~StorageStorageAreaGetBytesInUseFunction() override {}
135 // SettingsFunction:
136 ResponseValue RunWithStorage(ValueStore* storage) override;
139 } // namespace extensions
141 #endif // EXTENSIONS_BROWSER_API_STORAGE_STORAGE_API_H_