| Index: chrome/browser/net/sqlite_persistent_cookie_store.cc
|
| diff --git a/chrome/browser/net/sqlite_persistent_cookie_store.cc b/chrome/browser/net/sqlite_persistent_cookie_store.cc
|
| index 10e315328e680804d9c8884a19952b4fde14f7e3..f9795745bbf3c2627c2784b7d1a58f23abfbb242 100644
|
| --- a/chrome/browser/net/sqlite_persistent_cookie_store.cc
|
| +++ b/chrome/browser/net/sqlite_persistent_cookie_store.cc
|
| @@ -75,8 +75,6 @@ class SQLitePersistentCookieStore::Backend
|
| num_cookies_read_(0),
|
| num_priority_waiting_(0),
|
| total_priority_requests_(0) {
|
| - error_delegate_ =
|
| - new KillDatabaseErrorDelegate(this, GetErrorHandlerForCookieDb());
|
| }
|
|
|
| // Creates or loads the SQLite database.
|
| @@ -111,35 +109,26 @@ class SQLitePersistentCookieStore::Backend
|
| public:
|
| KillDatabaseErrorDelegate(Backend* backend,
|
| sql::ErrorDelegate* wrapped_delegate);
|
| +
|
| + virtual ~KillDatabaseErrorDelegate() {}
|
| +
|
| // ErrorDelegate implementation.
|
| virtual int OnError(int error,
|
| sql::Connection* connection,
|
| sql::Statement* stmt) OVERRIDE;
|
|
|
| - void reset_backend() {
|
| - backend_ = NULL;
|
| - }
|
| -
|
| - protected:
|
| - virtual ~KillDatabaseErrorDelegate() {}
|
| -
|
| private:
|
|
|
| // Do not increment the count on Backend, as that would create a circular
|
| - // reference (Backend -> Connection -> ErrorDelegate -> Backend). Instead,
|
| - // Backend will call reset_backend() when it is going away.
|
| + // reference (Backend -> Connection -> ErrorDelegate -> Backend).
|
| Backend* backend_;
|
| - scoped_refptr<sql::ErrorDelegate> wrapped_delegate_;
|
| + scoped_ptr<sql::ErrorDelegate> wrapped_delegate_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(KillDatabaseErrorDelegate);
|
| };
|
|
|
| // You should call Close() before destructing this object.
|
| ~Backend() {
|
| - if (error_delegate_.get()) {
|
| - error_delegate_->reset_backend();
|
| - error_delegate_ = NULL;
|
| - }
|
| DCHECK(!db_.get()) << "Close should have already been called.";
|
| DCHECK(num_pending_ == 0 && pending_.empty());
|
| }
|
| @@ -227,7 +216,6 @@ class SQLitePersistentCookieStore::Backend
|
|
|
| FilePath path_;
|
| scoped_ptr<sql::Connection> db_;
|
| - scoped_refptr<KillDatabaseErrorDelegate> error_delegate_;
|
| sql::MetaTable meta_table_;
|
|
|
| typedef std::list<PendingOperation*> PendingOperationsList;
|
| @@ -371,10 +359,9 @@ int SQLitePersistentCookieStore::Backend::KillDatabaseErrorDelegate::OnError(
|
| MessageLoop::current()->PostTask(
|
| FROM_HERE, base::Bind(&Backend::KillDatabase, backend_));
|
|
|
| - // Avoid being called more than once. There should still be a reference to
|
| - // this ErrorDelegate in the backend, but just in case don't refer to any
|
| - // members from here forward.
|
| - connection->set_error_delegate(wrapped_delegate_.get());
|
| + // Avoid being called more than once. This will destroy the
|
| + // KillDatabaseErrorDelegate. Do not refer to any members from here forward.
|
| + connection->set_error_delegate(wrapped_delegate_.release());
|
| }
|
|
|
| return error;
|
| @@ -627,7 +614,8 @@ bool SQLitePersistentCookieStore::Backend::InitializeDatabase() {
|
| }
|
|
|
| db_.reset(new sql::Connection);
|
| - db_->set_error_delegate(error_delegate_.get());
|
| + db_->set_error_delegate(
|
| + new KillDatabaseErrorDelegate(this, GetErrorHandlerForCookieDb()));
|
|
|
| if (!db_->Open(path_)) {
|
| NOTREACHED() << "Unable to open cookie DB.";
|
|
|