Home | History | Annotate | Download | only in storage
      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   virtual ~SettingsFunction();
     22 
     23   // ExtensionFunction:
     24   virtual bool ShouldSkipQuotaLimiting() const OVERRIDE;
     25   virtual 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   virtual ~StorageStorageAreaGetFunction() {}
     81 
     82   // SettingsFunction:
     83   virtual 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   virtual ~StorageStorageAreaSetFunction() {}
     92 
     93   // SettingsFunction:
     94   virtual ResponseValue RunWithStorage(ValueStore* storage) OVERRIDE;
     95 
     96   // ExtensionFunction:
     97   virtual void GetQuotaLimitHeuristics(
     98       QuotaLimitHeuristics* heuristics) const OVERRIDE;
     99 };
    100 
    101 class StorageStorageAreaRemoveFunction : public SettingsFunction {
    102  public:
    103   DECLARE_EXTENSION_FUNCTION("storage.remove", STORAGE_REMOVE)
    104 
    105  protected:
    106   virtual ~StorageStorageAreaRemoveFunction() {}
    107 
    108   // SettingsFunction:
    109   virtual ResponseValue RunWithStorage(ValueStore* storage) OVERRIDE;
    110 
    111   // ExtensionFunction:
    112   virtual void GetQuotaLimitHeuristics(
    113       QuotaLimitHeuristics* heuristics) const OVERRIDE;
    114 };
    115 
    116 class StorageStorageAreaClearFunction : public SettingsFunction {
    117  public:
    118   DECLARE_EXTENSION_FUNCTION("storage.clear", STORAGE_CLEAR)
    119 
    120  protected:
    121   virtual ~StorageStorageAreaClearFunction() {}
    122 
    123   // SettingsFunction:
    124   virtual ResponseValue RunWithStorage(ValueStore* storage) OVERRIDE;
    125 
    126   // ExtensionFunction:
    127   virtual void GetQuotaLimitHeuristics(
    128       QuotaLimitHeuristics* heuristics) const OVERRIDE;
    129 };
    130 
    131 class StorageStorageAreaGetBytesInUseFunction : public SettingsFunction {
    132  public:
    133   DECLARE_EXTENSION_FUNCTION("storage.getBytesInUse", STORAGE_GETBYTESINUSE)
    134 
    135  protected:
    136   virtual ~StorageStorageAreaGetBytesInUseFunction() {}
    137 
    138   // SettingsFunction:
    139   virtual ResponseValue RunWithStorage(ValueStore* storage) OVERRIDE;
    140 };
    141 
    142 }  // namespace extensions
    143 
    144 #endif  // EXTENSIONS_BROWSER_API_STORAGE_STORAGE_API_H_
    145