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

Side by Side Diff: net/base/cookie_monster.cc

Issue 7833042: Finalize a CL originally by departed intern ycxiao@ that detaches the loading of cookies from the... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « net/base/cookie_monster.h ('k') | net/base/cookie_monster_perftest.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) 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 // Portions of this code based on Mozilla: 5 // Portions of this code based on Mozilla:
6 // (netwerk/cookie/src/nsCookieService.cpp) 6 // (netwerk/cookie/src/nsCookieService.cpp)
7 /* ***** BEGIN LICENSE BLOCK ***** 7 /* ***** BEGIN LICENSE BLOCK *****
8 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 8 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
9 * 9 *
10 * The contents of this file are subject to the Mozilla Public License Version 10 * The contents of this file are subject to the Mozilla Public License Version
(...skipping 30 matching lines...) Expand all
41 * the terms of any one of the MPL, the GPL or the LGPL. 41 * the terms of any one of the MPL, the GPL or the LGPL.
42 * 42 *
43 * ***** END LICENSE BLOCK ***** */ 43 * ***** END LICENSE BLOCK ***** */
44 44
45 #include "net/base/cookie_monster.h" 45 #include "net/base/cookie_monster.h"
46 46
47 #include <algorithm> 47 #include <algorithm>
48 #include <set> 48 #include <set>
49 49
50 #include "base/basictypes.h" 50 #include "base/basictypes.h"
51 #include "base/bind.h"
51 #include "base/format_macros.h" 52 #include "base/format_macros.h"
52 #include "base/logging.h" 53 #include "base/logging.h"
53 #include "base/memory/scoped_ptr.h" 54 #include "base/memory/scoped_ptr.h"
54 #include "base/message_loop.h" 55 #include "base/message_loop.h"
56 #include "base/message_loop_proxy.h"
55 #include "base/metrics/histogram.h" 57 #include "base/metrics/histogram.h"
56 #include "base/string_tokenizer.h" 58 #include "base/string_tokenizer.h"
57 #include "base/string_util.h" 59 #include "base/string_util.h"
58 #include "base/stringprintf.h" 60 #include "base/stringprintf.h"
59 #include "googleurl/src/gurl.h" 61 #include "googleurl/src/gurl.h"
60 #include "googleurl/src/url_canon.h" 62 #include "googleurl/src/url_canon.h"
61 #include "net/base/net_util.h" 63 #include "net/base/net_util.h"
62 #include "net/base/registry_controlled_domain.h" 64 #include "net/base/registry_controlled_domain.h"
63 65
64 using base::Time; 66 using base::Time;
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 } 415 }
414 } 416 }
415 417
416 } // namespace 418 } // namespace
417 419
418 // static 420 // static
419 bool CookieMonster::enable_file_scheme_ = false; 421 bool CookieMonster::enable_file_scheme_ = false;
420 422
421 CookieMonster::CookieMonster(PersistentCookieStore* store, Delegate* delegate) 423 CookieMonster::CookieMonster(PersistentCookieStore* store, Delegate* delegate)
422 : initialized_(false), 424 : initialized_(false),
425 loaded_(false),
423 expiry_and_key_scheme_(expiry_and_key_default_), 426 expiry_and_key_scheme_(expiry_and_key_default_),
424 store_(store), 427 store_(store),
425 last_access_threshold_( 428 last_access_threshold_(
426 TimeDelta::FromSeconds(kDefaultAccessUpdateThresholdSeconds)), 429 TimeDelta::FromSeconds(kDefaultAccessUpdateThresholdSeconds)),
427 delegate_(delegate), 430 delegate_(delegate),
428 last_statistic_record_time_(Time::Now()), 431 last_statistic_record_time_(Time::Now()),
429 keep_expired_cookies_(false) { 432 keep_expired_cookies_(false) {
430 InitializeHistograms(); 433 InitializeHistograms();
431 SetDefaultCookieableSchemes(); 434 SetDefaultCookieableSchemes();
432 } 435 }
433 436
434 CookieMonster::CookieMonster(PersistentCookieStore* store, 437 CookieMonster::CookieMonster(PersistentCookieStore* store,
435 Delegate* delegate, 438 Delegate* delegate,
436 int last_access_threshold_milliseconds) 439 int last_access_threshold_milliseconds)
437 : initialized_(false), 440 : initialized_(false),
441 loaded_(false),
438 expiry_and_key_scheme_(expiry_and_key_default_), 442 expiry_and_key_scheme_(expiry_and_key_default_),
439 store_(store), 443 store_(store),
440 last_access_threshold_(base::TimeDelta::FromMilliseconds( 444 last_access_threshold_(base::TimeDelta::FromMilliseconds(
441 last_access_threshold_milliseconds)), 445 last_access_threshold_milliseconds)),
442 delegate_(delegate), 446 delegate_(delegate),
443 last_statistic_record_time_(base::Time::Now()), 447 last_statistic_record_time_(base::Time::Now()),
444 keep_expired_cookies_(false) { 448 keep_expired_cookies_(false) {
445 InitializeHistograms(); 449 InitializeHistograms();
446 SetDefaultCookieableSchemes(); 450 SetDefaultCookieableSchemes();
447 } 451 }
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 // the following check would be reasonable: 565 // the following check would be reasonable:
562 // NOTREACHED() << "Cookie exploded expiration failed: " << time_string; 566 // NOTREACHED() << "Cookie exploded expiration failed: " << time_string;
563 567
564 return Time(); 568 return Time();
565 } 569 }
566 570
567 bool CookieMonster::DomainIsHostOnly(const std::string& domain_string) { 571 bool CookieMonster::DomainIsHostOnly(const std::string& domain_string) {
568 return (domain_string.empty() || domain_string[0] != '.'); 572 return (domain_string.empty() || domain_string[0] != '.');
569 } 573 }
570 574
575 // Task classes for queueing the coming request.
576
577 class CookieMonster::CookieMonsterTask
578 : public base::RefCountedThreadSafe<CookieMonsterTask> {
579 public:
580 // Runs the task and invokes the client callback on the thread that
581 // originally constructed the task.
582 virtual void Run() = 0;
583
584 protected:
585 explicit CookieMonsterTask(CookieMonster* cookie_monster);
586 virtual ~CookieMonsterTask();
587
588 // Invokes the callback immediately, if the current thread is the one
589 // that originated the task, or queues the callback for execution on the
590 // appropriate thread. Maintains a reference to this CookieMonsterTask
591 // instance until the callback completes.
592 void InvokeCallback(base::Closure callback);
593
594 CookieMonster* cookie_monster() {
595 return cookie_monster_;
596 }
597
598 friend class base::RefCountedThreadSafe<CookieMonsterTask>;
599
600 private:
601 CookieMonster* cookie_monster_;
602 scoped_refptr<base::MessageLoopProxy> thread_;
603
604 DISALLOW_COPY_AND_ASSIGN(CookieMonsterTask);
605 };
606
607 CookieMonster::CookieMonsterTask::CookieMonsterTask(
608 CookieMonster* cookie_monster)
609 : cookie_monster_(cookie_monster),
610 thread_(base::MessageLoopProxy::current()) { }
611
612 CookieMonster::CookieMonsterTask::~CookieMonsterTask() { }
613
614 // Unfortunately, one cannot re-bind a Callback with parameters into a closure.
615 // Therefore, the closure passed to InvokeCallback is a clumsy binding of
616 // Callback::Run on a wrapped Callback instance. Since Callback is not
617 // reference counted, we bind to an instance that is a member of the
618 // CookieMonsterTask subclass. Then, we cannot simply post the callback to a
619 // message loop because the underlying instance may be destroyed (along with the
620 // CookieMonsterTask instance) in the interim. Therefore, we post a callback
621 // bound to the CookieMonsterTask, which *is* reference counted (thus preventing
622 // destruction of the original callback), and which invokes the closure (which
623 // invokes the original callback with the returned data).
624 void CookieMonster::CookieMonsterTask::InvokeCallback(base::Closure callback) {
625 if (thread_->BelongsToCurrentThread()) {
626 callback.Run();
627 } else {
628 thread_->PostTask(FROM_HERE, base::Bind(
629 &CookieMonster::CookieMonsterTask::InvokeCallback, this, callback));
630 }
631 }
632
633 // Task class for SetCookieWithDetails call.
634 class CookieMonster::SetCookieWithDetailsTask
635 : public CookieMonster::CookieMonsterTask {
636 public:
637 SetCookieWithDetailsTask(
638 CookieMonster* cookie_monster,
639 const GURL& url, const std::string& name, const std::string& value,
640 const std::string& domain, const std::string& path,
641 const base::Time& expiration_time, bool secure, bool http_only,
642 const CookieMonster::SetCookiesCallback& callback)
643 : CookieMonsterTask(cookie_monster),
644 url_(url),
645 name_(name),
646 value_(value),
647 domain_(domain),
648 path_(path),
649 expiration_time_(expiration_time),
650 secure_(secure),
651 http_only_(http_only),
652 callback_(callback) { }
653
654 virtual void Run() OVERRIDE;
655
656 private:
657 GURL url_;
658 std::string name_;
659 std::string value_;
660 std::string domain_;
661 std::string path_;
662 base::Time expiration_time_;
663 bool secure_;
664 bool http_only_;
665 CookieMonster::SetCookiesCallback callback_;
666
667 DISALLOW_COPY_AND_ASSIGN(SetCookieWithDetailsTask);
668 };
669
670 void CookieMonster::SetCookieWithDetailsTask::Run() {
671 bool success = this->cookie_monster()->
672 SetCookieWithDetails(url_, name_, value_, domain_, path_,
673 expiration_time_, secure_, http_only_);
674 if (!callback_.is_null()) {
675 this->InvokeCallback(base::Bind(&CookieMonster::SetCookiesCallback::Run,
676 base::Unretained(&callback_), success));
677 }
678 }
679
680 // Task class for GetAllCookies call.
681 class CookieMonster::GetAllCookiesTask
682 : public CookieMonster::CookieMonsterTask {
683 public:
684 GetAllCookiesTask(CookieMonster* cookie_monster,
685 const CookieMonster::GetCookieListCallback& callback)
686 : CookieMonsterTask(cookie_monster),
687 callback_(callback) { }
688
689 virtual void Run() OVERRIDE;
690
691 private:
692 CookieMonster::GetCookieListCallback callback_;
693
694 DISALLOW_COPY_AND_ASSIGN(GetAllCookiesTask);
695 };
696
697 void CookieMonster::GetAllCookiesTask::Run() {
698 if (!callback_.is_null()) {
699 CookieList cookies = this->cookie_monster()->GetAllCookies();
700 this->InvokeCallback(base::Bind(&CookieMonster::GetCookieListCallback::Run,
701 base::Unretained(&callback_), cookies));
702 }
703 }
704
705 // Task class for GetAllCookiesForURLWithOptions call.
706 class CookieMonster::GetAllCookiesForURLWithOptionsTask
707 : public CookieMonster::CookieMonsterTask {
708 public:
709 GetAllCookiesForURLWithOptionsTask(
710 CookieMonster* cookie_monster,
711 const GURL& url,
712 const CookieOptions& options,
713 const CookieMonster::GetCookieListCallback& callback)
714 : CookieMonsterTask(cookie_monster),
715 url_(url),
716 options_(options),
717 callback_(callback) { }
718
719 virtual void Run() OVERRIDE;
720
721 private:
722 GURL url_;
723 CookieOptions options_;
724 CookieMonster::GetCookieListCallback callback_;
725
726 DISALLOW_COPY_AND_ASSIGN(GetAllCookiesForURLWithOptionsTask);
727 };
728
729 void CookieMonster::GetAllCookiesForURLWithOptionsTask::Run() {
730 if (!callback_.is_null()) {
731 CookieList cookies = this->cookie_monster()->
732 GetAllCookiesForURLWithOptions(url_, options_);
733 this->InvokeCallback(base::Bind(&CookieMonster::GetCookieListCallback::Run,
734 base::Unretained(&callback_), cookies));
735 }
736 }
737
738 // Task class for DeleteAll call.
739 class CookieMonster::DeleteAllTask : public CookieMonster::CookieMonsterTask {
740 public:
741 DeleteAllTask(CookieMonster* cookie_monster,
742 const CookieMonster::DeleteCallback& callback)
743 : CookieMonsterTask(cookie_monster),
744 callback_(callback) { }
745
746 virtual void Run() OVERRIDE;
747
748 private:
749 CookieMonster::DeleteCallback callback_;
750
751 DISALLOW_COPY_AND_ASSIGN(DeleteAllTask);
752 };
753
754 void CookieMonster::DeleteAllTask::Run() {
755 int num_deleted = this->cookie_monster()->DeleteAll(true);
756 if (!callback_.is_null()) {
757 this->InvokeCallback(base::Bind(&CookieMonster::DeleteCallback::Run,
758 base::Unretained(&callback_), num_deleted));
759 }
760 }
761
762 // Task class for DeleteAllCreatedBetween call.
763 class CookieMonster::DeleteAllCreatedBetweenTask
764 : public CookieMonster::CookieMonsterTask {
765 public:
766 DeleteAllCreatedBetweenTask(
767 CookieMonster* cookie_monster,
768 const Time& delete_begin,
769 const Time& delete_end,
770 const CookieMonster::DeleteCallback& callback)
771 : CookieMonsterTask(cookie_monster),
772 delete_begin_(delete_begin),
773 delete_end_(delete_end),
774 callback_(callback) { }
775
776 virtual void Run() OVERRIDE;
777
778 private:
779 Time delete_begin_;
780 Time delete_end_;
781 CookieMonster::DeleteCallback callback_;
782
783 DISALLOW_COPY_AND_ASSIGN(DeleteAllCreatedBetweenTask);
784 };
785
786 void CookieMonster::DeleteAllCreatedBetweenTask::Run() {
787 int num_deleted = this->cookie_monster()->
788 DeleteAllCreatedBetween(delete_begin_, delete_end_);
789 if (!callback_.is_null()) {
790 this->InvokeCallback(base::Bind(&CookieMonster::DeleteCallback::Run,
791 base::Unretained(&callback_), num_deleted));
792 }
793 }
794
795 // Task class for DeleteAllForHost call.
796 class CookieMonster::DeleteAllForHostTask
797 : public CookieMonster::CookieMonsterTask {
798 public:
799 DeleteAllForHostTask(CookieMonster* cookie_monster,
800 const GURL& url,
801 const CookieMonster::DeleteCallback& callback)
802 : CookieMonsterTask(cookie_monster),
803 url_(url),
804 callback_(callback) { }
805
806 virtual void Run() OVERRIDE;
807
808 private:
809 GURL url_;
810 CookieMonster::DeleteCallback callback_;
811
812 DISALLOW_COPY_AND_ASSIGN(DeleteAllForHostTask);
813 };
814
815 void CookieMonster::DeleteAllForHostTask::Run() {
816 int num_deleted = this->cookie_monster()->DeleteAllForHost(url_);
817 if (!callback_.is_null()) {
818 this->InvokeCallback(base::Bind(&CookieMonster::DeleteCallback::Run,
819 base::Unretained(&callback_), num_deleted));
820 }
821 }
822
823 // Task class for DeleteCanonicalCookie call.
824 class CookieMonster::DeleteCanonicalCookieTask
825 : public CookieMonster::CookieMonsterTask {
826 public:
827 DeleteCanonicalCookieTask(
828 CookieMonster* cookie_monster,
829 const CookieMonster::CanonicalCookie& cookie,
830 const CookieMonster::DeleteCookieCallback& callback)
831 : CookieMonsterTask(cookie_monster),
832 cookie_(cookie),
833 callback_(callback) { }
834
835 virtual void Run() OVERRIDE;
836
837 private:
838 CookieMonster::CanonicalCookie cookie_;
839 CookieMonster::DeleteCookieCallback callback_;
840
841 DISALLOW_COPY_AND_ASSIGN(DeleteCanonicalCookieTask);
842 };
843
844 void CookieMonster::DeleteCanonicalCookieTask::Run() {
845 bool result = this->cookie_monster()->DeleteCanonicalCookie(cookie_);
846 if (!callback_.is_null()) {
847 this->InvokeCallback(base::Bind(&CookieMonster::DeleteCookieCallback::Run,
848 base::Unretained(&callback_), result));
849 }
850 }
851
852 // Task class for SetCookieWithOptions call.
853 class CookieMonster::SetCookieWithOptionsTask
854 : public CookieMonster::CookieMonsterTask {
855 public:
856 SetCookieWithOptionsTask(CookieMonster* cookie_monster,
857 const GURL& url,
858 const std::string& cookie_line,
859 const CookieOptions& options,
860 const CookieMonster::SetCookiesCallback& callback)
861 : CookieMonsterTask(cookie_monster),
862 url_(url),
863 cookie_line_(cookie_line),
864 options_(options),
865 callback_(callback) { }
866
867 virtual void Run() OVERRIDE;
868
869 private:
870 GURL url_;
871 std::string cookie_line_;
872 CookieOptions options_;
873 CookieMonster::SetCookiesCallback callback_;
874
875 DISALLOW_COPY_AND_ASSIGN(SetCookieWithOptionsTask);
876 };
877
878 void CookieMonster::SetCookieWithOptionsTask::Run() {
879 bool result = this->cookie_monster()->
880 SetCookieWithOptions(url_, cookie_line_, options_);
881 if (!callback_.is_null()) {
882 this->InvokeCallback(base::Bind(&CookieMonster::SetCookiesCallback::Run,
883 base::Unretained(&callback_), result));
884 }
885 }
886
887 // Task class for GetCookiesWithOptions call.
888 class CookieMonster::GetCookiesWithOptionsTask
889 : public CookieMonster::CookieMonsterTask {
890 public:
891 GetCookiesWithOptionsTask(CookieMonster* cookie_monster,
892 GURL url,
893 const CookieOptions& options,
894 const CookieMonster::GetCookiesCallback& callback)
895 : CookieMonsterTask(cookie_monster),
896 url_(url),
897 options_(options),
898 callback_(callback) { }
899
900 virtual void Run() OVERRIDE;
901
902 private:
903 GURL url_;
904 CookieOptions options_;
905 CookieMonster::GetCookiesCallback callback_;
906
907 DISALLOW_COPY_AND_ASSIGN(GetCookiesWithOptionsTask);
908 };
909
910 void CookieMonster::GetCookiesWithOptionsTask::Run() {
911 std::string cookie = this->cookie_monster()->
912 GetCookiesWithOptions(url_, options_);
913 if (!callback_.is_null()) {
914 this->InvokeCallback(base::Bind(&CookieMonster::GetCookiesCallback::Run,
915 base::Unretained(&callback_), cookie));
916 }
917 }
918
919 // Task class for GetCookiesWithInfo call.
920 class CookieMonster::GetCookiesWithInfoTask
921 : public CookieMonster::CookieMonsterTask {
922 public:
923 GetCookiesWithInfoTask(CookieMonster* cookie_monster,
924 const GURL& url,
925 const CookieOptions& options,
926 const CookieMonster::GetCookieInfoCallback& callback)
927 : CookieMonsterTask(cookie_monster),
928 url_(url),
929 options_(options),
930 callback_(callback) { }
931
932 virtual void Run() OVERRIDE;
933
934 private:
935 GURL url_;
936 CookieOptions options_;
937 CookieMonster::GetCookieInfoCallback callback_;
938
939 DISALLOW_COPY_AND_ASSIGN(GetCookiesWithInfoTask);
940 };
941
942 void CookieMonster::GetCookiesWithInfoTask::Run() {
943 if (!callback_.is_null()) {
944 std::string cookie_line;
945 std::vector<CookieMonster::CookieInfo> cookie_infos;
946 this->cookie_monster()->
947 GetCookiesWithInfo(url_, options_, &cookie_line, &cookie_infos);
948 this->InvokeCallback(base::Bind(&CookieMonster::GetCookieInfoCallback::Run,
949 base::Unretained(&callback_),
950 cookie_line, cookie_infos));
951 }
952 }
953
954 // Task class for DeleteCookie call.
955 class CookieMonster::DeleteCookieTask
956 : public CookieMonster::CookieMonsterTask {
957 public:
958 DeleteCookieTask(CookieMonster* cookie_monster,
959 GURL url,
960 const std::string& cookie_name,
961 const base::Closure& callback)
962 : CookieMonsterTask(cookie_monster),
963 url_(url),
964 cookie_name_(cookie_name),
965 callback_(callback) { }
966
967 virtual void Run() OVERRIDE;
968
969 private:
970 GURL url_;
971 std::string cookie_name_;
972 base::Closure callback_;
973
974 DISALLOW_COPY_AND_ASSIGN(DeleteCookieTask);
975 };
976
977 void CookieMonster::DeleteCookieTask::Run() {
978 this->cookie_monster()->DeleteCookie(url_, cookie_name_);
979 if (!callback_.is_null()) {
980 this->InvokeCallback(callback_);
981 }
982 }
983
984 // Asynchronous CookieMonster API
985
986 void CookieMonster::SetCookieWithDetailsAsync(
987 const GURL& url, const std::string& name, const std::string& value,
988 const std::string& domain, const std::string& path,
989 const base::Time& expiration_time, bool secure, bool http_only,
990 const SetCookiesCallback& callback) {
991 scoped_refptr<SetCookieWithDetailsTask> task =
992 new SetCookieWithDetailsTask(this, url, name, value, domain, path,
993 expiration_time, secure, http_only,
994 callback);
995
996 DoCookieTask(task);
997 }
998
999 void CookieMonster::GetAllCookiesAsync(const GetCookieListCallback& callback) {
1000 scoped_refptr<GetAllCookiesTask> task =
1001 new GetAllCookiesTask(this, callback);
1002
1003 DoCookieTask(task);
1004 }
1005
1006
1007 void CookieMonster::GetAllCookiesForURLWithOptionsAsync(
1008 const GURL& url,
1009 const CookieOptions& options,
1010 const GetCookieListCallback& callback) {
1011 scoped_refptr<GetAllCookiesForURLWithOptionsTask> task =
1012 new GetAllCookiesForURLWithOptionsTask(this, url, options, callback);
1013
1014 DoCookieTask(task);
1015 }
1016
1017 void CookieMonster::GetAllCookiesForURLAsync(
1018 const GURL& url, const GetCookieListCallback& callback) {
1019 CookieOptions options;
1020 options.set_include_httponly();
1021 scoped_refptr<GetAllCookiesForURLWithOptionsTask> task =
1022 new GetAllCookiesForURLWithOptionsTask(this, url, options, callback);
1023
1024 DoCookieTask(task);
1025 }
1026
1027 void CookieMonster::DeleteAllAsync(const DeleteCallback& callback) {
1028 scoped_refptr<DeleteAllTask> task =
1029 new DeleteAllTask(this, callback);
1030
1031 DoCookieTask(task);
1032 }
1033
1034 void CookieMonster::DeleteAllCreatedBetweenAsync(
1035 const Time& delete_begin, const Time& delete_end,
1036 const DeleteCallback& callback) {
1037 scoped_refptr<DeleteAllCreatedBetweenTask> task =
1038 new DeleteAllCreatedBetweenTask(this, delete_begin, delete_end,
1039 callback);
1040
1041 DoCookieTask(task);
1042 }
1043
1044 void CookieMonster::DeleteAllForHostAsync(
1045 const GURL& url, const DeleteCallback& callback) {
1046 scoped_refptr<DeleteAllForHostTask> task =
1047 new DeleteAllForHostTask(this, url, callback);
1048
1049 DoCookieTask(task);
1050 }
1051
1052 void CookieMonster::DeleteCanonicalCookieAsync(
1053 const CanonicalCookie& cookie,
1054 const DeleteCookieCallback& callback) {
1055 scoped_refptr<DeleteCanonicalCookieTask> task =
1056 new DeleteCanonicalCookieTask(this, cookie, callback);
1057
1058 DoCookieTask(task);
1059 }
1060
1061 void CookieMonster::SetCookieWithOptionsAsync(
1062 const GURL& url,
1063 const std::string& cookie_line,
1064 const CookieOptions& options,
1065 const SetCookiesCallback& callback) {
1066 scoped_refptr<SetCookieWithOptionsTask> task =
1067 new SetCookieWithOptionsTask(this, url, cookie_line, options, callback);
1068
1069 DoCookieTask(task);
1070 }
1071
1072 void CookieMonster::GetCookiesWithOptionsAsync(
1073 const GURL& url,
1074 const CookieOptions& options,
1075 const GetCookiesCallback& callback) {
1076 scoped_refptr<GetCookiesWithOptionsTask> task =
1077 new GetCookiesWithOptionsTask(this, url, options, callback);
1078
1079 DoCookieTask(task);
1080 }
1081
1082 void CookieMonster::GetCookiesWithInfoAsync(
1083 const GURL& url,
1084 const CookieOptions& options,
1085 const GetCookieInfoCallback& callback) {
1086 scoped_refptr<GetCookiesWithInfoTask> task =
1087 new GetCookiesWithInfoTask(this, url, options, callback);
1088
1089 DoCookieTask(task);
1090 }
1091
1092 void CookieMonster::DeleteCookieAsync(const GURL& url,
1093 const std::string& cookie_name,
1094 const base::Closure& callback) {
1095 scoped_refptr<DeleteCookieTask> task =
1096 new DeleteCookieTask(this, url, cookie_name, callback);
1097
1098 DoCookieTask(task);
1099 }
1100
1101 void CookieMonster::DoCookieTask(
1102 const scoped_refptr<CookieMonsterTask>& task_item) {
1103 InitIfNecessary();
1104
1105 {
1106 base::AutoLock autolock(lock_);
1107 if (!loaded_) {
1108 queue_.push(task_item);
1109 return;
1110 }
1111 }
1112
1113 task_item->Run();
1114 }
1115
571 bool CookieMonster::SetCookieWithDetails( 1116 bool CookieMonster::SetCookieWithDetails(
572 const GURL& url, const std::string& name, const std::string& value, 1117 const GURL& url, const std::string& name, const std::string& value,
573 const std::string& domain, const std::string& path, 1118 const std::string& domain, const std::string& path,
574 const base::Time& expiration_time, bool secure, bool http_only) { 1119 const base::Time& expiration_time, bool secure, bool http_only) {
575 base::AutoLock autolock(lock_); 1120 base::AutoLock autolock(lock_);
576 1121
577 if (!HasCookieableScheme(url)) 1122 if (!HasCookieableScheme(url))
578 return false; 1123 return false;
579 1124
580 InitIfNecessary();
581
582 Time creation_time = CurrentTime(); 1125 Time creation_time = CurrentTime();
583 last_time_seen_ = creation_time; 1126 last_time_seen_ = creation_time;
584 1127
585 // TODO(abarth): Take these values as parameters. 1128 // TODO(abarth): Take these values as parameters.
586 std::string mac_key; 1129 std::string mac_key;
587 std::string mac_algorithm; 1130 std::string mac_algorithm;
588 1131
589 scoped_ptr<CanonicalCookie> cc; 1132 scoped_ptr<CanonicalCookie> cc;
590 cc.reset(CanonicalCookie::Create( 1133 cc.reset(CanonicalCookie::Create(
591 url, name, value, domain, path, 1134 url, name, value, domain, path,
592 mac_key, mac_algorithm, 1135 mac_key, mac_algorithm,
593 creation_time, expiration_time, 1136 creation_time, expiration_time,
594 secure, http_only)); 1137 secure, http_only));
595 1138
596 if (!cc.get()) 1139 if (!cc.get())
597 return false; 1140 return false;
598 1141
599 CookieOptions options; 1142 CookieOptions options;
600 options.set_include_httponly(); 1143 options.set_include_httponly();
601 return SetCanonicalCookie(&cc, creation_time, options); 1144 return SetCanonicalCookie(&cc, creation_time, options);
602 } 1145 }
603 1146
604 void CookieMonster::SetCookieWithDetailsAsync(
605 const GURL& url, const std::string& name, const std::string& value,
606 const std::string& domain, const std::string& path,
607 const base::Time& expiration_time, bool secure, bool http_only,
608 const SetCookiesCallback& callback) {
609 bool success_ = SetCookieWithDetails(url, name, value, domain, path,
610 expiration_time, secure, http_only);
611 if (!callback.is_null())
612 callback.Run(success_);
613 }
614
615 bool CookieMonster::InitializeFrom(const CookieList& list) { 1147 bool CookieMonster::InitializeFrom(const CookieList& list) {
616 base::AutoLock autolock(lock_); 1148 base::AutoLock autolock(lock_);
617 InitIfNecessary(); 1149 InitIfNecessary();
618 for (net::CookieList::const_iterator iter = list.begin(); 1150 for (net::CookieList::const_iterator iter = list.begin();
619 iter != list.end(); ++iter) { 1151 iter != list.end(); ++iter) {
620 scoped_ptr<net::CookieMonster::CanonicalCookie> cookie; 1152 scoped_ptr<net::CookieMonster::CanonicalCookie> cookie;
621 cookie.reset(new net::CookieMonster::CanonicalCookie(*iter)); 1153 cookie.reset(new net::CookieMonster::CanonicalCookie(*iter));
622 net::CookieOptions options; 1154 net::CookieOptions options;
623 options.set_include_httponly(); 1155 options.set_include_httponly();
624 if (!SetCanonicalCookie(&cookie, cookie->CreationDate(), 1156 if (!SetCanonicalCookie(&cookie, cookie->CreationDate(),
625 options)) { 1157 options)) {
626 return false; 1158 return false;
627 } 1159 }
628 } 1160 }
629 return true; 1161 return true;
630 } 1162 }
631 1163
632 CookieList CookieMonster::GetAllCookies() { 1164 CookieList CookieMonster::GetAllCookies() {
633 base::AutoLock autolock(lock_); 1165 base::AutoLock autolock(lock_);
634 InitIfNecessary();
635 1166
636 // This function is being called to scrape the cookie list for management UI 1167 // This function is being called to scrape the cookie list for management UI
637 // or similar. We shouldn't show expired cookies in this list since it will 1168 // or similar. We shouldn't show expired cookies in this list since it will
638 // just be confusing to users, and this function is called rarely enough (and 1169 // just be confusing to users, and this function is called rarely enough (and
639 // is already slow enough) that it's OK to take the time to garbage collect 1170 // is already slow enough) that it's OK to take the time to garbage collect
640 // the expired cookies now. 1171 // the expired cookies now.
641 // 1172 //
642 // Note that this does not prune cookies to be below our limits (if we've 1173 // Note that this does not prune cookies to be below our limits (if we've
643 // exceeded them) the way that calling GarbageCollect() would. 1174 // exceeded them) the way that calling GarbageCollect() would.
644 GarbageCollectExpired(Time::Now(), 1175 GarbageCollectExpired(Time::Now(),
(...skipping 10 matching lines...) Expand all
655 1186
656 CookieList cookie_list; 1187 CookieList cookie_list;
657 cookie_list.reserve(cookie_ptrs.size()); 1188 cookie_list.reserve(cookie_ptrs.size());
658 for (std::vector<CanonicalCookie*>::const_iterator it = cookie_ptrs.begin(); 1189 for (std::vector<CanonicalCookie*>::const_iterator it = cookie_ptrs.begin();
659 it != cookie_ptrs.end(); ++it) 1190 it != cookie_ptrs.end(); ++it)
660 cookie_list.push_back(**it); 1191 cookie_list.push_back(**it);
661 1192
662 return cookie_list; 1193 return cookie_list;
663 } 1194 }
664 1195
665 void CookieMonster::GetAllCookiesAsync(const GetCookieListCallback& callback) {
666 if (!callback.is_null())
667 callback.Run(GetAllCookies());
668 }
669
670 CookieList CookieMonster::GetAllCookiesForURLWithOptions( 1196 CookieList CookieMonster::GetAllCookiesForURLWithOptions(
671 const GURL& url, 1197 const GURL& url,
672 const CookieOptions& options) { 1198 const CookieOptions& options) {
673 base::AutoLock autolock(lock_); 1199 base::AutoLock autolock(lock_);
674 InitIfNecessary();
675 1200
676 std::vector<CanonicalCookie*> cookie_ptrs; 1201 std::vector<CanonicalCookie*> cookie_ptrs;
677 FindCookiesForHostAndDomain(url, options, false, &cookie_ptrs); 1202 FindCookiesForHostAndDomain(url, options, false, &cookie_ptrs);
678 std::sort(cookie_ptrs.begin(), cookie_ptrs.end(), CookieSorter); 1203 std::sort(cookie_ptrs.begin(), cookie_ptrs.end(), CookieSorter);
679 1204
680 CookieList cookies; 1205 CookieList cookies;
681 for (std::vector<CanonicalCookie*>::const_iterator it = cookie_ptrs.begin(); 1206 for (std::vector<CanonicalCookie*>::const_iterator it = cookie_ptrs.begin();
682 it != cookie_ptrs.end(); it++) 1207 it != cookie_ptrs.end(); it++)
683 cookies.push_back(**it); 1208 cookies.push_back(**it);
684 1209
685 return cookies; 1210 return cookies;
686 } 1211 }
687 1212
688 void CookieMonster::GetAllCookiesForURLWithOptionsAsync(
689 const GURL& url,
690 const CookieOptions& options,
691 const GetCookieListCallback& callback) {
692 if (!callback.is_null())
693 callback.Run(GetAllCookiesForURLWithOptions(url, options));
694 }
695
696 CookieList CookieMonster::GetAllCookiesForURL(const GURL& url) { 1213 CookieList CookieMonster::GetAllCookiesForURL(const GURL& url) {
697 CookieOptions options; 1214 CookieOptions options;
698 options.set_include_httponly(); 1215 options.set_include_httponly();
699 1216
700 return GetAllCookiesForURLWithOptions(url, options); 1217 return GetAllCookiesForURLWithOptions(url, options);
701 } 1218 }
702 1219
703 void CookieMonster::GetAllCookiesForURLAsync(
704 const GURL& url, const GetCookieListCallback& callback) {
705 if (!callback.is_null())
706 callback.Run(GetAllCookiesForURL(url));
707 }
708
709 int CookieMonster::DeleteAll(bool sync_to_store) { 1220 int CookieMonster::DeleteAll(bool sync_to_store) {
710 base::AutoLock autolock(lock_); 1221 base::AutoLock autolock(lock_);
711 if (sync_to_store)
712 InitIfNecessary();
713 1222
714 int num_deleted = 0; 1223 int num_deleted = 0;
715 for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { 1224 for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) {
716 CookieMap::iterator curit = it; 1225 CookieMap::iterator curit = it;
717 ++it; 1226 ++it;
718 InternalDeleteCookie(curit, sync_to_store, 1227 InternalDeleteCookie(curit, sync_to_store,
719 sync_to_store ? DELETE_COOKIE_EXPLICIT : 1228 sync_to_store ? DELETE_COOKIE_EXPLICIT :
720 DELETE_COOKIE_DONT_RECORD /* Destruction. */); 1229 DELETE_COOKIE_DONT_RECORD /* Destruction. */);
721 ++num_deleted; 1230 ++num_deleted;
722 } 1231 }
723 1232
724 return num_deleted; 1233 return num_deleted;
725 } 1234 }
726 1235
727 int CookieMonster::DeleteAllCreatedBetween(const Time& delete_begin, 1236 int CookieMonster::DeleteAllCreatedBetween(const Time& delete_begin,
728 const Time& delete_end, 1237 const Time& delete_end) {
729 bool sync_to_store) {
730 base::AutoLock autolock(lock_); 1238 base::AutoLock autolock(lock_);
731 InitIfNecessary();
732 1239
733 int num_deleted = 0; 1240 int num_deleted = 0;
734 for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { 1241 for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) {
735 CookieMap::iterator curit = it; 1242 CookieMap::iterator curit = it;
736 CanonicalCookie* cc = curit->second; 1243 CanonicalCookie* cc = curit->second;
737 ++it; 1244 ++it;
738 1245
739 if (cc->CreationDate() >= delete_begin && 1246 if (cc->CreationDate() >= delete_begin &&
740 (delete_end.is_null() || cc->CreationDate() < delete_end)) { 1247 (delete_end.is_null() || cc->CreationDate() < delete_end)) {
741 InternalDeleteCookie(curit, sync_to_store, DELETE_COOKIE_EXPLICIT); 1248 InternalDeleteCookie(curit,
1249 true, /*sync_to_store*/
1250 DELETE_COOKIE_EXPLICIT);
742 ++num_deleted; 1251 ++num_deleted;
743 } 1252 }
744 } 1253 }
745 1254
746 return num_deleted; 1255 return num_deleted;
747 } 1256 }
748 1257
749 void CookieMonster::DeleteAllCreatedBetweenAsync(
750 const Time& delete_begin, const Time& delete_end,
751 bool sync_to_store,
752 const DeleteCallback& callback) {
753 int num_deleted = DeleteAllCreatedBetween(
754 delete_begin, delete_end, sync_to_store);
755 if (!callback.is_null())
756 callback.Run(num_deleted);
757 }
758
759 int CookieMonster::DeleteAllForHost(const GURL& url) { 1258 int CookieMonster::DeleteAllForHost(const GURL& url) {
760 base::AutoLock autolock(lock_); 1259 base::AutoLock autolock(lock_);
761 InitIfNecessary();
762 1260
763 if (!HasCookieableScheme(url)) 1261 if (!HasCookieableScheme(url))
764 return 0; 1262 return 0;
765 1263
766 const std::string scheme(url.scheme()); 1264 const std::string scheme(url.scheme());
767 const std::string host(url.host()); 1265 const std::string host(url.host());
768 1266
769 // We store host cookies in the store by their canonical host name; 1267 // We store host cookies in the store by their canonical host name;
770 // domain cookies are stored with a leading ".". So this is a pretty 1268 // domain cookies are stored with a leading ".". So this is a pretty
771 // simple lookup and per-cookie delete. 1269 // simple lookup and per-cookie delete.
772 int num_deleted = 0; 1270 int num_deleted = 0;
773 for (CookieMapItPair its = cookies_.equal_range(GetKey(host)); 1271 for (CookieMapItPair its = cookies_.equal_range(GetKey(host));
774 its.first != its.second;) { 1272 its.first != its.second;) {
775 CookieMap::iterator curit = its.first; 1273 CookieMap::iterator curit = its.first;
776 ++its.first; 1274 ++its.first;
777 1275
778 const CanonicalCookie* const cc = curit->second; 1276 const CanonicalCookie* const cc = curit->second;
779 1277
780 // Delete only on a match as a host cookie. 1278 // Delete only on a match as a host cookie.
781 if (cc->IsHostCookie() && cc->IsDomainMatch(scheme, host)) { 1279 if (cc->IsHostCookie() && cc->IsDomainMatch(scheme, host)) {
782 num_deleted++; 1280 num_deleted++;
783 1281
784 InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPLICIT); 1282 InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPLICIT);
785 } 1283 }
786 } 1284 }
787 return num_deleted; 1285 return num_deleted;
788 } 1286 }
789 1287
790 void CookieMonster::DeleteAllForHostAsync(
791 const GURL& url, const DeleteCallback& callback) {
792 int num_deleted = DeleteAllForHost(url);
793 if (!callback.is_null())
794 callback.Run(num_deleted);
795 }
796
797 bool CookieMonster::DeleteCanonicalCookie(const CanonicalCookie& cookie) { 1288 bool CookieMonster::DeleteCanonicalCookie(const CanonicalCookie& cookie) {
798 base::AutoLock autolock(lock_); 1289 base::AutoLock autolock(lock_);
799 InitIfNecessary();
800 1290
801 for (CookieMapItPair its = cookies_.equal_range(GetKey(cookie.Domain())); 1291 for (CookieMapItPair its = cookies_.equal_range(GetKey(cookie.Domain()));
802 its.first != its.second; ++its.first) { 1292 its.first != its.second; ++its.first) {
803 // The creation date acts as our unique index... 1293 // The creation date acts as our unique index...
804 if (its.first->second->CreationDate() == cookie.CreationDate()) { 1294 if (its.first->second->CreationDate() == cookie.CreationDate()) {
805 InternalDeleteCookie(its.first, true, DELETE_COOKIE_EXPLICIT); 1295 InternalDeleteCookie(its.first, true, DELETE_COOKIE_EXPLICIT);
806 return true; 1296 return true;
807 } 1297 }
808 } 1298 }
809 return false; 1299 return false;
810 } 1300 }
811 1301
812 void CookieMonster::DeleteCanonicalCookieAsync(
813 const CanonicalCookie& cookie,
814 const DeleteCookieCallback& callback) {
815 bool result = DeleteCanonicalCookie(cookie);
816 if (!callback.is_null())
817 callback.Run(result);
818 }
819
820 void CookieMonster::SetCookieableSchemes( 1302 void CookieMonster::SetCookieableSchemes(
821 const char* schemes[], size_t num_schemes) { 1303 const char* schemes[], size_t num_schemes) {
822 base::AutoLock autolock(lock_); 1304 base::AutoLock autolock(lock_);
823 1305
824 // Cookieable Schemes must be set before first use of function. 1306 // Cookieable Schemes must be set before first use of function.
825 DCHECK(!initialized_); 1307 DCHECK(!initialized_);
826 1308
827 cookieable_schemes_.clear(); 1309 cookieable_schemes_.clear();
828 cookieable_schemes_.insert(cookieable_schemes_.end(), 1310 cookieable_schemes_.insert(cookieable_schemes_.end(),
829 schemes, schemes + num_schemes); 1311 schemes, schemes + num_schemes);
(...skipping 28 matching lines...) Expand all
858 1340
859 bool CookieMonster::SetCookieWithOptions(const GURL& url, 1341 bool CookieMonster::SetCookieWithOptions(const GURL& url,
860 const std::string& cookie_line, 1342 const std::string& cookie_line,
861 const CookieOptions& options) { 1343 const CookieOptions& options) {
862 base::AutoLock autolock(lock_); 1344 base::AutoLock autolock(lock_);
863 1345
864 if (!HasCookieableScheme(url)) { 1346 if (!HasCookieableScheme(url)) {
865 return false; 1347 return false;
866 } 1348 }
867 1349
868 InitIfNecessary();
869
870 return SetCookieWithCreationTimeAndOptions(url, cookie_line, Time(), options); 1350 return SetCookieWithCreationTimeAndOptions(url, cookie_line, Time(), options);
871 } 1351 }
872 1352
873 void CookieMonster::SetCookieWithOptionsAsync(
874 const GURL& url,
875 const std::string& cookie_line,
876 const CookieOptions& options,
877 const SetCookiesCallback& callback) {
878 bool result = SetCookieWithOptions(url, cookie_line, options);
879 if (!callback.is_null())
880 callback.Run(result);
881 }
882
883 std::string CookieMonster::GetCookiesWithOptions(const GURL& url, 1353 std::string CookieMonster::GetCookiesWithOptions(const GURL& url,
884 const CookieOptions& options) { 1354 const CookieOptions& options) {
885 base::AutoLock autolock(lock_); 1355 base::AutoLock autolock(lock_);
886 InitIfNecessary();
887 1356
888 if (!HasCookieableScheme(url)) 1357 if (!HasCookieableScheme(url))
889 return std::string(); 1358 return std::string();
890 1359
891 TimeTicks start_time(TimeTicks::Now()); 1360 TimeTicks start_time(TimeTicks::Now());
892 1361
893 std::vector<CanonicalCookie*> cookies; 1362 std::vector<CanonicalCookie*> cookies;
894 FindCookiesForHostAndDomain(url, options, true, &cookies); 1363 FindCookiesForHostAndDomain(url, options, true, &cookies);
895 std::sort(cookies.begin(), cookies.end(), CookieSorter); 1364 std::sort(cookies.begin(), cookies.end(), CookieSorter);
896 1365
897 std::string cookie_line = BuildCookieLine(cookies); 1366 std::string cookie_line = BuildCookieLine(cookies);
898 1367
899 histogram_time_get_->AddTime(TimeTicks::Now() - start_time); 1368 histogram_time_get_->AddTime(TimeTicks::Now() - start_time);
900 1369
901 VLOG(kVlogGetCookies) << "GetCookies() result: " << cookie_line; 1370 VLOG(kVlogGetCookies) << "GetCookies() result: " << cookie_line;
902 1371
903 return cookie_line; 1372 return cookie_line;
904 } 1373 }
905 1374
906 void CookieMonster::GetCookiesWithOptionsAsync(
907 const GURL& url, const CookieOptions& options,
908 const GetCookiesCallback& callback) {
909 std::string cookie = GetCookiesWithOptions(url, options);
910 if (!callback.is_null())
911 callback.Run(cookie);
912 }
913
914 void CookieMonster::GetCookiesWithInfo(const GURL& url, 1375 void CookieMonster::GetCookiesWithInfo(const GURL& url,
915 const CookieOptions& options, 1376 const CookieOptions& options,
916 std::string* cookie_line, 1377 std::string* cookie_line,
917 std::vector<CookieInfo>* cookie_infos) { 1378 std::vector<CookieInfo>* cookie_infos) {
918 DCHECK(cookie_line->empty()); 1379 DCHECK(cookie_line->empty());
919 DCHECK(cookie_infos->empty()); 1380 DCHECK(cookie_infos->empty());
920 1381
921 base::AutoLock autolock(lock_); 1382 base::AutoLock autolock(lock_);
922 InitIfNecessary();
923 1383
924 if (!HasCookieableScheme(url)) 1384 if (!HasCookieableScheme(url))
925 return; 1385 return;
926 1386
927 TimeTicks start_time(TimeTicks::Now()); 1387 TimeTicks start_time(TimeTicks::Now());
928 1388
929 std::vector<CanonicalCookie*> cookies; 1389 std::vector<CanonicalCookie*> cookies;
930 FindCookiesForHostAndDomain(url, options, true, &cookies); 1390 FindCookiesForHostAndDomain(url, options, true, &cookies);
931 std::sort(cookies.begin(), cookies.end(), CookieSorter); 1391 std::sort(cookies.begin(), cookies.end(), CookieSorter);
932 *cookie_line = BuildCookieLine(cookies); 1392 *cookie_line = BuildCookieLine(cookies);
933 1393
934 histogram_time_get_->AddTime(TimeTicks::Now() - start_time); 1394 histogram_time_get_->AddTime(TimeTicks::Now() - start_time);
935 1395
936 TimeTicks mac_start_time = TimeTicks::Now(); 1396 TimeTicks mac_start_time = TimeTicks::Now();
937 BuildCookieInfoList(cookies, cookie_infos); 1397 BuildCookieInfoList(cookies, cookie_infos);
938 histogram_time_mac_->AddTime(TimeTicks::Now() - mac_start_time); 1398 histogram_time_mac_->AddTime(TimeTicks::Now() - mac_start_time);
939 } 1399 }
940 1400
941 void CookieMonster::GetCookiesWithInfoAsync(
942 const GURL& url,
943 const CookieOptions& options,
944 const GetCookieInfoCallback& callback) {
945 std::string cookie_line;
946 std::vector<CookieInfo> cookie_infos;
947 GetCookiesWithInfo(url, options, &cookie_line, &cookie_infos);
948
949 if (!callback.is_null())
950 callback.Run(&cookie_line, &cookie_infos);
951 }
952
953 void CookieMonster::DeleteCookie(const GURL& url, 1401 void CookieMonster::DeleteCookie(const GURL& url,
954 const std::string& cookie_name) { 1402 const std::string& cookie_name) {
955 base::AutoLock autolock(lock_); 1403 base::AutoLock autolock(lock_);
956 InitIfNecessary();
957 1404
958 if (!HasCookieableScheme(url)) 1405 if (!HasCookieableScheme(url))
959 return; 1406 return;
960 1407
961 CookieOptions options; 1408 CookieOptions options;
962 options.set_include_httponly(); 1409 options.set_include_httponly();
963 // Get the cookies for this host and its domain(s). 1410 // Get the cookies for this host and its domain(s).
964 std::vector<CanonicalCookie*> cookies; 1411 std::vector<CanonicalCookie*> cookies;
965 FindCookiesForHostAndDomain(url, options, true, &cookies); 1412 FindCookiesForHostAndDomain(url, options, true, &cookies);
966 std::set<CanonicalCookie*> matching_cookies; 1413 std::set<CanonicalCookie*> matching_cookies;
967 1414
968 for (std::vector<CanonicalCookie*>::const_iterator it = cookies.begin(); 1415 for (std::vector<CanonicalCookie*>::const_iterator it = cookies.begin();
969 it != cookies.end(); ++it) { 1416 it != cookies.end(); ++it) {
970 if ((*it)->Name() != cookie_name) 1417 if ((*it)->Name() != cookie_name)
971 continue; 1418 continue;
972 if (url.path().find((*it)->Path())) 1419 if (url.path().find((*it)->Path()))
973 continue; 1420 continue;
974 matching_cookies.insert(*it); 1421 matching_cookies.insert(*it);
975 } 1422 }
976 1423
977 for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { 1424 for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) {
978 CookieMap::iterator curit = it; 1425 CookieMap::iterator curit = it;
979 ++it; 1426 ++it;
980 if (matching_cookies.find(curit->second) != matching_cookies.end()) { 1427 if (matching_cookies.find(curit->second) != matching_cookies.end()) {
981 InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPLICIT); 1428 InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPLICIT);
982 } 1429 }
983 } 1430 }
984 } 1431 }
985 1432
986 void CookieMonster::DeleteCookieAsync(const GURL& url,
987 const std::string& cookie_name,
988 const base::Closure& callback) {
989 DeleteCookie(url, cookie_name);
990 if (!callback.is_null())
991 callback.Run();
992 }
993
994 CookieMonster* CookieMonster::GetCookieMonster() { 1433 CookieMonster* CookieMonster::GetCookieMonster() {
995 return this; 1434 return this;
996 } 1435 }
997 1436
998 CookieMonster::~CookieMonster() { 1437 CookieMonster::~CookieMonster() {
999 DeleteAll(false); 1438 DeleteAll(false);
1000 } 1439 }
1001 1440
1002 bool CookieMonster::SetCookieWithCreationTime(const GURL& url, 1441 bool CookieMonster::SetCookieWithCreationTime(const GURL& url,
1003 const std::string& cookie_line, 1442 const std::string& cookie_line,
1004 const base::Time& creation_time) { 1443 const base::Time& creation_time) {
1444 DCHECK(!store_) << "This method is only to be used by unit-tests.";
1005 base::AutoLock autolock(lock_); 1445 base::AutoLock autolock(lock_);
1006 1446
1007 if (!HasCookieableScheme(url)) { 1447 if (!HasCookieableScheme(url)) {
1008 return false; 1448 return false;
1009 } 1449 }
1010 1450
1011 InitIfNecessary(); 1451 InitIfNecessary();
1012 return SetCookieWithCreationTimeAndOptions(url, cookie_line, creation_time, 1452 return SetCookieWithCreationTimeAndOptions(url, cookie_line, creation_time,
1013 CookieOptions()); 1453 CookieOptions());
1014 } 1454 }
1015 1455
1016 void CookieMonster::InitStore() { 1456 void CookieMonster::InitStore() {
1017 DCHECK(store_) << "Store must exist to initialize"; 1457 DCHECK(store_) << "Store must exist to initialize";
1018 1458
1019 TimeTicks beginning_time(TimeTicks::Now()); 1459 // We bind in the current time so that we can report the wall-clock time for
1460 // loading cookies.
1461 store_->Load(base::Bind(&CookieMonster::OnLoaded, this, TimeTicks::Now()));
1462 }
1020 1463
1464 void CookieMonster::OnLoaded(TimeTicks beginning_time,
1465 const std::vector<CanonicalCookie*>& cookies) {
1466 StoreLoadedCookies(cookies);
1467 histogram_time_load_->AddTime(TimeTicks::Now() - beginning_time);
1468
1469 // Invoke the task queue of cookie request.
1470 InvokeQueue();
1471 }
1472
1473 void CookieMonster::StoreLoadedCookies(
1474 const std::vector<CanonicalCookie*>& cookies) {
1021 // Initialize the store and sync in any saved persistent cookies. We don't 1475 // Initialize the store and sync in any saved persistent cookies. We don't
1022 // care if it's expired, insert it so it can be garbage collected, removed, 1476 // care if it's expired, insert it so it can be garbage collected, removed,
1023 // and sync'd. 1477 // and sync'd.
1024 std::vector<CanonicalCookie*> cookies; 1478 base::AutoLock autolock(lock_);
1025 // Reserve space for the maximum amount of cookies a database should have.
1026 // This prevents multiple vector growth / copies as we append cookies.
1027 cookies.reserve(kMaxCookies);
1028 store_->Load(&cookies);
1029 1479
1030 // Avoid ever letting cookies with duplicate creation times into the store; 1480 // Avoid ever letting cookies with duplicate creation times into the store;
1031 // that way we don't have to worry about what sections of code are safe 1481 // that way we don't have to worry about what sections of code are safe
1032 // to call while it's in that state. 1482 // to call while it's in that state.
1033 std::set<int64> creation_times; 1483 std::set<int64> creation_times;
1034 1484
1035 // Presumably later than any access time in the store. 1485 // Presumably later than any access time in the store.
1036 Time earliest_access_time; 1486 Time earliest_access_time;
1037 1487
1038 for (std::vector<CanonicalCookie*>::const_iterator it = cookies.begin(); 1488 for (std::vector<CanonicalCookie*>::const_iterator it = cookies.begin();
(...skipping 18 matching lines...) Expand all
1057 delete (*it); 1507 delete (*it);
1058 } 1508 }
1059 } 1509 }
1060 earliest_access_time_= earliest_access_time; 1510 earliest_access_time_= earliest_access_time;
1061 1511
1062 // After importing cookies from the PersistentCookieStore, verify that 1512 // After importing cookies from the PersistentCookieStore, verify that
1063 // none of our other constraints are violated. 1513 // none of our other constraints are violated.
1064 // 1514 //
1065 // In particular, the backing store might have given us duplicate cookies. 1515 // In particular, the backing store might have given us duplicate cookies.
1066 EnsureCookiesMapIsValid(); 1516 EnsureCookiesMapIsValid();
1517 }
1067 1518
1068 histogram_time_load_->AddTime(TimeTicks::Now() - beginning_time); 1519 void CookieMonster::InvokeQueue() {
1520 while (true) {
1521 scoped_refptr<CookieMonsterTask> request_task;
1522 {
1523 base::AutoLock autolock(lock_);
1524 if (queue_.empty()) {
1525 loaded_ = true;
1526 break;
1527 }
1528 request_task = queue_.front();
1529 queue_.pop();
1530 }
1531 request_task->Run();
1532 }
1069 } 1533 }
1070 1534
1071 void CookieMonster::EnsureCookiesMapIsValid() { 1535 void CookieMonster::EnsureCookiesMapIsValid() {
1072 lock_.AssertAcquired(); 1536 lock_.AssertAcquired();
1073 1537
1074 int num_duplicates_trimmed = 0; 1538 int num_duplicates_trimmed = 0;
1075 1539
1076 // Iterate through all the of the cookies, grouped by host. 1540 // Iterate through all the of the cookies, grouped by host.
1077 CookieMap::iterator prev_range_end = cookies_.begin(); 1541 CookieMap::iterator prev_range_end = cookies_.begin();
1078 while (prev_range_end != cookies_.end()) { 1542 while (prev_range_end != cookies_.end()) {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1159 signature.name.c_str(), 1623 signature.name.c_str(),
1160 signature.domain.c_str(), 1624 signature.domain.c_str(),
1161 signature.path.c_str()); 1625 signature.path.c_str());
1162 1626
1163 // Remove all the cookies identified by |dupes|. It is valid to delete our 1627 // Remove all the cookies identified by |dupes|. It is valid to delete our
1164 // list of iterators one at a time, since |cookies_| is a multimap (they 1628 // list of iterators one at a time, since |cookies_| is a multimap (they
1165 // don't invalidate existing iterators following deletion). 1629 // don't invalidate existing iterators following deletion).
1166 for (CookieSet::iterator dupes_it = dupes.begin(); 1630 for (CookieSet::iterator dupes_it = dupes.begin();
1167 dupes_it != dupes.end(); 1631 dupes_it != dupes.end();
1168 ++dupes_it) { 1632 ++dupes_it) {
1169 InternalDeleteCookie(*dupes_it, true /*sync_to_store*/, 1633 InternalDeleteCookie(*dupes_it, true,
1170 DELETE_COOKIE_DUPLICATE_IN_BACKING_STORE); 1634 DELETE_COOKIE_DUPLICATE_IN_BACKING_STORE);
1171 } 1635 }
1172 } 1636 }
1173 DCHECK_EQ(num_duplicates, num_duplicates_found); 1637 DCHECK_EQ(num_duplicates, num_duplicates_found);
1174 1638
1175 return num_duplicates; 1639 return num_duplicates;
1176 } 1640 }
1177 1641
1178 // Note: file must be the last scheme. 1642 // Note: file must be the last scheme.
1179 const char* CookieMonster::kDefaultCookieableSchemes[] = 1643 const char* CookieMonster::kDefaultCookieableSchemes[] =
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after
1813 if (!pairs_.empty()) { 2277 if (!pairs_.empty()) {
1814 is_valid_ = true; 2278 is_valid_ = true;
1815 SetupAttributes(); 2279 SetupAttributes();
1816 } 2280 }
1817 } 2281 }
1818 2282
1819 CookieMonster::ParsedCookie::~ParsedCookie() { 2283 CookieMonster::ParsedCookie::~ParsedCookie() {
1820 } 2284 }
1821 2285
1822 // Returns true if |c| occurs in |chars| 2286 // Returns true if |c| occurs in |chars|
1823 // TODO maybe make this take an iterator, could check for end also? 2287 // TODO(erikwright): maybe make this take an iterator, could check for end also?
1824 static inline bool CharIsA(const char c, const char* chars) { 2288 static inline bool CharIsA(const char c, const char* chars) {
1825 return strchr(chars, c) != NULL; 2289 return strchr(chars, c) != NULL;
1826 } 2290 }
1827 // Seek the iterator to the first occurrence of a character in |chars|. 2291 // Seek the iterator to the first occurrence of a character in |chars|.
1828 // Returns true if it hit the end, false otherwise. 2292 // Returns true if it hit the end, false otherwise.
1829 static inline bool SeekTo(std::string::const_iterator* it, 2293 static inline bool SeekTo(std::string::const_iterator* it,
1830 const std::string::const_iterator& end, 2294 const std::string::const_iterator& end,
1831 const char* chars) { 2295 const char* chars) {
1832 for (; *it != end && !CharIsA(**it, chars); ++(*it)) {} 2296 for (; *it != end && !CharIsA(**it, chars); ++(*it)) {}
1833 return *it == end; 2297 return *it == end;
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
1969 // Parse all token/value pairs and populate pairs_. 2433 // Parse all token/value pairs and populate pairs_.
1970 void CookieMonster::ParsedCookie::ParseTokenValuePairs( 2434 void CookieMonster::ParsedCookie::ParseTokenValuePairs(
1971 const std::string& cookie_line) { 2435 const std::string& cookie_line) {
1972 pairs_.clear(); 2436 pairs_.clear();
1973 2437
1974 // Ok, here we go. We should be expecting to be starting somewhere 2438 // Ok, here we go. We should be expecting to be starting somewhere
1975 // before the cookie line, not including any header name... 2439 // before the cookie line, not including any header name...
1976 std::string::const_iterator start = cookie_line.begin(); 2440 std::string::const_iterator start = cookie_line.begin();
1977 std::string::const_iterator it = start; 2441 std::string::const_iterator it = start;
1978 2442
1979 // TODO Make sure we're stripping \r\n in the network code. Then we 2443 // TODO(erikwright): Make sure we're stripping \r\n in the network code.
1980 // can log any unexpected terminators. 2444 // Then we can log any unexpected terminators.
1981 std::string::const_iterator end = FindFirstTerminator(cookie_line); 2445 std::string::const_iterator end = FindFirstTerminator(cookie_line);
1982 2446
1983 for (int pair_num = 0; pair_num < kMaxPairs && it != end; ++pair_num) { 2447 for (int pair_num = 0; pair_num < kMaxPairs && it != end; ++pair_num) {
1984 TokenValuePair pair; 2448 TokenValuePair pair;
1985 2449
1986 std::string::const_iterator token_start, token_end; 2450 std::string::const_iterator token_start, token_end;
1987 if (!ParseToken(&it, end, &token_start, &token_end)) 2451 if (!ParseToken(&it, end, &token_start, &token_end))
1988 break; 2452 break;
1989 2453
1990 if (it == end || *it != '=') { 2454 if (it == end || *it != '=') {
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
2300 std::string CookieMonster::CanonicalCookie::DebugString() const { 2764 std::string CookieMonster::CanonicalCookie::DebugString() const {
2301 return base::StringPrintf( 2765 return base::StringPrintf(
2302 "name: %s value: %s domain: %s path: %s creation: %" 2766 "name: %s value: %s domain: %s path: %s creation: %"
2303 PRId64, 2767 PRId64,
2304 name_.c_str(), value_.c_str(), 2768 name_.c_str(), value_.c_str(),
2305 domain_.c_str(), path_.c_str(), 2769 domain_.c_str(), path_.c_str(),
2306 static_cast<int64>(creation_date_.ToTimeT())); 2770 static_cast<int64>(creation_date_.ToTimeT()));
2307 } 2771 }
2308 2772
2309 } // namespace 2773 } // namespace
OLDNEW
« no previous file with comments | « net/base/cookie_monster.h ('k') | net/base/cookie_monster_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698