indexed_db_factory.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Use of this source code is governed by a BSD-style license that can be 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// found in the LICENSE file. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_FACTORY_H_ 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_FACTORY_H_ 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <map> 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <set> 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "base/basictypes.h" 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "base/files/file_path.h" 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "base/memory/ref_counted.h" 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "base/strings/string16.h" 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "content/browser/indexed_db/indexed_db_callbacks.h" 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "content/browser/indexed_db/indexed_db_database.h" 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "content/browser/indexed_db/indexed_db_database_callbacks.h" 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "content/common/content_export.h" 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "url/gurl.h" 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace content { 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass IndexedDBBackingStore; 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass IndexedDBContextImpl; 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass CONTENT_EXPORT IndexedDBFactory 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : NON_EXPORTED_BASE(public base::RefCountedThreadSafe<IndexedDBFactory>) { 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org public: 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org typedef std::multimap<GURL, IndexedDBDatabase*> OriginDBMap; 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org typedef OriginDBMap::const_iterator OriginDBMapIterator; 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org explicit IndexedDBFactory(IndexedDBContextImpl* context); 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // Notifications from weak pointers. 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void ReleaseDatabase(const IndexedDBDatabase::Identifier& identifier, 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool forcedClose); 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void GetDatabaseNames(scoped_refptr<IndexedDBCallbacks> callbacks, 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GURL& origin_url, 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const base::FilePath& data_directory); 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void Open(const base::string16& name, 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64 version, 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64 transaction_id, 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scoped_refptr<IndexedDBCallbacks> callbacks, 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks, 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GURL& origin_url, 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const base::FilePath& data_directory); 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void DeleteDatabase(const base::string16& name, 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scoped_refptr<IndexedDBCallbacks> callbacks, 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GURL& origin_url, 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const base::FilePath& data_directory); 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void HandleBackingStoreFailure(const GURL& origin_url); 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::pair<OriginDBMapIterator, OriginDBMapIterator> GetOpenDatabasesForOrigin( 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GURL& origin_url) const; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // Called by IndexedDBContext after all connections are closed, to 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // ensure the backing store closed immediately. 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void ForceClose(const GURL& origin_url); 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // Called by the IndexedDBContext destructor so the factory can do cleanup. 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void ContextDestroyed(); 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // Called by an IndexedDBDatabase when it is actually deleted. 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void DatabaseDeleted(const IndexedDBDatabase::Identifier& identifier); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size_t GetConnectionCount(const GURL& origin_url) const; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org protected: 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org friend class base::RefCountedThreadSafe<IndexedDBFactory>; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ~IndexedDBFactory(); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual scoped_refptr<IndexedDBBackingStore> OpenBackingStore( 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GURL& origin_url, 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const base::FilePath& data_directory, 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blink::WebIDBDataLoss* data_loss, 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::string* data_loss_reason, 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool* disk_full); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void ReleaseBackingStore(const GURL& origin_url, bool immediate); 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void CloseBackingStore(const GURL& origin_url); 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org private: 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest, 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BackingStoreReleasedOnForcedClose); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest, 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BackingStoreReleaseDelayedOnClose); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest, DatabaseFailedOpen); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest, 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DeleteDatabaseClosesBackingStore); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest, 95 ForceCloseReleasesBackingStore); 96 FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest, 97 GetDatabaseNamesClosesBackingStore); 98 FRIEND_TEST_ALL_PREFIXES(IndexedDBTest, 99 ForceCloseOpenDatabasesOnCommitFailure); 100 101 // Called internally after a database is closed, with some delay. If this 102 // factory has the last reference, it will be released. 103 void MaybeCloseBackingStore(const GURL& origin_url); 104 bool HasLastBackingStoreReference(const GURL& origin_url) const; 105 106 // Testing helpers, so unit tests don't need to grovel through internal state. 107 bool IsDatabaseOpen(const GURL& origin_url, 108 const base::string16& name) const; 109 bool IsBackingStoreOpen(const GURL& origin_url) const; 110 bool IsBackingStorePendingClose(const GURL& origin_url) const; 111 void RemoveDatabaseFromMaps(const IndexedDBDatabase::Identifier& identifier); 112 113 IndexedDBContextImpl* context_; 114 115 typedef std::map<IndexedDBDatabase::Identifier, 116 IndexedDBDatabase*> IndexedDBDatabaseMap; 117 IndexedDBDatabaseMap database_map_; 118 OriginDBMap origin_dbs_; 119 120 typedef std::map<GURL, scoped_refptr<IndexedDBBackingStore> > 121 IndexedDBBackingStoreMap; 122 IndexedDBBackingStoreMap backing_store_map_; 123 124 std::set<scoped_refptr<IndexedDBBackingStore> > session_only_backing_stores_; 125}; 126 127} // namespace content 128 129#endif // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_FACTORY_H_ 130