indexed_db_factory.h revision 116680a4aac90f2aa7413d9095a592090648e557
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file. 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_FACTORY_H_ 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_FACTORY_H_ 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <map> 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <set> 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <string> 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <utility> 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/basictypes.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_path.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/ref_counted.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/indexed_db/indexed_db_callbacks.h" 18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/browser/indexed_db/indexed_db_database.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/indexed_db/indexed_db_database_callbacks.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/common/content_export.h" 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "url/gurl.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace net { 24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass URLRequestContext; 25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content { 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class IndexedDBBackingStore; 301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class IndexedDBContextImpl; 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)struct IndexedDBPendingConnection; 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class CONTENT_EXPORT IndexedDBFactory 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : NON_EXPORTED_BASE(public base::RefCountedThreadSafe<IndexedDBFactory>) { 35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef std::multimap<GURL, IndexedDBDatabase*> OriginDBMap; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef OriginDBMap::const_iterator OriginDBMapIterator; 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) explicit IndexedDBFactory(IndexedDBContextImpl* context); 40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ReleaseDatabase(const IndexedDBDatabase::Identifier& identifier, 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool forcedClose); 43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void GetDatabaseNames(scoped_refptr<IndexedDBCallbacks> callbacks, 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GURL& origin_url, 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::FilePath& data_directory, 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu net::URLRequestContext* request_context); 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void Open(const base::string16& name, 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const IndexedDBPendingConnection& connection, 50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch net::URLRequestContext* request_context, 511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GURL& origin_url, 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::FilePath& data_directory); 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void DeleteDatabase(const base::string16& name, 55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch net::URLRequestContext* request_context, 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<IndexedDBCallbacks> callbacks, 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GURL& origin_url, 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::FilePath& data_directory); 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void HandleBackingStoreFailure(const GURL& origin_url); 61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch void HandleBackingStoreCorruption(const GURL& origin_url, 62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const IndexedDBDatabaseError& error); 631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::pair<OriginDBMapIterator, OriginDBMapIterator> GetOpenDatabasesForOrigin( 651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GURL& origin_url) const; 661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void ForceClose(const GURL& origin_url); 681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Called by the IndexedDBContext destructor so the factory can do cleanup. 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void ContextDestroyed(); 71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Called by the IndexedDBActiveBlobRegistry. 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void ReportOutstandingBlobs(const GURL& origin_url, 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool blobs_outstanding); 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Called by an IndexedDBDatabase when it is actually deleted. 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void DatabaseDeleted(const IndexedDBDatabase::Identifier& identifier); 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t GetConnectionCount(const GURL& origin_url) const; 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected: 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) friend class base::RefCountedThreadSafe<IndexedDBFactory>; 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual ~IndexedDBFactory(); 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual scoped_refptr<IndexedDBBackingStore> OpenBackingStore( 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GURL& origin_url, 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath& data_directory, 89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch net::URLRequestContext* request_context, 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDataLoss* data_loss, 910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) std::string* data_loss_reason, 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool* disk_full, 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch leveldb::Status* status); 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual scoped_refptr<IndexedDBBackingStore> OpenBackingStoreHelper( 965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const GURL& origin_url, 975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::FilePath& data_directory, 985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu net::URLRequestContext* request_context, 995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu blink::WebIDBDataLoss* data_loss, 1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::string* data_loss_message, 1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool* disk_full, 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool first_time, 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch leveldb::Status* status); 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void ReleaseBackingStore(const GURL& origin_url, bool immediate); 1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void CloseBackingStore(const GURL& origin_url); 107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IndexedDBContextImpl* context() const { return context_; } 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest, 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BackingStoreReleasedOnForcedClose); 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest, 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BackingStoreReleaseDelayedOnClose); 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest, DatabaseFailedOpen); 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest, 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeleteDatabaseClosesBackingStore); 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest, 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ForceCloseReleasesBackingStore); 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest, 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetDatabaseNamesClosesBackingStore); 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(IndexedDBTest, 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ForceCloseOpenDatabasesOnCommitFailure); 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Called internally after a database is closed, with some delay. If this 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // factory has the last reference, it will be released. 1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void MaybeCloseBackingStore(const GURL& origin_url); 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool HasLastBackingStoreReference(const GURL& origin_url) const; 1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Testing helpers, so unit tests don't need to grovel through internal state. 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool IsDatabaseOpen(const GURL& origin_url, 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& name) const; 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool IsBackingStoreOpen(const GURL& origin_url) const; 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool IsBackingStorePendingClose(const GURL& origin_url) const; 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RemoveDatabaseFromMaps(const IndexedDBDatabase::Identifier& identifier); 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IndexedDBContextImpl* context_; 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch typedef std::map<IndexedDBDatabase::Identifier, 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IndexedDBDatabase*> IndexedDBDatabaseMap; 140424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IndexedDBDatabaseMap database_map_; 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OriginDBMap origin_dbs_; 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) typedef std::map<GURL, scoped_refptr<IndexedDBBackingStore> > 144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStoreMap; 145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStoreMap backing_store_map_; 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::set<scoped_refptr<IndexedDBBackingStore> > session_only_backing_stores_; 148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IndexedDBBackingStoreMap backing_stores_with_active_blobs_; 1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::set<GURL> backends_opened_since_boot_; 150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(IndexedDBFactory); 152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace content 155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_FACTORY_H_ 157