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 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
337 int last_access_threshold_milliseconds) | 337 int last_access_threshold_milliseconds) |
338 : initialized_(false), | 338 : initialized_(false), |
339 started_fetching_all_cookies_(false), | 339 started_fetching_all_cookies_(false), |
340 finished_fetching_all_cookies_(false), | 340 finished_fetching_all_cookies_(false), |
341 fetch_strategy_(kUnknownFetch), | 341 fetch_strategy_(kUnknownFetch), |
342 store_(store), | 342 store_(store), |
343 last_access_threshold_(base::TimeDelta::FromMilliseconds( | 343 last_access_threshold_(base::TimeDelta::FromMilliseconds( |
344 last_access_threshold_milliseconds)), | 344 last_access_threshold_milliseconds)), |
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 InitializeHistograms(); | 349 InitializeHistograms(); |
349 cookieable_schemes_.insert( | 350 cookieable_schemes_.insert( |
350 cookieable_schemes_.begin(), kDefaultCookieableSchemes, | 351 cookieable_schemes_.begin(), kDefaultCookieableSchemes, |
351 kDefaultCookieableSchemes + kDefaultCookieableSchemesCount); | 352 kDefaultCookieableSchemes + kDefaultCookieableSchemesCount); |
352 } | 353 } |
353 | 354 |
354 // Task classes for queueing the coming request. | 355 // Task classes for queueing the coming request. |
355 | 356 |
356 class CookieMonster::CookieMonsterTask | 357 class CookieMonster::CookieMonsterTask |
357 : public base::RefCountedThreadSafe<CookieMonsterTask> { | 358 : public base::RefCountedThreadSafe<CookieMonsterTask> { |
358 public: | 359 public: |
359 // Runs the task and invokes the client callback on the thread that | 360 // Runs the task and invokes the client callback on the thread that |
360 // originally constructed the task. | 361 // originally constructed the task. |
361 virtual void Run() = 0; | 362 virtual void Run() = 0; |
362 | 363 |
363 protected: | 364 protected: |
364 explicit CookieMonsterTask(CookieMonster* cookie_monster); | 365 explicit CookieMonsterTask(CookieMonster* cookie_monster); |
365 virtual ~CookieMonsterTask(); | 366 virtual ~CookieMonsterTask(); |
366 | 367 |
367 // Invokes the callback immediately, if the current thread is the one | |
368 // that originated the task, or queues the callback for execution on the | |
369 // appropriate thread. Maintains a reference to this CookieMonsterTask | |
370 // instance until the callback completes. | |
371 void InvokeCallback(base::Closure callback); | |
372 | |
373 CookieMonster* cookie_monster() { return cookie_monster_; } | 368 CookieMonster* cookie_monster() { return cookie_monster_; } |
374 | 369 |
375 private: | 370 private: |
376 friend class base::RefCountedThreadSafe<CookieMonsterTask>; | 371 friend class base::RefCountedThreadSafe<CookieMonsterTask>; |
377 | 372 |
378 CookieMonster* cookie_monster_; | 373 CookieMonster* cookie_monster_; |
379 scoped_refptr<base::SingleThreadTaskRunner> thread_; | |
380 | 374 |
381 DISALLOW_COPY_AND_ASSIGN(CookieMonsterTask); | 375 DISALLOW_COPY_AND_ASSIGN(CookieMonsterTask); |
382 }; | 376 }; |
383 | 377 |
384 CookieMonster::CookieMonsterTask::CookieMonsterTask( | 378 CookieMonster::CookieMonsterTask::CookieMonsterTask( |
385 CookieMonster* cookie_monster) | 379 CookieMonster* cookie_monster) |
386 : cookie_monster_(cookie_monster), | 380 : cookie_monster_(cookie_monster) {} |
387 thread_(base::ThreadTaskRunnerHandle::Get()) { | |
388 } | |
389 | 381 |
390 CookieMonster::CookieMonsterTask::~CookieMonsterTask() { | 382 CookieMonster::CookieMonsterTask::~CookieMonsterTask() { |
391 } | 383 } |
392 | 384 |
393 // Unfortunately, one cannot re-bind a Callback with parameters into a closure. | |
394 // Therefore, the closure passed to InvokeCallback is a clumsy binding of | |
395 // Callback::Run on a wrapped Callback instance. Since Callback is not | |
396 // reference counted, we bind to an instance that is a member of the | |
397 // CookieMonsterTask subclass. Then, we cannot simply post the callback to a | |
398 // message loop because the underlying instance may be destroyed (along with the | |
399 // CookieMonsterTask instance) in the interim. Therefore, we post a callback | |
400 // bound to the CookieMonsterTask, which *is* reference counted (thus preventing | |
401 // destruction of the original callback), and which invokes the closure (which | |
402 // invokes the original callback with the returned data). | |
403 void CookieMonster::CookieMonsterTask::InvokeCallback(base::Closure callback) { | |
404 if (thread_->BelongsToCurrentThread()) { | |
405 callback.Run(); | |
406 } else { | |
407 thread_->PostTask(FROM_HERE, base::Bind(&CookieMonsterTask::InvokeCallback, | |
408 this, callback)); | |
409 } | |
410 } | |
411 | |
412 // Task class for SetCookieWithDetails call. | 385 // Task class for SetCookieWithDetails call. |
413 class CookieMonster::SetCookieWithDetailsTask : public CookieMonsterTask { | 386 class CookieMonster::SetCookieWithDetailsTask : public CookieMonsterTask { |
414 public: | 387 public: |
415 SetCookieWithDetailsTask(CookieMonster* cookie_monster, | 388 SetCookieWithDetailsTask(CookieMonster* cookie_monster, |
416 const GURL& url, | 389 const GURL& url, |
417 const std::string& name, | 390 const std::string& name, |
418 const std::string& value, | 391 const std::string& value, |
419 const std::string& domain, | 392 const std::string& domain, |
420 const std::string& path, | 393 const std::string& path, |
421 base::Time creation_time, | 394 base::Time creation_time, |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
466 SetCookiesCallback callback_; | 439 SetCookiesCallback callback_; |
467 | 440 |
468 DISALLOW_COPY_AND_ASSIGN(SetCookieWithDetailsTask); | 441 DISALLOW_COPY_AND_ASSIGN(SetCookieWithDetailsTask); |
469 }; | 442 }; |
470 | 443 |
471 void CookieMonster::SetCookieWithDetailsTask::Run() { | 444 void CookieMonster::SetCookieWithDetailsTask::Run() { |
472 bool success = this->cookie_monster()->SetCookieWithDetails( | 445 bool success = this->cookie_monster()->SetCookieWithDetails( |
473 url_, name_, value_, domain_, path_, creation_time_, expiration_time_, | 446 url_, name_, value_, domain_, path_, creation_time_, expiration_time_, |
474 last_access_time_, secure_, http_only_, same_site_, | 447 last_access_time_, secure_, http_only_, same_site_, |
475 enforce_strict_secure_, priority_); | 448 enforce_strict_secure_, priority_); |
476 if (!callback_.is_null()) { | 449 if (!callback_.is_null()) |
477 this->InvokeCallback(base::Bind(&SetCookiesCallback::Run, | 450 callback_.Run(success); |
478 base::Unretained(&callback_), success)); | |
479 } | |
480 } | 451 } |
481 | 452 |
482 // Task class for GetAllCookies call. | 453 // Task class for GetAllCookies call. |
483 class CookieMonster::GetAllCookiesTask : public CookieMonsterTask { | 454 class CookieMonster::GetAllCookiesTask : public CookieMonsterTask { |
484 public: | 455 public: |
485 GetAllCookiesTask(CookieMonster* cookie_monster, | 456 GetAllCookiesTask(CookieMonster* cookie_monster, |
486 const GetCookieListCallback& callback) | 457 const GetCookieListCallback& callback) |
487 : CookieMonsterTask(cookie_monster), callback_(callback) {} | 458 : CookieMonsterTask(cookie_monster), callback_(callback) {} |
488 | 459 |
489 // CookieMonsterTask | 460 // CookieMonsterTask |
490 void Run() override; | 461 void Run() override; |
491 | 462 |
492 protected: | 463 protected: |
493 ~GetAllCookiesTask() override {} | 464 ~GetAllCookiesTask() override {} |
494 | 465 |
495 private: | 466 private: |
496 GetCookieListCallback callback_; | 467 GetCookieListCallback callback_; |
497 | 468 |
498 DISALLOW_COPY_AND_ASSIGN(GetAllCookiesTask); | 469 DISALLOW_COPY_AND_ASSIGN(GetAllCookiesTask); |
499 }; | 470 }; |
500 | 471 |
501 void CookieMonster::GetAllCookiesTask::Run() { | 472 void CookieMonster::GetAllCookiesTask::Run() { |
502 if (!callback_.is_null()) { | 473 if (!callback_.is_null()) { |
503 CookieList cookies = this->cookie_monster()->GetAllCookies(); | 474 CookieList cookies = this->cookie_monster()->GetAllCookies(); |
504 this->InvokeCallback(base::Bind(&GetCookieListCallback::Run, | 475 callback_.Run(cookies); |
505 base::Unretained(&callback_), cookies)); | |
506 } | 476 } |
507 } | 477 } |
508 | 478 |
509 // Task class for GetCookieListWithOptionsAsync call. | 479 // Task class for GetCookieListWithOptionsAsync call. |
510 class CookieMonster::GetCookieListWithOptionsTask : public CookieMonsterTask { | 480 class CookieMonster::GetCookieListWithOptionsTask : public CookieMonsterTask { |
511 public: | 481 public: |
512 GetCookieListWithOptionsTask(CookieMonster* cookie_monster, | 482 GetCookieListWithOptionsTask(CookieMonster* cookie_monster, |
513 const GURL& url, | 483 const GURL& url, |
514 const CookieOptions& options, | 484 const CookieOptions& options, |
515 const GetCookieListCallback& callback) | 485 const GetCookieListCallback& callback) |
(...skipping 13 matching lines...) Expand all Loading... | |
529 CookieOptions options_; | 499 CookieOptions options_; |
530 GetCookieListCallback callback_; | 500 GetCookieListCallback callback_; |
531 | 501 |
532 DISALLOW_COPY_AND_ASSIGN(GetCookieListWithOptionsTask); | 502 DISALLOW_COPY_AND_ASSIGN(GetCookieListWithOptionsTask); |
533 }; | 503 }; |
534 | 504 |
535 void CookieMonster::GetCookieListWithOptionsTask::Run() { | 505 void CookieMonster::GetCookieListWithOptionsTask::Run() { |
536 if (!callback_.is_null()) { | 506 if (!callback_.is_null()) { |
537 CookieList cookies = | 507 CookieList cookies = |
538 this->cookie_monster()->GetCookieListWithOptions(url_, options_); | 508 this->cookie_monster()->GetCookieListWithOptions(url_, options_); |
539 this->InvokeCallback(base::Bind(&GetCookieListCallback::Run, | 509 callback_.Run(cookies); |
540 base::Unretained(&callback_), cookies)); | |
541 } | 510 } |
542 } | 511 } |
543 | 512 |
544 template <typename Result> | 513 template <typename Result> |
545 struct CallbackType { | 514 struct CallbackType { |
546 typedef base::Callback<void(Result)> Type; | 515 typedef base::Callback<void(Result)> Type; |
547 }; | 516 }; |
548 | 517 |
549 template <> | 518 template <> |
550 struct CallbackType<void> { | 519 struct CallbackType<void> { |
(...skipping 10 matching lines...) Expand all Loading... | |
561 | 530 |
562 // CookieMonsterTask: | 531 // CookieMonsterTask: |
563 void Run() override; | 532 void Run() override; |
564 | 533 |
565 protected: | 534 protected: |
566 ~DeleteTask() override; | 535 ~DeleteTask() override; |
567 | 536 |
568 private: | 537 private: |
569 // Runs the delete task and returns a result. | 538 // Runs the delete task and returns a result. |
570 virtual Result RunDeleteTask() = 0; | 539 virtual Result RunDeleteTask() = 0; |
540 // Runs the delete task and then returns a callback to be called after | |
541 // flushing the persistent store. | |
542 // TODO(mmenke): This seems like a pretty ugly and needlessly confusing API. | |
543 // Simplify it? | |
571 base::Closure RunDeleteTaskAndBindCallback(); | 544 base::Closure RunDeleteTaskAndBindCallback(); |
Mike West
2016/03/01 13:59:28
I'd suggest doing so, but in a separate CL. No nee
| |
572 void FlushDone(const base::Closure& callback); | |
573 | 545 |
574 typename CallbackType<Result>::Type callback_; | 546 typename CallbackType<Result>::Type callback_; |
575 | 547 |
576 DISALLOW_COPY_AND_ASSIGN(DeleteTask); | 548 DISALLOW_COPY_AND_ASSIGN(DeleteTask); |
577 }; | 549 }; |
578 | 550 |
579 template <typename Result> | 551 template <typename Result> |
580 CookieMonster::DeleteTask<Result>::~DeleteTask() { | 552 CookieMonster::DeleteTask<Result>::~DeleteTask() { |
581 } | 553 } |
582 | 554 |
583 template <typename Result> | 555 template <typename Result> |
584 base::Closure | 556 base::Closure |
585 CookieMonster::DeleteTask<Result>::RunDeleteTaskAndBindCallback() { | 557 CookieMonster::DeleteTask<Result>::RunDeleteTaskAndBindCallback() { |
586 Result result = RunDeleteTask(); | 558 Result result = RunDeleteTask(); |
587 if (callback_.is_null()) | 559 if (callback_.is_null()) |
588 return base::Closure(); | 560 return base::Closure(); |
589 return base::Bind(callback_, result); | 561 return base::Bind(callback_, result); |
590 } | 562 } |
591 | 563 |
592 template <> | 564 template <> |
593 base::Closure CookieMonster::DeleteTask<void>::RunDeleteTaskAndBindCallback() { | 565 base::Closure CookieMonster::DeleteTask<void>::RunDeleteTaskAndBindCallback() { |
594 RunDeleteTask(); | 566 RunDeleteTask(); |
595 return callback_; | 567 return callback_; |
596 } | 568 } |
597 | 569 |
598 template <typename Result> | 570 template <typename Result> |
599 void CookieMonster::DeleteTask<Result>::Run() { | 571 void CookieMonster::DeleteTask<Result>::Run() { |
600 this->cookie_monster()->FlushStore(base::Bind( | 572 base::Closure callback = RunDeleteTaskAndBindCallback(); |
601 &DeleteTask<Result>::FlushDone, this, RunDeleteTaskAndBindCallback())); | |
602 } | |
603 | |
604 template <typename Result> | |
605 void CookieMonster::DeleteTask<Result>::FlushDone( | |
606 const base::Closure& callback) { | |
607 if (!callback.is_null()) { | 573 if (!callback.is_null()) { |
608 this->InvokeCallback(callback); | 574 callback = base::Bind( |
575 &CookieMonster::RunCallback, | |
576 this->cookie_monster()->weak_ptr_factory_.GetWeakPtr(), callback); | |
609 } | 577 } |
578 this->cookie_monster()->FlushStore(callback); | |
610 } | 579 } |
611 | 580 |
612 // Task class for DeleteAllCreatedBetween call. | 581 // Task class for DeleteAllCreatedBetween call. |
613 class CookieMonster::DeleteAllCreatedBetweenTask : public DeleteTask<int> { | 582 class CookieMonster::DeleteAllCreatedBetweenTask : public DeleteTask<int> { |
614 public: | 583 public: |
615 DeleteAllCreatedBetweenTask(CookieMonster* cookie_monster, | 584 DeleteAllCreatedBetweenTask(CookieMonster* cookie_monster, |
616 const Time& delete_begin, | 585 const Time& delete_begin, |
617 const Time& delete_end, | 586 const Time& delete_end, |
618 const DeleteCallback& callback) | 587 const DeleteCallback& callback) |
619 : DeleteTask<int>(cookie_monster, callback), | 588 : DeleteTask<int>(cookie_monster, callback), |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
720 std::string cookie_line_; | 689 std::string cookie_line_; |
721 CookieOptions options_; | 690 CookieOptions options_; |
722 SetCookiesCallback callback_; | 691 SetCookiesCallback callback_; |
723 | 692 |
724 DISALLOW_COPY_AND_ASSIGN(SetCookieWithOptionsTask); | 693 DISALLOW_COPY_AND_ASSIGN(SetCookieWithOptionsTask); |
725 }; | 694 }; |
726 | 695 |
727 void CookieMonster::SetCookieWithOptionsTask::Run() { | 696 void CookieMonster::SetCookieWithOptionsTask::Run() { |
728 bool result = this->cookie_monster()->SetCookieWithOptions(url_, cookie_line_, | 697 bool result = this->cookie_monster()->SetCookieWithOptions(url_, cookie_line_, |
729 options_); | 698 options_); |
730 if (!callback_.is_null()) { | 699 if (!callback_.is_null()) |
731 this->InvokeCallback(base::Bind(&SetCookiesCallback::Run, | 700 callback_.Run(result); |
732 base::Unretained(&callback_), result)); | |
733 } | |
734 } | 701 } |
735 | 702 |
736 // Task class for SetAllCookies call. | 703 // Task class for SetAllCookies call. |
737 class CookieMonster::SetAllCookiesTask : public CookieMonsterTask { | 704 class CookieMonster::SetAllCookiesTask : public CookieMonsterTask { |
738 public: | 705 public: |
739 SetAllCookiesTask(CookieMonster* cookie_monster, | 706 SetAllCookiesTask(CookieMonster* cookie_monster, |
740 const CookieList& list, | 707 const CookieList& list, |
741 const SetCookiesCallback& callback) | 708 const SetCookiesCallback& callback) |
742 : CookieMonsterTask(cookie_monster), list_(list), callback_(callback) {} | 709 : CookieMonsterTask(cookie_monster), list_(list), callback_(callback) {} |
743 | 710 |
(...skipping 19 matching lines...) Expand all Loading... | |
763 | 730 |
764 for (CookieList::const_iterator it = negative_diff.begin(); | 731 for (CookieList::const_iterator it = negative_diff.begin(); |
765 it != negative_diff.end(); ++it) { | 732 it != negative_diff.end(); ++it) { |
766 this->cookie_monster()->DeleteCanonicalCookie(*it); | 733 this->cookie_monster()->DeleteCanonicalCookie(*it); |
767 } | 734 } |
768 | 735 |
769 bool result = true; | 736 bool result = true; |
770 if (positive_diff.size() > 0) | 737 if (positive_diff.size() > 0) |
771 result = this->cookie_monster()->SetCanonicalCookies(list_); | 738 result = this->cookie_monster()->SetCanonicalCookies(list_); |
772 | 739 |
773 if (!callback_.is_null()) { | 740 if (!callback_.is_null()) |
774 this->InvokeCallback(base::Bind(&SetCookiesCallback::Run, | 741 callback_.Run(result); |
775 base::Unretained(&callback_), result)); | |
776 } | |
777 } | 742 } |
778 | 743 |
779 // Task class for GetCookiesWithOptions call. | 744 // Task class for GetCookiesWithOptions call. |
780 class CookieMonster::GetCookiesWithOptionsTask : public CookieMonsterTask { | 745 class CookieMonster::GetCookiesWithOptionsTask : public CookieMonsterTask { |
781 public: | 746 public: |
782 GetCookiesWithOptionsTask(CookieMonster* cookie_monster, | 747 GetCookiesWithOptionsTask(CookieMonster* cookie_monster, |
783 const GURL& url, | 748 const GURL& url, |
784 const CookieOptions& options, | 749 const CookieOptions& options, |
785 const GetCookiesCallback& callback) | 750 const GetCookiesCallback& callback) |
786 : CookieMonsterTask(cookie_monster), | 751 : CookieMonsterTask(cookie_monster), |
(...skipping 15 matching lines...) Expand all Loading... | |
802 DISALLOW_COPY_AND_ASSIGN(GetCookiesWithOptionsTask); | 767 DISALLOW_COPY_AND_ASSIGN(GetCookiesWithOptionsTask); |
803 }; | 768 }; |
804 | 769 |
805 void CookieMonster::GetCookiesWithOptionsTask::Run() { | 770 void CookieMonster::GetCookiesWithOptionsTask::Run() { |
806 // TODO(mkwst): Remove ScopedTracker below once crbug.com/456373 is fixed. | 771 // TODO(mkwst): Remove ScopedTracker below once crbug.com/456373 is fixed. |
807 tracked_objects::ScopedTracker tracking_profile( | 772 tracked_objects::ScopedTracker tracking_profile( |
808 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 773 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
809 "456373 CookieMonster::GetCookiesWithOptionsTask::Run")); | 774 "456373 CookieMonster::GetCookiesWithOptionsTask::Run")); |
810 std::string cookie = | 775 std::string cookie = |
811 this->cookie_monster()->GetCookiesWithOptions(url_, options_); | 776 this->cookie_monster()->GetCookiesWithOptions(url_, options_); |
812 if (!callback_.is_null()) { | 777 if (!callback_.is_null()) |
813 this->InvokeCallback(base::Bind(&GetCookiesCallback::Run, | 778 callback_.Run(cookie); |
814 base::Unretained(&callback_), cookie)); | |
815 } | |
816 } | 779 } |
817 | 780 |
818 // Task class for DeleteCookie call. | 781 // Task class for DeleteCookie call. |
819 class CookieMonster::DeleteCookieTask : public DeleteTask<void> { | 782 class CookieMonster::DeleteCookieTask : public DeleteTask<void> { |
820 public: | 783 public: |
821 DeleteCookieTask(CookieMonster* cookie_monster, | 784 DeleteCookieTask(CookieMonster* cookie_monster, |
822 const GURL& url, | 785 const GURL& url, |
823 const std::string& cookie_name, | 786 const std::string& cookie_name, |
824 const base::Closure& callback) | 787 const base::Closure& callback) |
825 : DeleteTask<void>(cookie_monster, callback), | 788 : DeleteTask<void>(cookie_monster, callback), |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
882 CookiePriority priority, | 845 CookiePriority priority, |
883 const SetCookiesCallback& callback) { | 846 const SetCookiesCallback& callback) { |
884 scoped_refptr<SetCookieWithDetailsTask> task = new SetCookieWithDetailsTask( | 847 scoped_refptr<SetCookieWithDetailsTask> task = new SetCookieWithDetailsTask( |
885 this, url, name, value, domain, path, creation_time, expiration_time, | 848 this, url, name, value, domain, path, creation_time, expiration_time, |
886 last_access_time, secure, http_only, same_site, enforce_strict_secure, | 849 last_access_time, secure, http_only, same_site, enforce_strict_secure, |
887 priority, callback); | 850 priority, callback); |
888 DoCookieTaskForURL(task, url); | 851 DoCookieTaskForURL(task, url); |
889 } | 852 } |
890 | 853 |
891 void CookieMonster::FlushStore(const base::Closure& callback) { | 854 void CookieMonster::FlushStore(const base::Closure& callback) { |
892 base::AutoLock autolock(lock_); | 855 DCHECK(thread_checker_.CalledOnValidThread()); |
893 if (initialized_ && store_.get()) | 856 if (initialized_ && store_.get()) |
894 store_->Flush(callback); | 857 store_->Flush(callback); |
895 else if (!callback.is_null()) | 858 else if (!callback.is_null()) |
896 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 859 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); |
897 } | 860 } |
898 | 861 |
899 void CookieMonster::SetForceKeepSessionState() { | 862 void CookieMonster::SetForceKeepSessionState() { |
863 DCHECK(thread_checker_.CalledOnValidThread()); | |
900 if (store_) | 864 if (store_) |
901 store_->SetForceKeepSessionState(); | 865 store_->SetForceKeepSessionState(); |
902 } | 866 } |
903 | 867 |
904 void CookieMonster::SetAllCookiesAsync(const CookieList& list, | 868 void CookieMonster::SetAllCookiesAsync(const CookieList& list, |
905 const SetCookiesCallback& callback) { | 869 const SetCookiesCallback& callback) { |
906 scoped_refptr<SetAllCookiesTask> task = | 870 scoped_refptr<SetAllCookiesTask> task = |
907 new SetAllCookiesTask(this, list, callback); | 871 new SetAllCookiesTask(this, list, callback); |
908 DoCookieTask(task); | 872 DoCookieTask(task); |
909 } | 873 } |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
987 void CookieMonster::DeleteSessionCookiesAsync( | 951 void CookieMonster::DeleteSessionCookiesAsync( |
988 const CookieStore::DeleteCallback& callback) { | 952 const CookieStore::DeleteCallback& callback) { |
989 scoped_refptr<DeleteSessionCookiesTask> task = | 953 scoped_refptr<DeleteSessionCookiesTask> task = |
990 new DeleteSessionCookiesTask(this, callback); | 954 new DeleteSessionCookiesTask(this, callback); |
991 | 955 |
992 DoCookieTask(task); | 956 DoCookieTask(task); |
993 } | 957 } |
994 | 958 |
995 void CookieMonster::SetCookieableSchemes( | 959 void CookieMonster::SetCookieableSchemes( |
996 const std::vector<std::string>& schemes) { | 960 const std::vector<std::string>& schemes) { |
997 base::AutoLock autolock(lock_); | 961 DCHECK(thread_checker_.CalledOnValidThread()); |
998 | 962 |
999 // Calls to this method will have no effect if made after a WebView or | 963 // Calls to this method will have no effect if made after a WebView or |
1000 // CookieManager instance has been created. | 964 // CookieManager instance has been created. |
1001 if (initialized_) | 965 if (initialized_) |
1002 return; | 966 return; |
1003 | 967 |
1004 cookieable_schemes_ = schemes; | 968 cookieable_schemes_ = schemes; |
1005 } | 969 } |
1006 | 970 |
1007 // This function must be called before the CookieMonster is used. | 971 // This function must be called before the CookieMonster is used. |
1008 void CookieMonster::SetPersistSessionCookies(bool persist_session_cookies) { | 972 void CookieMonster::SetPersistSessionCookies(bool persist_session_cookies) { |
973 DCHECK(thread_checker_.CalledOnValidThread()); | |
1009 DCHECK(!initialized_); | 974 DCHECK(!initialized_); |
1010 persist_session_cookies_ = persist_session_cookies; | 975 persist_session_cookies_ = persist_session_cookies; |
1011 } | 976 } |
1012 | 977 |
1013 bool CookieMonster::IsCookieableScheme(const std::string& scheme) { | 978 bool CookieMonster::IsCookieableScheme(const std::string& scheme) { |
1014 base::AutoLock autolock(lock_); | 979 DCHECK(thread_checker_.CalledOnValidThread()); |
1015 | 980 |
1016 return std::find(cookieable_schemes_.begin(), cookieable_schemes_.end(), | 981 return std::find(cookieable_schemes_.begin(), cookieable_schemes_.end(), |
1017 scheme) != cookieable_schemes_.end(); | 982 scheme) != cookieable_schemes_.end(); |
1018 } | 983 } |
1019 | 984 |
1020 const char* const CookieMonster::kDefaultCookieableSchemes[] = {"http", "https", | 985 const char* const CookieMonster::kDefaultCookieableSchemes[] = {"http", "https", |
1021 "ws", "wss"}; | 986 "ws", "wss"}; |
1022 const int CookieMonster::kDefaultCookieableSchemesCount = | 987 const int CookieMonster::kDefaultCookieableSchemesCount = |
1023 arraysize(kDefaultCookieableSchemes); | 988 arraysize(kDefaultCookieableSchemes); |
1024 | 989 |
1025 scoped_ptr<CookieStore::CookieChangedSubscription> | 990 scoped_ptr<CookieStore::CookieChangedSubscription> |
1026 CookieMonster::AddCallbackForCookie(const GURL& gurl, | 991 CookieMonster::AddCallbackForCookie(const GURL& gurl, |
1027 const std::string& name, | 992 const std::string& name, |
1028 const CookieChangedCallback& callback) { | 993 const CookieChangedCallback& callback) { |
1029 base::AutoLock autolock(lock_); | 994 DCHECK(thread_checker_.CalledOnValidThread()); |
1030 std::pair<GURL, std::string> key(gurl, name); | 995 std::pair<GURL, std::string> key(gurl, name); |
1031 if (hook_map_.count(key) == 0) | 996 if (hook_map_.count(key) == 0) |
1032 hook_map_[key] = make_linked_ptr(new CookieChangedCallbackList()); | 997 hook_map_[key] = make_linked_ptr(new CookieChangedCallbackList()); |
1033 return hook_map_[key]->Add( | 998 return hook_map_[key]->Add( |
1034 base::Bind(&RunAsync, base::ThreadTaskRunnerHandle::Get(), callback)); | 999 base::Bind(&RunAsync, base::ThreadTaskRunnerHandle::Get(), callback)); |
1035 } | 1000 } |
1036 | 1001 |
1037 CookieMonster::~CookieMonster() { | 1002 CookieMonster::~CookieMonster() { |
1038 // Clean up cookies | 1003 DCHECK(thread_checker_.CalledOnValidThread()); |
1039 | 1004 |
1040 // InternalDeleteCookie expects the lock to be held, even though there can be | |
1041 // no contention here. | |
1042 base::AutoLock autolock(lock_); | |
1043 for (CookieMap::iterator cookie_it = cookies_.begin(); | 1005 for (CookieMap::iterator cookie_it = cookies_.begin(); |
1044 cookie_it != cookies_.end();) { | 1006 cookie_it != cookies_.end();) { |
1045 CookieMap::iterator current_cookie_it = cookie_it; | 1007 CookieMap::iterator current_cookie_it = cookie_it; |
1046 ++cookie_it; | 1008 ++cookie_it; |
1047 InternalDeleteCookie(current_cookie_it, false /* sync_to_store */, | 1009 InternalDeleteCookie(current_cookie_it, false /* sync_to_store */, |
1048 DELETE_COOKIE_DONT_RECORD); | 1010 DELETE_COOKIE_DONT_RECORD); |
1049 } | 1011 } |
1050 } | 1012 } |
1051 | 1013 |
1052 bool CookieMonster::SetCookieWithDetails(const GURL& url, | 1014 bool CookieMonster::SetCookieWithDetails(const GURL& url, |
1053 const std::string& name, | 1015 const std::string& name, |
1054 const std::string& value, | 1016 const std::string& value, |
1055 const std::string& domain, | 1017 const std::string& domain, |
1056 const std::string& path, | 1018 const std::string& path, |
1057 base::Time creation_time, | 1019 base::Time creation_time, |
1058 base::Time expiration_time, | 1020 base::Time expiration_time, |
1059 base::Time last_access_time, | 1021 base::Time last_access_time, |
1060 bool secure, | 1022 bool secure, |
1061 bool http_only, | 1023 bool http_only, |
1062 bool same_site, | 1024 bool same_site, |
1063 bool enforce_strict_secure, | 1025 bool enforce_strict_secure, |
1064 CookiePriority priority) { | 1026 CookiePriority priority) { |
1065 base::AutoLock autolock(lock_); | 1027 DCHECK(thread_checker_.CalledOnValidThread()); |
1066 | 1028 |
1067 if (!HasCookieableScheme(url)) | 1029 if (!HasCookieableScheme(url)) |
1068 return false; | 1030 return false; |
1069 | 1031 |
1070 // TODO(mmenke): This class assumes each cookie to have a unique creation | 1032 // TODO(mmenke): This class assumes each cookie to have a unique creation |
1071 // time. Allowing the caller to set the creation time violates that | 1033 // time. Allowing the caller to set the creation time violates that |
1072 // assumption. Worth fixing? Worth noting that time changes between browser | 1034 // assumption. Worth fixing? Worth noting that time changes between browser |
1073 // restarts can cause the same issue. | 1035 // restarts can cause the same issue. |
1074 base::Time actual_creation_time = creation_time; | 1036 base::Time actual_creation_time = creation_time; |
1075 if (creation_time.is_null()) { | 1037 if (creation_time.is_null()) { |
(...skipping 13 matching lines...) Expand all Loading... | |
1089 | 1051 |
1090 CookieOptions options; | 1052 CookieOptions options; |
1091 options.set_include_httponly(); | 1053 options.set_include_httponly(); |
1092 options.set_include_same_site(); | 1054 options.set_include_same_site(); |
1093 if (enforce_strict_secure) | 1055 if (enforce_strict_secure) |
1094 options.set_enforce_strict_secure(); | 1056 options.set_enforce_strict_secure(); |
1095 return SetCanonicalCookie(std::move(cc), options); | 1057 return SetCanonicalCookie(std::move(cc), options); |
1096 } | 1058 } |
1097 | 1059 |
1098 CookieList CookieMonster::GetAllCookies() { | 1060 CookieList CookieMonster::GetAllCookies() { |
1099 base::AutoLock autolock(lock_); | 1061 DCHECK(thread_checker_.CalledOnValidThread()); |
1100 | 1062 |
1101 // This function is being called to scrape the cookie list for management UI | 1063 // This function is being called to scrape the cookie list for management UI |
1102 // or similar. We shouldn't show expired cookies in this list since it will | 1064 // or similar. We shouldn't show expired cookies in this list since it will |
1103 // just be confusing to users, and this function is called rarely enough (and | 1065 // just be confusing to users, and this function is called rarely enough (and |
1104 // is already slow enough) that it's OK to take the time to garbage collect | 1066 // is already slow enough) that it's OK to take the time to garbage collect |
1105 // the expired cookies now. | 1067 // the expired cookies now. |
1106 // | 1068 // |
1107 // Note that this does not prune cookies to be below our limits (if we've | 1069 // Note that this does not prune cookies to be below our limits (if we've |
1108 // exceeded them) the way that calling GarbageCollect() would. | 1070 // exceeded them) the way that calling GarbageCollect() would. |
1109 GarbageCollectExpired( | 1071 GarbageCollectExpired( |
(...skipping 12 matching lines...) Expand all Loading... | |
1122 for (std::vector<CanonicalCookie*>::const_iterator it = cookie_ptrs.begin(); | 1084 for (std::vector<CanonicalCookie*>::const_iterator it = cookie_ptrs.begin(); |
1123 it != cookie_ptrs.end(); ++it) | 1085 it != cookie_ptrs.end(); ++it) |
1124 cookie_list.push_back(**it); | 1086 cookie_list.push_back(**it); |
1125 | 1087 |
1126 return cookie_list; | 1088 return cookie_list; |
1127 } | 1089 } |
1128 | 1090 |
1129 CookieList CookieMonster::GetCookieListWithOptions( | 1091 CookieList CookieMonster::GetCookieListWithOptions( |
1130 const GURL& url, | 1092 const GURL& url, |
1131 const CookieOptions& options) { | 1093 const CookieOptions& options) { |
1132 base::AutoLock autolock(lock_); | 1094 DCHECK(thread_checker_.CalledOnValidThread()); |
1133 | 1095 |
1134 CookieList cookies; | 1096 CookieList cookies; |
1135 if (!HasCookieableScheme(url)) | 1097 if (!HasCookieableScheme(url)) |
1136 return cookies; | 1098 return cookies; |
1137 | 1099 |
1138 std::vector<CanonicalCookie*> cookie_ptrs; | 1100 std::vector<CanonicalCookie*> cookie_ptrs; |
1139 FindCookiesForHostAndDomain(url, options, &cookie_ptrs); | 1101 FindCookiesForHostAndDomain(url, options, &cookie_ptrs); |
1140 std::sort(cookie_ptrs.begin(), cookie_ptrs.end(), CookieSorter); | 1102 std::sort(cookie_ptrs.begin(), cookie_ptrs.end(), CookieSorter); |
1141 | 1103 |
1142 cookies.reserve(cookie_ptrs.size()); | 1104 cookies.reserve(cookie_ptrs.size()); |
1143 for (std::vector<CanonicalCookie*>::const_iterator it = cookie_ptrs.begin(); | 1105 for (std::vector<CanonicalCookie*>::const_iterator it = cookie_ptrs.begin(); |
1144 it != cookie_ptrs.end(); it++) | 1106 it != cookie_ptrs.end(); it++) |
1145 cookies.push_back(**it); | 1107 cookies.push_back(**it); |
1146 | 1108 |
1147 return cookies; | 1109 return cookies; |
1148 } | 1110 } |
1149 | 1111 |
1150 int CookieMonster::DeleteAllCreatedBetween(const Time& delete_begin, | 1112 int CookieMonster::DeleteAllCreatedBetween(const Time& delete_begin, |
1151 const Time& delete_end) { | 1113 const Time& delete_end) { |
1152 base::AutoLock autolock(lock_); | 1114 DCHECK(thread_checker_.CalledOnValidThread()); |
1153 | 1115 |
1154 int num_deleted = 0; | 1116 int num_deleted = 0; |
1155 for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { | 1117 for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { |
1156 CookieMap::iterator curit = it; | 1118 CookieMap::iterator curit = it; |
1157 CanonicalCookie* cc = curit->second; | 1119 CanonicalCookie* cc = curit->second; |
1158 ++it; | 1120 ++it; |
1159 | 1121 |
1160 if (cc->CreationDate() >= delete_begin && | 1122 if (cc->CreationDate() >= delete_begin && |
1161 (delete_end.is_null() || cc->CreationDate() < delete_end)) { | 1123 (delete_end.is_null() || cc->CreationDate() < delete_end)) { |
1162 InternalDeleteCookie(curit, true, /*sync_to_store*/ | 1124 InternalDeleteCookie(curit, true, /*sync_to_store*/ |
1163 DELETE_COOKIE_EXPLICIT); | 1125 DELETE_COOKIE_EXPLICIT); |
1164 ++num_deleted; | 1126 ++num_deleted; |
1165 } | 1127 } |
1166 } | 1128 } |
1167 | 1129 |
1168 return num_deleted; | 1130 return num_deleted; |
1169 } | 1131 } |
1170 | 1132 |
1171 int CookieMonster::DeleteAllCreatedBetweenForHost(const Time delete_begin, | 1133 int CookieMonster::DeleteAllCreatedBetweenForHost(const Time delete_begin, |
1172 const Time delete_end, | 1134 const Time delete_end, |
1173 const GURL& url) { | 1135 const GURL& url) { |
1174 base::AutoLock autolock(lock_); | 1136 DCHECK(thread_checker_.CalledOnValidThread()); |
1175 | 1137 |
1176 if (!HasCookieableScheme(url)) | 1138 if (!HasCookieableScheme(url)) |
1177 return 0; | 1139 return 0; |
1178 | 1140 |
1179 const std::string host(url.host()); | 1141 const std::string host(url.host()); |
1180 | 1142 |
1181 // We store host cookies in the store by their canonical host name; | 1143 // We store host cookies in the store by their canonical host name; |
1182 // domain cookies are stored with a leading ".". So this is a pretty | 1144 // domain cookies are stored with a leading ".". So this is a pretty |
1183 // simple lookup and per-cookie delete. | 1145 // simple lookup and per-cookie delete. |
1184 int num_deleted = 0; | 1146 int num_deleted = 0; |
(...skipping 15 matching lines...) Expand all Loading... | |
1200 InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPLICIT); | 1162 InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPLICIT); |
1201 } | 1163 } |
1202 } | 1164 } |
1203 return num_deleted; | 1165 return num_deleted; |
1204 } | 1166 } |
1205 | 1167 |
1206 | 1168 |
1207 bool CookieMonster::SetCookieWithOptions(const GURL& url, | 1169 bool CookieMonster::SetCookieWithOptions(const GURL& url, |
1208 const std::string& cookie_line, | 1170 const std::string& cookie_line, |
1209 const CookieOptions& options) { | 1171 const CookieOptions& options) { |
1210 base::AutoLock autolock(lock_); | 1172 DCHECK(thread_checker_.CalledOnValidThread()); |
1211 | 1173 |
1212 if (!HasCookieableScheme(url)) { | 1174 if (!HasCookieableScheme(url)) { |
1213 return false; | 1175 return false; |
1214 } | 1176 } |
1215 | 1177 |
1216 return SetCookieWithCreationTimeAndOptions(url, cookie_line, Time(), options); | 1178 return SetCookieWithCreationTimeAndOptions(url, cookie_line, Time(), options); |
1217 } | 1179 } |
1218 | 1180 |
1219 std::string CookieMonster::GetCookiesWithOptions(const GURL& url, | 1181 std::string CookieMonster::GetCookiesWithOptions(const GURL& url, |
1220 const CookieOptions& options) { | 1182 const CookieOptions& options) { |
1221 base::AutoLock autolock(lock_); | 1183 DCHECK(thread_checker_.CalledOnValidThread()); |
1222 | 1184 |
1223 if (!HasCookieableScheme(url)) | 1185 if (!HasCookieableScheme(url)) |
1224 return std::string(); | 1186 return std::string(); |
1225 | 1187 |
1226 std::vector<CanonicalCookie*> cookies; | 1188 std::vector<CanonicalCookie*> cookies; |
1227 FindCookiesForHostAndDomain(url, options, &cookies); | 1189 FindCookiesForHostAndDomain(url, options, &cookies); |
1228 std::sort(cookies.begin(), cookies.end(), CookieSorter); | 1190 std::sort(cookies.begin(), cookies.end(), CookieSorter); |
1229 | 1191 |
1230 std::string cookie_line = BuildCookieLine(cookies); | 1192 std::string cookie_line = BuildCookieLine(cookies); |
1231 | 1193 |
1232 VLOG(kVlogGetCookies) << "GetCookies() result: " << cookie_line; | 1194 VLOG(kVlogGetCookies) << "GetCookies() result: " << cookie_line; |
1233 | 1195 |
1234 return cookie_line; | 1196 return cookie_line; |
1235 } | 1197 } |
1236 | 1198 |
1237 void CookieMonster::DeleteCookie(const GURL& url, | 1199 void CookieMonster::DeleteCookie(const GURL& url, |
1238 const std::string& cookie_name) { | 1200 const std::string& cookie_name) { |
1239 base::AutoLock autolock(lock_); | 1201 DCHECK(thread_checker_.CalledOnValidThread()); |
1240 | 1202 |
1241 if (!HasCookieableScheme(url)) | 1203 if (!HasCookieableScheme(url)) |
1242 return; | 1204 return; |
1243 | 1205 |
1244 CookieOptions options; | 1206 CookieOptions options; |
1245 options.set_include_httponly(); | 1207 options.set_include_httponly(); |
1246 options.set_include_same_site(); | 1208 options.set_include_same_site(); |
1247 // Get the cookies for this host and its domain(s). | 1209 // Get the cookies for this host and its domain(s). |
1248 std::vector<CanonicalCookie*> cookies; | 1210 std::vector<CanonicalCookie*> cookies; |
1249 FindCookiesForHostAndDomain(url, options, &cookies); | 1211 FindCookiesForHostAndDomain(url, options, &cookies); |
(...skipping 11 matching lines...) Expand all Loading... | |
1261 for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { | 1223 for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { |
1262 CookieMap::iterator curit = it; | 1224 CookieMap::iterator curit = it; |
1263 ++it; | 1225 ++it; |
1264 if (matching_cookies.find(curit->second) != matching_cookies.end()) { | 1226 if (matching_cookies.find(curit->second) != matching_cookies.end()) { |
1265 InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPLICIT); | 1227 InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPLICIT); |
1266 } | 1228 } |
1267 } | 1229 } |
1268 } | 1230 } |
1269 | 1231 |
1270 int CookieMonster::DeleteCanonicalCookie(const CanonicalCookie& cookie) { | 1232 int CookieMonster::DeleteCanonicalCookie(const CanonicalCookie& cookie) { |
1271 base::AutoLock autolock(lock_); | 1233 DCHECK(thread_checker_.CalledOnValidThread()); |
1272 | 1234 |
1273 for (CookieMapItPair its = cookies_.equal_range(GetKey(cookie.Domain())); | 1235 for (CookieMapItPair its = cookies_.equal_range(GetKey(cookie.Domain())); |
1274 its.first != its.second; ++its.first) { | 1236 its.first != its.second; ++its.first) { |
1275 // The creation date acts as the unique index... | 1237 // The creation date acts as the unique index... |
1276 if (its.first->second->CreationDate() == cookie.CreationDate()) { | 1238 if (its.first->second->CreationDate() == cookie.CreationDate()) { |
1277 InternalDeleteCookie(its.first, true, DELETE_COOKIE_EXPLICIT); | 1239 InternalDeleteCookie(its.first, true, DELETE_COOKIE_EXPLICIT); |
1278 return 1; | 1240 return 1; |
1279 } | 1241 } |
1280 } | 1242 } |
1281 return 0; | 1243 return 0; |
1282 } | 1244 } |
1283 | 1245 |
1284 bool CookieMonster::SetCookieWithCreationTime(const GURL& url, | 1246 bool CookieMonster::SetCookieWithCreationTime(const GURL& url, |
1285 const std::string& cookie_line, | 1247 const std::string& cookie_line, |
1286 const base::Time& creation_time) { | 1248 const base::Time& creation_time) { |
1249 DCHECK(thread_checker_.CalledOnValidThread()); | |
1287 DCHECK(!store_.get()) << "This method is only to be used by unit-tests."; | 1250 DCHECK(!store_.get()) << "This method is only to be used by unit-tests."; |
1288 base::AutoLock autolock(lock_); | |
1289 | 1251 |
1290 if (!HasCookieableScheme(url)) { | 1252 if (!HasCookieableScheme(url)) { |
1291 return false; | 1253 return false; |
1292 } | 1254 } |
1293 | 1255 |
1294 MarkCookieStoreAsInitialized(); | 1256 MarkCookieStoreAsInitialized(); |
1295 if (ShouldFetchAllCookiesWhenFetchingAnyCookie()) | 1257 if (ShouldFetchAllCookiesWhenFetchingAnyCookie()) |
1296 FetchAllCookiesIfNecessary(); | 1258 FetchAllCookiesIfNecessary(); |
1297 | 1259 |
1298 return SetCookieWithCreationTimeAndOptions(url, cookie_line, creation_time, | 1260 return SetCookieWithCreationTimeAndOptions(url, cookie_line, creation_time, |
1299 CookieOptions()); | 1261 CookieOptions()); |
1300 } | 1262 } |
1301 | 1263 |
1302 int CookieMonster::DeleteSessionCookies() { | 1264 int CookieMonster::DeleteSessionCookies() { |
1303 base::AutoLock autolock(lock_); | 1265 DCHECK(thread_checker_.CalledOnValidThread()); |
1304 | 1266 |
1305 int num_deleted = 0; | 1267 int num_deleted = 0; |
1306 for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { | 1268 for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { |
1307 CookieMap::iterator curit = it; | 1269 CookieMap::iterator curit = it; |
1308 CanonicalCookie* cc = curit->second; | 1270 CanonicalCookie* cc = curit->second; |
1309 ++it; | 1271 ++it; |
1310 | 1272 |
1311 if (!cc->IsPersistent()) { | 1273 if (!cc->IsPersistent()) { |
1312 InternalDeleteCookie(curit, true, /*sync_to_store*/ | 1274 InternalDeleteCookie(curit, true, /*sync_to_store*/ |
1313 DELETE_COOKIE_EXPIRED); | 1275 DELETE_COOKIE_EXPIRED); |
1314 ++num_deleted; | 1276 ++num_deleted; |
1315 } | 1277 } |
1316 } | 1278 } |
1317 | 1279 |
1318 return num_deleted; | 1280 return num_deleted; |
1319 } | 1281 } |
1320 | 1282 |
1321 void CookieMonster::MarkCookieStoreAsInitialized() { | 1283 void CookieMonster::MarkCookieStoreAsInitialized() { |
1284 DCHECK(thread_checker_.CalledOnValidThread()); | |
1322 initialized_ = true; | 1285 initialized_ = true; |
1323 } | 1286 } |
1324 | 1287 |
1325 void CookieMonster::FetchAllCookiesIfNecessary() { | 1288 void CookieMonster::FetchAllCookiesIfNecessary() { |
1289 DCHECK(thread_checker_.CalledOnValidThread()); | |
1326 if (store_.get() && !started_fetching_all_cookies_) { | 1290 if (store_.get() && !started_fetching_all_cookies_) { |
1327 started_fetching_all_cookies_ = true; | 1291 started_fetching_all_cookies_ = true; |
1328 FetchAllCookies(); | 1292 FetchAllCookies(); |
1329 } | 1293 } |
1330 } | 1294 } |
1331 | 1295 |
1332 void CookieMonster::FetchAllCookies() { | 1296 void CookieMonster::FetchAllCookies() { |
1297 DCHECK(thread_checker_.CalledOnValidThread()); | |
1333 DCHECK(store_.get()) << "Store must exist to initialize"; | 1298 DCHECK(store_.get()) << "Store must exist to initialize"; |
1334 DCHECK(!finished_fetching_all_cookies_) | 1299 DCHECK(!finished_fetching_all_cookies_) |
1335 << "All cookies have already been fetched."; | 1300 << "All cookies have already been fetched."; |
1336 | 1301 |
1337 // We bind in the current time so that we can report the wall-clock time for | 1302 // We bind in the current time so that we can report the wall-clock time for |
1338 // loading cookies. | 1303 // loading cookies. |
1339 store_->Load(base::Bind(&CookieMonster::OnLoaded, this, TimeTicks::Now())); | 1304 store_->Load(base::Bind(&CookieMonster::OnLoaded, |
1305 weak_ptr_factory_.GetWeakPtr(), TimeTicks::Now())); | |
1340 } | 1306 } |
1341 | 1307 |
1342 bool CookieMonster::ShouldFetchAllCookiesWhenFetchingAnyCookie() { | 1308 bool CookieMonster::ShouldFetchAllCookiesWhenFetchingAnyCookie() { |
1309 DCHECK(thread_checker_.CalledOnValidThread()); | |
1310 | |
1343 if (fetch_strategy_ == kUnknownFetch) { | 1311 if (fetch_strategy_ == kUnknownFetch) { |
1344 const std::string group_name = | 1312 const std::string group_name = |
1345 base::FieldTrialList::FindFullName(kCookieMonsterFetchStrategyName); | 1313 base::FieldTrialList::FindFullName(kCookieMonsterFetchStrategyName); |
1346 if (group_name == kFetchWhenNecessaryName) { | 1314 if (group_name == kFetchWhenNecessaryName) { |
1347 fetch_strategy_ = kFetchWhenNecessary; | 1315 fetch_strategy_ = kFetchWhenNecessary; |
1348 } else if (group_name == kAlwaysFetchName) { | 1316 } else if (group_name == kAlwaysFetchName) { |
1349 fetch_strategy_ = kAlwaysFetch; | 1317 fetch_strategy_ = kAlwaysFetch; |
1350 } else { | 1318 } else { |
1351 // The logic in the conditional is redundant, but it makes trials of | 1319 // The logic in the conditional is redundant, but it makes trials of |
1352 // the Finch experiment more explicit. | 1320 // the Finch experiment more explicit. |
1353 fetch_strategy_ = kAlwaysFetch; | 1321 fetch_strategy_ = kAlwaysFetch; |
1354 } | 1322 } |
1355 } | 1323 } |
1356 | 1324 |
1357 return fetch_strategy_ == kAlwaysFetch; | 1325 return fetch_strategy_ == kAlwaysFetch; |
1358 } | 1326 } |
1359 | 1327 |
1360 void CookieMonster::OnLoaded(TimeTicks beginning_time, | 1328 void CookieMonster::OnLoaded(TimeTicks beginning_time, |
1361 const std::vector<CanonicalCookie*>& cookies) { | 1329 const std::vector<CanonicalCookie*>& cookies) { |
1330 DCHECK(thread_checker_.CalledOnValidThread()); | |
1362 StoreLoadedCookies(cookies); | 1331 StoreLoadedCookies(cookies); |
1363 histogram_time_blocked_on_load_->AddTime(TimeTicks::Now() - beginning_time); | 1332 histogram_time_blocked_on_load_->AddTime(TimeTicks::Now() - beginning_time); |
1364 | 1333 |
1365 // Invoke the task queue of cookie request. | 1334 // Invoke the task queue of cookie request. |
1366 InvokeQueue(); | 1335 InvokeQueue(); |
1367 } | 1336 } |
1368 | 1337 |
1369 void CookieMonster::OnKeyLoaded(const std::string& key, | 1338 void CookieMonster::OnKeyLoaded(const std::string& key, |
1370 const std::vector<CanonicalCookie*>& cookies) { | 1339 const std::vector<CanonicalCookie*>& cookies) { |
1371 // This function does its own separate locking. | 1340 DCHECK(thread_checker_.CalledOnValidThread()); |
1341 | |
1372 StoreLoadedCookies(cookies); | 1342 StoreLoadedCookies(cookies); |
1373 | 1343 |
1374 std::deque<scoped_refptr<CookieMonsterTask>> tasks_pending_for_key; | 1344 auto tasks_pending_for_key = tasks_pending_for_key_.find(key); |
1375 | 1345 |
1376 // We need to do this repeatedly until no more tasks were added to the queue | 1346 // TODO(mmenke): Can this be turned into a DCHECK? |
Mike West
2016/03/01 13:59:28
I think so. There shouldn't be any case in which w
mmenke
2016/03/01 16:03:45
My CL to re-order things may change that property
| |
1377 // during the period where we release the lock. | 1347 if (tasks_pending_for_key == tasks_pending_for_key_.end()) |
1378 while (true) { | 1348 return; |
1379 { | |
1380 base::AutoLock autolock(lock_); | |
1381 std::map<std::string, | |
1382 std::deque<scoped_refptr<CookieMonsterTask>>>::iterator it = | |
1383 tasks_pending_for_key_.find(key); | |
1384 if (it == tasks_pending_for_key_.end()) { | |
1385 keys_loaded_.insert(key); | |
1386 return; | |
1387 } | |
1388 if (it->second.empty()) { | |
1389 keys_loaded_.insert(key); | |
1390 tasks_pending_for_key_.erase(it); | |
1391 return; | |
1392 } | |
1393 it->second.swap(tasks_pending_for_key); | |
1394 } | |
1395 | 1349 |
1396 while (!tasks_pending_for_key.empty()) { | 1350 // Run all tasks for the key. Note that running a task can result it multiple |
Mike West
2016/03/01 13:59:28
Nit: s/it multiple/in multiple/
mmenke
2016/03/01 16:03:45
Done.
| |
1397 scoped_refptr<CookieMonsterTask> task = tasks_pending_for_key.front(); | 1351 // tasks being added to the back of the deque. |
1398 task->Run(); | 1352 while (!tasks_pending_for_key->second.empty()) { |
1399 tasks_pending_for_key.pop_front(); | 1353 // Removing a task from the deque before running it isn't strictly |
1400 } | 1354 // necessary, but just seems like a good idea. |
Mike West
2016/03/01 13:59:28
Nit: I'd drop the comment. I'd agree that it's a g
mmenke
2016/03/01 16:03:45
Done.
| |
1355 scoped_refptr<CookieMonsterTask> task = | |
1356 tasks_pending_for_key->second.front(); | |
1357 tasks_pending_for_key->second.pop_front(); | |
1358 | |
1359 task->Run(); | |
1401 } | 1360 } |
1361 | |
1362 tasks_pending_for_key_.erase(tasks_pending_for_key); | |
1363 | |
1364 // This has to be done last, in case running a task queues a new task for the | |
1365 // key, to ensure tasks are run in the correct order. | |
1366 keys_loaded_.insert(key); | |
1402 } | 1367 } |
1403 | 1368 |
1404 void CookieMonster::StoreLoadedCookies( | 1369 void CookieMonster::StoreLoadedCookies( |
1405 const std::vector<CanonicalCookie*>& cookies) { | 1370 const std::vector<CanonicalCookie*>& cookies) { |
1371 DCHECK(thread_checker_.CalledOnValidThread()); | |
1372 | |
1406 // TODO(erikwright): Remove ScopedTracker below once crbug.com/457528 is | 1373 // TODO(erikwright): Remove ScopedTracker below once crbug.com/457528 is |
1407 // fixed. | 1374 // fixed. |
1408 tracked_objects::ScopedTracker tracking_profile( | 1375 tracked_objects::ScopedTracker tracking_profile( |
1409 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 1376 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
1410 "457528 CookieMonster::StoreLoadedCookies")); | 1377 "457528 CookieMonster::StoreLoadedCookies")); |
1411 | 1378 |
1412 // Initialize the store and sync in any saved persistent cookies. We don't | 1379 // Even if a key is expired, insert it so it can be garbage collected, |
1413 // care if it's expired, insert it so it can be garbage collected, removed, | 1380 // removed, and sync'd. |
1414 // and sync'd. | |
1415 base::AutoLock autolock(lock_); | |
Mike West
2016/03/01 13:59:28
Appropos of nothing, I really like seeing all thes
| |
1416 | |
1417 CookieItVector cookies_with_control_chars; | 1381 CookieItVector cookies_with_control_chars; |
1418 | 1382 |
1419 for (std::vector<CanonicalCookie*>::const_iterator it = cookies.begin(); | 1383 for (std::vector<CanonicalCookie*>::const_iterator it = cookies.begin(); |
1420 it != cookies.end(); ++it) { | 1384 it != cookies.end(); ++it) { |
1421 int64_t cookie_creation_time = (*it)->CreationDate().ToInternalValue(); | 1385 int64_t cookie_creation_time = (*it)->CreationDate().ToInternalValue(); |
1422 | 1386 |
1423 if (creation_times_.insert(cookie_creation_time).second) { | 1387 if (creation_times_.insert(cookie_creation_time).second) { |
1424 CookieMap::iterator inserted = | 1388 CookieMap::iterator inserted = |
1425 InternalInsertCookie(GetKey((*it)->Domain()), *it, false); | 1389 InternalInsertCookie(GetKey((*it)->Domain()), *it, false); |
1426 const Time cookie_access_time((*it)->LastAccessDate()); | 1390 const Time cookie_access_time((*it)->LastAccessDate()); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1459 // none of our other constraints are violated. | 1423 // none of our other constraints are violated. |
1460 // In particular, the backing store might have given us duplicate cookies. | 1424 // In particular, the backing store might have given us duplicate cookies. |
1461 | 1425 |
1462 // This method could be called multiple times due to priority loading, thus | 1426 // This method could be called multiple times due to priority loading, thus |
1463 // cookies loaded in previous runs will be validated again, but this is OK | 1427 // cookies loaded in previous runs will be validated again, but this is OK |
1464 // since they are expected to be much fewer than total DB. | 1428 // since they are expected to be much fewer than total DB. |
1465 EnsureCookiesMapIsValid(); | 1429 EnsureCookiesMapIsValid(); |
1466 } | 1430 } |
1467 | 1431 |
1468 void CookieMonster::InvokeQueue() { | 1432 void CookieMonster::InvokeQueue() { |
1469 while (true) { | 1433 DCHECK(thread_checker_.CalledOnValidThread()); |
1470 scoped_refptr<CookieMonsterTask> request_task; | 1434 |
1471 { | 1435 while (!tasks_pending_.empty()) { |
1472 base::AutoLock autolock(lock_); | 1436 scoped_refptr<CookieMonsterTask> request_task = tasks_pending_.front(); |
1473 if (tasks_pending_.empty()) { | 1437 tasks_pending_.pop(); |
1474 finished_fetching_all_cookies_ = true; | |
1475 creation_times_.clear(); | |
1476 keys_loaded_.clear(); | |
1477 break; | |
1478 } | |
1479 request_task = tasks_pending_.front(); | |
1480 tasks_pending_.pop(); | |
1481 } | |
1482 request_task->Run(); | 1438 request_task->Run(); |
1483 } | 1439 } |
1440 | |
1441 finished_fetching_all_cookies_ = true; | |
1442 creation_times_.clear(); | |
1443 keys_loaded_.clear(); | |
1484 } | 1444 } |
1485 | 1445 |
1486 void CookieMonster::EnsureCookiesMapIsValid() { | 1446 void CookieMonster::EnsureCookiesMapIsValid() { |
1487 lock_.AssertAcquired(); | 1447 DCHECK(thread_checker_.CalledOnValidThread()); |
1488 | 1448 |
1489 // Iterate through all the of the cookies, grouped by host. | 1449 // Iterate through all the of the cookies, grouped by host. |
1490 CookieMap::iterator prev_range_end = cookies_.begin(); | 1450 CookieMap::iterator prev_range_end = cookies_.begin(); |
1491 while (prev_range_end != cookies_.end()) { | 1451 while (prev_range_end != cookies_.end()) { |
1492 CookieMap::iterator cur_range_begin = prev_range_end; | 1452 CookieMap::iterator cur_range_begin = prev_range_end; |
1493 const std::string key = cur_range_begin->first; // Keep a copy. | 1453 const std::string key = cur_range_begin->first; // Keep a copy. |
1494 CookieMap::iterator cur_range_end = cookies_.upper_bound(key); | 1454 CookieMap::iterator cur_range_end = cookies_.upper_bound(key); |
1495 prev_range_end = cur_range_end; | 1455 prev_range_end = cur_range_end; |
1496 | 1456 |
1497 // Ensure no equivalent cookies for this host. | 1457 // Ensure no equivalent cookies for this host. |
1498 TrimDuplicateCookiesForKey(key, cur_range_begin, cur_range_end); | 1458 TrimDuplicateCookiesForKey(key, cur_range_begin, cur_range_end); |
1499 } | 1459 } |
1500 } | 1460 } |
1501 | 1461 |
1502 void CookieMonster::TrimDuplicateCookiesForKey(const std::string& key, | 1462 void CookieMonster::TrimDuplicateCookiesForKey(const std::string& key, |
1503 CookieMap::iterator begin, | 1463 CookieMap::iterator begin, |
1504 CookieMap::iterator end) { | 1464 CookieMap::iterator end) { |
1505 lock_.AssertAcquired(); | 1465 DCHECK(thread_checker_.CalledOnValidThread()); |
1506 | 1466 |
1507 // Set of cookies ordered by creation time. | 1467 // Set of cookies ordered by creation time. |
1508 typedef std::set<CookieMap::iterator, OrderByCreationTimeDesc> CookieSet; | 1468 typedef std::set<CookieMap::iterator, OrderByCreationTimeDesc> CookieSet; |
1509 | 1469 |
1510 // Helper map we populate to find the duplicates. | 1470 // Helper map we populate to find the duplicates. |
1511 typedef std::map<CookieSignature, CookieSet> EquivalenceMap; | 1471 typedef std::map<CookieSignature, CookieSet> EquivalenceMap; |
1512 EquivalenceMap equivalent_cookies; | 1472 EquivalenceMap equivalent_cookies; |
1513 | 1473 |
1514 // The number of duplicate cookies that have been found. | 1474 // The number of duplicate cookies that have been found. |
1515 int num_duplicates = 0; | 1475 int num_duplicates = 0; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1571 DELETE_COOKIE_DUPLICATE_IN_BACKING_STORE); | 1531 DELETE_COOKIE_DUPLICATE_IN_BACKING_STORE); |
1572 } | 1532 } |
1573 } | 1533 } |
1574 DCHECK_EQ(num_duplicates, num_duplicates_found); | 1534 DCHECK_EQ(num_duplicates, num_duplicates_found); |
1575 } | 1535 } |
1576 | 1536 |
1577 void CookieMonster::FindCookiesForHostAndDomain( | 1537 void CookieMonster::FindCookiesForHostAndDomain( |
1578 const GURL& url, | 1538 const GURL& url, |
1579 const CookieOptions& options, | 1539 const CookieOptions& options, |
1580 std::vector<CanonicalCookie*>* cookies) { | 1540 std::vector<CanonicalCookie*>* cookies) { |
1581 lock_.AssertAcquired(); | 1541 DCHECK(thread_checker_.CalledOnValidThread()); |
1582 | 1542 |
1583 const Time current_time(CurrentTime()); | 1543 const Time current_time(CurrentTime()); |
1584 | 1544 |
1585 // Probe to save statistics relatively frequently. We do it here rather | 1545 // Probe to save statistics relatively frequently. We do it here rather |
1586 // than in the set path as many websites won't set cookies, and we | 1546 // than in the set path as many websites won't set cookies, and we |
1587 // want to collect statistics whenever the browser's being used. | 1547 // want to collect statistics whenever the browser's being used. |
1588 RecordPeriodicStats(current_time); | 1548 RecordPeriodicStats(current_time); |
1589 | 1549 |
1590 // Can just dispatch to FindCookiesForKey | 1550 // Can just dispatch to FindCookiesForKey |
1591 const std::string key(GetKey(url.host())); | 1551 const std::string key(GetKey(url.host())); |
1592 FindCookiesForKey(key, url, options, current_time, cookies); | 1552 FindCookiesForKey(key, url, options, current_time, cookies); |
1593 } | 1553 } |
1594 | 1554 |
1595 void CookieMonster::FindCookiesForKey(const std::string& key, | 1555 void CookieMonster::FindCookiesForKey(const std::string& key, |
1596 const GURL& url, | 1556 const GURL& url, |
1597 const CookieOptions& options, | 1557 const CookieOptions& options, |
1598 const Time& current, | 1558 const Time& current, |
1599 std::vector<CanonicalCookie*>* cookies) { | 1559 std::vector<CanonicalCookie*>* cookies) { |
1600 lock_.AssertAcquired(); | 1560 DCHECK(thread_checker_.CalledOnValidThread()); |
1601 | 1561 |
1602 for (CookieMapItPair its = cookies_.equal_range(key); | 1562 for (CookieMapItPair its = cookies_.equal_range(key); |
1603 its.first != its.second;) { | 1563 its.first != its.second;) { |
1604 CookieMap::iterator curit = its.first; | 1564 CookieMap::iterator curit = its.first; |
1605 CanonicalCookie* cc = curit->second; | 1565 CanonicalCookie* cc = curit->second; |
1606 ++its.first; | 1566 ++its.first; |
1607 | 1567 |
1608 // If the cookie is expired, delete it. | 1568 // If the cookie is expired, delete it. |
1609 if (cc->IsExpired(current)) { | 1569 if (cc->IsExpired(current)) { |
1610 InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPIRED); | 1570 InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPIRED); |
(...skipping 13 matching lines...) Expand all Loading... | |
1624 } | 1584 } |
1625 cookies->push_back(cc); | 1585 cookies->push_back(cc); |
1626 } | 1586 } |
1627 } | 1587 } |
1628 | 1588 |
1629 bool CookieMonster::DeleteAnyEquivalentCookie(const std::string& key, | 1589 bool CookieMonster::DeleteAnyEquivalentCookie(const std::string& key, |
1630 const CanonicalCookie& ecc, | 1590 const CanonicalCookie& ecc, |
1631 bool skip_httponly, | 1591 bool skip_httponly, |
1632 bool already_expired, | 1592 bool already_expired, |
1633 bool enforce_strict_secure) { | 1593 bool enforce_strict_secure) { |
1634 lock_.AssertAcquired(); | 1594 DCHECK(thread_checker_.CalledOnValidThread()); |
1635 | 1595 |
1636 bool found_equivalent_cookie = false; | 1596 bool found_equivalent_cookie = false; |
1637 bool skipped_httponly = false; | 1597 bool skipped_httponly = false; |
1638 bool skipped_secure_cookie = false; | 1598 bool skipped_secure_cookie = false; |
1639 | 1599 |
1640 histogram_cookie_delete_equivalent_->Add(COOKIE_DELETE_EQUIVALENT_ATTEMPT); | 1600 histogram_cookie_delete_equivalent_->Add(COOKIE_DELETE_EQUIVALENT_ATTEMPT); |
1641 | 1601 |
1642 for (CookieMapItPair its = cookies_.equal_range(key); | 1602 for (CookieMapItPair its = cookies_.equal_range(key); |
1643 its.first != its.second;) { | 1603 its.first != its.second;) { |
1644 CookieMap::iterator curit = its.first; | 1604 CookieMap::iterator curit = its.first; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1687 found_equivalent_cookie = true; | 1647 found_equivalent_cookie = true; |
1688 } | 1648 } |
1689 } | 1649 } |
1690 return skipped_httponly || skipped_secure_cookie; | 1650 return skipped_httponly || skipped_secure_cookie; |
1691 } | 1651 } |
1692 | 1652 |
1693 CookieMonster::CookieMap::iterator CookieMonster::InternalInsertCookie( | 1653 CookieMonster::CookieMap::iterator CookieMonster::InternalInsertCookie( |
1694 const std::string& key, | 1654 const std::string& key, |
1695 CanonicalCookie* cc, | 1655 CanonicalCookie* cc, |
1696 bool sync_to_store) { | 1656 bool sync_to_store) { |
1657 DCHECK(thread_checker_.CalledOnValidThread()); | |
1658 | |
1697 // TODO(mkwst): Remove ScopedTracker below once crbug.com/456373 is fixed. | 1659 // TODO(mkwst): Remove ScopedTracker below once crbug.com/456373 is fixed. |
1698 tracked_objects::ScopedTracker tracking_profile( | 1660 tracked_objects::ScopedTracker tracking_profile( |
1699 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 1661 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
1700 "456373 CookieMonster::InternalInsertCookie")); | 1662 "456373 CookieMonster::InternalInsertCookie")); |
1701 lock_.AssertAcquired(); | |
1702 | 1663 |
1703 if ((cc->IsPersistent() || persist_session_cookies_) && store_.get() && | 1664 if ((cc->IsPersistent() || persist_session_cookies_) && store_.get() && |
1704 sync_to_store) | 1665 sync_to_store) |
1705 store_->AddCookie(*cc); | 1666 store_->AddCookie(*cc); |
1706 CookieMap::iterator inserted = | 1667 CookieMap::iterator inserted = |
1707 cookies_.insert(CookieMap::value_type(key, cc)); | 1668 cookies_.insert(CookieMap::value_type(key, cc)); |
1708 if (delegate_.get()) { | 1669 if (delegate_.get()) { |
1709 delegate_->OnCookieChanged(*cc, false, | 1670 delegate_->OnCookieChanged(*cc, false, |
1710 CookieMonsterDelegate::CHANGE_COOKIE_EXPLICIT); | 1671 CookieMonsterDelegate::CHANGE_COOKIE_EXPLICIT); |
1711 } | 1672 } |
(...skipping 17 matching lines...) Expand all Loading... | |
1729 : COOKIE_SOURCE_NONSECURE_COOKIE_CRYPTOGRAPHIC_SCHEME; | 1690 : COOKIE_SOURCE_NONSECURE_COOKIE_CRYPTOGRAPHIC_SCHEME; |
1730 } else { | 1691 } else { |
1731 cookie_source_sample = | 1692 cookie_source_sample = |
1732 cc->IsSecure() | 1693 cc->IsSecure() |
1733 ? COOKIE_SOURCE_SECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME | 1694 ? COOKIE_SOURCE_SECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME |
1734 : COOKIE_SOURCE_NONSECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME; | 1695 : COOKIE_SOURCE_NONSECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME; |
1735 } | 1696 } |
1736 histogram_cookie_source_scheme_->Add(cookie_source_sample); | 1697 histogram_cookie_source_scheme_->Add(cookie_source_sample); |
1737 } | 1698 } |
1738 | 1699 |
1739 RunCallbacks(*cc, false); | 1700 RunCookieChangedCallbacks(*cc, false); |
1740 | 1701 |
1741 return inserted; | 1702 return inserted; |
1742 } | 1703 } |
1743 | 1704 |
1744 bool CookieMonster::SetCookieWithCreationTimeAndOptions( | 1705 bool CookieMonster::SetCookieWithCreationTimeAndOptions( |
1745 const GURL& url, | 1706 const GURL& url, |
1746 const std::string& cookie_line, | 1707 const std::string& cookie_line, |
1747 const Time& creation_time_or_null, | 1708 const Time& creation_time_or_null, |
1748 const CookieOptions& options) { | 1709 const CookieOptions& options) { |
1749 lock_.AssertAcquired(); | 1710 DCHECK(thread_checker_.CalledOnValidThread()); |
1750 | 1711 |
1751 VLOG(kVlogSetCookies) << "SetCookie() line: " << cookie_line; | 1712 VLOG(kVlogSetCookies) << "SetCookie() line: " << cookie_line; |
1752 | 1713 |
1753 Time creation_time = creation_time_or_null; | 1714 Time creation_time = creation_time_or_null; |
1754 if (creation_time.is_null()) { | 1715 if (creation_time.is_null()) { |
1755 creation_time = CurrentTime(); | 1716 creation_time = CurrentTime(); |
1756 last_time_seen_ = creation_time; | 1717 last_time_seen_ = creation_time; |
1757 } | 1718 } |
1758 | 1719 |
1759 scoped_ptr<CanonicalCookie> cc( | 1720 scoped_ptr<CanonicalCookie> cc( |
1760 CanonicalCookie::Create(url, cookie_line, creation_time, options)); | 1721 CanonicalCookie::Create(url, cookie_line, creation_time, options)); |
1761 | 1722 |
1762 if (!cc.get()) { | 1723 if (!cc.get()) { |
1763 VLOG(kVlogSetCookies) << "WARNING: Failed to allocate CanonicalCookie"; | 1724 VLOG(kVlogSetCookies) << "WARNING: Failed to allocate CanonicalCookie"; |
1764 return false; | 1725 return false; |
1765 } | 1726 } |
1766 return SetCanonicalCookie(std::move(cc), options); | 1727 return SetCanonicalCookie(std::move(cc), options); |
1767 } | 1728 } |
1768 | 1729 |
1769 bool CookieMonster::SetCanonicalCookie(scoped_ptr<CanonicalCookie> cc, | 1730 bool CookieMonster::SetCanonicalCookie(scoped_ptr<CanonicalCookie> cc, |
1770 const CookieOptions& options) { | 1731 const CookieOptions& options) { |
1732 DCHECK(thread_checker_.CalledOnValidThread()); | |
1733 | |
1771 Time creation_time = cc->CreationDate(); | 1734 Time creation_time = cc->CreationDate(); |
1772 const std::string key(GetKey(cc->Domain())); | 1735 const std::string key(GetKey(cc->Domain())); |
1773 bool already_expired = cc->IsExpired(creation_time); | 1736 bool already_expired = cc->IsExpired(creation_time); |
1774 | 1737 |
1775 if (DeleteAnyEquivalentCookie(key, *cc, options.exclude_httponly(), | 1738 if (DeleteAnyEquivalentCookie(key, *cc, options.exclude_httponly(), |
1776 already_expired, | 1739 already_expired, |
1777 options.enforce_strict_secure())) { | 1740 options.enforce_strict_secure())) { |
1778 std::string error; | 1741 std::string error; |
1779 if (options.enforce_strict_secure()) { | 1742 if (options.enforce_strict_secure()) { |
1780 error = | 1743 error = |
(...skipping 28 matching lines...) Expand all Loading... | |
1809 // querying a cookie. Since setting a cookie can put us over our limits, | 1772 // querying a cookie. Since setting a cookie can put us over our limits, |
1810 // make sure that we garbage collect... We can also make the assumption that | 1773 // make sure that we garbage collect... We can also make the assumption that |
1811 // if a cookie was set, in the common case it will be used soon after, | 1774 // if a cookie was set, in the common case it will be used soon after, |
1812 // and we will purge the expired cookies in GetCookies(). | 1775 // and we will purge the expired cookies in GetCookies(). |
1813 GarbageCollect(creation_time, key, options.enforce_strict_secure()); | 1776 GarbageCollect(creation_time, key, options.enforce_strict_secure()); |
1814 | 1777 |
1815 return true; | 1778 return true; |
1816 } | 1779 } |
1817 | 1780 |
1818 bool CookieMonster::SetCanonicalCookies(const CookieList& list) { | 1781 bool CookieMonster::SetCanonicalCookies(const CookieList& list) { |
1819 base::AutoLock autolock(lock_); | 1782 DCHECK(thread_checker_.CalledOnValidThread()); |
1820 | 1783 |
1821 CookieOptions options; | 1784 CookieOptions options; |
1822 options.set_include_httponly(); | 1785 options.set_include_httponly(); |
1823 | 1786 |
1824 for (const auto& cookie : list) { | 1787 for (const auto& cookie : list) { |
1825 if (!SetCanonicalCookie(make_scoped_ptr(new CanonicalCookie(cookie)), | 1788 if (!SetCanonicalCookie(make_scoped_ptr(new CanonicalCookie(cookie)), |
1826 options)) { | 1789 options)) { |
1827 return false; | 1790 return false; |
1828 } | 1791 } |
1829 } | 1792 } |
1830 | 1793 |
1831 return true; | 1794 return true; |
1832 } | 1795 } |
1833 | 1796 |
1834 void CookieMonster::InternalUpdateCookieAccessTime(CanonicalCookie* cc, | 1797 void CookieMonster::InternalUpdateCookieAccessTime(CanonicalCookie* cc, |
1835 const Time& current) { | 1798 const Time& current) { |
1836 lock_.AssertAcquired(); | 1799 DCHECK(thread_checker_.CalledOnValidThread()); |
1837 | 1800 |
1838 // Based off the Mozilla code. When a cookie has been accessed recently, | 1801 // Based off the Mozilla code. When a cookie has been accessed recently, |
1839 // don't bother updating its access time again. This reduces the number of | 1802 // don't bother updating its access time again. This reduces the number of |
1840 // updates we do during pageload, which in turn reduces the chance our storage | 1803 // updates we do during pageload, which in turn reduces the chance our storage |
1841 // backend will hit its batch thresholds and be forced to update. | 1804 // backend will hit its batch thresholds and be forced to update. |
1842 if ((current - cc->LastAccessDate()) < last_access_threshold_) | 1805 if ((current - cc->LastAccessDate()) < last_access_threshold_) |
1843 return; | 1806 return; |
1844 | 1807 |
1845 cc->SetLastAccessDate(current); | 1808 cc->SetLastAccessDate(current); |
1846 if ((cc->IsPersistent() || persist_session_cookies_) && store_.get()) | 1809 if ((cc->IsPersistent() || persist_session_cookies_) && store_.get()) |
1847 store_->UpdateCookieAccessTime(*cc); | 1810 store_->UpdateCookieAccessTime(*cc); |
1848 } | 1811 } |
1849 | 1812 |
1850 // InternalDeleteCookies must not invalidate iterators other than the one being | 1813 // InternalDeleteCookies must not invalidate iterators other than the one being |
1851 // deleted. | 1814 // deleted. |
1852 void CookieMonster::InternalDeleteCookie(CookieMap::iterator it, | 1815 void CookieMonster::InternalDeleteCookie(CookieMap::iterator it, |
1853 bool sync_to_store, | 1816 bool sync_to_store, |
1854 DeletionCause deletion_cause) { | 1817 DeletionCause deletion_cause) { |
1855 lock_.AssertAcquired(); | 1818 DCHECK(thread_checker_.CalledOnValidThread()); |
1856 | 1819 |
1857 // Ideally, this would be asserted up where we define ChangeCauseMapping, | 1820 // Ideally, this would be asserted up where we define ChangeCauseMapping, |
1858 // but DeletionCause's visibility (or lack thereof) forces us to make | 1821 // but DeletionCause's visibility (or lack thereof) forces us to make |
1859 // this check here. | 1822 // this check here. |
1860 static_assert(arraysize(ChangeCauseMapping) == DELETE_COOKIE_LAST_ENTRY + 1, | 1823 static_assert(arraysize(ChangeCauseMapping) == DELETE_COOKIE_LAST_ENTRY + 1, |
1861 "ChangeCauseMapping size should match DeletionCause size"); | 1824 "ChangeCauseMapping size should match DeletionCause size"); |
1862 | 1825 |
1863 // See InitializeHistograms() for details. | 1826 // See InitializeHistograms() for details. |
1864 if (deletion_cause != DELETE_COOKIE_DONT_RECORD) | 1827 if (deletion_cause != DELETE_COOKIE_DONT_RECORD) |
1865 histogram_cookie_deletion_cause_->Add(deletion_cause); | 1828 histogram_cookie_deletion_cause_->Add(deletion_cause); |
1866 | 1829 |
1867 CanonicalCookie* cc = it->second; | 1830 CanonicalCookie* cc = it->second; |
1868 VLOG(kVlogSetCookies) << "InternalDeleteCookie()" | 1831 VLOG(kVlogSetCookies) << "InternalDeleteCookie()" |
1869 << ", cause:" << deletion_cause | 1832 << ", cause:" << deletion_cause |
1870 << ", cc: " << cc->DebugString(); | 1833 << ", cc: " << cc->DebugString(); |
1871 | 1834 |
1872 if ((cc->IsPersistent() || persist_session_cookies_) && store_.get() && | 1835 if ((cc->IsPersistent() || persist_session_cookies_) && store_.get() && |
1873 sync_to_store) | 1836 sync_to_store) |
1874 store_->DeleteCookie(*cc); | 1837 store_->DeleteCookie(*cc); |
1875 if (delegate_.get()) { | 1838 if (delegate_.get()) { |
1876 ChangeCausePair mapping = ChangeCauseMapping[deletion_cause]; | 1839 ChangeCausePair mapping = ChangeCauseMapping[deletion_cause]; |
1877 | 1840 |
1878 if (mapping.notify) | 1841 if (mapping.notify) |
1879 delegate_->OnCookieChanged(*cc, true, mapping.cause); | 1842 delegate_->OnCookieChanged(*cc, true, mapping.cause); |
1880 } | 1843 } |
1881 RunCallbacks(*cc, true); | 1844 RunCookieChangedCallbacks(*cc, true); |
1882 cookies_.erase(it); | 1845 cookies_.erase(it); |
1883 delete cc; | 1846 delete cc; |
1884 } | 1847 } |
1885 | 1848 |
1886 // Domain expiry behavior is unchanged by key/expiry scheme (the | 1849 // Domain expiry behavior is unchanged by key/expiry scheme (the |
1887 // meaning of the key is different, but that's not visible to this routine). | 1850 // meaning of the key is different, but that's not visible to this routine). |
1888 size_t CookieMonster::GarbageCollect(const Time& current, | 1851 size_t CookieMonster::GarbageCollect(const Time& current, |
1889 const std::string& key, | 1852 const std::string& key, |
1890 bool enforce_strict_secure) { | 1853 bool enforce_strict_secure) { |
1891 lock_.AssertAcquired(); | 1854 DCHECK(thread_checker_.CalledOnValidThread()); |
1892 | 1855 |
1893 size_t num_deleted = 0; | 1856 size_t num_deleted = 0; |
1894 Time safe_date(Time::Now() - TimeDelta::FromDays(kSafeFromGlobalPurgeDays)); | 1857 Time safe_date(Time::Now() - TimeDelta::FromDays(kSafeFromGlobalPurgeDays)); |
1895 | 1858 |
1896 // Collect garbage for this key, minding cookie priorities. | 1859 // Collect garbage for this key, minding cookie priorities. |
1897 if (cookies_.count(key) > kDomainMaxCookies) { | 1860 if (cookies_.count(key) > kDomainMaxCookies) { |
1898 VLOG(kVlogGarbageCollection) << "GarbageCollect() key: " << key; | 1861 VLOG(kVlogGarbageCollection) << "GarbageCollect() key: " << key; |
1899 | 1862 |
1900 CookieItVector cookie_its; | 1863 CookieItVector cookie_its; |
1901 | 1864 |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2111 current, DELETE_COOKIE_EVICTED_DOMAIN_POST_SAFE, it_purge_middle, | 2074 current, DELETE_COOKIE_EVICTED_DOMAIN_POST_SAFE, it_purge_middle, |
2112 it_purge_end); | 2075 it_purge_end); |
2113 it_purge_begin = it_purge_end; | 2076 it_purge_begin = it_purge_end; |
2114 } | 2077 } |
2115 return num_deleted; | 2078 return num_deleted; |
2116 } | 2079 } |
2117 | 2080 |
2118 size_t CookieMonster::GarbageCollectExpired(const Time& current, | 2081 size_t CookieMonster::GarbageCollectExpired(const Time& current, |
2119 const CookieMapItPair& itpair, | 2082 const CookieMapItPair& itpair, |
2120 CookieItVector* cookie_its) { | 2083 CookieItVector* cookie_its) { |
2121 lock_.AssertAcquired(); | 2084 DCHECK(thread_checker_.CalledOnValidThread()); |
2122 | 2085 |
2123 int num_deleted = 0; | 2086 int num_deleted = 0; |
2124 for (CookieMap::iterator it = itpair.first, end = itpair.second; it != end;) { | 2087 for (CookieMap::iterator it = itpair.first, end = itpair.second; it != end;) { |
2125 CookieMap::iterator curit = it; | 2088 CookieMap::iterator curit = it; |
2126 ++it; | 2089 ++it; |
2127 | 2090 |
2128 if (curit->second->IsExpired(current)) { | 2091 if (curit->second->IsExpired(current)) { |
2129 InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPIRED); | 2092 InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPIRED); |
2130 ++num_deleted; | 2093 ++num_deleted; |
2131 } else if (cookie_its) { | 2094 } else if (cookie_its) { |
2132 cookie_its->push_back(curit); | 2095 cookie_its->push_back(curit); |
2133 } | 2096 } |
2134 } | 2097 } |
2135 | 2098 |
2136 return num_deleted; | 2099 return num_deleted; |
2137 } | 2100 } |
2138 | 2101 |
2139 size_t CookieMonster::GarbageCollectNonSecure( | 2102 size_t CookieMonster::GarbageCollectNonSecure( |
2140 const CookieItVector& valid_cookies, | 2103 const CookieItVector& valid_cookies, |
2141 CookieItVector* cookie_its) { | 2104 CookieItVector* cookie_its) { |
2142 lock_.AssertAcquired(); | 2105 DCHECK(thread_checker_.CalledOnValidThread()); |
2143 | 2106 |
2144 size_t num_deleted = 0; | 2107 size_t num_deleted = 0; |
2145 for (const auto& curr_cookie_it : valid_cookies) { | 2108 for (const auto& curr_cookie_it : valid_cookies) { |
2146 if (!curr_cookie_it->second->IsSecure()) { | 2109 if (!curr_cookie_it->second->IsSecure()) { |
2147 InternalDeleteCookie(curr_cookie_it, true, DELETE_COOKIE_NON_SECURE); | 2110 InternalDeleteCookie(curr_cookie_it, true, DELETE_COOKIE_NON_SECURE); |
2148 ++num_deleted; | 2111 ++num_deleted; |
2149 } else if (cookie_its) { | 2112 } else if (cookie_its) { |
2150 cookie_its->push_back(curr_cookie_it); | 2113 cookie_its->push_back(curr_cookie_it); |
2151 } | 2114 } |
2152 } | 2115 } |
2153 | 2116 |
2154 return num_deleted; | 2117 return num_deleted; |
2155 } | 2118 } |
2156 | 2119 |
2157 size_t CookieMonster::GarbageCollectDeleteRange( | 2120 size_t CookieMonster::GarbageCollectDeleteRange( |
2158 const Time& current, | 2121 const Time& current, |
2159 DeletionCause cause, | 2122 DeletionCause cause, |
2160 CookieItVector::iterator it_begin, | 2123 CookieItVector::iterator it_begin, |
2161 CookieItVector::iterator it_end) { | 2124 CookieItVector::iterator it_end) { |
2125 DCHECK(thread_checker_.CalledOnValidThread()); | |
2126 | |
2162 for (CookieItVector::iterator it = it_begin; it != it_end; it++) { | 2127 for (CookieItVector::iterator it = it_begin; it != it_end; it++) { |
2163 histogram_evicted_last_access_minutes_->Add( | 2128 histogram_evicted_last_access_minutes_->Add( |
2164 (current - (*it)->second->LastAccessDate()).InMinutes()); | 2129 (current - (*it)->second->LastAccessDate()).InMinutes()); |
2165 InternalDeleteCookie((*it), true, cause); | 2130 InternalDeleteCookie((*it), true, cause); |
2166 } | 2131 } |
2167 return it_end - it_begin; | 2132 return it_end - it_begin; |
2168 } | 2133 } |
2169 | 2134 |
2170 size_t CookieMonster::GarbageCollectLeastRecentlyAccessed( | 2135 size_t CookieMonster::GarbageCollectLeastRecentlyAccessed( |
2171 const base::Time& current, | 2136 const base::Time& current, |
2172 const base::Time& safe_date, | 2137 const base::Time& safe_date, |
2173 size_t purge_goal, | 2138 size_t purge_goal, |
2174 CookieItVector cookie_its) { | 2139 CookieItVector cookie_its) { |
2140 DCHECK(thread_checker_.CalledOnValidThread()); | |
2141 | |
2175 // Sorts up to *and including* |cookie_its[purge_goal]|, so | 2142 // Sorts up to *and including* |cookie_its[purge_goal]|, so |
2176 // |earliest_access_time| will be properly assigned even if | 2143 // |earliest_access_time| will be properly assigned even if |
2177 // |global_purge_it| == |cookie_its.begin() + purge_goal|. | 2144 // |global_purge_it| == |cookie_its.begin() + purge_goal|. |
2178 SortLeastRecentlyAccessed(cookie_its.begin(), cookie_its.end(), purge_goal); | 2145 SortLeastRecentlyAccessed(cookie_its.begin(), cookie_its.end(), purge_goal); |
2179 // Find boundary to cookies older than safe_date. | 2146 // Find boundary to cookies older than safe_date. |
2180 CookieItVector::iterator global_purge_it = LowerBoundAccessDate( | 2147 CookieItVector::iterator global_purge_it = LowerBoundAccessDate( |
2181 cookie_its.begin(), cookie_its.begin() + purge_goal, safe_date); | 2148 cookie_its.begin(), cookie_its.begin() + purge_goal, safe_date); |
2182 // Only delete the old cookies, and if strict secure is enabled, delete | 2149 // Only delete the old cookies, and if strict secure is enabled, delete |
2183 // non-secure ones first. | 2150 // non-secure ones first. |
2184 size_t num_deleted = | 2151 size_t num_deleted = |
(...skipping 21 matching lines...) Expand all Loading... | |
2206 // Arguably the right thing to do here is to make the key | 2173 // Arguably the right thing to do here is to make the key |
2207 // algorithm dependent on the scheme, and make sure that the scheme is | 2174 // algorithm dependent on the scheme, and make sure that the scheme is |
2208 // available everywhere the key must be obtained (specfically at backing | 2175 // available everywhere the key must be obtained (specfically at backing |
2209 // store load time). This would require either changing the backing store | 2176 // store load time). This would require either changing the backing store |
2210 // database schema to include the scheme (far more trouble than it's worth), or | 2177 // database schema to include the scheme (far more trouble than it's worth), or |
2211 // separating out file cookies into their own CookieMonster instance and | 2178 // separating out file cookies into their own CookieMonster instance and |
2212 // thus restricting each scheme to a single cookie monster (which might | 2179 // thus restricting each scheme to a single cookie monster (which might |
2213 // be worth it, but is still too much trouble to solve what is currently a | 2180 // be worth it, but is still too much trouble to solve what is currently a |
2214 // non-problem). | 2181 // non-problem). |
2215 std::string CookieMonster::GetKey(const std::string& domain) const { | 2182 std::string CookieMonster::GetKey(const std::string& domain) const { |
2183 DCHECK(thread_checker_.CalledOnValidThread()); | |
2184 | |
2216 std::string effective_domain( | 2185 std::string effective_domain( |
2217 registry_controlled_domains::GetDomainAndRegistry( | 2186 registry_controlled_domains::GetDomainAndRegistry( |
2218 domain, registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES)); | 2187 domain, registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES)); |
2219 if (effective_domain.empty()) | 2188 if (effective_domain.empty()) |
2220 effective_domain = domain; | 2189 effective_domain = domain; |
2221 | 2190 |
2222 if (!effective_domain.empty() && effective_domain[0] == '.') | 2191 if (!effective_domain.empty() && effective_domain[0] == '.') |
2223 return effective_domain.substr(1); | 2192 return effective_domain.substr(1); |
2224 return effective_domain; | 2193 return effective_domain; |
2225 } | 2194 } |
2226 | 2195 |
2227 bool CookieMonster::HasCookieableScheme(const GURL& url) { | 2196 bool CookieMonster::HasCookieableScheme(const GURL& url) { |
2228 lock_.AssertAcquired(); | 2197 DCHECK(thread_checker_.CalledOnValidThread()); |
2229 | 2198 |
2230 // Make sure the request is on a cookie-able url scheme. | 2199 // Make sure the request is on a cookie-able url scheme. |
2231 for (size_t i = 0; i < cookieable_schemes_.size(); ++i) { | 2200 for (size_t i = 0; i < cookieable_schemes_.size(); ++i) { |
2232 // We matched a scheme. | 2201 // We matched a scheme. |
2233 if (url.SchemeIs(cookieable_schemes_[i].c_str())) { | 2202 if (url.SchemeIs(cookieable_schemes_[i].c_str())) { |
2234 // We've matched a supported scheme. | 2203 // We've matched a supported scheme. |
2235 return true; | 2204 return true; |
2236 } | 2205 } |
2237 } | 2206 } |
2238 | 2207 |
2239 // The scheme didn't match any in our whitelist. | 2208 // The scheme didn't match any in our whitelist. |
2240 VLOG(kVlogPerCookieMonster) | 2209 VLOG(kVlogPerCookieMonster) |
2241 << "WARNING: Unsupported cookie scheme: " << url.scheme(); | 2210 << "WARNING: Unsupported cookie scheme: " << url.scheme(); |
2242 return false; | 2211 return false; |
2243 } | 2212 } |
2244 | 2213 |
2245 // Test to see if stats should be recorded, and record them if so. | 2214 // Test to see if stats should be recorded, and record them if so. |
2246 // The goal here is to get sampling for the average browser-hour of | 2215 // The goal here is to get sampling for the average browser-hour of |
2247 // activity. We won't take samples when the web isn't being surfed, | 2216 // activity. We won't take samples when the web isn't being surfed, |
2248 // and when the web is being surfed, we'll take samples about every | 2217 // and when the web is being surfed, we'll take samples about every |
2249 // kRecordStatisticsIntervalSeconds. | 2218 // kRecordStatisticsIntervalSeconds. |
2250 // last_statistic_record_time_ is initialized to Now() rather than null | 2219 // last_statistic_record_time_ is initialized to Now() rather than null |
2251 // in the constructor so that we won't take statistics right after | 2220 // in the constructor so that we won't take statistics right after |
2252 // startup, to avoid bias from browsers that are started but not used. | 2221 // startup, to avoid bias from browsers that are started but not used. |
2253 void CookieMonster::RecordPeriodicStats(const base::Time& current_time) { | 2222 void CookieMonster::RecordPeriodicStats(const base::Time& current_time) { |
2223 DCHECK(thread_checker_.CalledOnValidThread()); | |
2224 | |
2254 const base::TimeDelta kRecordStatisticsIntervalTime( | 2225 const base::TimeDelta kRecordStatisticsIntervalTime( |
2255 base::TimeDelta::FromSeconds(kRecordStatisticsIntervalSeconds)); | 2226 base::TimeDelta::FromSeconds(kRecordStatisticsIntervalSeconds)); |
2256 | 2227 |
2257 // If we've taken statistics recently, return. | 2228 // If we've taken statistics recently, return. |
2258 if (current_time - last_statistic_record_time_ <= | 2229 if (current_time - last_statistic_record_time_ <= |
2259 kRecordStatisticsIntervalTime) { | 2230 kRecordStatisticsIntervalTime) { |
2260 return; | 2231 return; |
2261 } | 2232 } |
2262 | 2233 |
2263 // See InitializeHistograms() for details. | 2234 // See InitializeHistograms() for details. |
(...skipping 20 matching lines...) Expand all Loading... | |
2284 // Note that these variables refer to the same underlying histogram, | 2255 // Note that these variables refer to the same underlying histogram, |
2285 // so we still race (but safely) with other CookieMonster instances | 2256 // so we still race (but safely) with other CookieMonster instances |
2286 // for accumulation. | 2257 // for accumulation. |
2287 // | 2258 // |
2288 // To do this we've expanded out the individual histogram macros calls, | 2259 // To do this we've expanded out the individual histogram macros calls, |
2289 // with declarations of the variables in the class decl, initialization here | 2260 // with declarations of the variables in the class decl, initialization here |
2290 // (done from the class constructor) and direct calls to the accumulation | 2261 // (done from the class constructor) and direct calls to the accumulation |
2291 // methods where needed. The specific histogram macro calls on which the | 2262 // methods where needed. The specific histogram macro calls on which the |
2292 // initialization is based are included in comments below. | 2263 // initialization is based are included in comments below. |
2293 void CookieMonster::InitializeHistograms() { | 2264 void CookieMonster::InitializeHistograms() { |
2265 DCHECK(thread_checker_.CalledOnValidThread()); | |
2266 | |
2294 // From UMA_HISTOGRAM_CUSTOM_COUNTS | 2267 // From UMA_HISTOGRAM_CUSTOM_COUNTS |
2295 histogram_expiration_duration_minutes_ = base::Histogram::FactoryGet( | 2268 histogram_expiration_duration_minutes_ = base::Histogram::FactoryGet( |
2296 "Cookie.ExpirationDurationMinutes", 1, kMinutesInTenYears, 50, | 2269 "Cookie.ExpirationDurationMinutes", 1, kMinutesInTenYears, 50, |
2297 base::Histogram::kUmaTargetedHistogramFlag); | 2270 base::Histogram::kUmaTargetedHistogramFlag); |
2298 histogram_evicted_last_access_minutes_ = base::Histogram::FactoryGet( | 2271 histogram_evicted_last_access_minutes_ = base::Histogram::FactoryGet( |
2299 "Cookie.EvictedLastAccessMinutes", 1, kMinutesInTenYears, 50, | 2272 "Cookie.EvictedLastAccessMinutes", 1, kMinutesInTenYears, 50, |
2300 base::Histogram::kUmaTargetedHistogramFlag); | 2273 base::Histogram::kUmaTargetedHistogramFlag); |
2301 histogram_count_ = base::Histogram::FactoryGet( | 2274 histogram_count_ = base::Histogram::FactoryGet( |
2302 "Cookie.Count", 1, 4000, 50, base::Histogram::kUmaTargetedHistogramFlag); | 2275 "Cookie.Count", 1, 4000, 50, base::Histogram::kUmaTargetedHistogramFlag); |
2303 | 2276 |
(...skipping 23 matching lines...) Expand all Loading... | |
2327 // The system resolution is not high enough, so we can have multiple | 2300 // The system resolution is not high enough, so we can have multiple |
2328 // set cookies that result in the same system time. When this happens, we | 2301 // set cookies that result in the same system time. When this happens, we |
2329 // increment by one Time unit. Let's hope computers don't get too fast. | 2302 // increment by one Time unit. Let's hope computers don't get too fast. |
2330 Time CookieMonster::CurrentTime() { | 2303 Time CookieMonster::CurrentTime() { |
2331 return std::max(Time::Now(), Time::FromInternalValue( | 2304 return std::max(Time::Now(), Time::FromInternalValue( |
2332 last_time_seen_.ToInternalValue() + 1)); | 2305 last_time_seen_.ToInternalValue() + 1)); |
2333 } | 2306 } |
2334 | 2307 |
2335 void CookieMonster::DoCookieTask( | 2308 void CookieMonster::DoCookieTask( |
2336 const scoped_refptr<CookieMonsterTask>& task_item) { | 2309 const scoped_refptr<CookieMonsterTask>& task_item) { |
2337 { | 2310 DCHECK(thread_checker_.CalledOnValidThread()); |
2338 base::AutoLock autolock(lock_); | 2311 |
2339 MarkCookieStoreAsInitialized(); | 2312 MarkCookieStoreAsInitialized(); |
2340 FetchAllCookiesIfNecessary(); | 2313 FetchAllCookiesIfNecessary(); |
2341 if (!finished_fetching_all_cookies_ && store_.get()) { | 2314 |
2342 tasks_pending_.push(task_item); | 2315 if (!finished_fetching_all_cookies_ && store_.get()) { |
2343 return; | 2316 tasks_pending_.push(task_item); |
2344 } | 2317 return; |
2345 } | 2318 } |
2346 | 2319 |
2347 task_item->Run(); | 2320 task_item->Run(); |
2348 } | 2321 } |
2349 | 2322 |
2350 void CookieMonster::DoCookieTaskForURL( | 2323 void CookieMonster::DoCookieTaskForURL( |
2351 const scoped_refptr<CookieMonsterTask>& task_item, | 2324 const scoped_refptr<CookieMonsterTask>& task_item, |
2352 const GURL& url) { | 2325 const GURL& url) { |
2353 { | 2326 DCHECK(thread_checker_.CalledOnValidThread()); |
2354 base::AutoLock autolock(lock_); | 2327 |
2355 MarkCookieStoreAsInitialized(); | 2328 MarkCookieStoreAsInitialized(); |
2356 if (ShouldFetchAllCookiesWhenFetchingAnyCookie()) | 2329 if (ShouldFetchAllCookiesWhenFetchingAnyCookie()) |
2357 FetchAllCookiesIfNecessary(); | 2330 FetchAllCookiesIfNecessary(); |
2358 // If cookies for the requested domain key (eTLD+1) have been loaded from DB | 2331 |
2359 // then run the task, otherwise load from DB. | 2332 // If cookies for the requested domain key (eTLD+1) have been loaded from DB |
2360 if (!finished_fetching_all_cookies_ && store_.get()) { | 2333 // then run the task, otherwise load from DB. |
2361 // Checks if the domain key has been loaded. | 2334 if (!finished_fetching_all_cookies_ && store_.get()) { |
2362 std::string key( | 2335 // Checks if the domain key has been loaded. |
2363 cookie_util::GetEffectiveDomain(url.scheme(), url.host())); | 2336 std::string key(cookie_util::GetEffectiveDomain(url.scheme(), url.host())); |
2364 if (keys_loaded_.find(key) == keys_loaded_.end()) { | 2337 if (keys_loaded_.find(key) == keys_loaded_.end()) { |
2365 std::map<std::string, | 2338 std::map<std::string, |
2366 std::deque<scoped_refptr<CookieMonsterTask>>>::iterator it = | 2339 std::deque<scoped_refptr<CookieMonsterTask>>>::iterator it = |
2367 tasks_pending_for_key_.find(key); | 2340 tasks_pending_for_key_.find(key); |
2368 if (it == tasks_pending_for_key_.end()) { | 2341 if (it == tasks_pending_for_key_.end()) { |
2369 store_->LoadCookiesForKey( | 2342 store_->LoadCookiesForKey( |
2370 key, base::Bind(&CookieMonster::OnKeyLoaded, this, key)); | 2343 key, base::Bind(&CookieMonster::OnKeyLoaded, |
2371 it = tasks_pending_for_key_ | 2344 weak_ptr_factory_.GetWeakPtr(), key)); |
2372 .insert(std::make_pair( | 2345 it = tasks_pending_for_key_ |
2373 key, std::deque<scoped_refptr<CookieMonsterTask>>())) | 2346 .insert(std::make_pair( |
2374 .first; | 2347 key, std::deque<scoped_refptr<CookieMonsterTask>>())) |
2375 } | 2348 .first; |
2376 it->second.push_back(task_item); | |
2377 return; | |
2378 } | 2349 } |
2350 it->second.push_back(task_item); | |
2351 return; | |
2379 } | 2352 } |
2380 } | 2353 } |
2354 | |
2381 task_item->Run(); | 2355 task_item->Run(); |
2382 } | 2356 } |
2383 | 2357 |
2384 void CookieMonster::ComputeCookieDiff(CookieList* old_cookies, | 2358 void CookieMonster::ComputeCookieDiff(CookieList* old_cookies, |
2385 CookieList* new_cookies, | 2359 CookieList* new_cookies, |
2386 CookieList* cookies_to_add, | 2360 CookieList* cookies_to_add, |
2387 CookieList* cookies_to_delete) { | 2361 CookieList* cookies_to_delete) { |
2362 DCHECK(thread_checker_.CalledOnValidThread()); | |
2363 | |
2388 DCHECK(old_cookies); | 2364 DCHECK(old_cookies); |
2389 DCHECK(new_cookies); | 2365 DCHECK(new_cookies); |
2390 DCHECK(cookies_to_add); | 2366 DCHECK(cookies_to_add); |
2391 DCHECK(cookies_to_delete); | 2367 DCHECK(cookies_to_delete); |
2392 DCHECK(cookies_to_add->empty()); | 2368 DCHECK(cookies_to_add->empty()); |
2393 DCHECK(cookies_to_delete->empty()); | 2369 DCHECK(cookies_to_delete->empty()); |
2394 | 2370 |
2395 // Sort both lists. | 2371 // Sort both lists. |
2396 // A set ordered by FullDiffCookieSorter is also ordered by | 2372 // A set ordered by FullDiffCookieSorter is also ordered by |
2397 // PartialDiffCookieSorter. | 2373 // PartialDiffCookieSorter. |
2398 std::sort(old_cookies->begin(), old_cookies->end(), FullDiffCookieSorter); | 2374 std::sort(old_cookies->begin(), old_cookies->end(), FullDiffCookieSorter); |
2399 std::sort(new_cookies->begin(), new_cookies->end(), FullDiffCookieSorter); | 2375 std::sort(new_cookies->begin(), new_cookies->end(), FullDiffCookieSorter); |
2400 | 2376 |
2401 // Select any old cookie for deletion if no new cookie has the same name, | 2377 // Select any old cookie for deletion if no new cookie has the same name, |
2402 // domain, and path. | 2378 // domain, and path. |
2403 std::set_difference( | 2379 std::set_difference( |
2404 old_cookies->begin(), old_cookies->end(), new_cookies->begin(), | 2380 old_cookies->begin(), old_cookies->end(), new_cookies->begin(), |
2405 new_cookies->end(), | 2381 new_cookies->end(), |
2406 std::inserter(*cookies_to_delete, cookies_to_delete->begin()), | 2382 std::inserter(*cookies_to_delete, cookies_to_delete->begin()), |
2407 PartialDiffCookieSorter); | 2383 PartialDiffCookieSorter); |
2408 | 2384 |
2409 // Select any new cookie for addition (or update) if no old cookie is exactly | 2385 // Select any new cookie for addition (or update) if no old cookie is exactly |
2410 // equivalent. | 2386 // equivalent. |
2411 std::set_difference(new_cookies->begin(), new_cookies->end(), | 2387 std::set_difference(new_cookies->begin(), new_cookies->end(), |
2412 old_cookies->begin(), old_cookies->end(), | 2388 old_cookies->begin(), old_cookies->end(), |
2413 std::inserter(*cookies_to_add, cookies_to_add->begin()), | 2389 std::inserter(*cookies_to_add, cookies_to_add->begin()), |
2414 FullDiffCookieSorter); | 2390 FullDiffCookieSorter); |
2415 } | 2391 } |
2416 | 2392 |
2417 void CookieMonster::RunCallbacks(const CanonicalCookie& cookie, bool removed) { | 2393 void CookieMonster::RunCallback(const base::Closure& callback) { |
2418 lock_.AssertAcquired(); | 2394 DCHECK(thread_checker_.CalledOnValidThread()); |
2395 callback.Run(); | |
2396 } | |
2397 | |
2398 void CookieMonster::RunCookieChangedCallbacks(const CanonicalCookie& cookie, | |
2399 bool removed) { | |
2400 DCHECK(thread_checker_.CalledOnValidThread()); | |
2401 | |
2419 CookieOptions opts; | 2402 CookieOptions opts; |
2420 opts.set_include_httponly(); | 2403 opts.set_include_httponly(); |
2421 opts.set_include_same_site(); | 2404 opts.set_include_same_site(); |
2422 // Note that the callbacks in hook_map_ are wrapped with MakeAsync(), so they | 2405 // Note that the callbacks in hook_map_ are wrapped with RunAsync(), so they |
2423 // are guaranteed to not take long - they just post a RunAsync task back to | 2406 // are guaranteed to not take long - they just post a RunAsync task back to |
2424 // the appropriate thread's message loop and return. It is important that this | 2407 // the appropriate thread's message loop and return. |
2425 // method not run user-supplied callbacks directly, since the CookieMonster | 2408 // TODO(mmenke): Consider running these synchronously? |
2426 // lock is held and it is easy to accidentally introduce deadlocks. | |
2427 for (CookieChangedHookMap::iterator it = hook_map_.begin(); | 2409 for (CookieChangedHookMap::iterator it = hook_map_.begin(); |
2428 it != hook_map_.end(); ++it) { | 2410 it != hook_map_.end(); ++it) { |
2429 std::pair<GURL, std::string> key = it->first; | 2411 std::pair<GURL, std::string> key = it->first; |
2430 if (cookie.IncludeForRequestURL(key.first, opts) && | 2412 if (cookie.IncludeForRequestURL(key.first, opts) && |
2431 cookie.Name() == key.second) { | 2413 cookie.Name() == key.second) { |
2432 it->second->Notify(cookie, removed); | 2414 it->second->Notify(cookie, removed); |
2433 } | 2415 } |
2434 } | 2416 } |
2435 } | 2417 } |
2436 | 2418 |
2437 } // namespace net | 2419 } // namespace net |
OLD | NEW |