Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(725)

Side by Side Diff: webkit/database/database_tracker.h

Issue 7234014: Move code to clear web databases on shutdown to the database tracker (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: updates Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef WEBKIT_DATABASE_DATABASE_TRACKER_H_ 5 #ifndef WEBKIT_DATABASE_DATABASE_TRACKER_H_
6 #define WEBKIT_DATABASE_DATABASE_TRACKER_H_ 6 #define WEBKIT_DATABASE_DATABASE_TRACKER_H_
7 7
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 10
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 public: 81 public:
82 virtual void OnDatabaseSizeChanged(const string16& origin_identifier, 82 virtual void OnDatabaseSizeChanged(const string16& origin_identifier,
83 const string16& database_name, 83 const string16& database_name,
84 int64 database_size) = 0; 84 int64 database_size) = 0;
85 virtual void OnDatabaseScheduledForDeletion( 85 virtual void OnDatabaseScheduledForDeletion(
86 const string16& origin_identifier, 86 const string16& origin_identifier,
87 const string16& database_name) = 0; 87 const string16& database_name) = 0;
88 virtual ~Observer() {} 88 virtual ~Observer() {}
89 }; 89 };
90 90
91 DatabaseTracker(const FilePath& profile_path, bool is_incognito, 91 DatabaseTracker(const FilePath& profile_path,
92 bool is_incognito,
93 bool clear_local_state_on_exit,
92 quota::SpecialStoragePolicy* special_storage_policy, 94 quota::SpecialStoragePolicy* special_storage_policy,
93 quota::QuotaManagerProxy* quota_manager_proxy, 95 quota::QuotaManagerProxy* quota_manager_proxy,
94 base::MessageLoopProxy* db_tracker_thread); 96 base::MessageLoopProxy* db_tracker_thread);
95 97
96 void DatabaseOpened(const string16& origin_identifier, 98 void DatabaseOpened(const string16& origin_identifier,
97 const string16& database_name, 99 const string16& database_name,
98 const string16& database_details, 100 const string16& database_details,
99 int64 estimated_size, 101 int64 estimated_size,
100 int64* database_size); 102 int64* database_size);
101 void DatabaseModified(const string16& origin_identifier, 103 void DatabaseModified(const string16& origin_identifier,
(...skipping 14 matching lines...) Expand all
116 // virtual for unittesting only 118 // virtual for unittesting only
117 virtual bool GetOriginInfo(const string16& origin_id, OriginInfo* info); 119 virtual bool GetOriginInfo(const string16& origin_id, OriginInfo* info);
118 virtual bool GetAllOriginIdentifiers(std::vector<string16>* origin_ids); 120 virtual bool GetAllOriginIdentifiers(std::vector<string16>* origin_ids);
119 virtual bool GetAllOriginsInfo(std::vector<OriginInfo>* origins_info); 121 virtual bool GetAllOriginsInfo(std::vector<OriginInfo>* origins_info);
120 122
121 // Safe to call on any thread. 123 // Safe to call on any thread.
122 quota::QuotaManagerProxy* quota_manager_proxy() const { 124 quota::QuotaManagerProxy* quota_manager_proxy() const {
123 return quota_manager_proxy_.get(); 125 return quota_manager_proxy_.get();
124 } 126 }
125 127
128 // Safe to call on any thread.
129 quota::SpecialStoragePolicy* special_storage_policy() const {
130 return special_storage_policy_.get();
131 }
132
133
126 bool IsDatabaseScheduledForDeletion(const string16& origin_identifier, 134 bool IsDatabaseScheduledForDeletion(const string16& origin_identifier,
127 const string16& database_name); 135 const string16& database_name);
128 136
129 // Deletes a single database. Returns net::OK on success, net::FAILED on 137 // Deletes a single database. Returns net::OK on success, net::FAILED on
130 // failure, or net::ERR_IO_PENDING and |callback| is invoked upon completion, 138 // failure, or net::ERR_IO_PENDING and |callback| is invoked upon completion,
131 // if non-NULL. 139 // if non-NULL.
132 int DeleteDatabase(const string16& origin_identifier, 140 int DeleteDatabase(const string16& origin_identifier,
133 const string16& database_name, 141 const string16& database_name,
134 net::CompletionCallback* callback); 142 net::CompletionCallback* callback);
135 143
136 // Delete any databases that have been touched since the cutoff date that's 144 // Delete any databases that have been touched since the cutoff date that's
137 // supplied, omitting any that match IDs within |protected_origins|. 145 // supplied, omitting any that match IDs within |protected_origins|.
138 // Returns net::OK on success, net::FAILED if not all databases could be 146 // Returns net::OK on success, net::FAILED if not all databases could be
139 // deleted, and net::ERR_IO_PENDING and |callback| is invoked upon completion, 147 // deleted, and net::ERR_IO_PENDING and |callback| is invoked upon completion,
140 // if non-NULL. Protected origins, according the the SpecialStoragePolicy, 148 // if non-NULL. Protected origins, according the the SpecialStoragePolicy,
141 // are not deleted by this method. 149 // are not deleted by this method.
142 int DeleteDataModifiedSince(const base::Time& cutoff, 150 int DeleteDataModifiedSince(const base::Time& cutoff,
143 net::CompletionCallback* callback); 151 net::CompletionCallback* callback);
144 152
145 // Delete all databases that belong to the given origin. Returns net::OK on 153 // Delete all databases that belong to the given origin. Returns net::OK on
146 // success, net::FAILED if not all databases could be deleted, and 154 // success, net::FAILED if not all databases could be deleted, and
147 // net::ERR_IO_PENDING and |callback| is invoked upon completion, if non-NULL. 155 // net::ERR_IO_PENDING and |callback| is invoked upon completion, if non-NULL.
148 // virtual for unit testing only 156 // virtual for unit testing only
149 virtual int DeleteDataForOrigin(const string16& origin_identifier, 157 virtual int DeleteDataForOrigin(const string16& origin_identifier,
150 net::CompletionCallback* callback); 158 net::CompletionCallback* callback);
151 159
160 // Delete all files belonging to the given origin given that no database
161 // connections within this origin are open, or if |force| is true, delete
162 // the meta data and rename the associated directory.
163 bool DeleteOrigin(const string16& origin_identifier, bool force);
164
152 bool IsIncognitoProfile() const { return is_incognito_; } 165 bool IsIncognitoProfile() const { return is_incognito_; }
153 166
154 void GetIncognitoFileHandle(const string16& vfs_file_path, 167 void GetIncognitoFileHandle(const string16& vfs_file_path,
155 base::PlatformFile* file_handle) const; 168 base::PlatformFile* file_handle) const;
156 void SaveIncognitoFileHandle(const string16& vfs_file_path, 169 void SaveIncognitoFileHandle(const string16& vfs_file_path,
157 const base::PlatformFile& file_handle); 170 const base::PlatformFile& file_handle);
158 bool CloseIncognitoFileHandle(const string16& vfs_file_path); 171 bool CloseIncognitoFileHandle(const string16& vfs_file_path);
159 bool HasSavedIncognitoFileHandle(const string16& vfs_file_path) const; 172 bool HasSavedIncognitoFileHandle(const string16& vfs_file_path) const;
160 173
161 // Deletes the directory that stores all DBs in incognito mode, if it exists. 174 // Deletes the directory that stores all DBs in incognito mode, if it exists.
162 void DeleteIncognitoDBDirectory(); 175 void DeleteIncognitoDBDirectory();
163 176
164 static void ClearLocalState(const FilePath& profile_path); 177 // Deletes databases not protected by the special storage policy if
178 // |clear_local_state_on_exit_| is true and blocks databases from being
179 // created/opened.
180 void Shutdown();
181 void SetClearLocalStateOnExit(bool clear_local_state_on_exit);
165 182
166 private: 183 private:
167 friend class base::RefCountedThreadSafe<DatabaseTracker>; 184 friend class base::RefCountedThreadSafe<DatabaseTracker>;
168 friend class MockDatabaseTracker; // for testing 185 friend class MockDatabaseTracker; // for testing
169 186
170 typedef std::map<string16, std::set<string16> > DatabaseSet; 187 typedef std::map<string16, std::set<string16> > DatabaseSet;
171 typedef std::map<net::CompletionCallback*, DatabaseSet> PendingCompletionMap; 188 typedef std::map<net::CompletionCallback*, DatabaseSet> PendingCompletionMap;
172 typedef std::map<string16, base::PlatformFile> FileHandlesMap; 189 typedef std::map<string16, base::PlatformFile> FileHandlesMap;
173 typedef std::map<string16, string16> OriginDirectoriesMap; 190 typedef std::map<string16, string16> OriginDirectoriesMap;
174 191
(...skipping 13 matching lines...) Expand all
188 const string16& description) { 205 const string16& description) {
189 database_info_[database_name].second = description; 206 database_info_[database_name].second = description;
190 } 207 }
191 }; 208 };
192 209
193 // virtual for unittesting only 210 // virtual for unittesting only
194 virtual ~DatabaseTracker(); 211 virtual ~DatabaseTracker();
195 212
196 bool DeleteClosedDatabase(const string16& origin_identifier, 213 bool DeleteClosedDatabase(const string16& origin_identifier,
197 const string16& database_name); 214 const string16& database_name);
198 bool DeleteOrigin(const string16& origin_identifier);
199 void DeleteDatabaseIfNeeded(const string16& origin_identifier, 215 void DeleteDatabaseIfNeeded(const string16& origin_identifier,
200 const string16& database_name); 216 const string16& database_name);
201 217
202 bool LazyInit(); 218 bool LazyInit();
203 bool UpgradeToCurrentVersion(); 219 bool UpgradeToCurrentVersion();
204 void InsertOrUpdateDatabaseDetails(const string16& origin_identifier, 220 void InsertOrUpdateDatabaseDetails(const string16& origin_identifier,
205 const string16& database_name, 221 const string16& database_name,
206 const string16& database_details, 222 const string16& database_details,
207 int64 estimated_size); 223 int64 estimated_size);
208 224
(...skipping 12 matching lines...) Expand all
221 // Schedule a set of open databases for deletion. If non-null, callback is 237 // Schedule a set of open databases for deletion. If non-null, callback is
222 // invoked upon completion. 238 // invoked upon completion.
223 void ScheduleDatabasesForDeletion(const DatabaseSet& databases, 239 void ScheduleDatabasesForDeletion(const DatabaseSet& databases,
224 net::CompletionCallback* callback); 240 net::CompletionCallback* callback);
225 241
226 // Returns the directory where all DB files for the given origin are stored. 242 // Returns the directory where all DB files for the given origin are stored.
227 string16 GetOriginDirectory(const string16& origin_identifier); 243 string16 GetOriginDirectory(const string16& origin_identifier);
228 244
229 bool is_initialized_; 245 bool is_initialized_;
230 const bool is_incognito_; 246 const bool is_incognito_;
247 bool clear_local_state_on_exit_;
231 bool shutting_down_; 248 bool shutting_down_;
232 const FilePath profile_path_; 249 const FilePath profile_path_;
233 const FilePath db_dir_; 250 const FilePath db_dir_;
234 scoped_ptr<sql::Connection> db_; 251 scoped_ptr<sql::Connection> db_;
235 scoped_ptr<DatabasesTable> databases_table_; 252 scoped_ptr<DatabasesTable> databases_table_;
236 scoped_ptr<sql::MetaTable> meta_table_; 253 scoped_ptr<sql::MetaTable> meta_table_;
237 ObserverList<Observer, true> observers_; 254 ObserverList<Observer, true> observers_;
238 std::map<string16, CachedOriginInfo> origins_info_map_; 255 std::map<string16, CachedOriginInfo> origins_info_map_;
239 DatabaseConnections database_connections_; 256 DatabaseConnections database_connections_;
240 257
241 // The set of databases that should be deleted but are still opened 258 // The set of databases that should be deleted but are still opened
242 DatabaseSet dbs_to_be_deleted_; 259 DatabaseSet dbs_to_be_deleted_;
243 PendingCompletionMap deletion_callbacks_; 260 PendingCompletionMap deletion_callbacks_;
244 261
245 // Apps and Extensions can have special rights. 262 // Apps and Extensions can have special rights.
246 scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy_; 263 scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy_;
247 264
248 scoped_refptr<quota::QuotaManagerProxy> quota_manager_proxy_; 265 scoped_refptr<quota::QuotaManagerProxy> quota_manager_proxy_;
249 266
267 // The database tracker thread we're supposed to run file IO on.
268 scoped_refptr<base::MessageLoopProxy> db_tracker_thread_;
269
250 // When in incognito mode, store a DELETE_ON_CLOSE handle to each 270 // When in incognito mode, store a DELETE_ON_CLOSE handle to each
251 // main DB and journal file that was accessed. When the incognito profile 271 // main DB and journal file that was accessed. When the incognito profile
252 // goes away (or when the browser crashes), all these handles will be 272 // goes away (or when the browser crashes), all these handles will be
253 // closed, and the files will be deleted. 273 // closed, and the files will be deleted.
254 FileHandlesMap incognito_file_handles_; 274 FileHandlesMap incognito_file_handles_;
255 275
256 // In a non-incognito profile, all DBs in an origin are stored in a directory 276 // In a non-incognito profile, all DBs in an origin are stored in a directory
257 // named after the origin. In an incognito profile though, we do not want the 277 // named after the origin. In an incognito profile though, we do not want the
258 // directory structure to reveal the origins visited by the user (in case the 278 // directory structure to reveal the origins visited by the user (in case the
259 // browser process crashes and those directories are not deleted). So we use 279 // browser process crashes and those directories are not deleted). So we use
260 // this map to assign directory names that do not reveal this information. 280 // this map to assign directory names that do not reveal this information.
261 OriginDirectoriesMap incognito_origin_directories_; 281 OriginDirectoriesMap incognito_origin_directories_;
262 int incognito_origin_directories_generator_; 282 int incognito_origin_directories_generator_;
263 283
264 FRIEND_TEST_ALL_PREFIXES(DatabaseTracker, TestHelper); 284 FRIEND_TEST_ALL_PREFIXES(DatabaseTracker, TestHelper);
265 }; 285 };
266 286
267 } // namespace webkit_database 287 } // namespace webkit_database
268 288
269 #endif // WEBKIT_DATABASE_DATABASE_TRACKER_H_ 289 #endif // WEBKIT_DATABASE_DATABASE_TRACKER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698