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

Side by Side Diff: components/offline_pages/offline_page_model_impl.cc

Issue 2041983006: [Offline Pages] Filtering expired pages and fix consistency check. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: minor name changes. Created 4 years, 6 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
OLDNEW
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
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
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
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
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
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 DeleteOrphanedArchives(archive_paths);
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(
864 std::make_pair(id_page_pair.first, id_page_pair.second.client_id));
865 }
866 } 886 }
867 887
868 // No offline pages missing archive files, we can bail out.
869 if (ids_of_pages_missing_archive_file.empty()) 888 if (ids_of_pages_missing_archive_file.empty())
870 return; 889 return;
871 890
872 DeletePageCallback remove_pages_done_callback(base::Bind( 891 ExpirePages(
873 &OfflinePageModelImpl::OnRemoveOfflinePagesMissingArchiveFileDone, 892 ids_of_pages_missing_archive_file, base::Time::Now(),
874 weak_ptr_factory_.GetWeakPtr(), offline_client_id_pairs)); 893 base::Bind(&OfflinePageModelImpl::OnExpirePagesMissingArchiveFileDone,
875
876 store_->RemoveOfflinePages(
877 ids_of_pages_missing_archive_file,
878 base::Bind(&OfflinePageModelImpl::OnRemoveOfflinePagesDone,
879 weak_ptr_factory_.GetWeakPtr(), 894 weak_ptr_factory_.GetWeakPtr(),
880 ids_of_pages_missing_archive_file, 895 ids_of_pages_missing_archive_file));
881 remove_pages_done_callback));
882 } 896 }
883 897
884 void OfflinePageModelImpl::OnRemoveOfflinePagesMissingArchiveFileDone( 898 void OfflinePageModelImpl::OnExpirePagesMissingArchiveFileDone(
885 const std::vector<std::pair<int64_t, ClientId>>& offline_client_id_pairs, 899 const std::vector<int64_t>& offline_ids,
886 DeletePageResult /* result */) { 900 bool success) {
887 for (const auto& id_pair : offline_client_id_pairs) { 901 UMA_HISTOGRAM_COUNTS("OfflinePages.Consistency.PagesMissingArchiveFileCount",
888 FOR_EACH_OBSERVER(Observer, observers_, 902 static_cast<int32_t>(offline_ids.size()));
889 OfflinePageDeleted(id_pair.first, id_pair.second)); 903 UMA_HISTOGRAM_BOOLEAN(
890 } 904 "OfflinePages.Consistency.ExpirePagesMissingArchiveFileResult", success);
905 }
906
907 void OfflinePageModelImpl::DeleteOrphanedArchives(
908 const std::set<base::FilePath>& archive_paths) {
909 // Archives are considered orphaned unless they are pointed to by some pages.
910 std::set<base::FilePath> orphaned_archive_set(archive_paths);
911 for (const auto& id_page_pair : offline_pages_)
912 orphaned_archive_set.erase(id_page_pair.second.file_path);
913
914 if (orphaned_archive_set.empty())
915 return;
916
917 std::vector<base::FilePath> orphaned_archives(orphaned_archive_set.begin(),
918 orphaned_archive_set.end());
919 archive_manager_->DeleteMultipleArchives(
920 orphaned_archives,
921 base::Bind(&OfflinePageModelImpl::OnDeleteOrphanedArchivesDone,
922 weak_ptr_factory_.GetWeakPtr(), orphaned_archives));
923 }
924
925 void OfflinePageModelImpl::OnDeleteOrphanedArchivesDone(
926 const std::vector<base::FilePath>& archives,
927 bool success) {
928 UMA_HISTOGRAM_COUNTS("OfflinePages.Consistency.OrphanedArchivesCount",
929 static_cast<int32_t>(archives.size()));
930 UMA_HISTOGRAM_BOOLEAN("OfflinePages.Consistency.DeleteOrphanedArchivesResult",
931 success);
891 } 932 }
892 933
893 void OfflinePageModelImpl::OnRemoveAllFilesDoneForClearAll( 934 void OfflinePageModelImpl::OnRemoveAllFilesDoneForClearAll(
894 const base::Closure& callback, 935 const base::Closure& callback,
895 DeletePageResult result) { 936 DeletePageResult result) {
896 store_->Reset(base::Bind(&OfflinePageModelImpl::OnResetStoreDoneForClearAll, 937 store_->Reset(base::Bind(&OfflinePageModelImpl::OnResetStoreDoneForClearAll,
897 weak_ptr_factory_.GetWeakPtr(), callback)); 938 weak_ptr_factory_.GetWeakPtr(), callback));
898 } 939 }
899 940
900 void OfflinePageModelImpl::OnResetStoreDoneForClearAll( 941 void OfflinePageModelImpl::OnResetStoreDoneForClearAll(
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
953 void OfflinePageModelImpl::RunWhenLoaded(const base::Closure& task) { 994 void OfflinePageModelImpl::RunWhenLoaded(const base::Closure& task) {
954 if (!is_loaded_) { 995 if (!is_loaded_) {
955 delayed_tasks_.push_back(task); 996 delayed_tasks_.push_back(task);
956 return; 997 return;
957 } 998 }
958 999
959 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task); 1000 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task);
960 } 1001 }
961 1002
962 } // namespace offline_pages 1003 } // namespace offline_pages
OLDNEW
« no previous file with comments | « components/offline_pages/offline_page_model_impl.h ('k') | components/offline_pages/offline_page_model_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698