15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_STORAGE_STORAGE_API_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_STORAGE_STORAGE_API_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/storage/settings_namespace.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/storage/settings_observer.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/value_store/value_store.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Superclass of all settings functions.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SettingsFunction : public AsyncExtensionFunction {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettingsFunction();
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SettingsFunction();
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionFunction:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldSkipQuotaLimiting() const OVERRIDE;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool RunImpl() OVERRIDE;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension settings function implementations should do their work here.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The SettingsFrontend makes sure this is posted to the appropriate thread.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implementations should fill in args themselves, though (like RunImpl)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // may return false to imply failure.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool RunWithStorage(ValueStore* storage) = 0;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets error_ or result_ depending on the value of a storage ReadResult, and
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returns whether the result implies success (i.e. !error).
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool UseReadResult(ValueStore::ReadResult result);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets error_ depending on the value of a storage WriteResult, sends a
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // change notification if needed, and returns whether the result implies
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // success (i.e. !error).
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool UseWriteResult(ValueStore::WriteResult result);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called via PostTask from RunImpl.  Calls RunWithStorage and then
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SendResponse with its success value.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AsyncRunWithStorage(ValueStore* storage);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The settings namespace the call was for.  For example, SYNC if the API
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // call was chrome.settings.experimental.sync..., LOCAL if .local, etc.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings_namespace::Namespace settings_namespace_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observers, cached so that it's only grabbed from the UI thread.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SettingsObserverList> observers_;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StorageStorageAreaGetFunction : public SettingsFunction {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("storage.get", STORAGE_GET)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~StorageStorageAreaGetFunction() {}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SettingsFunction:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool RunWithStorage(ValueStore* storage) OVERRIDE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StorageStorageAreaSetFunction : public SettingsFunction {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("storage.set", STORAGE_SET)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~StorageStorageAreaSetFunction() {}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SettingsFunction:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool RunWithStorage(ValueStore* storage) OVERRIDE;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionFunction:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetQuotaLimitHeuristics(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaLimitHeuristics* heuristics) const OVERRIDE;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StorageStorageAreaRemoveFunction : public SettingsFunction {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("storage.remove", STORAGE_REMOVE)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~StorageStorageAreaRemoveFunction() {}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SettingsFunction:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool RunWithStorage(ValueStore* storage) OVERRIDE;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionFunction:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetQuotaLimitHeuristics(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaLimitHeuristics* heuristics) const OVERRIDE;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StorageStorageAreaClearFunction : public SettingsFunction {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("storage.clear", STORAGE_CLEAR)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~StorageStorageAreaClearFunction() {}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SettingsFunction:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool RunWithStorage(ValueStore* storage) OVERRIDE;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionFunction:
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetQuotaLimitHeuristics(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaLimitHeuristics* heuristics) const OVERRIDE;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StorageStorageAreaGetBytesInUseFunction : public SettingsFunction {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("storage.getBytesInUse", STORAGE_GETBYTESINUSE)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~StorageStorageAreaGetBytesInUseFunction() {}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SettingsFunction:
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool RunWithStorage(ValueStore* storage) OVERRIDE;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_API_STORAGE_STORAGE_API_H_
125