OLD | NEW |
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 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 delegate_(delegate), | 345 delegate_(delegate), |
346 last_statistic_record_time_(base::Time::Now()), | 346 last_statistic_record_time_(base::Time::Now()), |
347 persist_session_cookies_(false), | 347 persist_session_cookies_(false), |
348 weak_ptr_factory_(this) { | 348 weak_ptr_factory_(this) { |
349 InitializeHistograms(); | 349 InitializeHistograms(); |
350 cookieable_schemes_.insert( | 350 cookieable_schemes_.insert( |
351 cookieable_schemes_.begin(), kDefaultCookieableSchemes, | 351 cookieable_schemes_.begin(), kDefaultCookieableSchemes, |
352 kDefaultCookieableSchemes + kDefaultCookieableSchemesCount); | 352 kDefaultCookieableSchemes + kDefaultCookieableSchemesCount); |
353 } | 353 } |
354 | 354 |
| 355 CookieMonster::~CookieMonster() { |
| 356 DCHECK(thread_checker_.CalledOnValidThread()); |
| 357 |
| 358 // TODO(mmenke): Does it really make sense to run |delegate_| and |
| 359 // CookieChanged callbacks when the CookieStore is destroyed? |
| 360 for (CookieMap::iterator cookie_it = cookies_.begin(); |
| 361 cookie_it != cookies_.end();) { |
| 362 CookieMap::iterator current_cookie_it = cookie_it; |
| 363 ++cookie_it; |
| 364 InternalDeleteCookie(current_cookie_it, false /* sync_to_store */, |
| 365 DELETE_COOKIE_DONT_RECORD); |
| 366 } |
| 367 } |
| 368 |
355 // Task classes for queueing the coming request. | 369 // Task classes for queueing the coming request. |
356 | 370 |
357 class CookieMonster::CookieMonsterTask | 371 class CookieMonster::CookieMonsterTask |
358 : public base::RefCountedThreadSafe<CookieMonsterTask> { | 372 : public base::RefCountedThreadSafe<CookieMonsterTask> { |
359 public: | 373 public: |
360 // Runs the task and invokes the client callback on the thread that | 374 // Runs the task and invokes the client callback on the thread that |
361 // originally constructed the task. | 375 // originally constructed the task. |
362 virtual void Run() = 0; | 376 virtual void Run() = 0; |
363 | 377 |
364 protected: | 378 protected: |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
846 const SetCookiesCallback& callback) { | 860 const SetCookiesCallback& callback) { |
847 scoped_refptr<SetCookieWithDetailsTask> task = new SetCookieWithDetailsTask( | 861 scoped_refptr<SetCookieWithDetailsTask> task = new SetCookieWithDetailsTask( |
848 this, url, name, value, domain, path, creation_time, expiration_time, | 862 this, url, name, value, domain, path, creation_time, expiration_time, |
849 last_access_time, secure, http_only, same_site, enforce_strict_secure, | 863 last_access_time, secure, http_only, same_site, enforce_strict_secure, |
850 priority, callback); | 864 priority, callback); |
851 DoCookieTaskForURL(task, url); | 865 DoCookieTaskForURL(task, url); |
852 } | 866 } |
853 | 867 |
854 void CookieMonster::FlushStore(const base::Closure& callback) { | 868 void CookieMonster::FlushStore(const base::Closure& callback) { |
855 DCHECK(thread_checker_.CalledOnValidThread()); | 869 DCHECK(thread_checker_.CalledOnValidThread()); |
| 870 |
856 if (initialized_ && store_.get()) | 871 if (initialized_ && store_.get()) |
857 store_->Flush(callback); | 872 store_->Flush(callback); |
858 else if (!callback.is_null()) | 873 else if (!callback.is_null()) |
859 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 874 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); |
860 } | 875 } |
861 | 876 |
862 void CookieMonster::SetForceKeepSessionState() { | 877 void CookieMonster::SetForceKeepSessionState() { |
863 DCHECK(thread_checker_.CalledOnValidThread()); | 878 DCHECK(thread_checker_.CalledOnValidThread()); |
| 879 |
864 if (store_) | 880 if (store_) |
865 store_->SetForceKeepSessionState(); | 881 store_->SetForceKeepSessionState(); |
866 } | 882 } |
867 | 883 |
868 void CookieMonster::SetAllCookiesAsync(const CookieList& list, | 884 void CookieMonster::SetAllCookiesAsync(const CookieList& list, |
869 const SetCookiesCallback& callback) { | 885 const SetCookiesCallback& callback) { |
870 scoped_refptr<SetAllCookiesTask> task = | 886 scoped_refptr<SetAllCookiesTask> task = |
871 new SetAllCookiesTask(this, list, callback); | 887 new SetAllCookiesTask(this, list, callback); |
872 DoCookieTask(task); | 888 DoCookieTask(task); |
873 } | 889 } |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
985 const char* const CookieMonster::kDefaultCookieableSchemes[] = {"http", "https", | 1001 const char* const CookieMonster::kDefaultCookieableSchemes[] = {"http", "https", |
986 "ws", "wss"}; | 1002 "ws", "wss"}; |
987 const int CookieMonster::kDefaultCookieableSchemesCount = | 1003 const int CookieMonster::kDefaultCookieableSchemesCount = |
988 arraysize(kDefaultCookieableSchemes); | 1004 arraysize(kDefaultCookieableSchemes); |
989 | 1005 |
990 scoped_ptr<CookieStore::CookieChangedSubscription> | 1006 scoped_ptr<CookieStore::CookieChangedSubscription> |
991 CookieMonster::AddCallbackForCookie(const GURL& gurl, | 1007 CookieMonster::AddCallbackForCookie(const GURL& gurl, |
992 const std::string& name, | 1008 const std::string& name, |
993 const CookieChangedCallback& callback) { | 1009 const CookieChangedCallback& callback) { |
994 DCHECK(thread_checker_.CalledOnValidThread()); | 1010 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1011 |
995 std::pair<GURL, std::string> key(gurl, name); | 1012 std::pair<GURL, std::string> key(gurl, name); |
996 if (hook_map_.count(key) == 0) | 1013 if (hook_map_.count(key) == 0) |
997 hook_map_[key] = make_linked_ptr(new CookieChangedCallbackList()); | 1014 hook_map_[key] = make_linked_ptr(new CookieChangedCallbackList()); |
998 return hook_map_[key]->Add( | 1015 return hook_map_[key]->Add( |
999 base::Bind(&RunAsync, base::ThreadTaskRunnerHandle::Get(), callback)); | 1016 base::Bind(&RunAsync, base::ThreadTaskRunnerHandle::Get(), callback)); |
1000 } | 1017 } |
1001 | 1018 |
1002 CookieMonster::~CookieMonster() { | |
1003 DCHECK(thread_checker_.CalledOnValidThread()); | |
1004 | |
1005 for (CookieMap::iterator cookie_it = cookies_.begin(); | |
1006 cookie_it != cookies_.end();) { | |
1007 CookieMap::iterator current_cookie_it = cookie_it; | |
1008 ++cookie_it; | |
1009 InternalDeleteCookie(current_cookie_it, false /* sync_to_store */, | |
1010 DELETE_COOKIE_DONT_RECORD); | |
1011 } | |
1012 } | |
1013 | |
1014 bool CookieMonster::SetCookieWithDetails(const GURL& url, | 1019 bool CookieMonster::SetCookieWithDetails(const GURL& url, |
1015 const std::string& name, | 1020 const std::string& name, |
1016 const std::string& value, | 1021 const std::string& value, |
1017 const std::string& domain, | 1022 const std::string& domain, |
1018 const std::string& path, | 1023 const std::string& path, |
1019 base::Time creation_time, | 1024 base::Time creation_time, |
1020 base::Time expiration_time, | 1025 base::Time expiration_time, |
1021 base::Time last_access_time, | 1026 base::Time last_access_time, |
1022 bool secure, | 1027 bool secure, |
1023 bool http_only, | 1028 bool http_only, |
(...skipping 1374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2398 void CookieMonster::RunCookieChangedCallbacks(const CanonicalCookie& cookie, | 2403 void CookieMonster::RunCookieChangedCallbacks(const CanonicalCookie& cookie, |
2399 bool removed) { | 2404 bool removed) { |
2400 DCHECK(thread_checker_.CalledOnValidThread()); | 2405 DCHECK(thread_checker_.CalledOnValidThread()); |
2401 | 2406 |
2402 CookieOptions opts; | 2407 CookieOptions opts; |
2403 opts.set_include_httponly(); | 2408 opts.set_include_httponly(); |
2404 opts.set_include_same_site(); | 2409 opts.set_include_same_site(); |
2405 // Note that the callbacks in hook_map_ are wrapped with RunAsync(), so they | 2410 // Note that the callbacks in hook_map_ are wrapped with RunAsync(), so they |
2406 // are guaranteed to not take long - they just post a RunAsync task back to | 2411 // are guaranteed to not take long - they just post a RunAsync task back to |
2407 // the appropriate thread's message loop and return. | 2412 // the appropriate thread's message loop and return. |
2408 // TODO(mmenke): Consider running these synchronously? | 2413 // TODO(mmenke): Consider running these synchronously, and/or cancelling them |
| 2414 // when the CookieMonster is destroyed? |
2409 for (CookieChangedHookMap::iterator it = hook_map_.begin(); | 2415 for (CookieChangedHookMap::iterator it = hook_map_.begin(); |
2410 it != hook_map_.end(); ++it) { | 2416 it != hook_map_.end(); ++it) { |
2411 std::pair<GURL, std::string> key = it->first; | 2417 std::pair<GURL, std::string> key = it->first; |
2412 if (cookie.IncludeForRequestURL(key.first, opts) && | 2418 if (cookie.IncludeForRequestURL(key.first, opts) && |
2413 cookie.Name() == key.second) { | 2419 cookie.Name() == key.second) { |
2414 it->second->Notify(cookie, removed); | 2420 it->second->Notify(cookie, removed); |
2415 } | 2421 } |
2416 } | 2422 } |
2417 } | 2423 } |
2418 | 2424 |
2419 } // namespace net | 2425 } // namespace net |
OLD | NEW |