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
{
21 virtual ~SettingsFunction();
24 virtual bool ShouldSkipQuotaLimiting() const OVERRIDE
;
25 virtual 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_|
37 ResponseValue
UseReadResult(ValueStore::ReadResult result
,
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_|
46 // This will also send out a change notification, if appropriate.
47 ResponseValue
UseWriteResult(ValueStore::WriteResult result
,
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
,
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
{
77 DECLARE_EXTENSION_FUNCTION("storage.get", STORAGE_GET
)
80 virtual ~StorageStorageAreaGetFunction() {}
83 virtual ResponseValue
RunWithStorage(ValueStore
* storage
) OVERRIDE
;
86 class StorageStorageAreaSetFunction
: public SettingsFunction
{
88 DECLARE_EXTENSION_FUNCTION("storage.set", STORAGE_SET
)
91 virtual ~StorageStorageAreaSetFunction() {}
94 virtual ResponseValue
RunWithStorage(ValueStore
* storage
) OVERRIDE
;
97 virtual void GetQuotaLimitHeuristics(
98 QuotaLimitHeuristics
* heuristics
) const OVERRIDE
;
101 class StorageStorageAreaRemoveFunction
: public SettingsFunction
{
103 DECLARE_EXTENSION_FUNCTION("storage.remove", STORAGE_REMOVE
)
106 virtual ~StorageStorageAreaRemoveFunction() {}
109 virtual ResponseValue
RunWithStorage(ValueStore
* storage
) OVERRIDE
;
111 // ExtensionFunction:
112 virtual void GetQuotaLimitHeuristics(
113 QuotaLimitHeuristics
* heuristics
) const OVERRIDE
;
116 class StorageStorageAreaClearFunction
: public SettingsFunction
{
118 DECLARE_EXTENSION_FUNCTION("storage.clear", STORAGE_CLEAR
)
121 virtual ~StorageStorageAreaClearFunction() {}
124 virtual ResponseValue
RunWithStorage(ValueStore
* storage
) OVERRIDE
;
126 // ExtensionFunction:
127 virtual void GetQuotaLimitHeuristics(
128 QuotaLimitHeuristics
* heuristics
) const OVERRIDE
;
131 class StorageStorageAreaGetBytesInUseFunction
: public SettingsFunction
{
133 DECLARE_EXTENSION_FUNCTION("storage.getBytesInUse", STORAGE_GETBYTESINUSE
)
136 virtual ~StorageStorageAreaGetBytesInUseFunction() {}
139 virtual ResponseValue
RunWithStorage(ValueStore
* storage
) OVERRIDE
;
142 } // namespace extensions
144 #endif // EXTENSIONS_BROWSER_API_STORAGE_STORAGE_API_H_