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 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 | 398 |
399 // Make a copy of the cached item and update it. The cached item should only | 399 // Make a copy of the cached item and update it. The cached item should only |
400 // be updated upon the successful store operation. | 400 // be updated upon the successful store operation. |
401 OfflinePageItem offline_page_item = iter->second; | 401 OfflinePageItem offline_page_item = iter->second; |
402 | 402 |
403 ReportPageHistogramsAfterAccess(offline_page_item, GetCurrentTime()); | 403 ReportPageHistogramsAfterAccess(offline_page_item, GetCurrentTime()); |
404 | 404 |
405 offline_page_item.last_access_time = GetCurrentTime(); | 405 offline_page_item.last_access_time = GetCurrentTime(); |
406 offline_page_item.access_count++; | 406 offline_page_item.access_count++; |
407 | 407 |
408 store_->AddOrUpdateOfflinePage( | 408 std::vector<OfflinePageItem> items = { offline_page_item }; |
409 offline_page_item, | 409 store_->UpdateOfflinePages( |
410 base::Bind(&OfflinePageModelImpl::OnMarkPageAccesseDone, | 410 items, base::Bind(&OfflinePageModelImpl::OnMarkPageAccesseDone, |
411 weak_ptr_factory_.GetWeakPtr(), offline_page_item)); | 411 weak_ptr_factory_.GetWeakPtr(), offline_page_item)); |
412 } | 412 } |
413 | 413 |
414 void OfflinePageModelImpl::DeletePagesByOfflineId( | 414 void OfflinePageModelImpl::DeletePagesByOfflineId( |
415 const std::vector<int64_t>& offline_ids, | 415 const std::vector<int64_t>& offline_ids, |
416 const DeletePageCallback& callback) { | 416 const DeletePageCallback& callback) { |
417 RunWhenLoaded(base::Bind(&OfflinePageModelImpl::DoDeletePagesByOfflineId, | 417 RunWhenLoaded(base::Bind(&OfflinePageModelImpl::DoDeletePagesByOfflineId, |
418 weak_ptr_factory_.GetWeakPtr(), offline_ids, | 418 weak_ptr_factory_.GetWeakPtr(), offline_ids, |
419 callback)); | 419 callback)); |
420 } | 420 } |
421 | 421 |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
694 archive_manager_->GetAllArchives( | 694 archive_manager_->GetAllArchives( |
695 base::Bind(&OfflinePageModelImpl::CheckMetadataConsistencyForArchivePaths, | 695 base::Bind(&OfflinePageModelImpl::CheckMetadataConsistencyForArchivePaths, |
696 weak_ptr_factory_.GetWeakPtr())); | 696 weak_ptr_factory_.GetWeakPtr())); |
697 } | 697 } |
698 | 698 |
699 void OfflinePageModelImpl::ExpirePages( | 699 void OfflinePageModelImpl::ExpirePages( |
700 const std::vector<int64_t>& offline_ids, | 700 const std::vector<int64_t>& offline_ids, |
701 const base::Time& expiration_time, | 701 const base::Time& expiration_time, |
702 const base::Callback<void(bool)>& callback) { | 702 const base::Callback<void(bool)>& callback) { |
703 std::vector<base::FilePath> paths_to_delete; | 703 std::vector<base::FilePath> paths_to_delete; |
| 704 std::vector<OfflinePageItem> items_to_update; |
704 for (int64_t offline_id : offline_ids) { | 705 for (int64_t offline_id : offline_ids) { |
705 auto iter = offline_pages_.find(offline_id); | 706 auto iter = offline_pages_.find(offline_id); |
706 if (iter == offline_pages_.end()) | 707 if (iter == offline_pages_.end()) |
707 continue; | 708 continue; |
708 | 709 |
709 OfflinePageItem offline_page = iter->second; | 710 OfflinePageItem offline_page = iter->second; |
710 paths_to_delete.push_back(offline_page.file_path); | 711 paths_to_delete.push_back(offline_page.file_path); |
711 offline_page.expiration_time = expiration_time; | 712 offline_page.expiration_time = expiration_time; |
712 | 713 |
713 store_->AddOrUpdateOfflinePage( | 714 items_to_update.push_back(offline_page); |
714 offline_page, base::Bind(&OfflinePageModelImpl::OnExpirePageDone, | |
715 weak_ptr_factory_.GetWeakPtr(), offline_id, | |
716 expiration_time)); | |
717 } | 715 } |
| 716 |
| 717 store_->UpdateOfflinePages(items_to_update, |
| 718 base::Bind(&OfflinePageModelImpl::OnExpirePageDone, |
| 719 weak_ptr_factory_.GetWeakPtr(), |
| 720 items_to_update, expiration_time)); |
| 721 |
718 if (paths_to_delete.empty()) { | 722 if (paths_to_delete.empty()) { |
719 callback.Run(true); | 723 callback.Run(true); |
720 return; | 724 return; |
721 } | 725 } |
722 archive_manager_->DeleteMultipleArchives(paths_to_delete, callback); | 726 archive_manager_->DeleteMultipleArchives(paths_to_delete, callback); |
723 } | 727 } |
724 | 728 |
725 void OfflinePageModelImpl::OnExpirePageDone(int64_t offline_id, | 729 void OfflinePageModelImpl::OnExpirePageDone( |
726 const base::Time& expiration_time, | 730 const std::vector<OfflinePageItem>& expired_pages, |
727 bool success) { | 731 const base::Time& expiration_time, |
| 732 bool success) { |
728 UMA_HISTOGRAM_BOOLEAN("OfflinePages.ExpirePage.StoreUpdateResult", success); | 733 UMA_HISTOGRAM_BOOLEAN("OfflinePages.ExpirePage.StoreUpdateResult", success); |
729 if (!success) | 734 if (!success) |
730 return; | 735 return; |
731 const auto& iter = offline_pages_.find(offline_id); | 736 for (auto& expired_page : expired_pages) { |
732 if (iter != offline_pages_.end()) { | 737 const auto& iter = offline_pages_.find(expired_page.offline_id); |
| 738 if (iter == offline_pages_.end()) |
| 739 continue; |
| 740 |
733 iter->second.expiration_time = expiration_time; | 741 iter->second.expiration_time = expiration_time; |
734 ClientId client_id = iter->second.client_id; | 742 ClientId client_id = iter->second.client_id; |
735 offline_event_logger_.RecordPageExpired(std::to_string(offline_id)); | 743 offline_event_logger_.RecordPageExpired( |
| 744 std::to_string(expired_page.offline_id)); |
736 base::HistogramBase* histogram = base::Histogram::FactoryGet( | 745 base::HistogramBase* histogram = base::Histogram::FactoryGet( |
737 AddHistogramSuffix(client_id, "OfflinePages.ExpirePage.PageLifetime"), | 746 AddHistogramSuffix(client_id, "OfflinePages.ExpirePage.PageLifetime"), |
738 1, base::TimeDelta::FromDays(30).InMinutes(), 50, | 747 1, base::TimeDelta::FromDays(30).InMinutes(), 50, |
739 base::HistogramBase::kUmaTargetedHistogramFlag); | 748 base::HistogramBase::kUmaTargetedHistogramFlag); |
740 histogram->Add((expiration_time - iter->second.creation_time).InMinutes()); | 749 histogram->Add((expiration_time - iter->second.creation_time).InMinutes()); |
741 histogram = base::Histogram::FactoryGet( | 750 histogram = base::Histogram::FactoryGet( |
742 AddHistogramSuffix(client_id, | 751 AddHistogramSuffix(client_id, |
743 "OfflinePages.ExpirePage.TimeSinceLastAccess"), | 752 "OfflinePages.ExpirePage.TimeSinceLastAccess"), |
744 1, base::TimeDelta::FromDays(30).InMinutes(), 50, | 753 1, base::TimeDelta::FromDays(30).InMinutes(), 50, |
745 base::HistogramBase::kUmaTargetedHistogramFlag); | 754 base::HistogramBase::kUmaTargetedHistogramFlag); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 | 800 |
792 if (archiver_result != ArchiverResult::SUCCESSFULLY_CREATED) { | 801 if (archiver_result != ArchiverResult::SUCCESSFULLY_CREATED) { |
793 SavePageResult result = ToSavePageResult(archiver_result); | 802 SavePageResult result = ToSavePageResult(archiver_result); |
794 InformSavePageDone(callback, result, client_id, offline_id); | 803 InformSavePageDone(callback, result, client_id, offline_id); |
795 DeletePendingArchiver(archiver); | 804 DeletePendingArchiver(archiver); |
796 return; | 805 return; |
797 } | 806 } |
798 OfflinePageItem offline_page_item(url, offline_id, client_id, file_path, | 807 OfflinePageItem offline_page_item(url, offline_id, client_id, file_path, |
799 file_size, start_time); | 808 file_size, start_time); |
800 offline_page_item.title = title; | 809 offline_page_item.title = title; |
801 store_->AddOrUpdateOfflinePage( | 810 store_->AddOfflinePage(offline_page_item, |
802 offline_page_item, base::Bind(&OfflinePageModelImpl::OnAddOfflinePageDone, | 811 base::Bind(&OfflinePageModelImpl::OnAddOfflinePageDone, |
803 weak_ptr_factory_.GetWeakPtr(), archiver, | 812 weak_ptr_factory_.GetWeakPtr(), archiver, |
804 callback, offline_page_item)); | 813 callback, offline_page_item)); |
805 } | 814 } |
806 | 815 |
807 void OfflinePageModelImpl::OnAddOfflinePageDone( | 816 void OfflinePageModelImpl::OnAddOfflinePageDone( |
808 OfflinePageArchiver* archiver, | 817 OfflinePageArchiver* archiver, |
809 const SavePageCallback& callback, | 818 const SavePageCallback& callback, |
810 const OfflinePageItem& offline_page, | 819 const OfflinePageItem& offline_page, |
811 bool success) { | 820 OfflinePageMetadataStore::ItemActionStatus status) { |
812 SavePageResult result; | 821 SavePageResult result; |
813 if (success) { | 822 if (status == OfflinePageMetadataStore::SUCCESS) { |
814 offline_pages_[offline_page.offline_id] = offline_page; | 823 offline_pages_[offline_page.offline_id] = offline_page; |
815 result = SavePageResult::SUCCESS; | 824 result = SavePageResult::SUCCESS; |
816 ReportPageHistogramAfterSave(offline_pages_, offline_page, | 825 ReportPageHistogramAfterSave(offline_pages_, offline_page, |
817 GetCurrentTime()); | 826 GetCurrentTime()); |
818 offline_event_logger_.RecordPageSaved( | 827 offline_event_logger_.RecordPageSaved( |
819 offline_page.client_id.name_space, offline_page.url.spec(), | 828 offline_page.client_id.name_space, offline_page.url.spec(), |
820 std::to_string(offline_page.offline_id)); | 829 std::to_string(offline_page.offline_id)); |
| 830 } else if (status == OfflinePageMetadataStore::ALREADY_EXISTS) { |
| 831 result = SavePageResult::ALREADY_EXISTS; |
821 } else { | 832 } else { |
822 result = SavePageResult::STORE_FAILURE; | 833 result = SavePageResult::STORE_FAILURE; |
823 } | 834 } |
824 InformSavePageDone(callback, result, offline_page.client_id, | 835 InformSavePageDone(callback, result, offline_page.client_id, |
825 offline_page.offline_id); | 836 offline_page.offline_id); |
826 if (result == SavePageResult::SUCCESS) { | 837 if (result == SavePageResult::SUCCESS) { |
827 DeleteExistingPagesWithSameURL(offline_page); | 838 DeleteExistingPagesWithSameURL(offline_page); |
828 } else { | 839 } else { |
829 PostClearStorageIfNeededTask(); | 840 PostClearStorageIfNeededTask(); |
830 } | 841 } |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 } | 1166 } |
1156 | 1167 |
1157 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task); | 1168 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task); |
1158 } | 1169 } |
1159 | 1170 |
1160 base::Time OfflinePageModelImpl::GetCurrentTime() const { | 1171 base::Time OfflinePageModelImpl::GetCurrentTime() const { |
1161 return testing_clock_ ? testing_clock_->Now() : base::Time::Now(); | 1172 return testing_clock_ ? testing_clock_->Now() : base::Time::Now(); |
1162 } | 1173 } |
1163 | 1174 |
1164 } // namespace offline_pages | 1175 } // namespace offline_pages |
OLD | NEW |