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

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

Issue 876973003: Implement the "first-party-only" cookie flag. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: FirstPartyOnly. Created 5 years, 10 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 | « net/cookies/cookie_monster.h ('k') | net/cookies/cookie_monster_store_test.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 // 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 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 public: 407 public:
408 SetCookieWithDetailsTask(CookieMonster* cookie_monster, 408 SetCookieWithDetailsTask(CookieMonster* cookie_monster,
409 const GURL& url, 409 const GURL& url,
410 const std::string& name, 410 const std::string& name,
411 const std::string& value, 411 const std::string& value,
412 const std::string& domain, 412 const std::string& domain,
413 const std::string& path, 413 const std::string& path,
414 const base::Time& expiration_time, 414 const base::Time& expiration_time,
415 bool secure, 415 bool secure,
416 bool http_only, 416 bool http_only,
417 bool first_party_only,
417 CookiePriority priority, 418 CookiePriority priority,
418 const SetCookiesCallback& callback) 419 const SetCookiesCallback& callback)
419 : CookieMonsterTask(cookie_monster), 420 : CookieMonsterTask(cookie_monster),
420 url_(url), 421 url_(url),
421 name_(name), 422 name_(name),
422 value_(value), 423 value_(value),
423 domain_(domain), 424 domain_(domain),
424 path_(path), 425 path_(path),
425 expiration_time_(expiration_time), 426 expiration_time_(expiration_time),
426 secure_(secure), 427 secure_(secure),
427 http_only_(http_only), 428 http_only_(http_only),
429 first_party_only_(first_party_only),
428 priority_(priority), 430 priority_(priority),
429 callback_(callback) {} 431 callback_(callback) {}
430 432
431 // CookieMonsterTask: 433 // CookieMonsterTask:
432 void Run() override; 434 void Run() override;
433 435
434 protected: 436 protected:
435 ~SetCookieWithDetailsTask() override {} 437 ~SetCookieWithDetailsTask() override {}
436 438
437 private: 439 private:
438 GURL url_; 440 GURL url_;
439 std::string name_; 441 std::string name_;
440 std::string value_; 442 std::string value_;
441 std::string domain_; 443 std::string domain_;
442 std::string path_; 444 std::string path_;
443 base::Time expiration_time_; 445 base::Time expiration_time_;
444 bool secure_; 446 bool secure_;
445 bool http_only_; 447 bool http_only_;
448 bool first_party_only_;
446 CookiePriority priority_; 449 CookiePriority priority_;
447 SetCookiesCallback callback_; 450 SetCookiesCallback callback_;
448 451
449 DISALLOW_COPY_AND_ASSIGN(SetCookieWithDetailsTask); 452 DISALLOW_COPY_AND_ASSIGN(SetCookieWithDetailsTask);
450 }; 453 };
451 454
452 void CookieMonster::SetCookieWithDetailsTask::Run() { 455 void CookieMonster::SetCookieWithDetailsTask::Run() {
453 bool success = this->cookie_monster()->SetCookieWithDetails( 456 bool success = this->cookie_monster()->SetCookieWithDetails(
454 url_, name_, value_, domain_, path_, expiration_time_, secure_, 457 url_, name_, value_, domain_, path_, expiration_time_, secure_,
455 http_only_, priority_); 458 http_only_, first_party_only_, priority_);
456 if (!callback_.is_null()) { 459 if (!callback_.is_null()) {
457 this->InvokeCallback(base::Bind(&SetCookiesCallback::Run, 460 this->InvokeCallback(base::Bind(&SetCookiesCallback::Run,
458 base::Unretained(&callback_), success)); 461 base::Unretained(&callback_), success));
459 } 462 }
460 } 463 }
461 464
462 // Task class for GetAllCookies call. 465 // Task class for GetAllCookies call.
463 class CookieMonster::GetAllCookiesTask : public CookieMonsterTask { 466 class CookieMonster::GetAllCookiesTask : public CookieMonsterTask {
464 public: 467 public:
465 GetAllCookiesTask(CookieMonster* cookie_monster, 468 GetAllCookiesTask(CookieMonster* cookie_monster,
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
877 880
878 void CookieMonster::SetCookieWithDetailsAsync( 881 void CookieMonster::SetCookieWithDetailsAsync(
879 const GURL& url, 882 const GURL& url,
880 const std::string& name, 883 const std::string& name,
881 const std::string& value, 884 const std::string& value,
882 const std::string& domain, 885 const std::string& domain,
883 const std::string& path, 886 const std::string& path,
884 const Time& expiration_time, 887 const Time& expiration_time,
885 bool secure, 888 bool secure,
886 bool http_only, 889 bool http_only,
890 bool first_party_only,
887 CookiePriority priority, 891 CookiePriority priority,
888 const SetCookiesCallback& callback) { 892 const SetCookiesCallback& callback) {
889 scoped_refptr<SetCookieWithDetailsTask> task = new SetCookieWithDetailsTask( 893 scoped_refptr<SetCookieWithDetailsTask> task = new SetCookieWithDetailsTask(
890 this, url, name, value, domain, path, expiration_time, secure, http_only, 894 this, url, name, value, domain, path, expiration_time, secure, http_only,
891 priority, callback); 895 first_party_only, priority, callback);
892 DoCookieTaskForURL(task, url); 896 DoCookieTaskForURL(task, url);
893 } 897 }
894 898
895 void CookieMonster::GetAllCookiesAsync(const GetCookieListCallback& callback) { 899 void CookieMonster::GetAllCookiesAsync(const GetCookieListCallback& callback) {
896 scoped_refptr<GetAllCookiesTask> task = new GetAllCookiesTask(this, callback); 900 scoped_refptr<GetAllCookiesTask> task = new GetAllCookiesTask(this, callback);
897 901
898 DoCookieTask(task); 902 DoCookieTask(task);
899 } 903 }
900 904
901 void CookieMonster::GetAllCookiesForURLWithOptionsAsync( 905 void CookieMonster::GetAllCookiesForURLWithOptionsAsync(
902 const GURL& url, 906 const GURL& url,
903 const CookieOptions& options, 907 const CookieOptions& options,
904 const GetCookieListCallback& callback) { 908 const GetCookieListCallback& callback) {
905 scoped_refptr<GetAllCookiesForURLWithOptionsTask> task = 909 scoped_refptr<GetAllCookiesForURLWithOptionsTask> task =
906 new GetAllCookiesForURLWithOptionsTask(this, url, options, callback); 910 new GetAllCookiesForURLWithOptionsTask(this, url, options, callback);
907 911
908 DoCookieTaskForURL(task, url); 912 DoCookieTaskForURL(task, url);
909 } 913 }
910 914
911 void CookieMonster::GetAllCookiesForURLAsync( 915 void CookieMonster::GetAllCookiesForURLAsync(
912 const GURL& url, 916 const GURL& url,
913 const GetCookieListCallback& callback) { 917 const GetCookieListCallback& callback) {
914 CookieOptions options; 918 CookieOptions options;
915 options.set_include_httponly(); 919 options.set_include_httponly();
920 options.set_include_first_party_only();
916 scoped_refptr<GetAllCookiesForURLWithOptionsTask> task = 921 scoped_refptr<GetAllCookiesForURLWithOptionsTask> task =
917 new GetAllCookiesForURLWithOptionsTask(this, url, options, callback); 922 new GetAllCookiesForURLWithOptionsTask(this, url, options, callback);
918 923
919 DoCookieTaskForURL(task, url); 924 DoCookieTaskForURL(task, url);
920 } 925 }
921 926
922 void CookieMonster::HasCookiesForETLDP1Async( 927 void CookieMonster::HasCookiesForETLDP1Async(
923 const std::string& etldp1, 928 const std::string& etldp1,
924 const HasCookiesForETLDP1Callback& callback) { 929 const HasCookiesForETLDP1Callback& callback) {
925 scoped_refptr<HasCookiesForETLDP1Task> task = 930 scoped_refptr<HasCookiesForETLDP1Task> task =
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 } 1063 }
1059 1064
1060 bool CookieMonster::SetCookieWithDetails(const GURL& url, 1065 bool CookieMonster::SetCookieWithDetails(const GURL& url,
1061 const std::string& name, 1066 const std::string& name,
1062 const std::string& value, 1067 const std::string& value,
1063 const std::string& domain, 1068 const std::string& domain,
1064 const std::string& path, 1069 const std::string& path,
1065 const base::Time& expiration_time, 1070 const base::Time& expiration_time,
1066 bool secure, 1071 bool secure,
1067 bool http_only, 1072 bool http_only,
1073 bool first_party_only,
1068 CookiePriority priority) { 1074 CookiePriority priority) {
1069 base::AutoLock autolock(lock_); 1075 base::AutoLock autolock(lock_);
1070 1076
1071 if (!HasCookieableScheme(url)) 1077 if (!HasCookieableScheme(url))
1072 return false; 1078 return false;
1073 1079
1074 Time creation_time = CurrentTime(); 1080 Time creation_time = CurrentTime();
1075 last_time_seen_ = creation_time; 1081 last_time_seen_ = creation_time;
1076 1082
1077 scoped_ptr<CanonicalCookie> cc; 1083 scoped_ptr<CanonicalCookie> cc;
1078 cc.reset(CanonicalCookie::Create(url, name, value, domain, path, 1084 cc.reset(CanonicalCookie::Create(url, name, value, domain, path,
1079 creation_time, expiration_time, secure, 1085 creation_time, expiration_time, secure,
1080 http_only, priority)); 1086 http_only, first_party_only, priority));
1081 1087
1082 if (!cc.get()) 1088 if (!cc.get())
1083 return false; 1089 return false;
1084 1090
1085 CookieOptions options; 1091 CookieOptions options;
1086 options.set_include_httponly(); 1092 options.set_include_httponly();
1093 options.set_include_first_party_only();
1087 return SetCanonicalCookie(&cc, creation_time, options); 1094 return SetCanonicalCookie(&cc, creation_time, options);
1088 } 1095 }
1089 1096
1090 bool CookieMonster::ImportCookies(const CookieList& list) { 1097 bool CookieMonster::ImportCookies(const CookieList& list) {
1091 base::AutoLock autolock(lock_); 1098 base::AutoLock autolock(lock_);
1092 InitIfNecessary(); 1099 InitIfNecessary();
1093 for (net::CookieList::const_iterator iter = list.begin(); iter != list.end(); 1100 for (net::CookieList::const_iterator iter = list.begin(); iter != list.end();
1094 ++iter) { 1101 ++iter) {
1095 scoped_ptr<CanonicalCookie> cookie(new CanonicalCookie(*iter)); 1102 scoped_ptr<CanonicalCookie> cookie(new CanonicalCookie(*iter));
1096 net::CookieOptions options; 1103 net::CookieOptions options;
1097 options.set_include_httponly(); 1104 options.set_include_httponly();
1105 options.set_include_first_party_only();
1098 if (!SetCanonicalCookie(&cookie, cookie->CreationDate(), options)) 1106 if (!SetCanonicalCookie(&cookie, cookie->CreationDate(), options))
1099 return false; 1107 return false;
1100 } 1108 }
1101 return true; 1109 return true;
1102 } 1110 }
1103 1111
1104 CookieList CookieMonster::GetAllCookies() { 1112 CookieList CookieMonster::GetAllCookies() {
1105 base::AutoLock autolock(lock_); 1113 base::AutoLock autolock(lock_);
1106 1114
1107 // This function is being called to scrape the cookie list for management UI 1115 // This function is being called to scrape the cookie list for management UI
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1146 for (std::vector<CanonicalCookie*>::const_iterator it = cookie_ptrs.begin(); 1154 for (std::vector<CanonicalCookie*>::const_iterator it = cookie_ptrs.begin();
1147 it != cookie_ptrs.end(); it++) 1155 it != cookie_ptrs.end(); it++)
1148 cookies.push_back(**it); 1156 cookies.push_back(**it);
1149 1157
1150 return cookies; 1158 return cookies;
1151 } 1159 }
1152 1160
1153 CookieList CookieMonster::GetAllCookiesForURL(const GURL& url) { 1161 CookieList CookieMonster::GetAllCookiesForURL(const GURL& url) {
1154 CookieOptions options; 1162 CookieOptions options;
1155 options.set_include_httponly(); 1163 options.set_include_httponly();
1164 options.set_first_party_url(url);
1156 1165
1157 return GetAllCookiesForURLWithOptions(url, options); 1166 return GetAllCookiesForURLWithOptions(url, options);
1158 } 1167 }
1159 1168
1160 int CookieMonster::DeleteAll(bool sync_to_store) { 1169 int CookieMonster::DeleteAll(bool sync_to_store) {
1161 base::AutoLock autolock(lock_); 1170 base::AutoLock autolock(lock_);
1162 1171
1163 int num_deleted = 0; 1172 int num_deleted = 0;
1164 for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { 1173 for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) {
1165 CookieMap::iterator curit = it; 1174 CookieMap::iterator curit = it;
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1312 1321
1313 void CookieMonster::DeleteCookie(const GURL& url, 1322 void CookieMonster::DeleteCookie(const GURL& url,
1314 const std::string& cookie_name) { 1323 const std::string& cookie_name) {
1315 base::AutoLock autolock(lock_); 1324 base::AutoLock autolock(lock_);
1316 1325
1317 if (!HasCookieableScheme(url)) 1326 if (!HasCookieableScheme(url))
1318 return; 1327 return;
1319 1328
1320 CookieOptions options; 1329 CookieOptions options;
1321 options.set_include_httponly(); 1330 options.set_include_httponly();
1331 options.set_include_first_party_only();
1322 // Get the cookies for this host and its domain(s). 1332 // Get the cookies for this host and its domain(s).
1323 std::vector<CanonicalCookie*> cookies; 1333 std::vector<CanonicalCookie*> cookies;
1324 FindCookiesForHostAndDomain(url, options, true, &cookies); 1334 FindCookiesForHostAndDomain(url, options, true, &cookies);
1325 std::set<CanonicalCookie*> matching_cookies; 1335 std::set<CanonicalCookie*> matching_cookies;
1326 1336
1327 for (std::vector<CanonicalCookie*>::const_iterator it = cookies.begin(); 1337 for (std::vector<CanonicalCookie*>::const_iterator it = cookies.begin();
1328 it != cookies.end(); ++it) { 1338 it != cookies.end(); ++it) {
1329 if ((*it)->Name() != cookie_name) 1339 if ((*it)->Name() != cookie_name)
1330 continue; 1340 continue;
1331 if (url.path().find((*it)->Path())) 1341 if (url.path().find((*it)->Path()))
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after
2288 if (hook_map_.count(key) == 0) 2298 if (hook_map_.count(key) == 0)
2289 hook_map_[key] = make_linked_ptr(new CookieChangedCallbackList()); 2299 hook_map_[key] = make_linked_ptr(new CookieChangedCallbackList());
2290 return hook_map_[key]->Add( 2300 return hook_map_[key]->Add(
2291 base::Bind(&RunAsync, base::MessageLoopProxy::current(), callback)); 2301 base::Bind(&RunAsync, base::MessageLoopProxy::current(), callback));
2292 } 2302 }
2293 2303
2294 void CookieMonster::RunCallbacks(const CanonicalCookie& cookie, bool removed) { 2304 void CookieMonster::RunCallbacks(const CanonicalCookie& cookie, bool removed) {
2295 lock_.AssertAcquired(); 2305 lock_.AssertAcquired();
2296 CookieOptions opts; 2306 CookieOptions opts;
2297 opts.set_include_httponly(); 2307 opts.set_include_httponly();
2308 opts.set_include_first_party_only();
2298 // Note that the callbacks in hook_map_ are wrapped with MakeAsync(), so they 2309 // Note that the callbacks in hook_map_ are wrapped with MakeAsync(), so they
2299 // are guaranteed to not take long - they just post a RunAsync task back to 2310 // are guaranteed to not take long - they just post a RunAsync task back to
2300 // the appropriate thread's message loop and return. It is important that this 2311 // the appropriate thread's message loop and return. It is important that this
2301 // method not run user-supplied callbacks directly, since the CookieMonster 2312 // method not run user-supplied callbacks directly, since the CookieMonster
2302 // lock is held and it is easy to accidentally introduce deadlocks. 2313 // lock is held and it is easy to accidentally introduce deadlocks.
2303 for (CookieChangedHookMap::iterator it = hook_map_.begin(); 2314 for (CookieChangedHookMap::iterator it = hook_map_.begin();
2304 it != hook_map_.end(); ++it) { 2315 it != hook_map_.end(); ++it) {
2305 std::pair<GURL, std::string> key = it->first; 2316 std::pair<GURL, std::string> key = it->first;
2306 if (cookie.IncludeForRequestURL(key.first, opts) && 2317 if (cookie.IncludeForRequestURL(key.first, opts) &&
2307 cookie.Name() == key.second) { 2318 cookie.Name() == key.second) {
2308 it->second->Notify(cookie, removed); 2319 it->second->Notify(cookie, removed);
2309 } 2320 }
2310 } 2321 }
2311 } 2322 }
2312 2323
2313 } // namespace net 2324 } // namespace net
OLDNEW
« no previous file with comments | « net/cookies/cookie_monster.h ('k') | net/cookies/cookie_monster_store_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698