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

Side by Side Diff: chrome/browser/net/sqlite_persistent_cookie_store.cc

Issue 8533013: SessionRestore: Store session cookies and restore them if chrome crashes or auto-restarts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 9 years 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 #include "chrome/browser/net/sqlite_persistent_cookie_store.h" 5 #include "chrome/browser/net/sqlite_persistent_cookie_store.h"
6 6
7 #include <list> 7 #include <list>
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 #include <utility> 10 #include <utility>
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 // whichever occurs first. 57 // whichever occurs first.
58 class SQLitePersistentCookieStore::Backend 58 class SQLitePersistentCookieStore::Backend
59 : public base::RefCountedThreadSafe<SQLitePersistentCookieStore::Backend> { 59 : public base::RefCountedThreadSafe<SQLitePersistentCookieStore::Backend> {
60 public: 60 public:
61 explicit Backend(const FilePath& path) 61 explicit Backend(const FilePath& path)
62 : path_(path), 62 : path_(path),
63 db_(NULL), 63 db_(NULL),
64 num_pending_(0), 64 num_pending_(0),
65 clear_local_state_on_exit_(false), 65 clear_local_state_on_exit_(false),
66 initialized_(false), 66 initialized_(false),
67 return_session_cookies_(true),
67 num_priority_waiting_(0), 68 num_priority_waiting_(0),
68 total_priority_requests_(0) { 69 total_priority_requests_(0) {
69 } 70 }
70 71
71 // Creates or loads the SQLite database. 72 // Creates or loads the SQLite database.
72 void Load(const LoadedCallback& loaded_callback); 73 void Load(const LoadedCallback& loaded_callback);
73 74
74 // Loads cookies for the domain key (eTLD+1). 75 // Loads cookies for the domain key (eTLD+1).
75 void LoadCookiesForKey(const std::string& domain, 76 void LoadCookiesForKey(const std::string& domain,
76 const LoadedCallback& loaded_callback); 77 const LoadedCallback& loaded_callback);
77 78
78 // Batch a cookie addition. 79 // Batch a cookie addition.
79 void AddCookie(const net::CookieMonster::CanonicalCookie& cc); 80 void AddCookie(const net::CookieMonster::CanonicalCookie& cc);
80 81
81 // Batch a cookie access time update. 82 // Batch a cookie access time update.
82 void UpdateCookieAccessTime(const net::CookieMonster::CanonicalCookie& cc); 83 void UpdateCookieAccessTime(const net::CookieMonster::CanonicalCookie& cc);
83 84
84 // Batch a cookie deletion. 85 // Batch a cookie deletion.
85 void DeleteCookie(const net::CookieMonster::CanonicalCookie& cc); 86 void DeleteCookie(const net::CookieMonster::CanonicalCookie& cc);
86 87
87 // Commit pending operations as soon as possible. 88 // Commit pending operations as soon as possible.
88 void Flush(Task* completion_task); 89 void Flush(Task* completion_task);
89 90
90 // Commit any pending operations and close the database. This must be called 91 // Commit any pending operations and close the database. This must be called
91 // before the object is destructed. 92 // before the object is destructed.
92 void Close(); 93 void Close();
93 94
94 void SetClearLocalStateOnExit(bool clear_local_state); 95 void SetClearLocalStateOnExit(bool clear_local_state);
95 96
97 void DeleteSessionCookies();
98
96 private: 99 private:
97 friend class base::RefCountedThreadSafe<SQLitePersistentCookieStore::Backend>; 100 friend class base::RefCountedThreadSafe<SQLitePersistentCookieStore::Backend>;
98 101
99 // You should call Close() before destructing this object. 102 // You should call Close() before destructing this object.
100 ~Backend() { 103 ~Backend() {
101 DCHECK(!db_.get()) << "Close should have already been called."; 104 DCHECK(!db_.get()) << "Close should have already been called.";
102 DCHECK(num_pending_ == 0 && pending_.empty()); 105 DCHECK(num_pending_ == 0 && pending_.empty());
103 } 106 }
104 107
105 // Database upgrade statements. 108 // Database upgrade statements.
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 bool LoadCookiesForDomains(const std::set<std::string>& key); 172 bool LoadCookiesForDomains(const std::set<std::string>& key);
170 173
171 // Batch a cookie operation (add or delete) 174 // Batch a cookie operation (add or delete)
172 void BatchOperation(PendingOperation::OperationType op, 175 void BatchOperation(PendingOperation::OperationType op,
173 const net::CookieMonster::CanonicalCookie& cc); 176 const net::CookieMonster::CanonicalCookie& cc);
174 // Commit our pending operations to the database. 177 // Commit our pending operations to the database.
175 void Commit(); 178 void Commit();
176 // Close() executed on the background thread. 179 // Close() executed on the background thread.
177 void InternalBackgroundClose(); 180 void InternalBackgroundClose();
178 181
182 void DeleteSessionCookiesOnDBThread();
183
179 FilePath path_; 184 FilePath path_;
180 scoped_ptr<sql::Connection> db_; 185 scoped_ptr<sql::Connection> db_;
181 sql::MetaTable meta_table_; 186 sql::MetaTable meta_table_;
182 187
183 typedef std::list<PendingOperation*> PendingOperationsList; 188 typedef std::list<PendingOperation*> PendingOperationsList;
184 PendingOperationsList pending_; 189 PendingOperationsList pending_;
185 PendingOperationsList::size_type num_pending_; 190 PendingOperationsList::size_type num_pending_;
186 // True if the persistent store should be deleted upon destruction. 191 // True if the persistent store should be deleted upon destruction.
187 bool clear_local_state_on_exit_; 192 bool clear_local_state_on_exit_;
188 // Guard |cookies_|, |pending_|, |num_pending_|, |clear_local_state_on_exit_| 193 // Guard |cookies_|, |pending_|, |num_pending_|, |clear_local_state_on_exit_|
189 base::Lock lock_; 194 base::Lock lock_;
190 195
191 // Temporary buffer for cookies loaded from DB. Accumulates cookies to reduce 196 // Temporary buffer for cookies loaded from DB. Accumulates cookies to reduce
192 // the number of messages sent to the IO thread. Sent back in response to 197 // the number of messages sent to the IO thread. Sent back in response to
193 // individual load requests for domain keys or when all loading completes. 198 // individual load requests for domain keys or when all loading completes.
194 std::vector<net::CookieMonster::CanonicalCookie*> cookies_; 199 std::vector<net::CookieMonster::CanonicalCookie*> cookies_;
195 200
196 // Map of domain keys(eTLD+1) to domains/hosts that are to be loaded from DB. 201 // Map of domain keys(eTLD+1) to domains/hosts that are to be loaded from DB.
197 std::map<std::string, std::set<std::string> > keys_to_load_; 202 std::map<std::string, std::set<std::string> > keys_to_load_;
198 203
199 // Indicates if DB has been initialized. 204 // Indicates if DB has been initialized.
200 bool initialized_; 205 bool initialized_;
201 206
207 // If false, we should filter out session cookies when reading the DB.
208 bool return_session_cookies_;
209
202 // The cumulative time spent loading the cookies on the DB thread. Incremented 210 // The cumulative time spent loading the cookies on the DB thread. Incremented
203 // and reported from the DB thread. 211 // and reported from the DB thread.
204 base::TimeDelta cookie_load_duration_; 212 base::TimeDelta cookie_load_duration_;
205 213
206 // Guards the following metrics-related properties (only accessed when 214 // Guards the following metrics-related properties (only accessed when
207 // starting/completing priority loads or completing the total load). 215 // starting/completing priority loads or completing the total load).
208 base::Lock metrics_lock_; 216 base::Lock metrics_lock_;
209 int num_priority_waiting_; 217 int num_priority_waiting_;
210 // The total number of priority requests. 218 // The total number of priority requests.
211 int total_priority_requests_; 219 int total_priority_requests_;
212 // The time when |num_priority_waiting_| incremented to 1. 220 // The time when |num_priority_waiting_| incremented to 1.
213 base::Time current_priority_wait_start_; 221 base::Time current_priority_wait_start_;
214 // The cumulative duration of time when |num_priority_waiting_| was greater 222 // The cumulative duration of time when |num_priority_waiting_| was greater
215 // than 1. 223 // than 1.
216 base::TimeDelta priority_wait_duration_; 224 base::TimeDelta priority_wait_duration_;
217 225
218 DISALLOW_COPY_AND_ASSIGN(Backend); 226 DISALLOW_COPY_AND_ASSIGN(Backend);
219 }; 227 };
220 228
221 // Version number of the database. In version 4, we migrated the time epoch. 229 // Version number of the database. In version 4, we migrated the time epoch.
222 // If you open the DB with an older version on Mac or Linux, the times will 230 // If you open the DB with an older version on Mac or Linux, the times will
223 // look wonky, but the file will likely be usable. On Windows version 3 and 4 231 // look wonky, but the file will likely be usable. On Windows version 3 and 4
224 // are the same. 232 // are the same.
225 // 233 //
226 // Version 3 updated the database to include the last access time, so we can 234 // Version 3 updated the database to include the last access time, so we can
227 // expire them in decreasing order of use when we've reached the maximum 235 // expire them in decreasing order of use when we've reached the maximum
228 // number of cookies. 236 // number of cookies.
229 static const int kCurrentVersionNumber = 4; 237 static const int kCurrentVersionNumber = 5;
230 static const int kCompatibleVersionNumber = 3; 238 static const int kCompatibleVersionNumber = 5;
231 239
232 namespace { 240 namespace {
233 241
234 // Increments a specified TimeDelta by the duration between this object's 242 // Increments a specified TimeDelta by the duration between this object's
235 // constructor and destructor. Not thread safe. Multiple instances may be 243 // constructor and destructor. Not thread safe. Multiple instances may be
236 // created with the same delta instance as long as their lifetimes are nested. 244 // created with the same delta instance as long as their lifetimes are nested.
237 // The shortest lived instances have no impact. 245 // The shortest lived instances have no impact.
238 class IncrementTimeDelta { 246 class IncrementTimeDelta {
239 public: 247 public:
240 explicit IncrementTimeDelta(base::TimeDelta* delta) : 248 explicit IncrementTimeDelta(base::TimeDelta* delta) :
(...skipping 15 matching lines...) Expand all
256 264
257 // Initializes the cookies table, returning true on success. 265 // Initializes the cookies table, returning true on success.
258 bool InitTable(sql::Connection* db) { 266 bool InitTable(sql::Connection* db) {
259 if (!db->DoesTableExist("cookies")) { 267 if (!db->DoesTableExist("cookies")) {
260 if (!db->Execute("CREATE TABLE cookies (" 268 if (!db->Execute("CREATE TABLE cookies ("
261 "creation_utc INTEGER NOT NULL UNIQUE PRIMARY KEY," 269 "creation_utc INTEGER NOT NULL UNIQUE PRIMARY KEY,"
262 "host_key TEXT NOT NULL," 270 "host_key TEXT NOT NULL,"
263 "name TEXT NOT NULL," 271 "name TEXT NOT NULL,"
264 "value TEXT NOT NULL," 272 "value TEXT NOT NULL,"
265 "path TEXT NOT NULL," 273 "path TEXT NOT NULL,"
266 // We only store persistent, so we know it expires
267 "expires_utc INTEGER NOT NULL," 274 "expires_utc INTEGER NOT NULL,"
268 "secure INTEGER NOT NULL," 275 "secure INTEGER NOT NULL,"
269 "httponly INTEGER NOT NULL," 276 "httponly INTEGER NOT NULL,"
270 "last_access_utc INTEGER NOT NULL)")) 277 "last_access_utc INTEGER NOT NULL,"
278 "has_expires INTEGER NOT NULL,"
279 "persistent INTEGER NOT NULL)"))
271 return false; 280 return false;
272 } 281 }
273 282
274 // Try to create the index every time. Older versions did not have this index, 283 // Try to create the index every time. Older versions did not have this index,
275 // so we want those people to get it. Ignore errors, since it may exist. 284 // so we want those people to get it. Ignore errors, since it may exist.
276 db->Execute("CREATE INDEX IF NOT EXISTS cookie_times ON cookies" 285 db->Execute("CREATE INDEX IF NOT EXISTS cookie_times ON cookies"
277 " (creation_utc)"); 286 " (creation_utc)");
278 287
279 db->Execute("CREATE INDEX IF NOT EXISTS domain ON cookies(host_key)"); 288 db->Execute("CREATE INDEX IF NOT EXISTS domain ON cookies(host_key)");
280 289
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 // Otherwise notify on IO thread. 500 // Otherwise notify on IO thread.
492 if (load_success && keys_to_load_.size() > 0) { 501 if (load_success && keys_to_load_.size() > 0) {
493 BrowserThread::PostTask( 502 BrowserThread::PostTask(
494 BrowserThread::DB, FROM_HERE, 503 BrowserThread::DB, FROM_HERE,
495 base::Bind(&Backend::ChainLoadCookies, this, loaded_callback)); 504 base::Bind(&Backend::ChainLoadCookies, this, loaded_callback));
496 } else { 505 } else {
497 BrowserThread::PostTask( 506 BrowserThread::PostTask(
498 BrowserThread::IO, FROM_HERE, 507 BrowserThread::IO, FROM_HERE,
499 base::Bind(&SQLitePersistentCookieStore::Backend::CompleteLoadOnIOThread, 508 base::Bind(&SQLitePersistentCookieStore::Backend::CompleteLoadOnIOThread,
500 this, loaded_callback, load_success)); 509 this, loaded_callback, load_success));
510 // We haven't yet had the chance to delete session cookies from the DB; do
511 // it now.
512 if (!return_session_cookies_)
513 DeleteSessionCookiesOnDBThread();
501 } 514 }
502 } 515 }
503 516
504 bool SQLitePersistentCookieStore::Backend::LoadCookiesForDomains( 517 bool SQLitePersistentCookieStore::Backend::LoadCookiesForDomains(
505 const std::set<std::string>& domains) { 518 const std::set<std::string>& domains) {
506 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 519 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
507 520
508 sql::Statement smt(db_->GetCachedStatement(SQL_FROM_HERE, 521 const char* sql;
509 "SELECT creation_utc, host_key, name, value, path, expires_utc, secure, " 522 if (return_session_cookies_) {
510 "httponly, last_access_utc FROM cookies WHERE host_key = ?")); 523 sql =
524 "SELECT creation_utc, host_key, name, value, path, expires_utc, "
525 "secure, httponly, last_access_utc, has_expires, persistent "
526 "FROM cookies WHERE host_key = ?";
527 } else {
528 sql =
529 "SELECT creation_utc, host_key, name, value, path, expires_utc, "
530 "secure, httponly, last_access_utc, has_expires, persistent "
531 "FROM cookies WHERE host_key = ? AND persistent == 1";
532 }
533 sql::Statement smt(db_->GetCachedStatement(SQL_FROM_HERE, sql));
511 if (!smt) { 534 if (!smt) {
512 NOTREACHED() << "select statement prep failed"; 535 NOTREACHED() << "select statement prep failed";
513 db_.reset(); 536 db_.reset();
514 return false; 537 return false;
515 } 538 }
516 539
517 std::vector<net::CookieMonster::CanonicalCookie*> cookies; 540 std::vector<net::CookieMonster::CanonicalCookie*> cookies;
518 std::set<std::string>::const_iterator it = domains.begin(); 541 std::set<std::string>::const_iterator it = domains.begin();
519 for (; it != domains.end(); ++it) { 542 for (; it != domains.end(); ++it) {
520 smt.BindString(0, *it); 543 smt.BindString(0, *it);
521 while (smt.Step()) { 544 while (smt.Step()) {
522 scoped_ptr<net::CookieMonster::CanonicalCookie> cc( 545 scoped_ptr<net::CookieMonster::CanonicalCookie> cc(
523 new net::CookieMonster::CanonicalCookie( 546 new net::CookieMonster::CanonicalCookie(
524 // The "source" URL is not used with persisted cookies. 547 // The "source" URL is not used with persisted cookies.
525 GURL(), // Source 548 GURL(), // Source
526 smt.ColumnString(2), // name 549 smt.ColumnString(2), // name
527 smt.ColumnString(3), // value 550 smt.ColumnString(3), // value
528 smt.ColumnString(1), // domain 551 smt.ColumnString(1), // domain
529 smt.ColumnString(4), // path 552 smt.ColumnString(4), // path
530 std::string(), // TODO(abarth): Persist mac_key 553 std::string(), // TODO(abarth): Persist mac_key
531 std::string(), // TODO(abarth): Persist mac_algorithm 554 std::string(), // TODO(abarth): Persist mac_algorithm
532 Time::FromInternalValue(smt.ColumnInt64(0)), // creation_utc 555 Time::FromInternalValue(smt.ColumnInt64(0)), // creation_utc
533 Time::FromInternalValue(smt.ColumnInt64(5)), // expires_utc 556 Time::FromInternalValue(smt.ColumnInt64(5)), // expires_utc
534 Time::FromInternalValue(smt.ColumnInt64(8)), // last_access_utc 557 Time::FromInternalValue(smt.ColumnInt64(8)), // last_access_utc
535 smt.ColumnInt(6) != 0, // secure 558 smt.ColumnInt(6) != 0, // secure
536 smt.ColumnInt(7) != 0, // httponly 559 smt.ColumnInt(7) != 0, // httponly
537 true, // has_expires 560 smt.ColumnInt(9) != 0, // has_expires
538 true)); // is_persistent 561 smt.ColumnInt(10) != 0)); // is_persistent
539 DLOG_IF(WARNING, 562 DLOG_IF(WARNING,
540 cc->CreationDate() > Time::Now()) << L"CreationDate too recent"; 563 cc->CreationDate() > Time::Now()) << L"CreationDate too recent";
541 cookies.push_back(cc.release()); 564 cookies.push_back(cc.release());
542 } 565 }
543 smt.Reset(); 566 smt.Reset();
544 } 567 }
545 { 568 {
546 base::AutoLock locked(lock_); 569 base::AutoLock locked(lock_);
547 cookies_.insert(cookies_.end(), cookies.begin(), cookies.end()); 570 cookies_.insert(cookies_.end(), cookies.begin(), cookies.end());
548 } 571 }
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 "SET last_access_utc = last_access_utc + 11644473600000000 " 629 "SET last_access_utc = last_access_utc + 11644473600000000 "
607 "WHERE rowid IN " 630 "WHERE rowid IN "
608 "(SELECT rowid FROM cookies WHERE " 631 "(SELECT rowid FROM cookies WHERE "
609 "last_access_utc > 0 AND last_access_utc < 11644473600000000)"); 632 "last_access_utc > 0 AND last_access_utc < 11644473600000000)");
610 #endif 633 #endif
611 ++cur_version; 634 ++cur_version;
612 meta_table_.SetVersionNumber(cur_version); 635 meta_table_.SetVersionNumber(cur_version);
613 transaction.Commit(); 636 transaction.Commit();
614 } 637 }
615 638
639 if (cur_version == 4) {
640 sql::Transaction transaction(db_.get());
erikwright (departed) 2011/11/28 16:18:16 Please add a metric, recorded and reported here, f
marja 2011/11/29 12:56:01 Done.
641 if (!transaction.Begin())
642 return false;
643 if (!db_->Execute("ALTER TABLE cookies "
644 "ADD COLUMN has_expires INTEGER DEFAULT 1") ||
erikwright (departed) 2011/11/28 16:18:16 I don't see any documentation that states that the
marja 2011/11/29 12:56:01 Done. (1 & 3)
645 !db_->Execute("ALTER TABLE cookies "
646 "ADD COLUMN persistent INTEGER DEFAULT 1")) {
647 LOG(WARNING) << "Unable to update cookie database to version 5.";
648 return false;
649 }
650 ++cur_version;
651 meta_table_.SetVersionNumber(cur_version);
652 meta_table_.SetCompatibleVersionNumber(
653 std::min(cur_version, kCompatibleVersionNumber));
654 transaction.Commit();
655 }
656
616 // Put future migration cases here. 657 // Put future migration cases here.
617 658
618 // When the version is too old, we just try to continue anyway, there should 659 // When the version is too old, we just try to continue anyway, there should
619 // not be a released product that makes a database too old for us to handle. 660 // not be a released product that makes a database too old for us to handle.
620 LOG_IF(WARNING, cur_version < kCurrentVersionNumber) << 661 LOG_IF(WARNING, cur_version < kCurrentVersionNumber) <<
621 "Cookie database version " << cur_version << " is too old to handle."; 662 "Cookie database version " << cur_version << " is too old to handle.";
622 663
623 return true; 664 return true;
624 } 665 }
625 666
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 pending_.swap(ops); 720 pending_.swap(ops);
680 num_pending_ = 0; 721 num_pending_ = 0;
681 } 722 }
682 723
683 // Maybe an old timer fired or we are already Close()'ed. 724 // Maybe an old timer fired or we are already Close()'ed.
684 if (!db_.get() || ops.empty()) 725 if (!db_.get() || ops.empty())
685 return; 726 return;
686 727
687 sql::Statement add_smt(db_->GetCachedStatement(SQL_FROM_HERE, 728 sql::Statement add_smt(db_->GetCachedStatement(SQL_FROM_HERE,
688 "INSERT INTO cookies (creation_utc, host_key, name, value, path, " 729 "INSERT INTO cookies (creation_utc, host_key, name, value, path, "
689 "expires_utc, secure, httponly, last_access_utc) " 730 "expires_utc, secure, httponly, last_access_utc, has_expires, "
690 "VALUES (?,?,?,?,?,?,?,?,?)")); 731 "persistent) "
732 "VALUES (?,?,?,?,?,?,?,?,?,?,?)"));
691 if (!add_smt) { 733 if (!add_smt) {
692 NOTREACHED(); 734 NOTREACHED();
693 return; 735 return;
694 } 736 }
695 737
696 sql::Statement update_access_smt(db_->GetCachedStatement(SQL_FROM_HERE, 738 sql::Statement update_access_smt(db_->GetCachedStatement(SQL_FROM_HERE,
697 "UPDATE cookies SET last_access_utc=? WHERE creation_utc=?")); 739 "UPDATE cookies SET last_access_utc=? WHERE creation_utc=?"));
698 if (!update_access_smt) { 740 if (!update_access_smt) {
699 NOTREACHED(); 741 NOTREACHED();
700 return; 742 return;
(...skipping 20 matching lines...) Expand all
721 add_smt.Reset(); 763 add_smt.Reset();
722 add_smt.BindInt64(0, po->cc().CreationDate().ToInternalValue()); 764 add_smt.BindInt64(0, po->cc().CreationDate().ToInternalValue());
723 add_smt.BindString(1, po->cc().Domain()); 765 add_smt.BindString(1, po->cc().Domain());
724 add_smt.BindString(2, po->cc().Name()); 766 add_smt.BindString(2, po->cc().Name());
725 add_smt.BindString(3, po->cc().Value()); 767 add_smt.BindString(3, po->cc().Value());
726 add_smt.BindString(4, po->cc().Path()); 768 add_smt.BindString(4, po->cc().Path());
727 add_smt.BindInt64(5, po->cc().ExpiryDate().ToInternalValue()); 769 add_smt.BindInt64(5, po->cc().ExpiryDate().ToInternalValue());
728 add_smt.BindInt(6, po->cc().IsSecure()); 770 add_smt.BindInt(6, po->cc().IsSecure());
729 add_smt.BindInt(7, po->cc().IsHttpOnly()); 771 add_smt.BindInt(7, po->cc().IsHttpOnly());
730 add_smt.BindInt64(8, po->cc().LastAccessDate().ToInternalValue()); 772 add_smt.BindInt64(8, po->cc().LastAccessDate().ToInternalValue());
773 add_smt.BindInt(9, po->cc().DoesExpire());
774 add_smt.BindInt(10, po->cc().IsPersistent());
731 if (!add_smt.Run()) 775 if (!add_smt.Run())
732 NOTREACHED() << "Could not add a cookie to the DB."; 776 NOTREACHED() << "Could not add a cookie to the DB.";
733 break; 777 break;
734 778
735 case PendingOperation::COOKIE_UPDATEACCESS: 779 case PendingOperation::COOKIE_UPDATEACCESS:
736 update_access_smt.Reset(); 780 update_access_smt.Reset();
737 update_access_smt.BindInt64(0, 781 update_access_smt.BindInt64(0,
738 po->cc().LastAccessDate().ToInternalValue()); 782 po->cc().LastAccessDate().ToInternalValue());
739 update_access_smt.BindInt64(1, 783 update_access_smt.BindInt64(1,
740 po->cc().CreationDate().ToInternalValue()); 784 po->cc().CreationDate().ToInternalValue());
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 838
795 if (clear_local_state_on_exit_) 839 if (clear_local_state_on_exit_)
796 file_util::Delete(path_, false); 840 file_util::Delete(path_, false);
797 } 841 }
798 842
799 void SQLitePersistentCookieStore::Backend::SetClearLocalStateOnExit( 843 void SQLitePersistentCookieStore::Backend::SetClearLocalStateOnExit(
800 bool clear_local_state) { 844 bool clear_local_state) {
801 base::AutoLock locked(lock_); 845 base::AutoLock locked(lock_);
802 clear_local_state_on_exit_ = clear_local_state; 846 clear_local_state_on_exit_ = clear_local_state;
803 } 847 }
848
849 void SQLitePersistentCookieStore::Backend::DeleteSessionCookies() {
850 {
851 base::AutoLock locked(lock_);
852 return_session_cookies_ = false;
853 }
854 BrowserThread::PostTask(
855 BrowserThread::DB, FROM_HERE,
856 base::Bind(&Backend::DeleteSessionCookiesOnDBThread, this));
857 }
858
859 void SQLitePersistentCookieStore::Backend::DeleteSessionCookiesOnDBThread() {
860 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
861 // If the store hasn't been initialized, the session cookie deletion is done
862 // after all cookies have been loaded.
863 if (!initialized_)
864 return;
865 if (!db_->Execute("DELETE FROM cookies WHERE persistent == 0"))
866 LOG(WARNING) << "Unable to delete session cookies.";
867 }
868
804 SQLitePersistentCookieStore::SQLitePersistentCookieStore(const FilePath& path) 869 SQLitePersistentCookieStore::SQLitePersistentCookieStore(const FilePath& path)
805 : backend_(new Backend(path)) { 870 : backend_(new Backend(path)) {
806 } 871 }
807 872
808 SQLitePersistentCookieStore::~SQLitePersistentCookieStore() { 873 SQLitePersistentCookieStore::~SQLitePersistentCookieStore() {
809 if (backend_.get()) { 874 if (backend_.get()) {
810 backend_->Close(); 875 backend_->Close();
811 // Release our reference, it will probably still have a reference if the 876 // Release our reference, it will probably still have a reference if the
812 // background thread has not run Close() yet. 877 // background thread has not run Close() yet.
813 backend_ = NULL; 878 backend_ = NULL;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
847 if (backend_.get()) 912 if (backend_.get())
848 backend_->SetClearLocalStateOnExit(clear_local_state); 913 backend_->SetClearLocalStateOnExit(clear_local_state);
849 } 914 }
850 915
851 void SQLitePersistentCookieStore::Flush(Task* completion_task) { 916 void SQLitePersistentCookieStore::Flush(Task* completion_task) {
852 if (backend_.get()) 917 if (backend_.get())
853 backend_->Flush(completion_task); 918 backend_->Flush(completion_task);
854 else if (completion_task) 919 else if (completion_task)
855 MessageLoop::current()->PostTask(FROM_HERE, completion_task); 920 MessageLoop::current()->PostTask(FROM_HERE, completion_task);
856 } 921 }
922
923 void SQLitePersistentCookieStore::DeleteSessionCookies() {
924 if (backend_.get())
925 backend_->DeleteSessionCookies();
926 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698