indexed_db_factory.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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,
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      bool* disk_full);
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual scoped_refptr<IndexedDBBackingStore> OpenBackingStoreHelper(
955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const GURL& origin_url,
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const base::FilePath& data_directory,
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      net::URLRequestContext* request_context,
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      blink::WebIDBDataLoss* data_loss,
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      std::string* data_loss_message,
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      bool* disk_full,
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      bool first_time);
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void ReleaseBackingStore(const GURL& origin_url, bool immediate);
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void CloseBackingStore(const GURL& origin_url);
105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  IndexedDBContextImpl* context() const { return context_; }
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest,
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           BackingStoreReleasedOnForcedClose);
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest,
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           BackingStoreReleaseDelayedOnClose);
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest, DatabaseFailedOpen);
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest,
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           DeleteDatabaseClosesBackingStore);
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest,
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           ForceCloseReleasesBackingStore);
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(IndexedDBFactoryTest,
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           GetDatabaseNamesClosesBackingStore);
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(IndexedDBTest,
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           ForceCloseOpenDatabasesOnCommitFailure);
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Called internally after a database is closed, with some delay. If this
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // factory has the last reference, it will be released.
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void MaybeCloseBackingStore(const GURL& origin_url);
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool HasLastBackingStoreReference(const GURL& origin_url) const;
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Testing helpers, so unit tests don't need to grovel through internal state.
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool IsDatabaseOpen(const GURL& origin_url,
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      const base::string16& name) const;
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool IsBackingStoreOpen(const GURL& origin_url) const;
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool IsBackingStorePendingClose(const GURL& origin_url) const;
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void RemoveDatabaseFromMaps(const IndexedDBDatabase::Identifier& identifier);
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  IndexedDBContextImpl* context_;
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
136ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  typedef std::map<IndexedDBDatabase::Identifier,
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   IndexedDBDatabase*> IndexedDBDatabaseMap;
138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  IndexedDBDatabaseMap database_map_;
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OriginDBMap origin_dbs_;
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  typedef std::map<GURL, scoped_refptr<IndexedDBBackingStore> >
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      IndexedDBBackingStoreMap;
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  IndexedDBBackingStoreMap backing_store_map_;
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::set<scoped_refptr<IndexedDBBackingStore> > session_only_backing_stores_;
146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  IndexedDBBackingStoreMap backing_stores_with_active_blobs_;
1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::set<GURL> backends_opened_since_boot_;
148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IndexedDBFactory);
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace content
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif  // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_FACTORY_H_
155