Index: chrome/browser/extensions/api/storage/storage_api.h |
diff --git a/chrome/browser/extensions/api/storage/storage_api.h b/chrome/browser/extensions/api/storage/storage_api.h |
index a37ae6dbeed241edd5597adb72705aa5e6e36586..eb9411f1ed4b7bf42aa5bc15e8db99b9d200add9 100644 |
--- a/chrome/browser/extensions/api/storage/storage_api.h |
+++ b/chrome/browser/extensions/api/storage/storage_api.h |
@@ -30,24 +30,43 @@ class SettingsFunction : public ChromeAsyncExtensionFunction { |
// may return false to imply failure. |
virtual bool RunWithStorage(ValueStore* storage) = 0; |
- // Sets error_ or result_ depending on the value of a storage ReadResult, and |
- // returns whether the result implies success (i.e. !error). |
- bool UseReadResult(ValueStore::ReadResult result); |
- |
- // Sets error_ depending on the value of a storage WriteResult, sends a |
- // change notification if needed, and returns whether the result implies |
- // success (i.e. !error). |
- bool UseWriteResult(ValueStore::WriteResult result); |
+ // Handles the |result| of a read function. |
+ // - If the result succeeded, this will set |result_| and return. |
+ // - If |result| failed with a ValueStore::CORRUPTION error, this will call |
+ // RestoreStorageAndRetry(), and return that result. |
+ // - If the |result| failed with a different error, this will set |error_| |
+ // and return. |
+ bool UseReadResult(ValueStore::ReadResult result, ValueStore* storage); |
+ |
+ // Handles the |result| of a write function. |
+ // - If the result succeeded, this will set |result_| and return. |
+ // - If |result| failed with a ValueStore::CORRUPTION error, this will call |
+ // RestoreStorageAndRetry(), and return that result. |
+ // - If the |result| failed with a different error, this will set |error_| |
+ // and return. |
+ // This will also send out a change notification, if appropriate. |
+ bool UseWriteResult(ValueStore::WriteResult result, ValueStore* storage); |
private: |
// Called via PostTask from RunImpl. Calls RunWithStorage and then |
// SendResponse with its success value. |
void AsyncRunWithStorage(ValueStore* storage); |
+ // Called if we encounter a ValueStore error. If the error is due to |
+ // corruption, tries to restore the ValueStore and re-run the API function. |
+ // If the storage cannot be restored or was due to some other error, then sets |
+ // error and returns. This also sets the |tried_restoring_storage_| flag to |
+ // ensure we don't enter a loop. |
+ bool HandleError(const ValueStore::Error& error, ValueStore* storage); |
+ |
// The settings namespace the call was for. For example, SYNC if the API |
// call was chrome.settings.experimental.sync..., LOCAL if .local, etc. |
settings_namespace::Namespace settings_namespace_; |
+ // A flag indicating whether or not we have tried to restore storage. We |
+ // should only ever try once (per API call) in order to avoid entering a loop. |
+ bool tried_restoring_storage_; |
+ |
// Observers, cached so that it's only grabbed from the UI thread. |
scoped_refptr<SettingsObserverList> observers_; |
}; |