// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_SETTINGS_H_ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_SETTINGS_H_ #pragma once #include "base/callback.h" #include "base/file_path.h" #include "base/memory/ref_counted.h" #include "chrome/browser/extensions/extension_settings_storage.h" // Manages ExtensionSettingsStorage objects for extensions. class ExtensionSettings : public base::RefCountedThreadSafe { public: // File path is the base of the extension settings directory. // The databases will be at base_path/extension_id. explicit ExtensionSettings(const FilePath& base_path); // Callback from the GetStorage() methods. typedef base::Callback Callback; // Gets the storage area for a given extension. Only valid for the duration // of the callback. // By default this will be of a cached LEVELDB storage, but on failure to // create a leveldb instance will fall back to cached NOOP storage. // Callbacks will happen asynchronously regardless of whether they need to go // to the FILE thread, but will always be called on the UI thread. void GetStorage(const std::string& extension_id, const Callback& callback); // Gets a storage area for a given extension with a specific type. // and whether it should be wrapped in a cache. // Use this for testing; if the given type fails to be created (e.g. if // leveldb creation fails) then a DCHECK will fail. // Callback objects will be deleted when used. void GetStorageForTesting( ExtensionSettingsStorage::Type type, bool cached, const std::string& extension_id, const Callback& callback); private: friend class base::RefCountedThreadSafe; ~ExtensionSettings(); // Attempts to get and callback with an existing storage area. Returns // whether storage existed and the callback run. bool GetExistingStorage( const std::string& extension_id, const Callback& callback); // Runs a Callback with a storage argument, then deletes the callback. void RunWithStorage(Callback* callback, ExtensionSettingsStorage* storage); // Starts the process of creation of a storage area. // Must be run on the UI thread. void StartCreationOfStorage( const std::string& extension_id, ExtensionSettingsStorage::Type type, ExtensionSettingsStorage::Type fallback_type, bool cached, const Callback& callback); // Creates a new storage area of a given type, with a fallback type if // creation fails, and optionally wrapped in a cache. // Must be run on the FILE thread. void CreateStorageOnFileThread( const std::string& extension_id, ExtensionSettingsStorage::Type type, ExtensionSettingsStorage::Type fallback_type, bool cached, const Callback& callback); // Creates a storage area of a given type, optionally wrapped in a cache. // Returns NULL if creation fails. ExtensionSettingsStorage* CreateStorage( const std::string& extension_id, ExtensionSettingsStorage::Type type, bool cached); // End the creation of a storage area. // Must be run on the UI thread. void EndCreationOfStorage( const std::string& extension_id, ExtensionSettingsStorage* storage, const Callback& callback); // The base file path to create any leveldb databases at. const FilePath base_path_; // A cache of ExtensionSettingsStorage objects that have already been created. // Ensure that there is only ever one created per extension. std::map storage_objs_; DISALLOW_COPY_AND_ASSIGN(ExtensionSettings); }; #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_SETTINGS_H_