Index: net/extras/sqlite/sqlite_persistent_cookie_store.cc |
diff --git a/net/extras/sqlite/sqlite_persistent_cookie_store.cc b/net/extras/sqlite/sqlite_persistent_cookie_store.cc |
index 0af0b2aba406852d8667b818e4f624fa9d54c6dc..e97f27956f08ac17c4d0a100879e0de2d558ed3f 100644 |
--- a/net/extras/sqlite/sqlite_persistent_cookie_store.cc |
+++ b/net/extras/sqlite/sqlite_persistent_cookie_store.cc |
@@ -129,7 +129,7 @@ class SQLitePersistentCookieStore::Backend |
// Commit any pending operations and close the database. This must be called |
// before the object is destructed. |
- void Close(); |
+ void Close(const base::Closure& callback); |
// Post background delete of all cookies that match |cookies|. |
void DeleteAllInList(const std::list<CookieOrigin>& cookies); |
@@ -222,7 +222,7 @@ class SQLitePersistentCookieStore::Backend |
// Commit our pending operations to the database. |
void Commit(); |
// Close() executed on the background runner. |
- void InternalBackgroundClose(); |
+ void InternalBackgroundClose(const base::Closure& callback); |
void DeleteSessionCookiesOnStartup(); |
@@ -1178,17 +1178,19 @@ void SQLitePersistentCookieStore::Backend::Flush( |
// Fire off a close message to the background runner. We could still have a |
// pending commit timer or Load operations holding references on us, but if/when |
// this fires we will already have been cleaned up and it will be ignored. |
-void SQLitePersistentCookieStore::Backend::Close() { |
+void SQLitePersistentCookieStore::Backend::Close( |
+ const base::Closure& callback) { |
if (background_task_runner_->RunsTasksOnCurrentThread()) { |
- InternalBackgroundClose(); |
+ InternalBackgroundClose(callback); |
} else { |
// Must close the backend on the background runner. |
- PostBackgroundTask(FROM_HERE, |
- base::Bind(&Backend::InternalBackgroundClose, this)); |
+ PostBackgroundTask(FROM_HERE, base::Bind(&Backend::InternalBackgroundClose, |
+ this, callback)); |
} |
} |
-void SQLitePersistentCookieStore::Backend::InternalBackgroundClose() { |
+void SQLitePersistentCookieStore::Backend::InternalBackgroundClose( |
+ const base::Closure& callback) { |
DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); |
if (delete_session_cookies_at_shutdown_) |
@@ -1199,6 +1201,10 @@ void SQLitePersistentCookieStore::Backend::InternalBackgroundClose() { |
meta_table_.Reset(); |
db_.reset(); |
+ |
+ // We're clean now. |
+ if (!callback.is_null()) |
+ callback.Run(); |
} |
void SQLitePersistentCookieStore::Backend::DatabaseErrorCallback( |
@@ -1364,6 +1370,10 @@ void SQLitePersistentCookieStore::DeleteAllInList( |
backend_->DeleteAllInList(cookies); |
} |
+void SQLitePersistentCookieStore::Close(const base::Closure& callback) { |
+ backend_->Close(callback); |
+} |
+ |
void SQLitePersistentCookieStore::Load(const LoadedCallback& loaded_callback) { |
backend_->Load(loaded_callback); |
} |
@@ -1396,7 +1406,7 @@ void SQLitePersistentCookieStore::Flush(const base::Closure& callback) { |
} |
SQLitePersistentCookieStore::~SQLitePersistentCookieStore() { |
- backend_->Close(); |
+ backend_->Close(base::Closure()); |
// We release our reference to the Backend, though it will probably still have |
// a reference if the background runner has not run Close() yet. |
} |