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

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

Issue 2882063002: Add a SetCanonicalCookie method for CookieMonster. (Closed)
Patch Set: Fix iOS behavior for secure cookies. Created 3 years, 6 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
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 // 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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 #include "base/logging.h" 55 #include "base/logging.h"
56 #include "base/macros.h" 56 #include "base/macros.h"
57 #include "base/memory/ptr_util.h" 57 #include "base/memory/ptr_util.h"
58 #include "base/metrics/field_trial.h" 58 #include "base/metrics/field_trial.h"
59 #include "base/metrics/histogram.h" 59 #include "base/metrics/histogram.h"
60 #include "base/profiler/scoped_tracker.h" 60 #include "base/profiler/scoped_tracker.h"
61 #include "base/single_thread_task_runner.h" 61 #include "base/single_thread_task_runner.h"
62 #include "base/strings/string_util.h" 62 #include "base/strings/string_util.h"
63 #include "base/strings/stringprintf.h" 63 #include "base/strings/stringprintf.h"
64 #include "base/threading/thread_task_runner_handle.h" 64 #include "base/threading/thread_task_runner_handle.h"
65 #include "base/time/time.h"
mmenke 2017/06/16 15:56:28 nit: Not needed, already included in header.
Randy Smith (Not in Mondays) 2017/06/16 21:38:00 Done.
65 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" 66 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
66 #include "net/cookies/canonical_cookie.h" 67 #include "net/cookies/canonical_cookie.h"
67 #include "net/cookies/cookie_util.h" 68 #include "net/cookies/cookie_util.h"
68 #include "net/cookies/parsed_cookie.h" 69 #include "net/cookies/parsed_cookie.h"
69 #include "net/ssl/channel_id_service.h" 70 #include "net/ssl/channel_id_service.h"
70 #include "url/origin.h" 71 #include "url/origin.h"
71 72
72 using base::Time; 73 using base::Time;
73 using base::TimeDelta; 74 using base::TimeDelta;
74 using base::TimeTicks; 75 using base::TimeTicks;
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 private: 688 private:
688 CanonicalCookie cookie_; 689 CanonicalCookie cookie_;
689 690
690 DISALLOW_COPY_AND_ASSIGN(DeleteCanonicalCookieTask); 691 DISALLOW_COPY_AND_ASSIGN(DeleteCanonicalCookieTask);
691 }; 692 };
692 693
693 int CookieMonster::DeleteCanonicalCookieTask::RunDeleteTask() { 694 int CookieMonster::DeleteCanonicalCookieTask::RunDeleteTask() {
694 return this->cookie_monster()->DeleteCanonicalCookie(cookie_); 695 return this->cookie_monster()->DeleteCanonicalCookie(cookie_);
695 } 696 }
696 697
698 // Task class for SetCanonicalCookie call.
699 class CookieMonster::SetCanonicalCookieTask : public CookieMonsterTask {
700 public:
701 SetCanonicalCookieTask(CookieMonster* cookie_monster,
702 std::unique_ptr<CanonicalCookie> cookie,
703 bool secure_source,
704 bool modify_http_only,
705 const SetCookiesCallback& callback)
706 : CookieMonsterTask(cookie_monster),
707 cookie_(std::move(cookie)),
708 secure_source_(secure_source),
709 modify_http_only_(modify_http_only),
710 callback_(callback) {}
711
712 // CookieMonsterTask:
713 void Run() override;
714
715 protected:
716 ~SetCanonicalCookieTask() override {}
717
718 private:
719 std::unique_ptr<CanonicalCookie> cookie_;
720 bool secure_source_;
721 bool modify_http_only_;
722 SetCookiesCallback callback_;
723
724 DISALLOW_COPY_AND_ASSIGN(SetCanonicalCookieTask);
725 };
726
727 void CookieMonster::SetCanonicalCookieTask::Run() {
728 bool result = this->cookie_monster()->SetCanonicalCookie(
729 std::move(cookie_), secure_source_, modify_http_only_);
730 if (!callback_.is_null())
731 callback_.Run(result);
732 }
733
697 // Task class for SetCookieWithOptions call. 734 // Task class for SetCookieWithOptions call.
698 class CookieMonster::SetCookieWithOptionsTask : public CookieMonsterTask { 735 class CookieMonster::SetCookieWithOptionsTask : public CookieMonsterTask {
699 public: 736 public:
700 SetCookieWithOptionsTask(CookieMonster* cookie_monster, 737 SetCookieWithOptionsTask(CookieMonster* cookie_monster,
701 const GURL& url, 738 const GURL& url,
702 const std::string& cookie_line, 739 const std::string& cookie_line,
703 const CookieOptions& options, 740 const CookieOptions& options,
704 const SetCookiesCallback& callback) 741 const SetCookiesCallback& callback)
705 : CookieMonsterTask(cookie_monster), 742 : CookieMonsterTask(cookie_monster),
706 url_(url), 743 url_(url),
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
895 store_->SetForceKeepSessionState(); 932 store_->SetForceKeepSessionState();
896 } 933 }
897 934
898 void CookieMonster::SetAllCookiesAsync(const CookieList& list, 935 void CookieMonster::SetAllCookiesAsync(const CookieList& list,
899 const SetCookiesCallback& callback) { 936 const SetCookiesCallback& callback) {
900 scoped_refptr<SetAllCookiesTask> task = 937 scoped_refptr<SetAllCookiesTask> task =
901 new SetAllCookiesTask(this, list, callback); 938 new SetAllCookiesTask(this, list, callback);
902 DoCookieTask(task); 939 DoCookieTask(task);
903 } 940 }
904 941
942 void CookieMonster::SetCanonicalCookieAsync(
943 const CanonicalCookie& cookie,
944 bool secure_source,
945 bool modify_http_only,
946 const SetCookiesCallback& callback) {
947 DCHECK(cookie.IsCanonical());
948 scoped_refptr<SetCanonicalCookieTask> task = new SetCanonicalCookieTask(
949 this, base::MakeUnique<CanonicalCookie>(cookie), secure_source,
mmenke 2017/06/16 15:56:28 Should this take a unique_ptr<CanonicalCookie> ins
Randy Smith (Not in Mondays) 2017/06/16 21:38:00 I think I'm going to say "Yeah, that makes sense",
950 modify_http_only, callback);
951
952 // TODO(rdsmith): Switch to DoCookieTaskForURL (or the equivalent).
953 // This is tricky because we don't have the scheme in this routine
954 // and DoCookieTaskForURL uses cookie_util::GetEffectiveDomain(scheme, host)
955 // to generate the database key to block behind.
956 DoCookieTask(task);
957 }
958
905 void CookieMonster::SetCookieWithOptionsAsync( 959 void CookieMonster::SetCookieWithOptionsAsync(
906 const GURL& url, 960 const GURL& url,
907 const std::string& cookie_line, 961 const std::string& cookie_line,
908 const CookieOptions& options, 962 const CookieOptions& options,
909 const SetCookiesCallback& callback) { 963 const SetCookiesCallback& callback) {
910 scoped_refptr<SetCookieWithOptionsTask> task = 964 scoped_refptr<SetCookieWithOptionsTask> task =
911 new SetCookieWithOptionsTask(this, url, cookie_line, options, callback); 965 new SetCookieWithOptionsTask(this, url, cookie_line, options, callback);
912 966
913 DoCookieTaskForURL(task, url); 967 DoCookieTaskForURL(task, url);
914 } 968 }
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1061 base::Time last_access_time, 1115 base::Time last_access_time,
1062 bool secure, 1116 bool secure,
1063 bool http_only, 1117 bool http_only,
1064 CookieSameSite same_site, 1118 CookieSameSite same_site,
1065 CookiePriority priority) { 1119 CookiePriority priority) {
1066 DCHECK(thread_checker_.CalledOnValidThread()); 1120 DCHECK(thread_checker_.CalledOnValidThread());
1067 1121
1068 if (!HasCookieableScheme(url)) 1122 if (!HasCookieableScheme(url))
1069 return false; 1123 return false;
1070 1124
1071 // TODO(mmenke): This class assumes each cookie to have a unique creation
1072 // time. Allowing the caller to set the creation time violates that
1073 // assumption. Worth fixing? Worth noting that time changes between browser
1074 // restarts can cause the same issue.
1075 base::Time actual_creation_time = creation_time;
1076 if (creation_time.is_null()) {
1077 actual_creation_time = CurrentTime();
1078 last_time_seen_ = actual_creation_time;
1079 }
1080
1081 // Validate consistency of passed arguments. 1125 // Validate consistency of passed arguments.
1082 if (ParsedCookie::ParseTokenString(name) != name || 1126 if (ParsedCookie::ParseTokenString(name) != name ||
1083 ParsedCookie::ParseValueString(value) != value || 1127 ParsedCookie::ParseValueString(value) != value ||
1084 ParsedCookie::ParseValueString(domain) != domain || 1128 ParsedCookie::ParseValueString(domain) != domain ||
1085 ParsedCookie::ParseValueString(path) != path) { 1129 ParsedCookie::ParseValueString(path) != path) {
1086 return false; 1130 return false;
1087 } 1131 }
1088 1132
1089 std::string cookie_domain; 1133 std::string cookie_domain;
1090 if (!cookie_util::GetCookieDomainWithString(url, domain, &cookie_domain)) 1134 if (!cookie_util::GetCookieDomainWithString(url, domain, &cookie_domain))
1091 return false; 1135 return false;
1092 1136
1093 std::string cookie_path = CanonicalCookie::CanonPathWithString(url, path); 1137 std::string cookie_path = CanonicalCookie::CanonPathWithString(url, path);
1094 if (!path.empty() && cookie_path != path) 1138 if (!path.empty() && cookie_path != path)
1095 return false; 1139 return false;
1096 1140
1097 // Canonicalize path again to make sure it escapes characters as needed. 1141 // Canonicalize path again to make sure it escapes characters as needed.
1098 url::Component path_component(0, cookie_path.length()); 1142 url::Component path_component(0, cookie_path.length());
1099 url::RawCanonOutputT<char> canon_path; 1143 url::RawCanonOutputT<char> canon_path;
1100 url::Component canon_path_component; 1144 url::Component canon_path_component;
1101 url::CanonicalizePath(cookie_path.data(), path_component, &canon_path, 1145 url::CanonicalizePath(cookie_path.data(), path_component, &canon_path,
1102 &canon_path_component); 1146 &canon_path_component);
1103 cookie_path = std::string(canon_path.data() + canon_path_component.begin, 1147 cookie_path = std::string(canon_path.data() + canon_path_component.begin,
1104 canon_path_component.len); 1148 canon_path_component.len);
1105 1149
1106 std::unique_ptr<CanonicalCookie> cc(base::MakeUnique<CanonicalCookie>( 1150 std::unique_ptr<CanonicalCookie> cc(base::MakeUnique<CanonicalCookie>(
1107 name, value, cookie_domain, cookie_path, actual_creation_time, 1151 name, value, cookie_domain, cookie_path, creation_time, expiration_time,
1108 expiration_time, last_access_time, secure, http_only, same_site, 1152 last_access_time, secure, http_only, same_site, priority));
1109 priority));
1110 1153
1111 return SetCanonicalCookie(std::move(cc), url.SchemeIsCryptographic(), true); 1154 return SetCanonicalCookie(std::move(cc), url.SchemeIsCryptographic(), true);
1112 } 1155 }
1113 1156
1114 CookieList CookieMonster::GetAllCookies() { 1157 CookieList CookieMonster::GetAllCookies() {
1115 DCHECK(thread_checker_.CalledOnValidThread()); 1158 DCHECK(thread_checker_.CalledOnValidThread());
1116 1159
1117 // This function is being called to scrape the cookie list for management UI 1160 // This function is being called to scrape the cookie list for management UI
1118 // or similar. We shouldn't show expired cookies in this list since it will 1161 // or similar. We shouldn't show expired cookies in this list since it will
1119 // just be confusing to users, and this function is called rarely enough (and 1162 // just be confusing to users, and this function is called rarely enough (and
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after
1759 } 1802 }
1760 1803
1761 bool CookieMonster::SetCanonicalCookie(std::unique_ptr<CanonicalCookie> cc, 1804 bool CookieMonster::SetCanonicalCookie(std::unique_ptr<CanonicalCookie> cc,
1762 bool secure_source, 1805 bool secure_source,
1763 bool modify_http_only) { 1806 bool modify_http_only) {
1764 DCHECK(thread_checker_.CalledOnValidThread()); 1807 DCHECK(thread_checker_.CalledOnValidThread());
1765 1808
1766 if (cc->IsSecure() && !secure_source) 1809 if (cc->IsSecure() && !secure_source)
1767 return false; 1810 return false;
1768 1811
1769 Time creation_time = cc->CreationDate();
1770 const std::string key(GetKey(cc->Domain())); 1812 const std::string key(GetKey(cc->Domain()));
1771 bool already_expired = cc->IsExpired(creation_time); 1813
1814 // TODO(mmenke): This class assumes each cookie to have a unique creation
1815 // time. Allowing the caller to set the creation time violates that
1816 // assumption. Worth fixing? Worth noting that time changes between browser
1817 // restarts can cause the same issue.
1818 base::Time creation_date = cc->CreationDate();
1819 if (creation_date.is_null()) {
1820 creation_date = CurrentTime();
1821 cc->SetCreationDate(creation_date);
1822 last_time_seen_ = creation_date;
1823 }
1824 bool already_expired = cc->IsExpired(creation_date);
1772 1825
1773 if (DeleteAnyEquivalentCookie(key, *cc, secure_source, !modify_http_only, 1826 if (DeleteAnyEquivalentCookie(key, *cc, secure_source, !modify_http_only,
1774 already_expired)) { 1827 already_expired)) {
1775 std::string error; 1828 std::string error;
1776 error = 1829 error =
1777 "SetCookie() not clobbering httponly cookie or secure cookie for " 1830 "SetCookie() not clobbering httponly cookie or secure cookie for "
1778 "insecure scheme"; 1831 "insecure scheme";
1779 1832
1780 VLOG(kVlogSetCookies) << error; 1833 VLOG(kVlogSetCookies) << error;
1781 return false; 1834 return false;
1782 } 1835 }
1783 1836
1784 VLOG(kVlogSetCookies) << "SetCookie() key: " << key 1837 VLOG(kVlogSetCookies) << "SetCookie() key: " << key
1785 << " cc: " << cc->DebugString(); 1838 << " cc: " << cc->DebugString();
1786 1839
1787 // Realize that we might be setting an expired cookie, and the only point 1840 // Realize that we might be setting an expired cookie, and the only point
1788 // was to delete the cookie which we've already done. 1841 // was to delete the cookie which we've already done.
1789 if (!already_expired) { 1842 if (!already_expired) {
1790 // See InitializeHistograms() for details. 1843 // See InitializeHistograms() for details.
1791 if (cc->IsPersistent()) { 1844 if (cc->IsPersistent()) {
1792 histogram_expiration_duration_minutes_->Add( 1845 histogram_expiration_duration_minutes_->Add(
1793 (cc->ExpiryDate() - creation_time).InMinutes()); 1846 (cc->ExpiryDate() - creation_date).InMinutes());
1794 } 1847 }
1795 1848
1796 // Histogram the type of scheme used on URLs that set cookies. This 1849 // Histogram the type of scheme used on URLs that set cookies. This
1797 // intentionally includes cookies that are set or overwritten by 1850 // intentionally includes cookies that are set or overwritten by
1798 // http:// URLs, but not cookies that are cleared by http:// URLs, to 1851 // http:// URLs, but not cookies that are cleared by http:// URLs, to
1799 // understand if the former behavior can be deprecated for Secure 1852 // understand if the former behavior can be deprecated for Secure
1800 // cookies. 1853 // cookies.
1801 CookieSource cookie_source_sample = 1854 CookieSource cookie_source_sample =
1802 (secure_source 1855 (secure_source
1803 ? (cc->IsSecure() 1856 ? (cc->IsSecure()
1804 ? COOKIE_SOURCE_SECURE_COOKIE_CRYPTOGRAPHIC_SCHEME 1857 ? COOKIE_SOURCE_SECURE_COOKIE_CRYPTOGRAPHIC_SCHEME
1805 : COOKIE_SOURCE_NONSECURE_COOKIE_CRYPTOGRAPHIC_SCHEME) 1858 : COOKIE_SOURCE_NONSECURE_COOKIE_CRYPTOGRAPHIC_SCHEME)
1806 : (cc->IsSecure() 1859 : (cc->IsSecure()
1807 ? COOKIE_SOURCE_SECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME 1860 ? COOKIE_SOURCE_SECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME
1808 : COOKIE_SOURCE_NONSECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME)); 1861 : COOKIE_SOURCE_NONSECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME));
1809 histogram_cookie_source_scheme_->Add(cookie_source_sample); 1862 histogram_cookie_source_scheme_->Add(cookie_source_sample);
1810 1863
1811 InternalInsertCookie(key, std::move(cc), true); 1864 InternalInsertCookie(key, std::move(cc), true);
1812 } else { 1865 } else {
1813 VLOG(kVlogSetCookies) << "SetCookie() not storing already expired cookie."; 1866 VLOG(kVlogSetCookies) << "SetCookie() not storing already expired cookie.";
1814 } 1867 }
1815 1868
1816 // We assume that hopefully setting a cookie will be less common than 1869 // We assume that hopefully setting a cookie will be less common than
1817 // querying a cookie. Since setting a cookie can put us over our limits, 1870 // querying a cookie. Since setting a cookie can put us over our limits,
1818 // make sure that we garbage collect... We can also make the assumption that 1871 // make sure that we garbage collect... We can also make the assumption that
1819 // if a cookie was set, in the common case it will be used soon after, 1872 // if a cookie was set, in the common case it will be used soon after,
1820 // and we will purge the expired cookies in GetCookies(). 1873 // and we will purge the expired cookies in GetCookies().
1821 GarbageCollect(creation_time, key); 1874 GarbageCollect(creation_date, key);
mmenke 2017/06/16 15:56:28 So we just accept a creation date from the consume
Randy Smith (Not in Mondays) 2017/06/16 21:38:00 Good point, but I think it's currently existing be
1822 1875
1823 return true; 1876 return true;
1824 } 1877 }
1825 1878
1826 bool CookieMonster::SetAllCookies(const CookieList& list) { 1879 bool CookieMonster::SetAllCookies(const CookieList& list) {
1827 DCHECK(thread_checker_.CalledOnValidThread()); 1880 DCHECK(thread_checker_.CalledOnValidThread());
1828 for (const auto& cookie : list) { 1881 for (const auto& cookie : list) {
1829 const std::string key(GetKey(cookie.Domain())); 1882 const std::string key(GetKey(cookie.Domain()));
1830 Time creation_time = cookie.CreationDate(); 1883 Time creation_time = cookie.CreationDate();
1831 bool already_expired = cookie.IsExpired(creation_time); 1884 bool already_expired = cookie.IsExpired(creation_time);
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
2299 "Cookie.Count", 1, 4000, 50, base::Histogram::kUmaTargetedHistogramFlag); 2352 "Cookie.Count", 1, 4000, 50, base::Histogram::kUmaTargetedHistogramFlag);
2300 2353
2301 // From UMA_HISTOGRAM_ENUMERATION 2354 // From UMA_HISTOGRAM_ENUMERATION
2302 histogram_cookie_deletion_cause_ = base::LinearHistogram::FactoryGet( 2355 histogram_cookie_deletion_cause_ = base::LinearHistogram::FactoryGet(
2303 "Cookie.DeletionCause", 1, DELETE_COOKIE_LAST_ENTRY - 1, 2356 "Cookie.DeletionCause", 1, DELETE_COOKIE_LAST_ENTRY - 1,
2304 DELETE_COOKIE_LAST_ENTRY, base::Histogram::kUmaTargetedHistogramFlag); 2357 DELETE_COOKIE_LAST_ENTRY, base::Histogram::kUmaTargetedHistogramFlag);
2305 histogram_cookie_type_ = base::LinearHistogram::FactoryGet( 2358 histogram_cookie_type_ = base::LinearHistogram::FactoryGet(
2306 "Cookie.Type", 1, (1 << COOKIE_TYPE_LAST_ENTRY) - 1, 2359 "Cookie.Type", 1, (1 << COOKIE_TYPE_LAST_ENTRY) - 1,
2307 1 << COOKIE_TYPE_LAST_ENTRY, base::Histogram::kUmaTargetedHistogramFlag); 2360 1 << COOKIE_TYPE_LAST_ENTRY, base::Histogram::kUmaTargetedHistogramFlag);
2308 histogram_cookie_source_scheme_ = base::LinearHistogram::FactoryGet( 2361 histogram_cookie_source_scheme_ = base::LinearHistogram::FactoryGet(
2309 "Cookie.CookieSourceScheme", 1, COOKIE_SOURCE_LAST_ENTRY - 1, 2362 "Cookie.CookieSourceScheme", 1, COOKIE_SOURCE_LAST_ENTRY - 1,
mmenke 2017/06/16 15:56:28 Isn't this the histogram you renamed in the XML fi
Randy Smith (Not in Mondays) 2017/06/16 21:38:00 Whoops. Removed renaming from the xml file.
2310 COOKIE_SOURCE_LAST_ENTRY, base::Histogram::kUmaTargetedHistogramFlag); 2363 COOKIE_SOURCE_LAST_ENTRY, base::Histogram::kUmaTargetedHistogramFlag);
2311 histogram_cookie_delete_equivalent_ = base::LinearHistogram::FactoryGet( 2364 histogram_cookie_delete_equivalent_ = base::LinearHistogram::FactoryGet(
2312 "Cookie.CookieDeleteEquivalent", 1, 2365 "Cookie.CookieDeleteEquivalent", 1,
2313 COOKIE_DELETE_EQUIVALENT_LAST_ENTRY - 1, 2366 COOKIE_DELETE_EQUIVALENT_LAST_ENTRY - 1,
2314 COOKIE_DELETE_EQUIVALENT_LAST_ENTRY, 2367 COOKIE_DELETE_EQUIVALENT_LAST_ENTRY,
2315 base::Histogram::kUmaTargetedHistogramFlag); 2368 base::Histogram::kUmaTargetedHistogramFlag);
2316 2369
2317 // From UMA_HISTOGRAM_{CUSTOM_,}TIMES 2370 // From UMA_HISTOGRAM_{CUSTOM_,}TIMES
2318 histogram_time_blocked_on_load_ = base::Histogram::FactoryTimeGet( 2371 histogram_time_blocked_on_load_ = base::Histogram::FactoryTimeGet(
2319 "Cookie.TimeBlockedOnLoad", base::TimeDelta::FromMilliseconds(1), 2372 "Cookie.TimeBlockedOnLoad", base::TimeDelta::FromMilliseconds(1),
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
2443 it != hook_map_.end(); ++it) { 2496 it != hook_map_.end(); ++it) {
2444 std::pair<GURL, std::string> key = it->first; 2497 std::pair<GURL, std::string> key = it->first;
2445 if (cookie.IncludeForRequestURL(key.first, opts) && 2498 if (cookie.IncludeForRequestURL(key.first, opts) &&
2446 cookie.Name() == key.second) { 2499 cookie.Name() == key.second) {
2447 it->second->Notify(cookie, cause); 2500 it->second->Notify(cookie, cause);
2448 } 2501 }
2449 } 2502 }
2450 } 2503 }
2451 2504
2452 } // namespace net 2505 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698