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

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

Issue 14208017: Add cookie priority to the cookie database. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 7 years, 8 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
« no previous file with comments | « no previous file | content/browser/net/sqlite_persistent_cookie_store_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/browser/net/sqlite_persistent_cookie_store.h" 5 #include "content/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>
11 11
12 #include "base/basictypes.h" 12 #include "base/basictypes.h"
13 #include "base/bind.h" 13 #include "base/bind.h"
14 #include "base/callback.h" 14 #include "base/callback.h"
15 #include "base/file_util.h" 15 #include "base/file_util.h"
16 #include "base/files/file_path.h" 16 #include "base/files/file_path.h"
17 #include "base/location.h" 17 #include "base/location.h"
18 #include "base/logging.h" 18 #include "base/logging.h"
19 #include "base/memory/ref_counted.h" 19 #include "base/memory/ref_counted.h"
20 #include "base/memory/scoped_ptr.h" 20 #include "base/memory/scoped_ptr.h"
21 #include "base/metrics/histogram.h" 21 #include "base/metrics/histogram.h"
22 #include "base/sequenced_task_runner.h" 22 #include "base/sequenced_task_runner.h"
23 #include "base/string_util.h" 23 #include "base/string_util.h"
24 #include "base/stringprintf.h"
24 #include "base/synchronization/lock.h" 25 #include "base/synchronization/lock.h"
25 #include "base/threading/sequenced_worker_pool.h" 26 #include "base/threading/sequenced_worker_pool.h"
26 #include "base/time.h" 27 #include "base/time.h"
27 #include "content/public/browser/browser_thread.h" 28 #include "content/public/browser/browser_thread.h"
28 #include "content/public/browser/cookie_store_factory.h" 29 #include "content/public/browser/cookie_store_factory.h"
29 #include "googleurl/src/gurl.h" 30 #include "googleurl/src/gurl.h"
30 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" 31 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
31 #include "net/cookies/canonical_cookie.h" 32 #include "net/cookies/canonical_cookie.h"
32 #include "net/cookies/cookie_constants.h" 33 #include "net/cookies/cookie_constants.h"
33 #include "net/cookies/cookie_util.h" 34 #include "net/cookies/cookie_util.h"
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 // it is unlikely that a second time will be successful. 308 // it is unlikely that a second time will be successful.
308 if (!attempted_to_kill_database_ && sql::IsErrorCatastrophic(error)) { 309 if (!attempted_to_kill_database_ && sql::IsErrorCatastrophic(error)) {
309 attempted_to_kill_database_ = true; 310 attempted_to_kill_database_ = true;
310 311
311 backend_->ScheduleKillDatabase(); 312 backend_->ScheduleKillDatabase();
312 } 313 }
313 314
314 return error; 315 return error;
315 } 316 }
316 317
318 namespace {
319
317 // Version number of the database. 320 // Version number of the database.
318 // 321 //
322 // Version 6 adds cookie priorities. This allows developers to influence the
323 // order in which cookies are evicted in order to meet domain cookie limits.
324 //
319 // Version 5 adds the columns has_expires and is_persistent, so that the 325 // Version 5 adds the columns has_expires and is_persistent, so that the
320 // database can store session cookies as well as persistent cookies. Databases 326 // database can store session cookies as well as persistent cookies. Databases
321 // of version 5 are incompatible with older versions of code. If a database of 327 // of version 5 are incompatible with older versions of code. If a database of
322 // version 5 is read by older code, session cookies will be treated as normal 328 // version 5 is read by older code, session cookies will be treated as normal
323 // cookies. Currently, these fields are written, but not read anymore. 329 // cookies. Currently, these fields are written, but not read anymore.
324 // 330 //
325 // In version 4, we migrated the time epoch. If you open the DB with an older 331 // In version 4, we migrated the time epoch. If you open the DB with an older
326 // version on Mac or Linux, the times will look wonky, but the file will likely 332 // version on Mac or Linux, the times will look wonky, but the file will likely
327 // be usable. On Windows version 3 and 4 are the same. 333 // be usable. On Windows version 3 and 4 are the same.
328 // 334 //
329 // Version 3 updated the database to include the last access time, so we can 335 // Version 3 updated the database to include the last access time, so we can
330 // expire them in decreasing order of use when we've reached the maximum 336 // expire them in decreasing order of use when we've reached the maximum
331 // number of cookies. 337 // number of cookies.
332 static const int kCurrentVersionNumber = 5; 338 const int kCurrentVersionNumber = 6;
333 static const int kCompatibleVersionNumber = 5; 339 const int kCompatibleVersionNumber = 5;
334 340
335 namespace { 341 // Possible values for the 'priority' column.
342 enum DBCookiePriority {
343 kCookiePriorityLow = 0,
344 kCookiePriorityMedium = 1,
345 kCookiePriorityHigh = 2,
346 };
347
348 DBCookiePriority CookiePriorityToDBCookiePriority(net::CookiePriority value) {
349 switch (value) {
350 case net::COOKIE_PRIORITY_LOW:
351 return kCookiePriorityLow;
352 case net::COOKIE_PRIORITY_MEDIUM:
353 return kCookiePriorityMedium;
354 case net::COOKIE_PRIORITY_HIGH:
355 return kCookiePriorityHigh;
356 }
357
358 NOTREACHED();
359 return kCookiePriorityMedium;
360 }
361
362 net::CookiePriority DBCookiePriorityToCookiePriority(DBCookiePriority value) {
363 switch (value) {
364 case kCookiePriorityLow:
365 return net::COOKIE_PRIORITY_LOW;
366 case kCookiePriorityMedium:
367 return net::COOKIE_PRIORITY_MEDIUM;
368 case kCookiePriorityHigh:
369 return net::COOKIE_PRIORITY_HIGH;
370 }
371
372 NOTREACHED();
373 return net::COOKIE_PRIORITY_DEFAULT;
374 }
336 375
337 // Increments a specified TimeDelta by the duration between this object's 376 // Increments a specified TimeDelta by the duration between this object's
338 // constructor and destructor. Not thread safe. Multiple instances may be 377 // constructor and destructor. Not thread safe. Multiple instances may be
339 // created with the same delta instance as long as their lifetimes are nested. 378 // created with the same delta instance as long as their lifetimes are nested.
340 // The shortest lived instances have no impact. 379 // The shortest lived instances have no impact.
341 class IncrementTimeDelta { 380 class IncrementTimeDelta {
342 public: 381 public:
343 explicit IncrementTimeDelta(base::TimeDelta* delta) : 382 explicit IncrementTimeDelta(base::TimeDelta* delta) :
344 delta_(delta), 383 delta_(delta),
345 original_value_(*delta), 384 original_value_(*delta),
346 start_(base::Time::Now()) {} 385 start_(base::Time::Now()) {}
347 386
348 ~IncrementTimeDelta() { 387 ~IncrementTimeDelta() {
349 *delta_ = original_value_ + base::Time::Now() - start_; 388 *delta_ = original_value_ + base::Time::Now() - start_;
350 } 389 }
351 390
352 private: 391 private:
353 base::TimeDelta* delta_; 392 base::TimeDelta* delta_;
354 base::TimeDelta original_value_; 393 base::TimeDelta original_value_;
355 base::Time start_; 394 base::Time start_;
356 395
357 DISALLOW_COPY_AND_ASSIGN(IncrementTimeDelta); 396 DISALLOW_COPY_AND_ASSIGN(IncrementTimeDelta);
358 }; 397 };
359 398
360 // Initializes the cookies table, returning true on success. 399 // Initializes the cookies table, returning true on success.
361 bool InitTable(sql::Connection* db) { 400 bool InitTable(sql::Connection* db) {
362 if (!db->DoesTableExist("cookies")) { 401 if (!db->DoesTableExist("cookies")) {
363 if (!db->Execute("CREATE TABLE cookies (" 402 std::string stmt(base::StringPrintf(
364 "creation_utc INTEGER NOT NULL UNIQUE PRIMARY KEY," 403 "CREATE TABLE cookies ("
365 "host_key TEXT NOT NULL," 404 "creation_utc INTEGER NOT NULL UNIQUE PRIMARY KEY,"
366 "name TEXT NOT NULL," 405 "host_key TEXT NOT NULL,"
367 "value TEXT NOT NULL," 406 "name TEXT NOT NULL,"
368 "path TEXT NOT NULL," 407 "value TEXT NOT NULL,"
369 "expires_utc INTEGER NOT NULL," 408 "path TEXT NOT NULL,"
370 "secure INTEGER NOT NULL," 409 "expires_utc INTEGER NOT NULL,"
371 "httponly INTEGER NOT NULL," 410 "secure INTEGER NOT NULL,"
372 "last_access_utc INTEGER NOT NULL, " 411 "httponly INTEGER NOT NULL,"
373 "has_expires INTEGER NOT NULL DEFAULT 1, " 412 "last_access_utc INTEGER NOT NULL, "
374 "persistent INTEGER NOT NULL DEFAULT 1)")) { 413 "has_expires INTEGER NOT NULL DEFAULT 1, "
375 // TODO(rogerm): Add priority. 414 "persistent INTEGER NOT NULL DEFAULT 1,"
415 "priority INTEGER NOT NULL DEFAULT %d)",
416 CookiePriorityToDBCookiePriority(net::COOKIE_PRIORITY_DEFAULT)));
417 if (!db->Execute(stmt.c_str()))
376 return false; 418 return false;
377 }
378 } 419 }
379 420
380 // Older code created an index on creation_utc, which is already 421 // Older code created an index on creation_utc, which is already
381 // primary key for the table. 422 // primary key for the table.
382 if (!db->Execute("DROP INDEX IF EXISTS cookie_times")) 423 if (!db->Execute("DROP INDEX IF EXISTS cookie_times"))
383 return false; 424 return false;
384 425
385 if (!db->Execute("CREATE INDEX IF NOT EXISTS domain ON cookies(host_key)")) 426 if (!db->Execute("CREATE INDEX IF NOT EXISTS domain ON cookies(host_key)"))
386 return false; 427 return false;
387 428
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 } 694 }
654 } 695 }
655 696
656 bool SQLitePersistentCookieStore::Backend::LoadCookiesForDomains( 697 bool SQLitePersistentCookieStore::Backend::LoadCookiesForDomains(
657 const std::set<std::string>& domains) { 698 const std::set<std::string>& domains) {
658 DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 699 DCHECK(background_task_runner_->RunsTasksOnCurrentThread());
659 700
660 sql::Statement smt; 701 sql::Statement smt;
661 if (restore_old_session_cookies_) { 702 if (restore_old_session_cookies_) {
662 smt.Assign(db_->GetCachedStatement( 703 smt.Assign(db_->GetCachedStatement(
663 SQL_FROM_HERE, 704 SQL_FROM_HERE,
664 "SELECT creation_utc, host_key, name, value, path, expires_utc, " 705 "SELECT creation_utc, host_key, name, value, path, expires_utc, "
665 "secure, httponly, last_access_utc, has_expires, persistent " 706 "secure, httponly, last_access_utc, has_expires, persistent, priority "
666 "FROM cookies WHERE host_key = ?")); 707 "FROM cookies WHERE host_key = ?"));
667 // TODO(rogerm): Add priority.
668 } else { 708 } else {
669 smt.Assign(db_->GetCachedStatement( 709 smt.Assign(db_->GetCachedStatement(
670 SQL_FROM_HERE, 710 SQL_FROM_HERE,
671 "SELECT creation_utc, host_key, name, value, path, expires_utc, " 711 "SELECT creation_utc, host_key, name, value, path, expires_utc, "
672 "secure, httponly, last_access_utc, has_expires, persistent " 712 "secure, httponly, last_access_utc, has_expires, persistent, priority "
673 "FROM cookies WHERE host_key = ? AND persistent = 1")); 713 "FROM cookies WHERE host_key = ? AND persistent = 1"));
674 // TODO(rogerm): Add priority.
675 } 714 }
676 if (!smt.is_valid()) { 715 if (!smt.is_valid()) {
677 smt.Clear(); // Disconnect smt_ref from db_. 716 smt.Clear(); // Disconnect smt_ref from db_.
678 meta_table_.Reset(); 717 meta_table_.Reset();
679 db_.reset(); 718 db_.reset();
680 return false; 719 return false;
681 } 720 }
682 721
683 std::vector<net::CanonicalCookie*> cookies; 722 std::vector<net::CanonicalCookie*> cookies;
684 std::set<std::string>::const_iterator it = domains.begin(); 723 std::set<std::string>::const_iterator it = domains.begin();
685 for (; it != domains.end(); ++it) { 724 for (; it != domains.end(); ++it) {
686 smt.BindString(0, *it); 725 smt.BindString(0, *it);
687 while (smt.Step()) { 726 while (smt.Step()) {
688 scoped_ptr<net::CanonicalCookie> cc( 727 scoped_ptr<net::CanonicalCookie> cc(new net::CanonicalCookie(
689 new net::CanonicalCookie( 728 // The "source" URL is not used with persisted cookies.
690 // The "source" URL is not used with persisted cookies. 729 GURL(), // Source
691 GURL(), // Source 730 smt.ColumnString(2), // name
692 smt.ColumnString(2), // name 731 smt.ColumnString(3), // value
693 smt.ColumnString(3), // value 732 smt.ColumnString(1), // domain
694 smt.ColumnString(1), // domain 733 smt.ColumnString(4), // path
695 smt.ColumnString(4), // path 734 Time::FromInternalValue(smt.ColumnInt64(0)), // creation_utc
696 Time::FromInternalValue(smt.ColumnInt64(0)), // creation_utc 735 Time::FromInternalValue(smt.ColumnInt64(5)), // expires_utc
697 Time::FromInternalValue(smt.ColumnInt64(5)), // expires_utc 736 Time::FromInternalValue(smt.ColumnInt64(8)), // last_access_utc
698 Time::FromInternalValue(smt.ColumnInt64(8)), // last_access_utc 737 smt.ColumnInt(6) != 0, // secure
699 smt.ColumnInt(6) != 0, // secure 738 smt.ColumnInt(7) != 0, // httponly
700 smt.ColumnInt(7) != 0, // httponly 739 DBCookiePriorityToCookiePriority(
701 net::COOKIE_PRIORITY_DEFAULT)); // priority 740 static_cast<DBCookiePriority>(smt.ColumnInt(11))))); // priority
702 // TODO(rogerm): Change net::COOKIE_PRIORITY_DEFAULT above to
703 // net::StringToCookiePriority(smt.ColumnString(9))?
704 DLOG_IF(WARNING, 741 DLOG_IF(WARNING,
705 cc->CreationDate() > Time::Now()) << L"CreationDate too recent"; 742 cc->CreationDate() > Time::Now()) << L"CreationDate too recent";
706 cookies_per_origin_[CookieOrigin(cc->Domain(), cc->IsSecure())]++; 743 cookies_per_origin_[CookieOrigin(cc->Domain(), cc->IsSecure())]++;
707 cookies.push_back(cc.release()); 744 cookies.push_back(cc.release());
708 ++num_cookies_read_; 745 ++num_cookies_read_;
709 } 746 }
710 smt.Reset(true); 747 smt.Reset(true);
711 } 748 }
712 { 749 {
713 base::AutoLock locked(lock_); 750 base::AutoLock locked(lock_);
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 } 831 }
795 ++cur_version; 832 ++cur_version;
796 meta_table_.SetVersionNumber(cur_version); 833 meta_table_.SetVersionNumber(cur_version);
797 meta_table_.SetCompatibleVersionNumber( 834 meta_table_.SetCompatibleVersionNumber(
798 std::min(cur_version, kCompatibleVersionNumber)); 835 std::min(cur_version, kCompatibleVersionNumber));
799 transaction.Commit(); 836 transaction.Commit();
800 UMA_HISTOGRAM_TIMES("Cookie.TimeDatabaseMigrationToV5", 837 UMA_HISTOGRAM_TIMES("Cookie.TimeDatabaseMigrationToV5",
801 base::TimeTicks::Now() - start_time); 838 base::TimeTicks::Now() - start_time);
802 } 839 }
803 840
841 if (cur_version == 5) {
842 const base::TimeTicks start_time = base::TimeTicks::Now();
843 sql::Transaction transaction(db_.get());
844 if (!transaction.Begin())
845 return false;
846 // Alter the table to add the priority column with a default value.
847 std::string stmt(base::StringPrintf(
848 "ALTER TABLE cookies ADD COLUMN priority INTEGER DEFAULT %d",
849 CookiePriorityToDBCookiePriority(net::COOKIE_PRIORITY_DEFAULT)));
850 if (!db_->Execute(stmt.c_str())) {
851 LOG(WARNING) << "Unable to update cookie database to version 6.";
852 return false;
853 }
854 ++cur_version;
855 meta_table_.SetVersionNumber(cur_version);
856 meta_table_.SetCompatibleVersionNumber(
857 std::min(cur_version, kCompatibleVersionNumber));
858 transaction.Commit();
859 UMA_HISTOGRAM_TIMES("Cookie.TimeDatabaseMigrationToV6",
860 base::TimeTicks::Now() - start_time);
861 }
862
804 // Put future migration cases here. 863 // Put future migration cases here.
805 864
806 if (cur_version < kCurrentVersionNumber) { 865 if (cur_version < kCurrentVersionNumber) {
807 UMA_HISTOGRAM_COUNTS_100("Cookie.CorruptMetaTable", 1); 866 UMA_HISTOGRAM_COUNTS_100("Cookie.CorruptMetaTable", 1);
808 867
809 meta_table_.Reset(); 868 meta_table_.Reset();
810 db_.reset(new sql::Connection); 869 db_.reset(new sql::Connection);
811 if (!file_util::Delete(path_, false) || 870 if (!file_util::Delete(path_, false) ||
812 !db_->Open(path_) || 871 !db_->Open(path_) ||
813 !meta_table_.Init( 872 !meta_table_.Init(
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
877 { 936 {
878 base::AutoLock locked(lock_); 937 base::AutoLock locked(lock_);
879 pending_.swap(ops); 938 pending_.swap(ops);
880 num_pending_ = 0; 939 num_pending_ = 0;
881 } 940 }
882 941
883 // Maybe an old timer fired or we are already Close()'ed. 942 // Maybe an old timer fired or we are already Close()'ed.
884 if (!db_.get() || ops.empty()) 943 if (!db_.get() || ops.empty())
885 return; 944 return;
886 945
887 // TODO(rogerm): Add priority.
888 sql::Statement add_smt(db_->GetCachedStatement(SQL_FROM_HERE, 946 sql::Statement add_smt(db_->GetCachedStatement(SQL_FROM_HERE,
889 "INSERT INTO cookies (creation_utc, host_key, name, value, path, " 947 "INSERT INTO cookies (creation_utc, host_key, name, value, path, "
890 "expires_utc, secure, httponly, last_access_utc, has_expires, " 948 "expires_utc, secure, httponly, last_access_utc, has_expires, "
891 "persistent) " 949 "persistent, priority) "
892 "VALUES (?,?,?,?,?,?,?,?,?,?,?)")); 950 "VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"));
893 if (!add_smt.is_valid()) 951 if (!add_smt.is_valid())
894 return; 952 return;
895 953
896 sql::Statement update_access_smt(db_->GetCachedStatement(SQL_FROM_HERE, 954 sql::Statement update_access_smt(db_->GetCachedStatement(SQL_FROM_HERE,
897 "UPDATE cookies SET last_access_utc=? WHERE creation_utc=?")); 955 "UPDATE cookies SET last_access_utc=? WHERE creation_utc=?"));
898 if (!update_access_smt.is_valid()) 956 if (!update_access_smt.is_valid())
899 return; 957 return;
900 958
901 sql::Statement del_smt(db_->GetCachedStatement(SQL_FROM_HERE, 959 sql::Statement del_smt(db_->GetCachedStatement(SQL_FROM_HERE,
902 "DELETE FROM cookies WHERE creation_utc=?")); 960 "DELETE FROM cookies WHERE creation_utc=?"));
(...skipping 17 matching lines...) Expand all
920 add_smt.BindString(1, po->cc().Domain()); 978 add_smt.BindString(1, po->cc().Domain());
921 add_smt.BindString(2, po->cc().Name()); 979 add_smt.BindString(2, po->cc().Name());
922 add_smt.BindString(3, po->cc().Value()); 980 add_smt.BindString(3, po->cc().Value());
923 add_smt.BindString(4, po->cc().Path()); 981 add_smt.BindString(4, po->cc().Path());
924 add_smt.BindInt64(5, po->cc().ExpiryDate().ToInternalValue()); 982 add_smt.BindInt64(5, po->cc().ExpiryDate().ToInternalValue());
925 add_smt.BindInt(6, po->cc().IsSecure()); 983 add_smt.BindInt(6, po->cc().IsSecure());
926 add_smt.BindInt(7, po->cc().IsHttpOnly()); 984 add_smt.BindInt(7, po->cc().IsHttpOnly());
927 add_smt.BindInt64(8, po->cc().LastAccessDate().ToInternalValue()); 985 add_smt.BindInt64(8, po->cc().LastAccessDate().ToInternalValue());
928 add_smt.BindInt(9, po->cc().IsPersistent()); 986 add_smt.BindInt(9, po->cc().IsPersistent());
929 add_smt.BindInt(10, po->cc().IsPersistent()); 987 add_smt.BindInt(10, po->cc().IsPersistent());
930 // TODO(rogerm): Add priority. 988 add_smt.BindInt(
989 11, CookiePriorityToDBCookiePriority(po->cc().Priority()));
931 if (!add_smt.Run()) 990 if (!add_smt.Run())
932 NOTREACHED() << "Could not add a cookie to the DB."; 991 NOTREACHED() << "Could not add a cookie to the DB.";
933 break; 992 break;
934 993
935 case PendingOperation::COOKIE_UPDATEACCESS: 994 case PendingOperation::COOKIE_UPDATEACCESS:
936 update_access_smt.Reset(true); 995 update_access_smt.Reset(true);
937 update_access_smt.BindInt64(0, 996 update_access_smt.BindInt64(0,
938 po->cc().LastAccessDate().ToInternalValue()); 997 po->cc().LastAccessDate().ToInternalValue());
939 update_access_smt.BindInt64(1, 998 update_access_smt.BindInt64(1,
940 po->cc().CreationDate().ToInternalValue()); 999 po->cc().CreationDate().ToInternalValue());
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1155 path, 1214 path,
1156 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO), 1215 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO),
1157 BrowserThread::GetBlockingPool()->GetSequencedTaskRunner( 1216 BrowserThread::GetBlockingPool()->GetSequencedTaskRunner(
1158 BrowserThread::GetBlockingPool()->GetSequenceToken()), 1217 BrowserThread::GetBlockingPool()->GetSequenceToken()),
1159 restore_old_session_cookies, 1218 restore_old_session_cookies,
1160 storage_policy); 1219 storage_policy);
1161 return new net::CookieMonster(persistent_store, cookie_monster_delegate); 1220 return new net::CookieMonster(persistent_store, cookie_monster_delegate);
1162 } 1221 }
1163 1222
1164 } // namespace content 1223 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/browser/net/sqlite_persistent_cookie_store_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698