Chromium Code Reviews| Index: components/offline_pages/offline_page_model_impl.cc |
| diff --git a/components/offline_pages/offline_page_model_impl.cc b/components/offline_pages/offline_page_model_impl.cc |
| index 4d6f1d7af3939455a3ab139c1001cfda815afc1a..c45973d34391a73f7c9bfa83e888a66b16215249 100644 |
| --- a/components/offline_pages/offline_page_model_impl.cc |
| +++ b/components/offline_pages/offline_page_model_impl.cc |
| @@ -796,12 +796,66 @@ void OfflinePageModelImpl::InformSavePageDone(const SavePageCallback& callback, |
| ReportSavePageResultHistogramAfterSave(client_id, result); |
| archive_manager_->GetStorageStats( |
| base::Bind(&ReportStorageHistogramsAfterSave)); |
| + // Remove other user initiated pages with same url if the new save request was |
| + // user initiated. |
| + size_t pages_allowed = |
| + policy_controller_->GetPolicy(client_id.name_space).pages_allowed_per_url; |
| + if (result == SavePageResult::SUCCESS && pages_allowed > 0) { |
| + GetPagesByOnlineURL( |
| + offline_pages_[offline_id].url, |
| + base::Bind(&OfflinePageModelImpl::OnPagesFoundWithSameURL, |
| + weak_ptr_factory_.GetWeakPtr(), client_id, offline_id, |
| + pages_allowed)); |
| + } else { |
| + base::ThreadTaskRunnerHandle::Get()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded, |
| + weak_ptr_factory_.GetWeakPtr(), |
| + base::Bind(&OfflinePageModelImpl::OnStorageCleared, |
| + weak_ptr_factory_.GetWeakPtr()))); |
| + } |
| + callback.Run(result, offline_id); |
| +} |
| + |
| +void OfflinePageModelImpl::OnPagesFoundWithSameURL( |
| + const ClientId& client_id, |
| + int64_t offline_id, |
| + size_t pages_allowed, |
| + const MultipleOfflinePageItemResult& items) { |
| + std::vector<OfflinePageItem> pages_to_delete; |
| + for (const auto& item : items) { |
| + if (item.offline_id != offline_id && |
| + item.client_id.name_space == client_id.name_space) { |
| + pages_to_delete.push_back(item); |
| + } |
| + } |
| + // Only keep |pages_allowed|-1 of most fresh pages, and delete others, by |
|
fgorski
2016/06/21 19:48:10
remove the coma in front of "and" please.
romax
2016/06/21 23:04:45
Done.
|
| + // sorting pages with fresh ones first and resize the vector. |
|
fgorski
2016/06/21 19:48:10
should say: sorting with oldest first
romax
2016/06/21 23:04:45
Done.
|
| + if (pages_to_delete.size() >= pages_allowed) { |
| + sort(pages_to_delete.begin(), pages_to_delete.end(), |
| + [](const OfflinePageItem& a, const OfflinePageItem& b) -> bool { |
| + return a.last_access_time > b.last_access_time; |
|
fgorski
2016/06/21 19:48:10
should match the comment above
< instead of >
Ple
romax
2016/06/21 23:04:45
Done.
|
| + }); |
| + pages_to_delete.resize(pages_to_delete.size() - pages_allowed + 1); |
| + } |
| + std::vector<int64_t> page_ids_to_delete; |
| + for (const auto& item : pages_to_delete) { |
|
fgorski
2016/06/21 19:48:10
nit: braces not needed
romax
2016/06/21 23:04:45
Done.
|
| + page_ids_to_delete.push_back(item.offline_id); |
| + } |
| + DeletePagesByOfflineId( |
| + page_ids_to_delete, |
| + base::Bind(&OfflinePageModelImpl::OnDeleteOldPagesWithSameURL, |
| + weak_ptr_factory_.GetWeakPtr())); |
| +} |
| + |
| +void OfflinePageModelImpl::OnDeleteOldPagesWithSameURL( |
| + DeletePageResult result) { |
| + // TODO(romax) Add UMAs for failure cases. |
| base::ThreadTaskRunnerHandle::Get()->PostTask( |
| FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded, |
| weak_ptr_factory_.GetWeakPtr(), |
| base::Bind(&OfflinePageModelImpl::OnStorageCleared, |
| weak_ptr_factory_.GetWeakPtr()))); |
| - callback.Run(result, offline_id); |
| } |
| void OfflinePageModelImpl::DeletePendingArchiver( |