| 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..bda036a1fb692c47d0bf6ad3a3d0545719bdaa85 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(
|
| @@ -1361,30 +1367,51 @@ SQLitePersistentCookieStore::SQLitePersistentCookieStore(
|
|
|
| void SQLitePersistentCookieStore::DeleteAllInList(
|
| const std::list<CookieOrigin>& cookies) {
|
| - backend_->DeleteAllInList(cookies);
|
| + if (backend_)
|
| + backend_->DeleteAllInList(cookies);
|
| +}
|
| +
|
| +void SQLitePersistentCookieStore::Close(const base::Closure& callback) {
|
| + if (backend_) {
|
| + backend_->Close(callback);
|
| +
|
| + // We release our reference to the Backend, though it will probably still
|
| + // have a reference if the background runner has not run
|
| + // Backend::InternalBackgroundClose() yet.
|
| + backend_ = nullptr;
|
| + }
|
| }
|
|
|
| void SQLitePersistentCookieStore::Load(const LoadedCallback& loaded_callback) {
|
| - backend_->Load(loaded_callback);
|
| + if (backend_)
|
| + backend_->Load(loaded_callback);
|
| + else
|
| + loaded_callback.Run(std::vector<CanonicalCookie*>());
|
| }
|
|
|
| void SQLitePersistentCookieStore::LoadCookiesForKey(
|
| const std::string& key,
|
| const LoadedCallback& loaded_callback) {
|
| - backend_->LoadCookiesForKey(key, loaded_callback);
|
| + if (backend_)
|
| + backend_->LoadCookiesForKey(key, loaded_callback);
|
| + else
|
| + loaded_callback.Run(std::vector<CanonicalCookie*>());
|
| }
|
|
|
| void SQLitePersistentCookieStore::AddCookie(const CanonicalCookie& cc) {
|
| - backend_->AddCookie(cc);
|
| + if (backend_)
|
| + backend_->AddCookie(cc);
|
| }
|
|
|
| void SQLitePersistentCookieStore::UpdateCookieAccessTime(
|
| const CanonicalCookie& cc) {
|
| - backend_->UpdateCookieAccessTime(cc);
|
| + if (backend_)
|
| + backend_->UpdateCookieAccessTime(cc);
|
| }
|
|
|
| void SQLitePersistentCookieStore::DeleteCookie(const CanonicalCookie& cc) {
|
| - backend_->DeleteCookie(cc);
|
| + if (backend_)
|
| + backend_->DeleteCookie(cc);
|
| }
|
|
|
| void SQLitePersistentCookieStore::SetForceKeepSessionState() {
|
| @@ -1392,13 +1419,12 @@ void SQLitePersistentCookieStore::SetForceKeepSessionState() {
|
| }
|
|
|
| void SQLitePersistentCookieStore::Flush(const base::Closure& callback) {
|
| - backend_->Flush(callback);
|
| + if (backend_)
|
| + backend_->Flush(callback);
|
| }
|
|
|
| SQLitePersistentCookieStore::~SQLitePersistentCookieStore() {
|
| - backend_->Close();
|
| - // We release our reference to the Backend, though it will probably still have
|
| - // a reference if the background runner has not run Close() yet.
|
| + Close(base::Closure());
|
| }
|
|
|
| } // namespace net
|
|
|