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