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

Side by Side Diff: ios/net/cookies/cookie_store_ios.mm

Issue 1701063002: CookieStore: Remove reference counting. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@threadsafe
Patch Set: merge Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ios/net/cookies/cookie_store_ios.h ('k') | ios/net/cookies/cookie_store_ios_unittest.mm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 #include "ios/net/cookies/cookie_store_ios.h" 5 #include "ios/net/cookies/cookie_store_ios.h"
6 6
7 #import <Foundation/Foundation.h> 7 #import <Foundation/Foundation.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 285
286 CookieStoreIOS::CookieStoreIOS( 286 CookieStoreIOS::CookieStoreIOS(
287 net::CookieMonster::PersistentCookieStore* persistent_store) 287 net::CookieMonster::PersistentCookieStore* persistent_store)
288 : CookieStoreIOS(persistent_store, 288 : CookieStoreIOS(persistent_store,
289 [NSHTTPCookieStorage sharedHTTPCookieStorage]) { 289 [NSHTTPCookieStorage sharedHTTPCookieStorage]) {
290 } 290 }
291 291
292 CookieStoreIOS::CookieStoreIOS( 292 CookieStoreIOS::CookieStoreIOS(
293 net::CookieMonster::PersistentCookieStore* persistent_store, 293 net::CookieMonster::PersistentCookieStore* persistent_store,
294 NSHTTPCookieStorage* system_store) 294 NSHTTPCookieStorage* system_store)
295 : system_store_(system_store), 295 : cookie_monster_(new net::CookieMonster(persistent_store, nullptr)),
296 system_store_(system_store),
296 creation_time_manager_(new CookieCreationTimeManager), 297 creation_time_manager_(new CookieCreationTimeManager),
297 metrics_enabled_(false), 298 metrics_enabled_(false),
298 flush_delay_(base::TimeDelta::FromSeconds(10)), 299 flush_delay_(base::TimeDelta::FromSeconds(10)),
299 synchronization_state_(NOT_SYNCHRONIZED), 300 synchronization_state_(NOT_SYNCHRONIZED),
300 cookie_cache_(new CookieCache()) { 301 cookie_cache_(new CookieCache()),
302 weak_factory_(this) {
301 DCHECK(system_store); 303 DCHECK(system_store);
302 304
303 NotificationTrampoline::GetInstance()->AddObserver(this); 305 NotificationTrampoline::GetInstance()->AddObserver(this);
304 cookie_monster_ = new net::CookieMonster(persistent_store, nullptr); 306
305 cookie_monster_->SetPersistSessionCookies(true); 307 cookie_monster_->SetPersistSessionCookies(true);
306 cookie_monster_->SetForceKeepSessionState(); 308 cookie_monster_->SetForceKeepSessionState();
307 } 309 }
308 310
311 CookieStoreIOS::~CookieStoreIOS() {
312 NotificationTrampoline::GetInstance()->RemoveObserver(this);
313 STLDeleteContainerPairSecondPointers(hook_map_.begin(), hook_map_.end());
314 }
315
309 // static 316 // static
310 void CookieStoreIOS::SetCookiePolicy(CookiePolicy setting) { 317 void CookieStoreIOS::SetCookiePolicy(CookiePolicy setting) {
311 NSHTTPCookieAcceptPolicy policy = (setting == ALLOW) 318 NSHTTPCookieAcceptPolicy policy = (setting == ALLOW)
312 ? NSHTTPCookieAcceptPolicyAlways 319 ? NSHTTPCookieAcceptPolicyAlways
313 : NSHTTPCookieAcceptPolicyNever; 320 : NSHTTPCookieAcceptPolicyNever;
314 NSHTTPCookieStorage* store = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 321 NSHTTPCookieStorage* store = [NSHTTPCookieStorage sharedHTTPCookieStorage];
315 NSHTTPCookieAcceptPolicy current_policy = [store cookieAcceptPolicy]; 322 NSHTTPCookieAcceptPolicy current_policy = [store cookieAcceptPolicy];
316 if (current_policy == policy) 323 if (current_policy == policy)
317 return; 324 return;
318 [store setCookieAcceptPolicy:policy]; 325 [store setCookieAcceptPolicy:policy];
319 NotificationTrampoline::GetInstance()->NotifyCookiePolicyChanged(); 326 NotificationTrampoline::GetInstance()->NotifyCookiePolicyChanged();
320 } 327 }
321 328
322 // static 329 // static
323 CookieStoreIOS* CookieStoreIOS::CreateCookieStore( 330 scoped_ptr<CookieStoreIOS> CookieStoreIOS::CreateCookieStore(
324 NSHTTPCookieStorage* cookie_storage) { 331 NSHTTPCookieStorage* cookie_storage) {
325 DCHECK(cookie_storage); 332 DCHECK(cookie_storage);
326 // TODO(huey): Update this when CrNet supports multiple cookie jars. 333 // TODO(huey): Update this when CrNet supports multiple cookie jars.
327 [cookie_storage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; 334 [cookie_storage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
328 335
329 // Create a cookie store with no persistent store backing. Then, populate 336 // Create a cookie store with no persistent store backing. Then, populate
330 // it from the system's cookie jar. 337 // it from the system's cookie jar.
331 CookieStoreIOS* cookie_store = new CookieStoreIOS(nullptr, cookie_storage); 338 scoped_ptr<CookieStoreIOS> cookie_store(
339 new CookieStoreIOS(nullptr, cookie_storage));
332 cookie_store->synchronization_state_ = SYNCHRONIZED; 340 cookie_store->synchronization_state_ = SYNCHRONIZED;
333 cookie_store->FlushStore(base::Closure()); 341 cookie_store->FlushStore(base::Closure());
334 return cookie_store; 342 return cookie_store;
335 } 343 }
336 344
337 // static 345 // static
338 void CookieStoreIOS::SwitchSynchronizedStore(CookieStoreIOS* old_store, 346 void CookieStoreIOS::SwitchSynchronizedStore(CookieStoreIOS* old_store,
339 CookieStoreIOS* new_store) { 347 CookieStoreIOS* new_store) {
340 DCHECK(new_store); 348 DCHECK(new_store);
341 DCHECK_NE(new_store, old_store); 349 DCHECK_NE(new_store, old_store);
(...skipping 29 matching lines...) Expand all
371 const SetCookiesCallback& callback) { 379 const SetCookiesCallback& callback) {
372 DCHECK(thread_checker_.CalledOnValidThread()); 380 DCHECK(thread_checker_.CalledOnValidThread());
373 381
374 switch (synchronization_state_) { 382 switch (synchronization_state_) {
375 case NOT_SYNCHRONIZED: 383 case NOT_SYNCHRONIZED:
376 cookie_monster_->SetCookieWithOptionsAsync(url, cookie_line, options, 384 cookie_monster_->SetCookieWithOptionsAsync(url, cookie_line, options,
377 WrapSetCallback(callback)); 385 WrapSetCallback(callback));
378 break; 386 break;
379 case SYNCHRONIZING: 387 case SYNCHRONIZING:
380 tasks_pending_synchronization_.push_back( 388 tasks_pending_synchronization_.push_back(
381 base::Bind(&CookieStoreIOS::SetCookieWithOptionsAsync, this, url, 389 base::Bind(&CookieStoreIOS::SetCookieWithOptionsAsync,
382 cookie_line, options, WrapSetCallback(callback))); 390 weak_factory_.GetWeakPtr(), url, cookie_line, options,
391 WrapSetCallback(callback)));
383 break; 392 break;
384 case SYNCHRONIZED: 393 case SYNCHRONIZED:
385 // The exclude_httponly() option would only be used by a javascript 394 // The exclude_httponly() option would only be used by a javascript
386 // engine. 395 // engine.
387 DCHECK(!options.exclude_httponly()); 396 DCHECK(!options.exclude_httponly());
388 // If cookies are not allowed, they are stashed in the CookieMonster, and 397 // If cookies are not allowed, they are stashed in the CookieMonster, and
389 // should be written there instead. 398 // should be written there instead.
390 DCHECK(SystemCookiesAllowed()); 399 DCHECK(SystemCookiesAllowed());
391 400
392 base::Time server_time = 401 base::Time server_time =
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 DCHECK(thread_checker_.CalledOnValidThread()); 456 DCHECK(thread_checker_.CalledOnValidThread());
448 457
449 switch (synchronization_state_) { 458 switch (synchronization_state_) {
450 case NOT_SYNCHRONIZED: 459 case NOT_SYNCHRONIZED:
451 cookie_monster_->SetCookieWithDetailsAsync( 460 cookie_monster_->SetCookieWithDetailsAsync(
452 url, name, value, domain, path, creation_time, expiration_time, 461 url, name, value, domain, path, creation_time, expiration_time,
453 last_access_time, secure, http_only, same_site, enforce_strict_secure, 462 last_access_time, secure, http_only, same_site, enforce_strict_secure,
454 priority, WrapSetCallback(callback)); 463 priority, WrapSetCallback(callback));
455 break; 464 break;
456 case SYNCHRONIZING: 465 case SYNCHRONIZING:
457 tasks_pending_synchronization_.push_back(base::Bind( 466 tasks_pending_synchronization_.push_back(
458 &CookieStoreIOS::SetCookieWithDetailsAsync, this, url, name, value, 467 base::Bind(&CookieStoreIOS::SetCookieWithDetailsAsync,
459 domain, path, creation_time, expiration_time, last_access_time, 468 weak_factory_.GetWeakPtr(), url, name, value, domain, path,
460 secure, http_only, same_site, enforce_strict_secure, priority, 469 creation_time, expiration_time, last_access_time, secure,
461 WrapSetCallback(callback))); 470 http_only, same_site, enforce_strict_secure, priority,
471 WrapSetCallback(callback)));
462 break; 472 break;
463 case SYNCHRONIZED: 473 case SYNCHRONIZED:
464 // If cookies are not allowed, they are stashed in the CookieMonster, and 474 // If cookies are not allowed, they are stashed in the CookieMonster, and
465 // should be written there instead. 475 // should be written there instead.
466 DCHECK(SystemCookiesAllowed()); 476 DCHECK(SystemCookiesAllowed());
467 477
468 bool success = false; 478 bool success = false;
469 479
470 if (creation_time.is_null()) 480 if (creation_time.is_null())
471 creation_time = base::Time::Now(); 481 creation_time = base::Time::Now();
(...skipping 30 matching lines...) Expand all
502 const net::CookieOptions& options, 512 const net::CookieOptions& options,
503 const GetCookiesCallback& callback) { 513 const GetCookiesCallback& callback) {
504 DCHECK(thread_checker_.CalledOnValidThread()); 514 DCHECK(thread_checker_.CalledOnValidThread());
505 515
506 switch (synchronization_state_) { 516 switch (synchronization_state_) {
507 case NOT_SYNCHRONIZED: 517 case NOT_SYNCHRONIZED:
508 cookie_monster_->GetCookiesWithOptionsAsync(url, options, callback); 518 cookie_monster_->GetCookiesWithOptionsAsync(url, options, callback);
509 break; 519 break;
510 case SYNCHRONIZING: 520 case SYNCHRONIZING:
511 tasks_pending_synchronization_.push_back( 521 tasks_pending_synchronization_.push_back(
512 base::Bind(&CookieStoreIOS::GetCookiesWithOptionsAsync, this, url, 522 base::Bind(&CookieStoreIOS::GetCookiesWithOptionsAsync,
513 options, callback)); 523 weak_factory_.GetWeakPtr(), url, options, callback));
514 break; 524 break;
515 case SYNCHRONIZED: 525 case SYNCHRONIZED:
516 // If cookies are not allowed, they are stashed in the CookieMonster, and 526 // If cookies are not allowed, they are stashed in the CookieMonster, and
517 // should be read from there instead. 527 // should be read from there instead.
518 DCHECK(SystemCookiesAllowed()); 528 DCHECK(SystemCookiesAllowed());
519 // The exclude_httponly() option would only be used by a javascript 529 // The exclude_httponly() option would only be used by a javascript
520 // engine. 530 // engine.
521 DCHECK(!options.exclude_httponly()); 531 DCHECK(!options.exclude_httponly());
522 532
523 // TODO(mkwst): If/when iOS supports Same-Site cookies, we'll need to pass 533 // TODO(mkwst): If/when iOS supports Same-Site cookies, we'll need to pass
(...skipping 11 matching lines...) Expand all
535 const net::CookieOptions& options, 545 const net::CookieOptions& options,
536 const GetCookieListCallback& callback) { 546 const GetCookieListCallback& callback) {
537 DCHECK(thread_checker_.CalledOnValidThread()); 547 DCHECK(thread_checker_.CalledOnValidThread());
538 548
539 switch (synchronization_state_) { 549 switch (synchronization_state_) {
540 case NOT_SYNCHRONIZED: 550 case NOT_SYNCHRONIZED:
541 cookie_monster_->GetCookieListWithOptionsAsync(url, options, callback); 551 cookie_monster_->GetCookieListWithOptionsAsync(url, options, callback);
542 break; 552 break;
543 case SYNCHRONIZING: 553 case SYNCHRONIZING:
544 tasks_pending_synchronization_.push_back( 554 tasks_pending_synchronization_.push_back(
545 base::Bind(&CookieStoreIOS::GetCookieListWithOptionsAsync, this, url, 555 base::Bind(&CookieStoreIOS::GetCookieListWithOptionsAsync,
546 options, callback)); 556 weak_factory_.GetWeakPtr(), url, options, callback));
547 break; 557 break;
548 case SYNCHRONIZED: 558 case SYNCHRONIZED:
549 if (!SystemCookiesAllowed()) { 559 if (!SystemCookiesAllowed()) {
550 // If cookies are not allowed, the cookies are stashed in the 560 // If cookies are not allowed, the cookies are stashed in the
551 // CookieMonster, so get them from there. 561 // CookieMonster, so get them from there.
552 cookie_monster_->GetCookieListWithOptionsAsync(url, options, callback); 562 cookie_monster_->GetCookieListWithOptionsAsync(url, options, callback);
553 return; 563 return;
554 } 564 }
555 565
556 // TODO(mkwst): If/when iOS supports Same-Site cookies, we'll need to pass 566 // TODO(mkwst): If/when iOS supports Same-Site cookies, we'll need to pass
557 // options in here as well. https://crbug.com/459154 567 // options in here as well. https://crbug.com/459154
558 NSArray* cookies = GetCookiesForURL(system_store_, 568 NSArray* cookies = GetCookiesForURL(system_store_,
559 url, creation_time_manager_.get()); 569 url, creation_time_manager_.get());
560 net::CookieList cookie_list = CanonicalCookieListFromSystemCookies( 570 net::CookieList cookie_list = CanonicalCookieListFromSystemCookies(
561 cookies); 571 cookies);
562 if (!callback.is_null()) 572 if (!callback.is_null())
563 callback.Run(cookie_list); 573 callback.Run(cookie_list);
564 break; 574 break;
565 } 575 }
566 } 576 }
567 577
568 void CookieStoreIOS::GetAllCookiesAsync(const GetCookieListCallback& callback) { 578 void CookieStoreIOS::GetAllCookiesAsync(const GetCookieListCallback& callback) {
569 DCHECK(thread_checker_.CalledOnValidThread()); 579 DCHECK(thread_checker_.CalledOnValidThread());
570 580
571 switch (synchronization_state_) { 581 switch (synchronization_state_) {
572 case NOT_SYNCHRONIZED: 582 case NOT_SYNCHRONIZED:
573 cookie_monster_->GetAllCookiesAsync(callback); 583 cookie_monster_->GetAllCookiesAsync(callback);
574 break; 584 break;
575 case SYNCHRONIZING: 585 case SYNCHRONIZING:
576 tasks_pending_synchronization_.push_back(base::Bind( 586 tasks_pending_synchronization_.push_back(
577 &CookieStoreIOS::GetAllCookiesAsync, this, callback)); 587 base::Bind(&CookieStoreIOS::GetAllCookiesAsync,
588 weak_factory_.GetWeakPtr(), callback));
578 break; 589 break;
579 case SYNCHRONIZED: 590 case SYNCHRONIZED:
580 if (!SystemCookiesAllowed()) { 591 if (!SystemCookiesAllowed()) {
581 // If cookies are not allowed, the cookies are stashed in the 592 // If cookies are not allowed, the cookies are stashed in the
582 // CookieMonster, so get them from there. 593 // CookieMonster, so get them from there.
583 cookie_monster_->GetAllCookiesAsync(callback); 594 cookie_monster_->GetAllCookiesAsync(callback);
584 return; 595 return;
585 } 596 }
586 597
587 NSArray* cookies = GetAllCookies(system_store_, 598 NSArray* cookies = GetAllCookies(system_store_,
(...skipping 11 matching lines...) Expand all
599 const std::string& cookie_name, 610 const std::string& cookie_name,
600 const base::Closure& callback) { 611 const base::Closure& callback) {
601 DCHECK(thread_checker_.CalledOnValidThread()); 612 DCHECK(thread_checker_.CalledOnValidThread());
602 613
603 switch (synchronization_state_) { 614 switch (synchronization_state_) {
604 case NOT_SYNCHRONIZED: 615 case NOT_SYNCHRONIZED:
605 cookie_monster_->DeleteCookieAsync(url, cookie_name, 616 cookie_monster_->DeleteCookieAsync(url, cookie_name,
606 WrapClosure(callback)); 617 WrapClosure(callback));
607 break; 618 break;
608 case SYNCHRONIZING: 619 case SYNCHRONIZING:
609 tasks_pending_synchronization_.push_back( 620 tasks_pending_synchronization_.push_back(base::Bind(
610 base::Bind(&CookieStoreIOS::DeleteCookieAsync, this, url, cookie_name, 621 &CookieStoreIOS::DeleteCookieAsync, weak_factory_.GetWeakPtr(), url,
611 WrapClosure(callback))); 622 cookie_name, WrapClosure(callback)));
612 break; 623 break;
613 case SYNCHRONIZED: 624 case SYNCHRONIZED:
614 NSArray* cookies = GetCookiesForURL(system_store_, 625 NSArray* cookies = GetCookiesForURL(system_store_,
615 url, creation_time_manager_.get()); 626 url, creation_time_manager_.get());
616 for (NSHTTPCookie* cookie in cookies) { 627 for (NSHTTPCookie* cookie in cookies) {
617 if ([[cookie name] 628 if ([[cookie name]
618 isEqualToString:base::SysUTF8ToNSString(cookie_name)]) { 629 isEqualToString:base::SysUTF8ToNSString(cookie_name)]) {
619 [system_store_ deleteCookie:cookie]; 630 [system_store_ deleteCookie:cookie];
620 creation_time_manager_->DeleteCreationTime(cookie); 631 creation_time_manager_->DeleteCreationTime(cookie);
621 } 632 }
622 } 633 }
623 if (!callback.is_null()) 634 if (!callback.is_null())
624 callback.Run(); 635 callback.Run();
625 break; 636 break;
626 } 637 }
627 } 638 }
628 639
629 void CookieStoreIOS::DeleteCanonicalCookieAsync( 640 void CookieStoreIOS::DeleteCanonicalCookieAsync(
630 const CanonicalCookie& cookie, 641 const CanonicalCookie& cookie,
631 const DeleteCallback& callback) { 642 const DeleteCallback& callback) {
632 DCHECK(thread_checker_.CalledOnValidThread()); 643 DCHECK(thread_checker_.CalledOnValidThread());
633 644
634 switch (synchronization_state_) { 645 switch (synchronization_state_) {
635 case NOT_SYNCHRONIZED: 646 case NOT_SYNCHRONIZED:
636 cookie_monster_->DeleteCanonicalCookieAsync(cookie, 647 cookie_monster_->DeleteCanonicalCookieAsync(cookie,
637 WrapDeleteCallback(callback)); 648 WrapDeleteCallback(callback));
638 break; 649 break;
639 case SYNCHRONIZING: 650 case SYNCHRONIZING:
640 tasks_pending_synchronization_.push_back( 651 tasks_pending_synchronization_.push_back(base::Bind(
641 base::Bind(&CookieStoreIOS::DeleteCanonicalCookieAsync, this, cookie, 652 &CookieStoreIOS::DeleteCanonicalCookieAsync,
642 WrapDeleteCallback(callback))); 653 weak_factory_.GetWeakPtr(), cookie, WrapDeleteCallback(callback)));
643 break; 654 break;
644 case SYNCHRONIZED: 655 case SYNCHRONIZED:
645 // This relies on the fact cookies are given unique creation dates. 656 // This relies on the fact cookies are given unique creation dates.
646 CookieFilterFunction filter = base::Bind( 657 CookieFilterFunction filter = base::Bind(
647 IsCookieCreatedBetween, cookie.CreationDate(), cookie.CreationDate()); 658 IsCookieCreatedBetween, cookie.CreationDate(), cookie.CreationDate());
648 DeleteCookiesWithFilter(filter, callback); 659 DeleteCookiesWithFilter(filter, callback);
649 } 660 }
650 } 661 }
651 662
652 void CookieStoreIOS::DeleteAllCreatedBetweenAsync( 663 void CookieStoreIOS::DeleteAllCreatedBetweenAsync(
653 const base::Time& delete_begin, 664 const base::Time& delete_begin,
654 const base::Time& delete_end, 665 const base::Time& delete_end,
655 const DeleteCallback& callback) { 666 const DeleteCallback& callback) {
656 DCHECK(thread_checker_.CalledOnValidThread()); 667 DCHECK(thread_checker_.CalledOnValidThread());
657 668
658 if (metrics_enabled_) 669 if (metrics_enabled_)
659 ResetCookieCountMetrics(); 670 ResetCookieCountMetrics();
660 671
661 switch (synchronization_state_) { 672 switch (synchronization_state_) {
662 case NOT_SYNCHRONIZED: 673 case NOT_SYNCHRONIZED:
663 cookie_monster_->DeleteAllCreatedBetweenAsync( 674 cookie_monster_->DeleteAllCreatedBetweenAsync(
664 delete_begin, delete_end, WrapDeleteCallback(callback)); 675 delete_begin, delete_end, WrapDeleteCallback(callback));
665 break; 676 break;
666 case SYNCHRONIZING: 677 case SYNCHRONIZING:
667 tasks_pending_synchronization_.push_back( 678 tasks_pending_synchronization_.push_back(
668 base::Bind(&CookieStoreIOS::DeleteAllCreatedBetweenAsync, this, 679 base::Bind(&CookieStoreIOS::DeleteAllCreatedBetweenAsync,
669 delete_begin, delete_end, WrapDeleteCallback(callback))); 680 weak_factory_.GetWeakPtr(), delete_begin, delete_end,
681 WrapDeleteCallback(callback)));
670 break; 682 break;
671 case SYNCHRONIZED: 683 case SYNCHRONIZED:
672 CookieFilterFunction filter = 684 CookieFilterFunction filter =
673 base::Bind(&IsCookieCreatedBetween, delete_begin, delete_end); 685 base::Bind(&IsCookieCreatedBetween, delete_begin, delete_end);
674 DeleteCookiesWithFilter(filter, callback); 686 DeleteCookiesWithFilter(filter, callback);
675 break; 687 break;
676 } 688 }
677 } 689 }
678 690
679 void CookieStoreIOS::DeleteAllCreatedBetweenForHostAsync( 691 void CookieStoreIOS::DeleteAllCreatedBetweenForHostAsync(
680 const base::Time delete_begin, 692 const base::Time delete_begin,
681 const base::Time delete_end, 693 const base::Time delete_end,
682 const GURL& url, 694 const GURL& url,
683 const DeleteCallback& callback) { 695 const DeleteCallback& callback) {
684 DCHECK(thread_checker_.CalledOnValidThread()); 696 DCHECK(thread_checker_.CalledOnValidThread());
685 697
686 if (metrics_enabled_) 698 if (metrics_enabled_)
687 ResetCookieCountMetrics(); 699 ResetCookieCountMetrics();
688 700
689 switch (synchronization_state_) { 701 switch (synchronization_state_) {
690 case NOT_SYNCHRONIZED: 702 case NOT_SYNCHRONIZED:
691 cookie_monster_->DeleteAllCreatedBetweenForHostAsync( 703 cookie_monster_->DeleteAllCreatedBetweenForHostAsync(
692 delete_begin, delete_end, url, WrapDeleteCallback(callback)); 704 delete_begin, delete_end, url, WrapDeleteCallback(callback));
693 break; 705 break;
694 case SYNCHRONIZING: 706 case SYNCHRONIZING:
695 tasks_pending_synchronization_.push_back(base::Bind( 707 tasks_pending_synchronization_.push_back(
696 &CookieStoreIOS::DeleteAllCreatedBetweenForHostAsync, this, 708 base::Bind(&CookieStoreIOS::DeleteAllCreatedBetweenForHostAsync,
697 delete_begin, delete_end, url, WrapDeleteCallback(callback))); 709 weak_factory_.GetWeakPtr(), delete_begin, delete_end, url,
710 WrapDeleteCallback(callback)));
698 break; 711 break;
699 case SYNCHRONIZED: 712 case SYNCHRONIZED:
700 NSString* host = base::SysUTF8ToNSString(url.host()); 713 NSString* host = base::SysUTF8ToNSString(url.host());
701 CookieFilterFunction filter = base::Bind(IsCookieCreatedBetweenForHost, 714 CookieFilterFunction filter = base::Bind(IsCookieCreatedBetweenForHost,
702 delete_begin, delete_end, host); 715 delete_begin, delete_end, host);
703 DeleteCookiesWithFilter(filter, callback); 716 DeleteCookiesWithFilter(filter, callback);
704 break; 717 break;
705 } 718 }
706 } 719 }
707 720
708 void CookieStoreIOS::DeleteSessionCookiesAsync(const DeleteCallback& callback) { 721 void CookieStoreIOS::DeleteSessionCookiesAsync(const DeleteCallback& callback) {
709 DCHECK(thread_checker_.CalledOnValidThread()); 722 DCHECK(thread_checker_.CalledOnValidThread());
710 723
711 if (metrics_enabled_) 724 if (metrics_enabled_)
712 ResetCookieCountMetrics(); 725 ResetCookieCountMetrics();
713 726
714 switch (synchronization_state_) { 727 switch (synchronization_state_) {
715 case NOT_SYNCHRONIZED: 728 case NOT_SYNCHRONIZED:
716 cookie_monster_->DeleteSessionCookiesAsync(WrapDeleteCallback(callback)); 729 cookie_monster_->DeleteSessionCookiesAsync(WrapDeleteCallback(callback));
717 break; 730 break;
718 case SYNCHRONIZING: 731 case SYNCHRONIZING:
719 tasks_pending_synchronization_.push_back( 732 tasks_pending_synchronization_.push_back(
720 base::Bind(&CookieStoreIOS::DeleteSessionCookiesAsync, this, 733 base::Bind(&CookieStoreIOS::DeleteSessionCookiesAsync,
721 WrapDeleteCallback(callback))); 734 weak_factory_.GetWeakPtr(), WrapDeleteCallback(callback)));
722 break; 735 break;
723 case SYNCHRONIZED: 736 case SYNCHRONIZED:
724 CookieFilterFunction filter = base::Bind(&IsCookieSessionCookie); 737 CookieFilterFunction filter = base::Bind(&IsCookieSessionCookie);
725 DeleteCookiesWithFilter(filter, callback); 738 DeleteCookiesWithFilter(filter, callback);
726 break; 739 break;
727 } 740 }
728 } 741 }
729 742
730 void CookieStoreIOS::FlushStore(const base::Closure& closure) { 743 void CookieStoreIOS::FlushStore(const base::Closure& closure) {
731 DCHECK(thread_checker_.CalledOnValidThread()); 744 DCHECK(thread_checker_.CalledOnValidThread());
732 745
733 if (SystemCookiesAllowed()) { 746 if (SystemCookiesAllowed()) {
734 // If cookies are disabled, the system store is empty, and the cookies are 747 // If cookies are disabled, the system store is empty, and the cookies are
735 // stashed on disk. Do not delete the cookies on the disk in this case. 748 // stashed on disk. Do not delete the cookies on the disk in this case.
736 WriteToCookieMonster([system_store_ cookies]); 749 WriteToCookieMonster([system_store_ cookies]);
737 } 750 }
738 cookie_monster_->FlushStore(closure); 751 cookie_monster_->FlushStore(closure);
739 flush_closure_.Cancel(); 752 flush_closure_.Cancel();
740 } 753 }
741 754
742 #pragma mark - 755 #pragma mark -
743 #pragma mark Protected methods
744
745 CookieStoreIOS::~CookieStoreIOS() {
746 NotificationTrampoline::GetInstance()->RemoveObserver(this);
747 STLDeleteContainerPairSecondPointers(hook_map_.begin(), hook_map_.end());
748 }
749
750 #pragma mark -
751 #pragma mark Private methods 756 #pragma mark Private methods
752 757
753 void CookieStoreIOS::ClearSystemStore() { 758 void CookieStoreIOS::ClearSystemStore() {
754 DCHECK(thread_checker_.CalledOnValidThread()); 759 DCHECK(thread_checker_.CalledOnValidThread());
755 base::scoped_nsobject<NSArray> copy( 760 base::scoped_nsobject<NSArray> copy(
756 [[NSArray alloc] initWithArray:[system_store_ cookies]]); 761 [[NSArray alloc] initWithArray:[system_store_ cookies]]);
757 for (NSHTTPCookie* cookie in copy.get()) 762 for (NSHTTPCookie* cookie in copy.get())
758 [system_store_ deleteCookie:cookie]; 763 [system_store_ deleteCookie:cookie];
759 DCHECK_EQ(0u, [[system_store_ cookies] count]); 764 DCHECK_EQ(0u, [[system_store_ cookies] count]);
760 creation_time_manager_->Clear(); 765 creation_time_manager_->Clear();
761 } 766 }
762 767
763 void CookieStoreIOS::OnSystemCookiePolicyChanged() { 768 void CookieStoreIOS::OnSystemCookiePolicyChanged() {
764 DCHECK(thread_checker_.CalledOnValidThread()); 769 DCHECK(thread_checker_.CalledOnValidThread());
765 770
766 // If the CookieStoreIOS is not synchronized or is not backed by 771 // If the CookieStoreIOS is not synchronized or is not backed by
767 // |NSHTTPCookieStorage sharedHTTPCookieStorage| this callback is irrelevant. 772 // |NSHTTPCookieStorage sharedHTTPCookieStorage| this callback is irrelevant.
768 if (synchronization_state_ == NOT_SYNCHRONIZED || 773 if (synchronization_state_ == NOT_SYNCHRONIZED ||
769 system_store_ != [NSHTTPCookieStorage sharedHTTPCookieStorage]) { 774 system_store_ != [NSHTTPCookieStorage sharedHTTPCookieStorage]) {
770 return; 775 return;
771 } 776 }
772 777
773 NSHTTPCookieAcceptPolicy policy = 778 NSHTTPCookieAcceptPolicy policy =
774 [system_store_ cookieAcceptPolicy]; 779 [system_store_ cookieAcceptPolicy];
775 if (policy == NSHTTPCookieAcceptPolicyAlways) { 780 if (policy == NSHTTPCookieAcceptPolicyAlways) {
776 // If cookies are disabled, the system cookie store should be empty. 781 // If cookies are disabled, the system cookie store should be empty.
777 DCHECK(![[system_store_ cookies] count]); 782 DCHECK(![[system_store_ cookies] count]);
778 DCHECK(synchronization_state_ != SYNCHRONIZING); 783 DCHECK(synchronization_state_ != SYNCHRONIZING);
779 synchronization_state_ = SYNCHRONIZING; 784 synchronization_state_ = SYNCHRONIZING;
780 cookie_monster_->GetAllCookiesAsync( 785 cookie_monster_->GetAllCookiesAsync(base::Bind(
781 base::Bind(&CookieStoreIOS::AddCookiesToSystemStore, this)); 786 &CookieStoreIOS::AddCookiesToSystemStore, weak_factory_.GetWeakPtr()));
782 } else { 787 } else {
783 DCHECK_EQ(NSHTTPCookieAcceptPolicyNever, policy); 788 DCHECK_EQ(NSHTTPCookieAcceptPolicyNever, policy);
784 // FlushStore() does not write the cookies to disk when they are disabled. 789 // FlushStore() does not write the cookies to disk when they are disabled.
785 // Explicitly copy them. 790 // Explicitly copy them.
786 WriteToCookieMonster([system_store_ cookies]); 791 WriteToCookieMonster([system_store_ cookies]);
787 FlushStore(base::Closure()); 792 FlushStore(base::Closure());
788 ClearSystemStore(); 793 ClearSystemStore();
789 if (synchronization_state_ == SYNCHRONIZING) { 794 if (synchronization_state_ == SYNCHRONIZING) {
790 // If synchronization was in progress, abort it and leave the cookie store 795 // If synchronization was in progress, abort it and leave the cookie store
791 // empty. 796 // empty.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 DCHECK(policy == NSHTTPCookieAcceptPolicyAlways || 830 DCHECK(policy == NSHTTPCookieAcceptPolicyAlways ||
826 ![[system_store_ cookies] count]); 831 ![[system_store_ cookies] count]);
827 832
828 // If cookies are disabled, nothing is done now, the work will be done when 833 // If cookies are disabled, nothing is done now, the work will be done when
829 // cookies are re-enabled. 834 // cookies are re-enabled.
830 if (policy == NSHTTPCookieAcceptPolicyAlways) { 835 if (policy == NSHTTPCookieAcceptPolicyAlways) {
831 if (synchronized) { 836 if (synchronized) {
832 synchronization_state_ = SYNCHRONIZING; 837 synchronization_state_ = SYNCHRONIZING;
833 ClearSystemStore(); 838 ClearSystemStore();
834 cookie_monster_->GetAllCookiesAsync( 839 cookie_monster_->GetAllCookiesAsync(
835 base::Bind(&CookieStoreIOS::AddCookiesToSystemStore, this)); 840 base::Bind(&CookieStoreIOS::AddCookiesToSystemStore,
841 weak_factory_.GetWeakPtr()));
836 return; 842 return;
837 } else { 843 } else {
838 // Copy the cookies from the global store to |cookie_monster_|. 844 // Copy the cookies from the global store to |cookie_monster_|.
839 FlushStore(base::Closure()); 845 FlushStore(base::Closure());
840 } 846 }
841 } 847 }
842 synchronization_state_ = synchronized ? SYNCHRONIZED : NOT_SYNCHRONIZED; 848 synchronization_state_ = synchronized ? SYNCHRONIZED : NOT_SYNCHRONIZED;
843 849
844 if (synchronization_state_ == NOT_SYNCHRONIZED) { 850 if (synchronization_state_ == NOT_SYNCHRONIZED) {
845 // If there are pending tasks, then it means that the synchronization is 851 // If there are pending tasks, then it means that the synchronization is
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
963 RunCallbacksForCookies(key.first, key.second, removed_cookies, true); 969 RunCallbacksForCookies(key.first, key.second, removed_cookies, true);
964 RunCallbacksForCookies(key.first, key.second, added_cookies, false); 970 RunCallbacksForCookies(key.first, key.second, added_cookies, false);
965 } 971 }
966 } 972 }
967 973
968 // Do not schedule a flush if one is already scheduled. 974 // Do not schedule a flush if one is already scheduled.
969 if (!flush_closure_.IsCancelled()) 975 if (!flush_closure_.IsCancelled())
970 return; 976 return;
971 977
972 flush_closure_.Reset(base::Bind(&CookieStoreIOS::FlushStore, 978 flush_closure_.Reset(base::Bind(&CookieStoreIOS::FlushStore,
973 base::Unretained(this), base::Closure())); 979 weak_factory_.GetWeakPtr(), base::Closure()));
974 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 980 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
975 FROM_HERE, flush_closure_.callback(), flush_delay_); 981 FROM_HERE, flush_closure_.callback(), flush_delay_);
976 } 982 }
977 983
978 scoped_ptr<net::CookieStore::CookieChangedSubscription> 984 scoped_ptr<net::CookieStore::CookieChangedSubscription>
979 CookieStoreIOS::AddCallbackForCookie(const GURL& gurl, 985 CookieStoreIOS::AddCallbackForCookie(const GURL& gurl,
980 const std::string& name, 986 const std::string& name,
981 const CookieChangedCallback& callback) { 987 const CookieChangedCallback& callback) {
982 DCHECK(thread_checker_.CalledOnValidThread()); 988 DCHECK(thread_checker_.CalledOnValidThread());
983 989
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 1064
1059 void CookieStoreIOS::DidClearNSHTTPCookieStorageCookies( 1065 void CookieStoreIOS::DidClearNSHTTPCookieStorageCookies(
1060 const DeleteCallback& delete_callback, 1066 const DeleteCallback& delete_callback,
1061 int num_deleted) { 1067 int num_deleted) {
1062 DCHECK(thread_checker_.CalledOnValidThread()); 1068 DCHECK(thread_checker_.CalledOnValidThread());
1063 1069
1064 CookieStoreIOSClient* client = net::GetCookieStoreIOSClient(); 1070 CookieStoreIOSClient* client = net::GetCookieStoreIOSClient();
1065 DCHECK(client); 1071 DCHECK(client);
1066 auto sequenced_task_runner = client->GetTaskRunner(); 1072 auto sequenced_task_runner = client->GetTaskRunner();
1067 DCHECK(sequenced_task_runner); 1073 DCHECK(sequenced_task_runner);
1068 auto callback = base::Bind(&CookieStoreIOS::DidClearBinaryCookiesFileCookies, 1074 auto callback =
1069 this, delete_callback, num_deleted); 1075 base::Bind(&CookieStoreIOS::DidClearBinaryCookiesFileCookies,
1076 weak_factory_.GetWeakPtr(), delete_callback, num_deleted);
1070 sequenced_task_runner.get()->PostTaskAndReply( 1077 sequenced_task_runner.get()->PostTaskAndReply(
1071 FROM_HERE, base::Bind(&ClearAllCookiesFromBinaryCookiesFile), callback); 1078 FROM_HERE, base::Bind(&ClearAllCookiesFromBinaryCookiesFile), callback);
1072 } 1079 }
1073 1080
1074 void CookieStoreIOS::DidClearBinaryCookiesFileCookies( 1081 void CookieStoreIOS::DidClearBinaryCookiesFileCookies(
1075 const DeleteCallback& callback, 1082 const DeleteCallback& callback,
1076 int num_deleted_from_nshttp_cookie_storage) { 1083 int num_deleted_from_nshttp_cookie_storage) {
1077 DCHECK(thread_checker_.CalledOnValidThread()); 1084 DCHECK(thread_checker_.CalledOnValidThread());
1078 1085
1079 CookieStoreIOSClient* client = net::GetCookieStoreIOSClient(); 1086 CookieStoreIOSClient* client = net::GetCookieStoreIOSClient();
1080 DCHECK(client); 1087 DCHECK(client);
1081 client->DidChangeCookieStorage(); 1088 client->DidChangeCookieStorage();
1082 if (!callback.is_null()) 1089 if (!callback.is_null())
1083 callback.Run(num_deleted_from_nshttp_cookie_storage); 1090 callback.Run(num_deleted_from_nshttp_cookie_storage);
1084 } 1091 }
1085 1092
1086 void CookieStoreIOS::UpdateCachesFromCookieMonster() { 1093 void CookieStoreIOS::UpdateCachesFromCookieMonster() {
1087 DCHECK(thread_checker_.CalledOnValidThread()); 1094 DCHECK(thread_checker_.CalledOnValidThread());
1088 for (const auto& hook_map_entry : hook_map_) { 1095 for (const auto& hook_map_entry : hook_map_) {
1089 std::pair<GURL, std::string> key = hook_map_entry.first; 1096 std::pair<GURL, std::string> key = hook_map_entry.first;
1090 GetCookieListCallback callback = 1097 GetCookieListCallback callback = base::Bind(
1091 base::Bind(&CookieStoreIOS::GotCookieListFor, this, key); 1098 &CookieStoreIOS::GotCookieListFor, weak_factory_.GetWeakPtr(), key);
1092 cookie_monster_->GetAllCookiesForURLAsync(key.first, callback); 1099 cookie_monster_->GetAllCookiesForURLAsync(key.first, callback);
1093 } 1100 }
1094 } 1101 }
1095 1102
1096 void CookieStoreIOS::UpdateCachesAfterSet(const SetCookiesCallback& callback, 1103 void CookieStoreIOS::UpdateCachesAfterSet(const SetCookiesCallback& callback,
1097 bool success) { 1104 bool success) {
1098 DCHECK(thread_checker_.CalledOnValidThread()); 1105 DCHECK(thread_checker_.CalledOnValidThread());
1099 if (success) 1106 if (success)
1100 UpdateCachesFromCookieMonster(); 1107 UpdateCachesFromCookieMonster();
1101 if (!callback.is_null()) 1108 if (!callback.is_null())
(...skipping 22 matching lines...) Expand all
1124 for (NSHTTPCookie* cookie in cookies) { 1131 for (NSHTTPCookie* cookie in cookies) {
1125 base::Time created = creation_time_manager_->GetCreationTime(cookie); 1132 base::Time created = creation_time_manager_->GetCreationTime(cookie);
1126 cookie_list.push_back(CanonicalCookieFromSystemCookie(cookie, created)); 1133 cookie_list.push_back(CanonicalCookieFromSystemCookie(cookie, created));
1127 } 1134 }
1128 return cookie_list; 1135 return cookie_list;
1129 } 1136 }
1130 1137
1131 CookieStoreIOS::SetCookiesCallback CookieStoreIOS::WrapSetCallback( 1138 CookieStoreIOS::SetCookiesCallback CookieStoreIOS::WrapSetCallback(
1132 const SetCookiesCallback& callback) { 1139 const SetCookiesCallback& callback) {
1133 DCHECK(thread_checker_.CalledOnValidThread()); 1140 DCHECK(thread_checker_.CalledOnValidThread());
1134 return base::Bind(&CookieStoreIOS::UpdateCachesAfterSet, this, callback); 1141 return base::Bind(&CookieStoreIOS::UpdateCachesAfterSet,
1142 weak_factory_.GetWeakPtr(), callback);
1135 } 1143 }
1136 1144
1137 CookieStoreIOS::DeleteCallback CookieStoreIOS::WrapDeleteCallback( 1145 CookieStoreIOS::DeleteCallback CookieStoreIOS::WrapDeleteCallback(
1138 const DeleteCallback& callback) { 1146 const DeleteCallback& callback) {
1139 DCHECK(thread_checker_.CalledOnValidThread()); 1147 DCHECK(thread_checker_.CalledOnValidThread());
1140 return base::Bind(&CookieStoreIOS::UpdateCachesAfterDelete, this, callback); 1148 return base::Bind(&CookieStoreIOS::UpdateCachesAfterDelete,
1149 weak_factory_.GetWeakPtr(), callback);
1141 } 1150 }
1142 1151
1143 base::Closure CookieStoreIOS::WrapClosure(const base::Closure& callback) { 1152 base::Closure CookieStoreIOS::WrapClosure(const base::Closure& callback) {
1144 DCHECK(thread_checker_.CalledOnValidThread()); 1153 DCHECK(thread_checker_.CalledOnValidThread());
1145 return base::Bind(&CookieStoreIOS::UpdateCachesAfterClosure, this, callback); 1154 return base::Bind(&CookieStoreIOS::UpdateCachesAfterClosure,
1155 weak_factory_.GetWeakPtr(), callback);
1146 } 1156 }
1147 1157
1148 } // namespace net 1158 } // namespace net
OLDNEW
« no previous file with comments | « ios/net/cookies/cookie_store_ios.h ('k') | ios/net/cookies/cookie_store_ios_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698