Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "components/offline_pages/offline_page_model_impl.h" | 5 #include "components/offline_pages/offline_page_model_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 299 archives_dir_, offline_id, | 299 archives_dir_, offline_id, |
| 300 base::Bind(&OfflinePageModelImpl::OnCreateArchiveDone, | 300 base::Bind(&OfflinePageModelImpl::OnCreateArchiveDone, |
| 301 weak_ptr_factory_.GetWeakPtr(), url, offline_id, client_id, | 301 weak_ptr_factory_.GetWeakPtr(), url, offline_id, client_id, |
| 302 base::Time::Now(), callback)); | 302 base::Time::Now(), callback)); |
| 303 pending_archivers_.push_back(std::move(archiver)); | 303 pending_archivers_.push_back(std::move(archiver)); |
| 304 } | 304 } |
| 305 | 305 |
| 306 void OfflinePageModelImpl::MarkPageAccessed(int64_t offline_id) { | 306 void OfflinePageModelImpl::MarkPageAccessed(int64_t offline_id) { |
| 307 DCHECK(is_loaded_); | 307 DCHECK(is_loaded_); |
| 308 auto iter = offline_pages_.find(offline_id); | 308 auto iter = offline_pages_.find(offline_id); |
| 309 if (iter == offline_pages_.end()) | 309 if (iter == offline_pages_.end() || iter->second.IsExpired()) |
| 310 return; | 310 return; |
| 311 | 311 |
| 312 // Make a copy of the cached item and update it. The cached item should only | 312 // Make a copy of the cached item and update it. The cached item should only |
| 313 // be updated upon the successful store operation. | 313 // be updated upon the successful store operation. |
| 314 OfflinePageItem offline_page_item = iter->second; | 314 OfflinePageItem offline_page_item = iter->second; |
| 315 | 315 |
| 316 ReportPageHistogramsAfterAccess(offline_page_item); | 316 ReportPageHistogramsAfterAccess(offline_page_item); |
| 317 | 317 |
| 318 offline_page_item.last_access_time = base::Time::Now(); | 318 offline_page_item.last_access_time = base::Time::Now(); |
| 319 offline_page_item.access_count++; | 319 offline_page_item.access_count++; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 407 } | 407 } |
| 408 | 408 |
| 409 void OfflinePageModelImpl::HasPagesAfterLoadDone( | 409 void OfflinePageModelImpl::HasPagesAfterLoadDone( |
| 410 const std::string& name_space, | 410 const std::string& name_space, |
| 411 const HasPagesCallback& callback) const { | 411 const HasPagesCallback& callback) const { |
| 412 DCHECK(is_loaded_); | 412 DCHECK(is_loaded_); |
| 413 | 413 |
| 414 bool has_pages = false; | 414 bool has_pages = false; |
| 415 | 415 |
| 416 for (const auto& id_page_pair : offline_pages_) { | 416 for (const auto& id_page_pair : offline_pages_) { |
| 417 if (id_page_pair.second.client_id.name_space == name_space) { | 417 if (id_page_pair.second.client_id.name_space == name_space && |
| 418 !id_page_pair.second.IsExpired()) { | |
| 418 has_pages = true; | 419 has_pages = true; |
| 419 break; | 420 break; |
| 420 } | 421 } |
| 421 } | 422 } |
| 422 | 423 |
| 423 callback.Run(has_pages); | 424 callback.Run(has_pages); |
| 424 } | 425 } |
| 425 | 426 |
| 426 void OfflinePageModelImpl::CheckPagesExistOffline( | 427 void OfflinePageModelImpl::CheckPagesExistOffline( |
| 427 const std::set<GURL>& urls, | 428 const std::set<GURL>& urls, |
| 428 const CheckPagesExistOfflineCallback& callback) { | 429 const CheckPagesExistOfflineCallback& callback) { |
| 429 RunWhenLoaded( | 430 RunWhenLoaded( |
| 430 base::Bind(&OfflinePageModelImpl::CheckPagesExistOfflineAfterLoadDone, | 431 base::Bind(&OfflinePageModelImpl::CheckPagesExistOfflineAfterLoadDone, |
| 431 weak_ptr_factory_.GetWeakPtr(), urls, callback)); | 432 weak_ptr_factory_.GetWeakPtr(), urls, callback)); |
| 432 } | 433 } |
| 433 | 434 |
| 434 void OfflinePageModelImpl::CheckPagesExistOfflineAfterLoadDone( | 435 void OfflinePageModelImpl::CheckPagesExistOfflineAfterLoadDone( |
| 435 const std::set<GURL>& urls, | 436 const std::set<GURL>& urls, |
| 436 const CheckPagesExistOfflineCallback& callback) { | 437 const CheckPagesExistOfflineCallback& callback) { |
| 437 DCHECK(is_loaded_); | 438 DCHECK(is_loaded_); |
| 438 CheckPagesExistOfflineResult result; | 439 CheckPagesExistOfflineResult result; |
| 439 for (const auto& id_page_pair : offline_pages_) { | 440 for (const auto& id_page_pair : offline_pages_) { |
| 441 if (id_page_pair.second.IsExpired()) | |
| 442 continue; | |
| 440 auto iter = urls.find(id_page_pair.second.url); | 443 auto iter = urls.find(id_page_pair.second.url); |
| 441 if (iter != urls.end()) | 444 if (iter != urls.end()) |
| 442 result.insert(*iter); | 445 result.insert(*iter); |
| 443 } | 446 } |
| 444 callback.Run(result); | 447 callback.Run(result); |
| 445 } | 448 } |
| 446 | 449 |
| 447 void OfflinePageModelImpl::GetAllPages( | 450 void OfflinePageModelImpl::GetAllPages( |
| 448 const MultipleOfflinePageItemCallback& callback) { | 451 const MultipleOfflinePageItemCallback& callback) { |
| 449 RunWhenLoaded(base::Bind(&OfflinePageModelImpl::GetAllPagesAfterLoadDone, | 452 RunWhenLoaded(base::Bind(&OfflinePageModelImpl::GetAllPagesAfterLoadDone, |
| 450 weak_ptr_factory_.GetWeakPtr(), callback)); | 453 weak_ptr_factory_.GetWeakPtr(), callback)); |
| 451 } | 454 } |
| 452 | 455 |
| 453 void OfflinePageModelImpl::GetAllPagesAfterLoadDone( | 456 void OfflinePageModelImpl::GetAllPagesAfterLoadDone( |
| 454 const MultipleOfflinePageItemCallback& callback) const { | 457 const MultipleOfflinePageItemCallback& callback) const { |
| 455 DCHECK(is_loaded_); | 458 DCHECK(is_loaded_); |
| 456 | 459 |
| 457 MultipleOfflinePageItemResult offline_pages; | 460 MultipleOfflinePageItemResult offline_pages; |
| 458 for (const auto& id_page_pair : offline_pages_) | 461 for (const auto& id_page_pair : offline_pages_) { |
| 459 offline_pages.push_back(id_page_pair.second); | 462 if (!id_page_pair.second.IsExpired()) |
| 463 offline_pages.push_back(id_page_pair.second); | |
| 464 } | |
| 460 | 465 |
| 461 callback.Run(offline_pages); | 466 callback.Run(offline_pages); |
| 462 } | 467 } |
| 463 | 468 |
| 464 void OfflinePageModelImpl::GetOfflineIdsForClientId( | 469 void OfflinePageModelImpl::GetOfflineIdsForClientId( |
| 465 const ClientId& client_id, | 470 const ClientId& client_id, |
| 466 const MultipleOfflineIdCallback& callback) { | 471 const MultipleOfflineIdCallback& callback) { |
| 467 RunWhenLoaded( | 472 RunWhenLoaded( |
| 468 base::Bind(&OfflinePageModelImpl::GetOfflineIdsForClientIdWhenLoadDone, | 473 base::Bind(&OfflinePageModelImpl::GetOfflineIdsForClientIdWhenLoadDone, |
| 469 weak_ptr_factory_.GetWeakPtr(), client_id, callback)); | 474 weak_ptr_factory_.GetWeakPtr(), client_id, callback)); |
| 470 } | 475 } |
| 471 | 476 |
| 472 void OfflinePageModelImpl::GetOfflineIdsForClientIdWhenLoadDone( | 477 void OfflinePageModelImpl::GetOfflineIdsForClientIdWhenLoadDone( |
| 473 const ClientId& client_id, | 478 const ClientId& client_id, |
| 474 const MultipleOfflineIdCallback& callback) const { | 479 const MultipleOfflineIdCallback& callback) const { |
| 475 callback.Run(MaybeGetOfflineIdsForClientId(client_id)); | 480 callback.Run(MaybeGetOfflineIdsForClientId(client_id)); |
| 476 } | 481 } |
| 477 | 482 |
| 478 const std::vector<int64_t> OfflinePageModelImpl::MaybeGetOfflineIdsForClientId( | 483 const std::vector<int64_t> OfflinePageModelImpl::MaybeGetOfflineIdsForClientId( |
| 479 const ClientId& client_id) const { | 484 const ClientId& client_id) const { |
| 480 DCHECK(is_loaded_); | 485 DCHECK(is_loaded_); |
| 481 std::vector<int64_t> results; | 486 std::vector<int64_t> results; |
| 482 | 487 |
| 483 // We want only all pages, including those marked for deletion. | 488 // We want only all pages, including those marked for deletion. |
| 484 // TODO(bburns): actually use an index rather than linear scan. | 489 // TODO(bburns): actually use an index rather than linear scan. |
| 485 for (const auto& id_page_pair : offline_pages_) { | 490 for (const auto& id_page_pair : offline_pages_) { |
| 486 if (id_page_pair.second.client_id == client_id) | 491 if (id_page_pair.second.client_id == client_id && |
| 492 !id_page_pair.second.IsExpired()) { | |
| 487 results.push_back(id_page_pair.second.offline_id); | 493 results.push_back(id_page_pair.second.offline_id); |
| 494 } | |
| 488 } | 495 } |
| 489 return results; | 496 return results; |
| 490 } | 497 } |
| 491 | 498 |
| 492 void OfflinePageModelImpl::GetPageByOfflineId( | 499 void OfflinePageModelImpl::GetPageByOfflineId( |
| 493 int64_t offline_id, | 500 int64_t offline_id, |
| 494 const SingleOfflinePageItemCallback& callback) { | 501 const SingleOfflinePageItemCallback& callback) { |
| 495 RunWhenLoaded( | 502 RunWhenLoaded( |
| 496 base::Bind(&OfflinePageModelImpl::GetPageByOfflineIdWhenLoadDone, | 503 base::Bind(&OfflinePageModelImpl::GetPageByOfflineIdWhenLoadDone, |
| 497 weak_ptr_factory_.GetWeakPtr(), offline_id, callback)); | 504 weak_ptr_factory_.GetWeakPtr(), offline_id, callback)); |
| 498 } | 505 } |
| 499 | 506 |
| 500 void OfflinePageModelImpl::GetPageByOfflineIdWhenLoadDone( | 507 void OfflinePageModelImpl::GetPageByOfflineIdWhenLoadDone( |
| 501 int64_t offline_id, | 508 int64_t offline_id, |
| 502 const SingleOfflinePageItemCallback& callback) const { | 509 const SingleOfflinePageItemCallback& callback) const { |
| 503 SingleOfflinePageItemResult result; | 510 SingleOfflinePageItemResult result; |
| 504 const OfflinePageItem* match = MaybeGetPageByOfflineId(offline_id); | 511 const OfflinePageItem* match = MaybeGetPageByOfflineId(offline_id); |
| 505 if (match != nullptr) | 512 if (match != nullptr) |
| 506 result = *match; | 513 result = *match; |
| 507 callback.Run(result); | 514 callback.Run(result); |
| 508 } | 515 } |
| 509 | 516 |
| 510 const OfflinePageItem* OfflinePageModelImpl::MaybeGetPageByOfflineId( | 517 const OfflinePageItem* OfflinePageModelImpl::MaybeGetPageByOfflineId( |
| 511 int64_t offline_id) const { | 518 int64_t offline_id) const { |
| 512 const auto iter = offline_pages_.find(offline_id); | 519 const auto iter = offline_pages_.find(offline_id); |
| 513 return iter != offline_pages_.end() ? &(iter->second) : nullptr; | 520 return iter != offline_pages_.end() && !iter->second.IsExpired() |
| 521 ? &(iter->second) | |
| 522 : nullptr; | |
| 514 } | 523 } |
| 515 | 524 |
| 516 void OfflinePageModelImpl::GetPageByOfflineURL( | 525 void OfflinePageModelImpl::GetPageByOfflineURL( |
| 517 const GURL& offline_url, | 526 const GURL& offline_url, |
| 518 const SingleOfflinePageItemCallback& callback) { | 527 const SingleOfflinePageItemCallback& callback) { |
| 519 RunWhenLoaded( | 528 RunWhenLoaded( |
| 520 base::Bind(&OfflinePageModelImpl::GetPageByOfflineURLWhenLoadDone, | 529 base::Bind(&OfflinePageModelImpl::GetPageByOfflineURLWhenLoadDone, |
| 521 weak_ptr_factory_.GetWeakPtr(), offline_url, callback)); | 530 weak_ptr_factory_.GetWeakPtr(), offline_url, callback)); |
| 522 } | 531 } |
| 523 | 532 |
| 524 void OfflinePageModelImpl::GetPageByOfflineURLWhenLoadDone( | 533 void OfflinePageModelImpl::GetPageByOfflineURLWhenLoadDone( |
| 525 const GURL& offline_url, | 534 const GURL& offline_url, |
| 526 const SingleOfflinePageItemCallback& callback) const { | 535 const SingleOfflinePageItemCallback& callback) const { |
| 536 // Getting pages by offline URL does not exclude expired pages, as the caller | |
| 537 // already holds the offline URL and simply needs to look up a corresponding | |
| 538 // online URL. | |
| 527 base::Optional<OfflinePageItem> result; | 539 base::Optional<OfflinePageItem> result; |
| 528 | 540 |
| 529 for (const auto& id_page_pair : offline_pages_) { | 541 for (const auto& id_page_pair : offline_pages_) { |
| 530 if (id_page_pair.second.GetOfflineURL() == offline_url) { | 542 if (id_page_pair.second.GetOfflineURL() == offline_url) { |
| 531 callback.Run(base::make_optional(id_page_pair.second)); | 543 callback.Run(base::make_optional(id_page_pair.second)); |
| 532 return; | 544 return; |
| 533 } | 545 } |
| 534 } | 546 } |
| 535 | 547 |
| 536 callback.Run(base::nullopt); | 548 callback.Run(base::nullopt); |
| 537 } | 549 } |
| 538 | 550 |
| 539 const OfflinePageItem* OfflinePageModelImpl::MaybeGetPageByOfflineURL( | 551 const OfflinePageItem* OfflinePageModelImpl::MaybeGetPageByOfflineURL( |
| 540 const GURL& offline_url) const { | 552 const GURL& offline_url) const { |
| 553 // Getting pages by offline URL does not exclude expired pages, as the caller | |
| 554 // already holds the offline URL and simply needs to look up a corresponding | |
| 555 // online URL. | |
| 541 for (const auto& id_page_pair : offline_pages_) { | 556 for (const auto& id_page_pair : offline_pages_) { |
| 542 if (id_page_pair.second.GetOfflineURL() == offline_url) | 557 if (id_page_pair.second.GetOfflineURL() == offline_url) |
| 543 return &(id_page_pair.second); | 558 return &(id_page_pair.second); |
| 544 } | 559 } |
| 545 return nullptr; | 560 return nullptr; |
| 546 } | 561 } |
| 547 | 562 |
| 548 void OfflinePageModelImpl::GetBestPageForOnlineURL( | 563 void OfflinePageModelImpl::GetBestPageForOnlineURL( |
| 549 const GURL& online_url, | 564 const GURL& online_url, |
| 550 const SingleOfflinePageItemCallback callback) { | 565 const SingleOfflinePageItemCallback callback) { |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 572 base::Bind(&OfflinePageModelImpl::GetPagesByOnlineURLWhenLoadDone, | 587 base::Bind(&OfflinePageModelImpl::GetPagesByOnlineURLWhenLoadDone, |
| 573 weak_ptr_factory_.GetWeakPtr(), online_url, callback)); | 588 weak_ptr_factory_.GetWeakPtr(), online_url, callback)); |
| 574 } | 589 } |
| 575 | 590 |
| 576 void OfflinePageModelImpl::GetPagesByOnlineURLWhenLoadDone( | 591 void OfflinePageModelImpl::GetPagesByOnlineURLWhenLoadDone( |
| 577 const GURL& online_url, | 592 const GURL& online_url, |
| 578 const MultipleOfflinePageItemCallback& callback) const { | 593 const MultipleOfflinePageItemCallback& callback) const { |
| 579 std::vector<OfflinePageItem> result; | 594 std::vector<OfflinePageItem> result; |
| 580 | 595 |
| 581 for (const auto& id_page_pair : offline_pages_) { | 596 for (const auto& id_page_pair : offline_pages_) { |
| 582 if (id_page_pair.second.url == online_url) | 597 if (id_page_pair.second.url == online_url && |
| 598 !id_page_pair.second.IsExpired()) { | |
| 583 result.push_back(id_page_pair.second); | 599 result.push_back(id_page_pair.second); |
| 600 } | |
| 584 } | 601 } |
| 585 | 602 |
| 586 callback.Run(result); | 603 callback.Run(result); |
| 587 } | 604 } |
| 588 | 605 |
| 589 const OfflinePageItem* OfflinePageModelImpl::MaybeGetBestPageForOnlineURL( | 606 const OfflinePageItem* OfflinePageModelImpl::MaybeGetBestPageForOnlineURL( |
| 590 const GURL& online_url) const { | 607 const GURL& online_url) const { |
| 591 const OfflinePageItem* result = nullptr; | 608 const OfflinePageItem* result = nullptr; |
| 592 for (const auto& id_page_pair : offline_pages_) { | 609 for (const auto& id_page_pair : offline_pages_) { |
| 593 if (id_page_pair.second.url == online_url) { | 610 if (id_page_pair.second.url == online_url && |
| 611 !id_page_pair.second.IsExpired()) { | |
| 594 if (!result || id_page_pair.second.creation_time > result->creation_time) | 612 if (!result || id_page_pair.second.creation_time > result->creation_time) |
| 595 result = &(id_page_pair.second); | 613 result = &(id_page_pair.second); |
| 596 } | 614 } |
| 597 } | 615 } |
| 598 return result; | 616 return result; |
| 599 } | 617 } |
| 600 | 618 |
| 601 void OfflinePageModelImpl::CheckForExternalFileDeletion() { | 619 void OfflinePageModelImpl::CheckMetadataConsistency() { |
| 602 DCHECK(is_loaded_); | 620 DCHECK(is_loaded_); |
| 603 | 621 |
| 604 archive_manager_->GetAllArchives( | 622 archive_manager_->GetAllArchives( |
| 605 base::Bind(&OfflinePageModelImpl::ScanForMissingArchiveFiles, | 623 base::Bind(&OfflinePageModelImpl::DoCheckMetadataConsistency, |
| 606 weak_ptr_factory_.GetWeakPtr())); | 624 weak_ptr_factory_.GetWeakPtr())); |
| 607 } | 625 } |
| 608 | 626 |
| 609 void OfflinePageModelImpl::ExpirePages( | 627 void OfflinePageModelImpl::ExpirePages( |
| 610 const std::vector<int64_t>& offline_ids, | 628 const std::vector<int64_t>& offline_ids, |
| 611 const base::Time& expiration_time, | 629 const base::Time& expiration_time, |
| 612 const base::Callback<void(bool)>& callback) { | 630 const base::Callback<void(bool)>& callback) { |
| 613 std::vector<base::FilePath> paths_to_delete; | 631 std::vector<base::FilePath> paths_to_delete; |
| 614 for (int64_t offline_id : offline_ids) { | 632 for (int64_t offline_id : offline_ids) { |
| 615 auto iter = offline_pages_.find(offline_id); | 633 auto iter = offline_pages_.find(offline_id); |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 765 storage_manager_.reset(new OfflinePageStorageManager( | 783 storage_manager_.reset(new OfflinePageStorageManager( |
| 766 this, GetPolicyController(), archive_manager_.get())); | 784 this, GetPolicyController(), archive_manager_.get())); |
| 767 | 785 |
| 768 // Run all the delayed tasks. | 786 // Run all the delayed tasks. |
| 769 for (const auto& delayed_task : delayed_tasks_) | 787 for (const auto& delayed_task : delayed_tasks_) |
| 770 delayed_task.Run(); | 788 delayed_task.Run(); |
| 771 delayed_tasks_.clear(); | 789 delayed_tasks_.clear(); |
| 772 | 790 |
| 773 FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelLoaded(this)); | 791 FOR_EACH_OBSERVER(Observer, observers_, OfflinePageModelLoaded(this)); |
| 774 | 792 |
| 775 CheckForExternalFileDeletion(); | 793 CheckMetadataConsistency(); |
| 776 | 794 |
| 777 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 795 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| 778 FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded, | 796 FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded, |
| 779 weak_ptr_factory_.GetWeakPtr(), | 797 weak_ptr_factory_.GetWeakPtr(), |
| 780 base::Bind(&OfflinePageModelImpl::OnStorageCleared, | 798 base::Bind(&OfflinePageModelImpl::OnStorageCleared, |
| 781 weak_ptr_factory_.GetWeakPtr())), | 799 weak_ptr_factory_.GetWeakPtr())), |
| 782 kStorageManagerStartingDelay); | 800 kStorageManagerStartingDelay); |
| 783 } | 801 } |
| 784 | 802 |
| 785 void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback, | 803 void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback, |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 846 DeletePageResult result) { | 864 DeletePageResult result) { |
| 847 UMA_HISTOGRAM_ENUMERATION("OfflinePages.DeletePageResult", | 865 UMA_HISTOGRAM_ENUMERATION("OfflinePages.DeletePageResult", |
| 848 static_cast<int>(result), | 866 static_cast<int>(result), |
| 849 static_cast<int>(DeletePageResult::RESULT_COUNT)); | 867 static_cast<int>(DeletePageResult::RESULT_COUNT)); |
| 850 archive_manager_->GetStorageStats( | 868 archive_manager_->GetStorageStats( |
| 851 base::Bind(&ReportStorageHistogramsAfterDelete)); | 869 base::Bind(&ReportStorageHistogramsAfterDelete)); |
| 852 if (!callback.is_null()) | 870 if (!callback.is_null()) |
| 853 callback.Run(result); | 871 callback.Run(result); |
| 854 } | 872 } |
| 855 | 873 |
| 856 void OfflinePageModelImpl::ScanForMissingArchiveFiles( | 874 void OfflinePageModelImpl::DoCheckMetadataConsistency( |
| 875 const std::set<base::FilePath>& archive_paths) { | |
| 876 ExpirePagesMissingArchiveFile(archive_paths); | |
| 877 DeleteHeadlessArchives(archive_paths); | |
|
jianli
2016/06/08 21:10:35
I think "Orphaned" is better than "Headless".
romax
2016/06/08 22:18:59
sure, i've changed to orphaned.
| |
| 878 } | |
| 879 | |
| 880 void OfflinePageModelImpl::ExpirePagesMissingArchiveFile( | |
| 857 const std::set<base::FilePath>& archive_paths) { | 881 const std::set<base::FilePath>& archive_paths) { |
| 858 std::vector<int64_t> ids_of_pages_missing_archive_file; | 882 std::vector<int64_t> ids_of_pages_missing_archive_file; |
| 859 std::vector<std::pair<int64_t, ClientId>> offline_client_id_pairs; | |
| 860 for (const auto& id_page_pair : offline_pages_) { | 883 for (const auto& id_page_pair : offline_pages_) { |
| 861 if (archive_paths.count(id_page_pair.second.file_path) == 0UL) { | 884 if (archive_paths.count(id_page_pair.second.file_path) == 0UL) |
| 862 ids_of_pages_missing_archive_file.push_back(id_page_pair.first); | 885 ids_of_pages_missing_archive_file.push_back(id_page_pair.first); |
| 863 offline_client_id_pairs.push_back( | 886 } |
|
fgorski
2016/06/08 20:27:07
nit: could you put a space here for better readabi
romax
2016/06/08 22:18:59
Done.
| |
| 864 std::make_pair(id_page_pair.first, id_page_pair.second.client_id)); | 887 if (ids_of_pages_missing_archive_file.empty()) |
| 865 } | 888 return; |
|
fgorski
2016/06/08 20:27:07
nit: same here (by space I mean empty line of cour
romax
2016/06/08 22:18:59
Done.
| |
| 889 ExpirePages( | |
| 890 ids_of_pages_missing_archive_file, base::Time::Now(), | |
| 891 base::Bind(&OfflinePageModelImpl::OnExpirePagesMissingArchiveFileDone, | |
| 892 weak_ptr_factory_.GetWeakPtr(), | |
| 893 ids_of_pages_missing_archive_file)); | |
| 894 } | |
| 895 | |
| 896 void OfflinePageModelImpl::OnExpirePagesMissingArchiveFileDone( | |
| 897 const std::vector<int64_t>& offline_ids, | |
| 898 bool success) { | |
| 899 UMA_HISTOGRAM_COUNTS("OfflinePages.Consistency.PagesMissingArchiveFileCount", | |
| 900 static_cast<int32_t>(offline_ids.size())); | |
| 901 UMA_HISTOGRAM_BOOLEAN( | |
| 902 "OfflinePages.Consistency.ExpirePagesMissingArchiveFileResult", success); | |
| 903 } | |
| 904 | |
| 905 void OfflinePageModelImpl::DeleteHeadlessArchives( | |
| 906 const std::set<base::FilePath>& archive_paths) { | |
| 907 // Archives are considered unused unless they are pointed to by some pages. | |
|
jianli
2016/06/08 21:10:35
unused => orphaned
romax
2016/06/08 22:18:59
Done.
| |
| 908 std::set<base::FilePath> unused_archives(archive_paths); | |
| 909 for (const auto& id_page_pair : offline_pages_) { | |
|
fgorski
2016/06/08 20:27:07
nit: you don't need {} for one-liner, and in our t
romax
2016/06/08 22:18:59
Done.
| |
| 910 unused_archives.erase(id_page_pair.second.file_path); | |
| 866 } | 911 } |
| 867 | 912 |
| 868 // No offline pages missing archive files, we can bail out. | 913 if (unused_archives.empty()) |
| 869 if (ids_of_pages_missing_archive_file.empty()) | |
| 870 return; | 914 return; |
|
fgorski
2016/06/08 20:27:07
nit: extra line would be useful for readability.
romax
2016/06/08 22:18:59
Done.
| |
| 871 | 915 std::vector<base::FilePath> headless_archives(unused_archives.begin(), |
| 872 DeletePageCallback remove_pages_done_callback(base::Bind( | 916 unused_archives.end()); |
| 873 &OfflinePageModelImpl::OnRemoveOfflinePagesMissingArchiveFileDone, | 917 archive_manager_->DeleteMultipleArchives( |
|
fgorski
2016/06/08 20:27:07
I had one more thought about this. What if an arch
jianli
2016/06/08 21:10:35
I agree with Filip that we need to handle this cas
romax
2016/06/08 22:18:59
This seems not a trivial issue. Will have another
| |
| 874 weak_ptr_factory_.GetWeakPtr(), offline_client_id_pairs)); | 918 headless_archives, |
| 875 | 919 base::Bind(&OfflinePageModelImpl::OnDeleteHeadlessArchivesDone, |
| 876 store_->RemoveOfflinePages( | 920 weak_ptr_factory_.GetWeakPtr(), headless_archives)); |
| 877 ids_of_pages_missing_archive_file, | |
| 878 base::Bind(&OfflinePageModelImpl::OnRemoveOfflinePagesDone, | |
| 879 weak_ptr_factory_.GetWeakPtr(), | |
| 880 ids_of_pages_missing_archive_file, | |
| 881 remove_pages_done_callback)); | |
| 882 } | 921 } |
| 883 | 922 |
| 884 void OfflinePageModelImpl::OnRemoveOfflinePagesMissingArchiveFileDone( | 923 void OfflinePageModelImpl::OnDeleteHeadlessArchivesDone( |
| 885 const std::vector<std::pair<int64_t, ClientId>>& offline_client_id_pairs, | 924 const std::vector<base::FilePath>& archives, |
| 886 DeletePageResult /* result */) { | 925 bool success) { |
| 887 for (const auto& id_pair : offline_client_id_pairs) { | 926 UMA_HISTOGRAM_COUNTS("OfflinePages.Consistency.HeadlessArchivesCount", |
| 888 FOR_EACH_OBSERVER(Observer, observers_, | 927 static_cast<int32_t>(archives.size())); |
| 889 OfflinePageDeleted(id_pair.first, id_pair.second)); | 928 UMA_HISTOGRAM_BOOLEAN("OfflinePages.Consistency.DeleteHeadlessArchivesResult", |
| 890 } | 929 success); |
| 891 } | 930 } |
| 892 | 931 |
| 893 void OfflinePageModelImpl::OnRemoveAllFilesDoneForClearAll( | 932 void OfflinePageModelImpl::OnRemoveAllFilesDoneForClearAll( |
| 894 const base::Closure& callback, | 933 const base::Closure& callback, |
| 895 DeletePageResult result) { | 934 DeletePageResult result) { |
| 896 store_->Reset(base::Bind(&OfflinePageModelImpl::OnResetStoreDoneForClearAll, | 935 store_->Reset(base::Bind(&OfflinePageModelImpl::OnResetStoreDoneForClearAll, |
| 897 weak_ptr_factory_.GetWeakPtr(), callback)); | 936 weak_ptr_factory_.GetWeakPtr(), callback)); |
| 898 } | 937 } |
| 899 | 938 |
| 900 void OfflinePageModelImpl::OnResetStoreDoneForClearAll( | 939 void OfflinePageModelImpl::OnResetStoreDoneForClearAll( |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 953 void OfflinePageModelImpl::RunWhenLoaded(const base::Closure& task) { | 992 void OfflinePageModelImpl::RunWhenLoaded(const base::Closure& task) { |
| 954 if (!is_loaded_) { | 993 if (!is_loaded_) { |
| 955 delayed_tasks_.push_back(task); | 994 delayed_tasks_.push_back(task); |
| 956 return; | 995 return; |
| 957 } | 996 } |
| 958 | 997 |
| 959 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task); | 998 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task); |
| 960 } | 999 } |
| 961 | 1000 |
| 962 } // namespace offline_pages | 1001 } // namespace offline_pages |
| OLD | NEW |