| OLD | NEW |
| 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 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 metrics_enabled_ = true; | 296 metrics_enabled_ = true; |
| 297 } | 297 } |
| 298 | 298 |
| 299 #pragma mark - | 299 #pragma mark - |
| 300 #pragma mark CookieStore methods | 300 #pragma mark CookieStore methods |
| 301 | 301 |
| 302 void CookieStoreIOS::SetCookieWithOptionsAsync( | 302 void CookieStoreIOS::SetCookieWithOptionsAsync( |
| 303 const GURL& url, | 303 const GURL& url, |
| 304 const std::string& cookie_line, | 304 const std::string& cookie_line, |
| 305 const net::CookieOptions& options, | 305 const net::CookieOptions& options, |
| 306 const SetCookiesCallback& callback) { | 306 SetCookiesCallback callback) { |
| 307 DCHECK(thread_checker_.CalledOnValidThread()); | 307 DCHECK(thread_checker_.CalledOnValidThread()); |
| 308 | 308 |
| 309 // The exclude_httponly() option would only be used by a javascript | 309 // The exclude_httponly() option would only be used by a javascript |
| 310 // engine. | 310 // engine. |
| 311 DCHECK(!options.exclude_httponly()); | 311 DCHECK(!options.exclude_httponly()); |
| 312 | 312 |
| 313 // If cookies are not allowed, they are stashed in the CookieMonster, and | 313 // If cookies are not allowed, they are stashed in the CookieMonster, and |
| 314 // should be written there instead. | 314 // should be written there instead. |
| 315 DCHECK(SystemCookiesAllowed()); | 315 DCHECK(SystemCookiesAllowed()); |
| 316 | 316 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 341 (!has_explicit_domain || has_valid_domain); | 341 (!has_explicit_domain || has_valid_domain); |
| 342 | 342 |
| 343 if (success) { | 343 if (success) { |
| 344 [system_store_ setCookie:cookie]; | 344 [system_store_ setCookie:cookie]; |
| 345 creation_time_manager_->SetCreationTime( | 345 creation_time_manager_->SetCreationTime( |
| 346 cookie, | 346 cookie, |
| 347 creation_time_manager_->MakeUniqueCreationTime(base::Time::Now())); | 347 creation_time_manager_->MakeUniqueCreationTime(base::Time::Now())); |
| 348 } | 348 } |
| 349 | 349 |
| 350 if (!callback.is_null()) | 350 if (!callback.is_null()) |
| 351 callback.Run(success); | 351 std::move(callback).Run(success); |
| 352 } | 352 } |
| 353 | 353 |
| 354 void CookieStoreIOS::SetCookieWithDetailsAsync( | 354 void CookieStoreIOS::SetCookieWithDetailsAsync(const GURL& url, |
| 355 const GURL& url, | 355 const std::string& name, |
| 356 const std::string& name, | 356 const std::string& value, |
| 357 const std::string& value, | 357 const std::string& domain, |
| 358 const std::string& domain, | 358 const std::string& path, |
| 359 const std::string& path, | 359 base::Time creation_time, |
| 360 base::Time creation_time, | 360 base::Time expiration_time, |
| 361 base::Time expiration_time, | 361 base::Time last_access_time, |
| 362 base::Time last_access_time, | 362 bool secure, |
| 363 bool secure, | 363 bool http_only, |
| 364 bool http_only, | 364 CookieSameSite same_site, |
| 365 CookieSameSite same_site, | 365 CookiePriority priority, |
| 366 CookiePriority priority, | 366 SetCookiesCallback callback) { |
| 367 const SetCookiesCallback& callback) { | |
| 368 DCHECK(thread_checker_.CalledOnValidThread()); | 367 DCHECK(thread_checker_.CalledOnValidThread()); |
| 369 // If cookies are not allowed, they are stashed in the CookieMonster, and | 368 // If cookies are not allowed, they are stashed in the CookieMonster, and |
| 370 // should be written there instead. | 369 // should be written there instead. |
| 371 DCHECK(SystemCookiesAllowed()); | 370 DCHECK(SystemCookiesAllowed()); |
| 372 | 371 |
| 373 bool success = false; | 372 bool success = false; |
| 374 | 373 |
| 375 if (creation_time.is_null()) | 374 if (creation_time.is_null()) |
| 376 creation_time = base::Time::Now(); | 375 creation_time = base::Time::Now(); |
| 377 | 376 |
| 378 // Validate consistency of passed arguments. | 377 // Validate consistency of passed arguments. |
| 379 if (ParsedCookie::ParseTokenString(name) != name || | 378 if (ParsedCookie::ParseTokenString(name) != name || |
| 380 ParsedCookie::ParseValueString(value) != value || | 379 ParsedCookie::ParseValueString(value) != value || |
| 381 ParsedCookie::ParseValueString(domain) != domain || | 380 ParsedCookie::ParseValueString(domain) != domain || |
| 382 ParsedCookie::ParseValueString(path) != path) { | 381 ParsedCookie::ParseValueString(path) != path) { |
| 383 if (!callback.is_null()) | 382 if (!callback.is_null()) |
| 384 callback.Run(false); | 383 std::move(callback).Run(false); |
| 385 return; | 384 return; |
| 386 } | 385 } |
| 387 | 386 |
| 388 // Validate passed arguments against URL. | 387 // Validate passed arguments against URL. |
| 389 std::string cookie_domain; | 388 std::string cookie_domain; |
| 390 std::string cookie_path = CanonicalCookie::CanonPathWithString(url, path); | 389 std::string cookie_path = CanonicalCookie::CanonPathWithString(url, path); |
| 391 if ((secure && !url.SchemeIsCryptographic()) || | 390 if ((secure && !url.SchemeIsCryptographic()) || |
| 392 !cookie_util::GetCookieDomainWithString(url, domain, &cookie_domain) || | 391 !cookie_util::GetCookieDomainWithString(url, domain, &cookie_domain) || |
| 393 (!path.empty() && cookie_path != path)) { | 392 (!path.empty() && cookie_path != path)) { |
| 394 if (!callback.is_null()) | 393 if (!callback.is_null()) |
| 395 callback.Run(false); | 394 std::move(callback).Run(false); |
| 396 return; | 395 return; |
| 397 } | 396 } |
| 398 | 397 |
| 399 // Canonicalize path again to make sure it escapes characters as needed. | 398 // Canonicalize path again to make sure it escapes characters as needed. |
| 400 url::Component path_component(0, cookie_path.length()); | 399 url::Component path_component(0, cookie_path.length()); |
| 401 url::RawCanonOutputT<char> canon_path; | 400 url::RawCanonOutputT<char> canon_path; |
| 402 url::Component canon_path_component; | 401 url::Component canon_path_component; |
| 403 url::CanonicalizePath(cookie_path.data(), path_component, &canon_path, | 402 url::CanonicalizePath(cookie_path.data(), path_component, &canon_path, |
| 404 &canon_path_component); | 403 &canon_path_component); |
| 405 cookie_path = std::string(canon_path.data() + canon_path_component.begin, | 404 cookie_path = std::string(canon_path.data() + canon_path_component.begin, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 417 if (cookie != nil) { | 416 if (cookie != nil) { |
| 418 [system_store_ setCookie:cookie]; | 417 [system_store_ setCookie:cookie]; |
| 419 creation_time_manager_->SetCreationTime( | 418 creation_time_manager_->SetCreationTime( |
| 420 cookie, creation_time_manager_->MakeUniqueCreationTime( | 419 cookie, creation_time_manager_->MakeUniqueCreationTime( |
| 421 canonical_cookie->CreationDate())); | 420 canonical_cookie->CreationDate())); |
| 422 success = true; | 421 success = true; |
| 423 } | 422 } |
| 424 } | 423 } |
| 425 | 424 |
| 426 if (!callback.is_null()) | 425 if (!callback.is_null()) |
| 427 callback.Run(success); | 426 std::move(callback).Run(success); |
| 428 } | 427 } |
| 429 | 428 |
| 430 void CookieStoreIOS::SetCanonicalCookieAsync( | 429 void CookieStoreIOS::SetCanonicalCookieAsync( |
| 431 std::unique_ptr<net::CanonicalCookie> cookie, | 430 std::unique_ptr<net::CanonicalCookie> cookie, |
| 432 bool secure_source, | 431 bool secure_source, |
| 433 bool modify_http_only, | 432 bool modify_http_only, |
| 434 const SetCookiesCallback& callback) { | 433 SetCookiesCallback callback) { |
| 435 DCHECK(cookie->IsCanonical()); | 434 DCHECK(cookie->IsCanonical()); |
| 436 // The exclude_httponly() option would only be used by a javascript | 435 // The exclude_httponly() option would only be used by a javascript |
| 437 // engine. | 436 // engine. |
| 438 DCHECK(modify_http_only); | 437 DCHECK(modify_http_only); |
| 439 | 438 |
| 440 if (cookie->IsSecure() && !secure_source) { | 439 if (cookie->IsSecure() && !secure_source) { |
| 441 if (!callback.is_null()) | 440 if (!callback.is_null()) |
| 442 callback.Run(false); | 441 std::move(callback).Run(false); |
| 443 return; | 442 return; |
| 444 } | 443 } |
| 445 | 444 |
| 446 NSHTTPCookie* ns_cookie = SystemCookieFromCanonicalCookie(*cookie.get()); | 445 NSHTTPCookie* ns_cookie = SystemCookieFromCanonicalCookie(*cookie.get()); |
| 447 | 446 |
| 448 if (ns_cookie != nil) { | 447 if (ns_cookie != nil) { |
| 449 [system_store_ setCookie:ns_cookie]; | 448 [system_store_ setCookie:ns_cookie]; |
| 450 creation_time_manager_->SetCreationTime( | 449 creation_time_manager_->SetCreationTime( |
| 451 ns_cookie, | 450 ns_cookie, |
| 452 creation_time_manager_->MakeUniqueCreationTime( | 451 creation_time_manager_->MakeUniqueCreationTime( |
| 453 cookie->CreationDate().is_null() ? base::Time::Now() | 452 cookie->CreationDate().is_null() ? base::Time::Now() |
| 454 : cookie->CreationDate())); | 453 : cookie->CreationDate())); |
| 455 if (!callback.is_null()) | 454 if (!callback.is_null()) |
| 456 callback.Run(true); | 455 std::move(callback).Run(true); |
| 457 return; | 456 return; |
| 458 } | 457 } |
| 459 | 458 |
| 460 if (!callback.is_null()) | 459 if (!callback.is_null()) |
| 461 callback.Run(false); | 460 std::move(callback).Run(false); |
| 462 } | 461 } |
| 463 | 462 |
| 464 void CookieStoreIOS::GetCookiesWithOptionsAsync( | 463 void CookieStoreIOS::GetCookiesWithOptionsAsync( |
| 465 const GURL& url, | 464 const GURL& url, |
| 466 const net::CookieOptions& options, | 465 const net::CookieOptions& options, |
| 467 const GetCookiesCallback& callback) { | 466 GetCookiesCallback callback) { |
| 468 DCHECK(thread_checker_.CalledOnValidThread()); | 467 DCHECK(thread_checker_.CalledOnValidThread()); |
| 469 | 468 |
| 470 // If cookies are not allowed, they are stashed in the CookieMonster, and | 469 // If cookies are not allowed, they are stashed in the CookieMonster, and |
| 471 // should be read from there instead. | 470 // should be read from there instead. |
| 472 DCHECK(SystemCookiesAllowed()); | 471 DCHECK(SystemCookiesAllowed()); |
| 473 // The exclude_httponly() option would only be used by a javascript | 472 // The exclude_httponly() option would only be used by a javascript |
| 474 // engine. | 473 // engine. |
| 475 DCHECK(!options.exclude_httponly()); | 474 DCHECK(!options.exclude_httponly()); |
| 476 | 475 |
| 477 // TODO(mkwst): If/when iOS supports Same-Site cookies, we'll need to pass | 476 // TODO(mkwst): If/when iOS supports Same-Site cookies, we'll need to pass |
| 478 // options in here as well. https://crbug.com/459154 | 477 // options in here as well. https://crbug.com/459154 |
| 479 NSArray* cookies = | 478 NSArray* cookies = |
| 480 GetCookiesForURL(system_store_, url, creation_time_manager_.get()); | 479 GetCookiesForURL(system_store_, url, creation_time_manager_.get()); |
| 481 if (!callback.is_null()) | 480 if (!callback.is_null()) |
| 482 callback.Run(BuildCookieLineWithOptions(cookies, options)); | 481 std::move(callback).Run(BuildCookieLineWithOptions(cookies, options)); |
| 483 } | 482 } |
| 484 | 483 |
| 485 void CookieStoreIOS::GetCookieListWithOptionsAsync( | 484 void CookieStoreIOS::GetCookieListWithOptionsAsync( |
| 486 const GURL& url, | 485 const GURL& url, |
| 487 const net::CookieOptions& options, | 486 const net::CookieOptions& options, |
| 488 const GetCookieListCallback& callback) { | 487 GetCookieListCallback callback) { |
| 489 DCHECK(thread_checker_.CalledOnValidThread()); | 488 DCHECK(thread_checker_.CalledOnValidThread()); |
| 490 if (!SystemCookiesAllowed()) { | 489 if (!SystemCookiesAllowed()) { |
| 491 // If cookies are not allowed, the cookies are stashed in the | 490 // If cookies are not allowed, the cookies are stashed in the |
| 492 // CookieMonster, so get them from there. | 491 // CookieMonster, so get them from there. |
| 493 cookie_monster_->GetCookieListWithOptionsAsync(url, options, callback); | 492 cookie_monster_->GetCookieListWithOptionsAsync(url, options, |
| 493 std::move(callback)); |
| 494 return; | 494 return; |
| 495 } | 495 } |
| 496 | 496 |
| 497 // TODO(mkwst): If/when iOS supports Same-Site cookies, we'll need to pass | 497 // TODO(mkwst): If/when iOS supports Same-Site cookies, we'll need to pass |
| 498 // options in here as well. https://crbug.com/459154 | 498 // options in here as well. https://crbug.com/459154 |
| 499 NSArray* cookies = | 499 NSArray* cookies = |
| 500 GetCookiesForURL(system_store_, url, creation_time_manager_.get()); | 500 GetCookiesForURL(system_store_, url, creation_time_manager_.get()); |
| 501 net::CookieList cookie_list = CanonicalCookieListFromSystemCookies(cookies); | 501 net::CookieList cookie_list = CanonicalCookieListFromSystemCookies(cookies); |
| 502 if (!callback.is_null()) | 502 if (!callback.is_null()) |
| 503 callback.Run(cookie_list); | 503 std::move(callback).Run(cookie_list); |
| 504 } | 504 } |
| 505 | 505 |
| 506 void CookieStoreIOS::GetAllCookiesAsync(const GetCookieListCallback& callback) { | 506 void CookieStoreIOS::GetAllCookiesAsync(GetCookieListCallback callback) { |
| 507 DCHECK(thread_checker_.CalledOnValidThread()); | 507 DCHECK(thread_checker_.CalledOnValidThread()); |
| 508 | 508 |
| 509 if (!SystemCookiesAllowed()) { | 509 if (!SystemCookiesAllowed()) { |
| 510 // If cookies are not allowed, the cookies are stashed in the | 510 // If cookies are not allowed, the cookies are stashed in the |
| 511 // CookieMonster, so get them from there. | 511 // CookieMonster, so get them from there. |
| 512 cookie_monster_->GetAllCookiesAsync(callback); | 512 cookie_monster_->GetAllCookiesAsync(std::move(callback)); |
| 513 return; | 513 return; |
| 514 } | 514 } |
| 515 | 515 |
| 516 NSArray* cookies = GetAllCookies(system_store_, creation_time_manager_.get()); | 516 NSArray* cookies = GetAllCookies(system_store_, creation_time_manager_.get()); |
| 517 net::CookieList cookie_list = CanonicalCookieListFromSystemCookies(cookies); | 517 net::CookieList cookie_list = CanonicalCookieListFromSystemCookies(cookies); |
| 518 if (!callback.is_null()) { | 518 if (!callback.is_null()) { |
| 519 callback.Run(cookie_list); | 519 std::move(callback).Run(cookie_list); |
| 520 } | 520 } |
| 521 } | 521 } |
| 522 | 522 |
| 523 void CookieStoreIOS::DeleteCookieAsync(const GURL& url, | 523 void CookieStoreIOS::DeleteCookieAsync(const GURL& url, |
| 524 const std::string& cookie_name, | 524 const std::string& cookie_name, |
| 525 const base::Closure& callback) { | 525 base::OnceClosure callback) { |
| 526 DCHECK(thread_checker_.CalledOnValidThread()); | 526 DCHECK(thread_checker_.CalledOnValidThread()); |
| 527 | 527 |
| 528 NSArray* cookies = | 528 NSArray* cookies = |
| 529 GetCookiesForURL(system_store_, url, creation_time_manager_.get()); | 529 GetCookiesForURL(system_store_, url, creation_time_manager_.get()); |
| 530 for (NSHTTPCookie* cookie in cookies) { | 530 for (NSHTTPCookie* cookie in cookies) { |
| 531 if ([[cookie name] isEqualToString:base::SysUTF8ToNSString(cookie_name)]) { | 531 if ([[cookie name] isEqualToString:base::SysUTF8ToNSString(cookie_name)]) { |
| 532 [system_store_ deleteCookie:cookie]; | 532 [system_store_ deleteCookie:cookie]; |
| 533 creation_time_manager_->DeleteCreationTime(cookie); | 533 creation_time_manager_->DeleteCreationTime(cookie); |
| 534 } | 534 } |
| 535 } | 535 } |
| 536 | 536 |
| 537 if (!callback.is_null()) | 537 if (!callback.is_null()) |
| 538 callback.Run(); | 538 std::move(callback).Run(); |
| 539 } | 539 } |
| 540 | 540 |
| 541 void CookieStoreIOS::DeleteCanonicalCookieAsync( | 541 void CookieStoreIOS::DeleteCanonicalCookieAsync(const CanonicalCookie& cookie, |
| 542 const CanonicalCookie& cookie, | 542 DeleteCallback callback) { |
| 543 const DeleteCallback& callback) { | |
| 544 DCHECK(thread_checker_.CalledOnValidThread()); | 543 DCHECK(thread_checker_.CalledOnValidThread()); |
| 545 | 544 |
| 546 // This relies on the fact cookies are given unique creation dates. | 545 // This relies on the fact cookies are given unique creation dates. |
| 547 CookieFilterFunction filter = base::Bind( | 546 CookieFilterFunction filter = base::Bind( |
| 548 IsCookieCreatedBetween, cookie.CreationDate(), cookie.CreationDate()); | 547 IsCookieCreatedBetween, cookie.CreationDate(), cookie.CreationDate()); |
| 549 DeleteCookiesWithFilter(filter, callback); | 548 DeleteCookiesWithFilter(filter, std::move(callback)); |
| 550 } | 549 } |
| 551 | 550 |
| 552 void CookieStoreIOS::DeleteAllCreatedBetweenAsync( | 551 void CookieStoreIOS::DeleteAllCreatedBetweenAsync( |
| 553 const base::Time& delete_begin, | 552 const base::Time& delete_begin, |
| 554 const base::Time& delete_end, | 553 const base::Time& delete_end, |
| 555 const DeleteCallback& callback) { | 554 DeleteCallback callback) { |
| 556 DCHECK(thread_checker_.CalledOnValidThread()); | 555 DCHECK(thread_checker_.CalledOnValidThread()); |
| 557 | 556 |
| 558 if (metrics_enabled_) | 557 if (metrics_enabled_) |
| 559 ResetCookieCountMetrics(); | 558 ResetCookieCountMetrics(); |
| 560 | 559 |
| 561 CookieFilterFunction filter = base::Bind( | 560 CookieFilterFunction filter = base::Bind( |
| 562 &IsCookieCreatedBetween, delete_begin, delete_end); | 561 &IsCookieCreatedBetween, delete_begin, delete_end); |
| 563 DeleteCookiesWithFilter(filter, callback); | 562 DeleteCookiesWithFilter(filter, std::move(callback)); |
| 564 } | 563 } |
| 565 | 564 |
| 566 void CookieStoreIOS::DeleteAllCreatedBetweenWithPredicateAsync( | 565 void CookieStoreIOS::DeleteAllCreatedBetweenWithPredicateAsync( |
| 567 const base::Time& delete_begin, | 566 const base::Time& delete_begin, |
| 568 const base::Time& delete_end, | 567 const base::Time& delete_end, |
| 569 const CookiePredicate& predicate, | 568 const CookiePredicate& predicate, |
| 570 const DeleteCallback& callback) { | 569 DeleteCallback callback) { |
| 571 DCHECK(thread_checker_.CalledOnValidThread()); | 570 DCHECK(thread_checker_.CalledOnValidThread()); |
| 572 | 571 |
| 573 if (metrics_enabled_) | 572 if (metrics_enabled_) |
| 574 ResetCookieCountMetrics(); | 573 ResetCookieCountMetrics(); |
| 575 | 574 |
| 576 CookieFilterFunction filter = base::Bind( | 575 CookieFilterFunction filter = base::Bind( |
| 577 IsCookieCreatedBetweenWithPredicate, delete_begin, delete_end, predicate); | 576 IsCookieCreatedBetweenWithPredicate, delete_begin, delete_end, predicate); |
| 578 DeleteCookiesWithFilter(filter, callback); | 577 DeleteCookiesWithFilter(filter, std::move(callback)); |
| 579 } | 578 } |
| 580 | 579 |
| 581 void CookieStoreIOS::DeleteSessionCookiesAsync(const DeleteCallback& callback) { | 580 void CookieStoreIOS::DeleteSessionCookiesAsync(DeleteCallback callback) { |
| 582 DCHECK(thread_checker_.CalledOnValidThread()); | 581 DCHECK(thread_checker_.CalledOnValidThread()); |
| 583 | 582 |
| 584 if (metrics_enabled_) | 583 if (metrics_enabled_) |
| 585 ResetCookieCountMetrics(); | 584 ResetCookieCountMetrics(); |
| 586 | 585 |
| 587 CookieFilterFunction filter = base::Bind(&IsCookieSessionCookie); | 586 CookieFilterFunction filter = base::Bind(&IsCookieSessionCookie); |
| 588 DeleteCookiesWithFilter(filter, callback); | 587 DeleteCookiesWithFilter(filter, std::move(callback)); |
| 589 } | 588 } |
| 590 | 589 |
| 591 void CookieStoreIOS::FlushStore(const base::Closure& closure) { | 590 void CookieStoreIOS::FlushStore(base::OnceClosure closure) { |
| 592 DCHECK(thread_checker_.CalledOnValidThread()); | 591 DCHECK(thread_checker_.CalledOnValidThread()); |
| 593 | 592 |
| 594 if (SystemCookiesAllowed()) { | 593 if (SystemCookiesAllowed()) { |
| 595 // If cookies are disabled, the system store is empty, and the cookies are | 594 // If cookies are disabled, the system store is empty, and the cookies are |
| 596 // stashed on disk. Do not delete the cookies on the disk in this case. | 595 // stashed on disk. Do not delete the cookies on the disk in this case. |
| 597 WriteToCookieMonster([system_store_ cookies]); | 596 WriteToCookieMonster([system_store_ cookies]); |
| 598 } | 597 } |
| 599 cookie_monster_->FlushStore(closure); | 598 cookie_monster_->FlushStore(std::move(closure)); |
| 600 flush_closure_.Cancel(); | 599 flush_closure_.Cancel(); |
| 601 } | 600 } |
| 602 | 601 |
| 603 #pragma mark - | 602 #pragma mark - |
| 604 #pragma mark Protected methods | 603 #pragma mark Protected methods |
| 605 | 604 |
| 606 CookieStoreIOS::CookieStoreIOS( | 605 CookieStoreIOS::CookieStoreIOS( |
| 607 net::CookieMonster::PersistentCookieStore* persistent_store, | 606 net::CookieMonster::PersistentCookieStore* persistent_store, |
| 608 NSHTTPCookieStorage* system_store) | 607 NSHTTPCookieStorage* system_store) |
| 609 : cookie_monster_(new net::CookieMonster(persistent_store, nullptr)), | 608 : cookie_monster_(new net::CookieMonster(persistent_store, nullptr)), |
| 610 system_store_(system_store), | 609 system_store_(system_store), |
| 611 creation_time_manager_(new CookieCreationTimeManager), | 610 creation_time_manager_(new CookieCreationTimeManager), |
| 612 metrics_enabled_(false), | 611 metrics_enabled_(false), |
| 613 cookie_cache_(new CookieCache()), | 612 cookie_cache_(new CookieCache()), |
| 614 weak_factory_(this) { | 613 weak_factory_(this) { |
| 615 DCHECK(system_store); | 614 DCHECK(system_store); |
| 616 | 615 |
| 617 NotificationTrampoline::GetInstance()->AddObserver(this); | 616 NotificationTrampoline::GetInstance()->AddObserver(this); |
| 618 | 617 |
| 619 cookie_monster_->SetPersistSessionCookies(true); | 618 cookie_monster_->SetPersistSessionCookies(true); |
| 620 cookie_monster_->SetForceKeepSessionState(); | 619 cookie_monster_->SetForceKeepSessionState(); |
| 621 } | 620 } |
| 622 | 621 |
| 623 CookieStoreIOS::SetCookiesCallback CookieStoreIOS::WrapSetCallback( | 622 CookieStoreIOS::SetCookiesCallback CookieStoreIOS::WrapSetCallback( |
| 624 const SetCookiesCallback& callback) { | 623 SetCookiesCallback callback) { |
| 625 DCHECK(thread_checker_.CalledOnValidThread()); | 624 DCHECK(thread_checker_.CalledOnValidThread()); |
| 626 return base::Bind(&CookieStoreIOS::UpdateCachesAfterSet, | 625 return base::BindOnce(&CookieStoreIOS::UpdateCachesAfterSet, |
| 627 weak_factory_.GetWeakPtr(), callback); | 626 weak_factory_.GetWeakPtr(), std::move(callback)); |
| 628 } | 627 } |
| 629 | 628 |
| 630 CookieStoreIOS::DeleteCallback CookieStoreIOS::WrapDeleteCallback( | 629 CookieStoreIOS::DeleteCallback CookieStoreIOS::WrapDeleteCallback( |
| 631 const DeleteCallback& callback) { | 630 DeleteCallback callback) { |
| 632 DCHECK(thread_checker_.CalledOnValidThread()); | 631 DCHECK(thread_checker_.CalledOnValidThread()); |
| 633 return base::Bind(&CookieStoreIOS::UpdateCachesAfterDelete, | 632 return base::BindOnce(&CookieStoreIOS::UpdateCachesAfterDelete, |
| 634 weak_factory_.GetWeakPtr(), callback); | 633 weak_factory_.GetWeakPtr(), std::move(callback)); |
| 635 } | 634 } |
| 636 | 635 |
| 637 base::Closure CookieStoreIOS::WrapClosure(const base::Closure& callback) { | 636 base::OnceClosure CookieStoreIOS::WrapClosure(base::OnceClosure callback) { |
| 638 DCHECK(thread_checker_.CalledOnValidThread()); | 637 DCHECK(thread_checker_.CalledOnValidThread()); |
| 639 return base::Bind(&CookieStoreIOS::UpdateCachesAfterClosure, | 638 return base::BindOnce(&CookieStoreIOS::UpdateCachesAfterClosure, |
| 640 weak_factory_.GetWeakPtr(), callback); | 639 weak_factory_.GetWeakPtr(), std::move(callback)); |
| 641 } | 640 } |
| 642 | 641 |
| 643 #pragma mark - | 642 #pragma mark - |
| 644 #pragma mark Private methods | 643 #pragma mark Private methods |
| 645 | 644 |
| 646 void CookieStoreIOS::ClearSystemStore() { | 645 void CookieStoreIOS::ClearSystemStore() { |
| 647 DCHECK(thread_checker_.CalledOnValidThread()); | 646 DCHECK(thread_checker_.CalledOnValidThread()); |
| 648 base::scoped_nsobject<NSArray> copy( | 647 base::scoped_nsobject<NSArray> copy( |
| 649 [[NSArray alloc] initWithArray:[system_store_ cookies]]); | 648 [[NSArray alloc] initWithArray:[system_store_ cookies]]); |
| 650 for (NSHTTPCookie* cookie in copy.get()) | 649 for (NSHTTPCookie* cookie in copy.get()) |
| (...skipping 19 matching lines...) Expand all Loading... |
| 670 cookie, creation_time_manager_->GetCreationTime(cookie))); | 669 cookie, creation_time_manager_->GetCreationTime(cookie))); |
| 671 } | 670 } |
| 672 cookie_monster_->SetAllCookiesAsync(cookie_list, SetCookiesCallback()); | 671 cookie_monster_->SetAllCookiesAsync(cookie_list, SetCookiesCallback()); |
| 673 | 672 |
| 674 // Update metrics. | 673 // Update metrics. |
| 675 if (metrics_enabled_) | 674 if (metrics_enabled_) |
| 676 UMA_HISTOGRAM_COUNTS_10000("CookieIOS.CookieWrittenCount", cookie_count); | 675 UMA_HISTOGRAM_COUNTS_10000("CookieIOS.CookieWrittenCount", cookie_count); |
| 677 } | 676 } |
| 678 | 677 |
| 679 void CookieStoreIOS::DeleteCookiesWithFilter(const CookieFilterFunction& filter, | 678 void CookieStoreIOS::DeleteCookiesWithFilter(const CookieFilterFunction& filter, |
| 680 const DeleteCallback& callback) { | 679 DeleteCallback callback) { |
| 681 DCHECK(thread_checker_.CalledOnValidThread()); | 680 DCHECK(thread_checker_.CalledOnValidThread()); |
| 682 NSArray* cookies = [system_store_ cookies]; | 681 NSArray* cookies = [system_store_ cookies]; |
| 683 | 682 |
| 684 // Collect the cookies to delete. | 683 // Collect the cookies to delete. |
| 685 base::scoped_nsobject<NSMutableArray> to_delete( | 684 base::scoped_nsobject<NSMutableArray> to_delete( |
| 686 [[NSMutableArray alloc] init]); | 685 [[NSMutableArray alloc] init]); |
| 687 for (NSHTTPCookie* cookie in cookies) { | 686 for (NSHTTPCookie* cookie in cookies) { |
| 688 base::Time creation_time = creation_time_manager_->GetCreationTime(cookie); | 687 base::Time creation_time = creation_time_manager_->GetCreationTime(cookie); |
| 689 if (filter.Run(cookie, creation_time)) | 688 if (filter.Run(cookie, creation_time)) |
| 690 [to_delete addObject:cookie]; | 689 [to_delete addObject:cookie]; |
| 691 } | 690 } |
| 692 | 691 |
| 693 // Delete them. | 692 // Delete them. |
| 694 for (NSHTTPCookie* cookie in to_delete.get()) { | 693 for (NSHTTPCookie* cookie in to_delete.get()) { |
| 695 [system_store_ deleteCookie:cookie]; | 694 [system_store_ deleteCookie:cookie]; |
| 696 creation_time_manager_->DeleteCreationTime(cookie); | 695 creation_time_manager_->DeleteCreationTime(cookie); |
| 697 } | 696 } |
| 698 | 697 |
| 699 if (!callback.is_null()) | 698 if (!callback.is_null()) |
| 700 callback.Run([to_delete count]); | 699 std::move(callback).Run([to_delete count]); |
| 701 } | 700 } |
| 702 | 701 |
| 703 void CookieStoreIOS::OnSystemCookiesChanged() { | 702 void CookieStoreIOS::OnSystemCookiesChanged() { |
| 704 DCHECK(thread_checker_.CalledOnValidThread()); | 703 DCHECK(thread_checker_.CalledOnValidThread()); |
| 705 | 704 |
| 706 for (const auto& hook_map_entry : hook_map_) { | 705 for (const auto& hook_map_entry : hook_map_) { |
| 707 std::pair<GURL, std::string> key = hook_map_entry.first; | 706 std::pair<GURL, std::string> key = hook_map_entry.first; |
| 708 std::vector<net::CanonicalCookie> removed_cookies; | 707 std::vector<net::CanonicalCookie> removed_cookies; |
| 709 std::vector<net::CanonicalCookie> added_cookies; | 708 std::vector<net::CanonicalCookie> added_cookies; |
| 710 if (UpdateCacheForCookieFromSystem(key.first, key.second, &removed_cookies, | 709 if (UpdateCacheForCookieFromSystem(key.first, key.second, &removed_cookies, |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 807 if (cookie_cache_->Update(key.first, key.second, filtered, &removed_cookies, | 806 if (cookie_cache_->Update(key.first, key.second, filtered, &removed_cookies, |
| 808 &added_cookies)) { | 807 &added_cookies)) { |
| 809 RunCallbacksForCookies(key.first, key.second, removed_cookies, | 808 RunCallbacksForCookies(key.first, key.second, removed_cookies, |
| 810 net::CookieStore::ChangeCause::UNKNOWN_DELETION); | 809 net::CookieStore::ChangeCause::UNKNOWN_DELETION); |
| 811 RunCallbacksForCookies(key.first, key.second, added_cookies, | 810 RunCallbacksForCookies(key.first, key.second, added_cookies, |
| 812 net::CookieStore::ChangeCause::INSERTED); | 811 net::CookieStore::ChangeCause::INSERTED); |
| 813 } | 812 } |
| 814 } | 813 } |
| 815 | 814 |
| 816 void CookieStoreIOS::DidClearNSHTTPCookieStorageCookies( | 815 void CookieStoreIOS::DidClearNSHTTPCookieStorageCookies( |
| 817 const DeleteCallback& delete_callback, | 816 DeleteCallback delete_callback, |
| 818 int num_deleted) { | 817 int num_deleted) { |
| 819 DCHECK(thread_checker_.CalledOnValidThread()); | 818 DCHECK(thread_checker_.CalledOnValidThread()); |
| 820 | 819 |
| 821 CookieStoreIOSClient* client = net::GetCookieStoreIOSClient(); | 820 CookieStoreIOSClient* client = net::GetCookieStoreIOSClient(); |
| 822 DCHECK(client); | 821 DCHECK(client); |
| 823 auto sequenced_task_runner = client->GetTaskRunner(); | 822 auto sequenced_task_runner = client->GetTaskRunner(); |
| 824 DCHECK(sequenced_task_runner); | 823 DCHECK(sequenced_task_runner); |
| 825 auto callback = | 824 auto callback = base::BindOnce( |
| 826 base::Bind(&CookieStoreIOS::DidClearBinaryCookiesFileCookies, | 825 &CookieStoreIOS::DidClearBinaryCookiesFileCookies, |
| 827 weak_factory_.GetWeakPtr(), delete_callback, num_deleted); | 826 weak_factory_.GetWeakPtr(), std::move(delete_callback), num_deleted); |
| 828 sequenced_task_runner.get()->PostTaskAndReply( | 827 sequenced_task_runner.get()->PostTaskAndReply( |
| 829 FROM_HERE, base::Bind(&ClearAllCookiesFromBinaryCookiesFile), callback); | 828 FROM_HERE, base::Bind(&ClearAllCookiesFromBinaryCookiesFile), |
| 829 std::move(callback)); |
| 830 } | 830 } |
| 831 | 831 |
| 832 void CookieStoreIOS::DidClearBinaryCookiesFileCookies( | 832 void CookieStoreIOS::DidClearBinaryCookiesFileCookies( |
| 833 const DeleteCallback& callback, | 833 DeleteCallback callback, |
| 834 int num_deleted_from_nshttp_cookie_storage) { | 834 int num_deleted_from_nshttp_cookie_storage) { |
| 835 DCHECK(thread_checker_.CalledOnValidThread()); | 835 DCHECK(thread_checker_.CalledOnValidThread()); |
| 836 | 836 |
| 837 CookieStoreIOSClient* client = net::GetCookieStoreIOSClient(); | 837 CookieStoreIOSClient* client = net::GetCookieStoreIOSClient(); |
| 838 DCHECK(client); | 838 DCHECK(client); |
| 839 client->DidChangeCookieStorage(); | 839 client->DidChangeCookieStorage(); |
| 840 if (!callback.is_null()) | 840 if (!callback.is_null()) |
| 841 callback.Run(num_deleted_from_nshttp_cookie_storage); | 841 std::move(callback).Run(num_deleted_from_nshttp_cookie_storage); |
| 842 } | 842 } |
| 843 | 843 |
| 844 void CookieStoreIOS::UpdateCachesFromCookieMonster() { | 844 void CookieStoreIOS::UpdateCachesFromCookieMonster() { |
| 845 DCHECK(thread_checker_.CalledOnValidThread()); | 845 DCHECK(thread_checker_.CalledOnValidThread()); |
| 846 for (const auto& hook_map_entry : hook_map_) { | 846 for (const auto& hook_map_entry : hook_map_) { |
| 847 std::pair<GURL, std::string> key = hook_map_entry.first; | 847 std::pair<GURL, std::string> key = hook_map_entry.first; |
| 848 GetCookieListCallback callback = base::Bind( | 848 GetCookieListCallback callback = base::BindOnce( |
| 849 &CookieStoreIOS::GotCookieListFor, weak_factory_.GetWeakPtr(), key); | 849 &CookieStoreIOS::GotCookieListFor, weak_factory_.GetWeakPtr(), key); |
| 850 cookie_monster_->GetAllCookiesForURLAsync(key.first, callback); | 850 cookie_monster_->GetAllCookiesForURLAsync(key.first, std::move(callback)); |
| 851 } | 851 } |
| 852 } | 852 } |
| 853 | 853 |
| 854 void CookieStoreIOS::UpdateCachesAfterSet(const SetCookiesCallback& callback, | 854 void CookieStoreIOS::UpdateCachesAfterSet(SetCookiesCallback callback, |
| 855 bool success) { | 855 bool success) { |
| 856 DCHECK(thread_checker_.CalledOnValidThread()); | 856 DCHECK(thread_checker_.CalledOnValidThread()); |
| 857 if (success) | 857 if (success) |
| 858 UpdateCachesFromCookieMonster(); | 858 UpdateCachesFromCookieMonster(); |
| 859 if (!callback.is_null()) | 859 if (!callback.is_null()) |
| 860 callback.Run(success); | 860 std::move(callback).Run(success); |
| 861 } | 861 } |
| 862 | 862 |
| 863 void CookieStoreIOS::UpdateCachesAfterDelete(const DeleteCallback& callback, | 863 void CookieStoreIOS::UpdateCachesAfterDelete(DeleteCallback callback, |
| 864 int num_deleted) { | 864 int num_deleted) { |
| 865 DCHECK(thread_checker_.CalledOnValidThread()); | 865 DCHECK(thread_checker_.CalledOnValidThread()); |
| 866 UpdateCachesFromCookieMonster(); | 866 UpdateCachesFromCookieMonster(); |
| 867 if (!callback.is_null()) | 867 if (!callback.is_null()) |
| 868 callback.Run(num_deleted); | 868 std::move(callback).Run(num_deleted); |
| 869 } | 869 } |
| 870 | 870 |
| 871 void CookieStoreIOS::UpdateCachesAfterClosure(const base::Closure& callback) { | 871 void CookieStoreIOS::UpdateCachesAfterClosure(base::OnceClosure callback) { |
| 872 DCHECK(thread_checker_.CalledOnValidThread()); | 872 DCHECK(thread_checker_.CalledOnValidThread()); |
| 873 UpdateCachesFromCookieMonster(); | 873 UpdateCachesFromCookieMonster(); |
| 874 if (!callback.is_null()) | 874 if (!callback.is_null()) |
| 875 callback.Run(); | 875 std::move(callback).Run(); |
| 876 } | 876 } |
| 877 | 877 |
| 878 net::CookieList | 878 net::CookieList |
| 879 CookieStoreIOS::CanonicalCookieListFromSystemCookies(NSArray* cookies) { | 879 CookieStoreIOS::CanonicalCookieListFromSystemCookies(NSArray* cookies) { |
| 880 net::CookieList cookie_list; | 880 net::CookieList cookie_list; |
| 881 cookie_list.reserve([cookies count]); | 881 cookie_list.reserve([cookies count]); |
| 882 for (NSHTTPCookie* cookie in cookies) { | 882 for (NSHTTPCookie* cookie in cookies) { |
| 883 base::Time created = creation_time_manager_->GetCreationTime(cookie); | 883 base::Time created = creation_time_manager_->GetCreationTime(cookie); |
| 884 cookie_list.push_back(CanonicalCookieFromSystemCookie(cookie, created)); | 884 cookie_list.push_back(CanonicalCookieFromSystemCookie(cookie, created)); |
| 885 } | 885 } |
| 886 return cookie_list; | 886 return cookie_list; |
| 887 } | 887 } |
| 888 | 888 |
| 889 } // namespace net | 889 } // namespace net |
| OLD | NEW |