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

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

Issue 2512073002: [Offline Pages] Removes two-step expiration related. (Closed)
Patch Set: Created 4 years, 1 month 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 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 370
371 void OfflinePageModelImpl::MarkPageAccessed(int64_t offline_id) { 371 void OfflinePageModelImpl::MarkPageAccessed(int64_t offline_id) {
372 RunWhenLoaded(base::Bind(&OfflinePageModelImpl::MarkPageAccessedWhenLoadDone, 372 RunWhenLoaded(base::Bind(&OfflinePageModelImpl::MarkPageAccessedWhenLoadDone,
373 weak_ptr_factory_.GetWeakPtr(), offline_id)); 373 weak_ptr_factory_.GetWeakPtr(), offline_id));
374 } 374 }
375 375
376 void OfflinePageModelImpl::MarkPageAccessedWhenLoadDone(int64_t offline_id) { 376 void OfflinePageModelImpl::MarkPageAccessedWhenLoadDone(int64_t offline_id) {
377 DCHECK(is_loaded_); 377 DCHECK(is_loaded_);
378 378
379 auto iter = offline_pages_.find(offline_id); 379 auto iter = offline_pages_.find(offline_id);
380 if (iter == offline_pages_.end() || iter->second.IsExpired()) 380 if (iter == offline_pages_.end())
381 return; 381 return;
382 382
383 // Make a copy of the cached item and update it. The cached item should only 383 // Make a copy of the cached item and update it. The cached item should only
384 // be updated upon the successful store operation. 384 // be updated upon the successful store operation.
385 OfflinePageItem offline_page_item = iter->second; 385 OfflinePageItem offline_page_item = iter->second;
386 386
387 ReportPageHistogramsAfterAccess(offline_page_item, GetCurrentTime()); 387 ReportPageHistogramsAfterAccess(offline_page_item, GetCurrentTime());
388 388
389 offline_page_item.last_access_time = GetCurrentTime(); 389 offline_page_item.last_access_time = GetCurrentTime();
390 offline_page_item.access_count++; 390 offline_page_item.access_count++;
(...skipping 13 matching lines...) Expand all
404 } 404 }
405 405
406 void OfflinePageModelImpl::DoDeletePagesByOfflineId( 406 void OfflinePageModelImpl::DoDeletePagesByOfflineId(
407 const std::vector<int64_t>& offline_ids, 407 const std::vector<int64_t>& offline_ids,
408 const DeletePageCallback& callback) { 408 const DeletePageCallback& callback) {
409 DCHECK(is_loaded_); 409 DCHECK(is_loaded_);
410 410
411 std::vector<base::FilePath> paths_to_delete; 411 std::vector<base::FilePath> paths_to_delete;
412 for (const auto& offline_id : offline_ids) { 412 for (const auto& offline_id : offline_ids) {
413 auto iter = offline_pages_.find(offline_id); 413 auto iter = offline_pages_.find(offline_id);
414 if (iter != offline_pages_.end() && !iter->second.IsExpired()) { 414 if (iter != offline_pages_.end()) {
415 paths_to_delete.push_back(iter->second.file_path); 415 paths_to_delete.push_back(iter->second.file_path);
416 } 416 }
417 } 417 }
418 418
419 // If there're no pages to delete, return early. 419 // If there're no pages to delete, return early.
420 if (paths_to_delete.empty()) { 420 if (paths_to_delete.empty()) {
421 InformDeletePageDone(callback, DeletePageResult::SUCCESS); 421 InformDeletePageDone(callback, DeletePageResult::SUCCESS);
422 return; 422 return;
423 } 423 }
424 424
425 archive_manager_->DeleteMultipleArchives( 425 archive_manager_->DeleteMultipleArchives(
426 paths_to_delete, 426 paths_to_delete,
427 base::Bind(&OfflinePageModelImpl::OnDeleteArchiveFilesDone, 427 base::Bind(&OfflinePageModelImpl::OnDeleteArchiveFilesDone,
428 weak_ptr_factory_.GetWeakPtr(), offline_ids, callback)); 428 weak_ptr_factory_.GetWeakPtr(), offline_ids, callback));
429 } 429 }
430 430
431 void OfflinePageModelImpl::DeletePagesByClientIds( 431 void OfflinePageModelImpl::DeletePagesByClientIds(
432 const std::vector<ClientId>& client_ids, 432 const std::vector<ClientId>& client_ids,
433 const DeletePageCallback& callback) { 433 const DeletePageCallback& callback) {
434 OfflinePageModelQueryBuilder builder; 434 OfflinePageModelQueryBuilder builder;
435 builder 435 builder.SetClientIds(OfflinePageModelQuery::Requirement::INCLUDE_MATCHING,
436 .SetClientIds(OfflinePageModelQuery::Requirement::INCLUDE_MATCHING, 436 client_ids);
437 client_ids)
438 .AllowExpiredPages(true);
439 auto delete_pages = base::Bind(&OfflinePageModelImpl::DeletePages, 437 auto delete_pages = base::Bind(&OfflinePageModelImpl::DeletePages,
440 weak_ptr_factory_.GetWeakPtr(), callback); 438 weak_ptr_factory_.GetWeakPtr(), callback);
441 RunWhenLoaded(base::Bind(&OfflinePageModelImpl::GetPagesMatchingQuery, 439 RunWhenLoaded(base::Bind(&OfflinePageModelImpl::GetPagesMatchingQuery,
442 weak_ptr_factory_.GetWeakPtr(), 440 weak_ptr_factory_.GetWeakPtr(),
443 base::Passed(builder.Build(GetPolicyController())), 441 base::Passed(builder.Build(GetPolicyController())),
444 delete_pages)); 442 delete_pages));
445 } 443 }
446 444
447 void OfflinePageModelImpl::DeletePages( 445 void OfflinePageModelImpl::DeletePages(
448 const DeletePageCallback& callback, 446 const DeletePageCallback& callback,
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 530
533 void OfflinePageModelImpl::GetAllPages( 531 void OfflinePageModelImpl::GetAllPages(
534 const MultipleOfflinePageItemCallback& callback) { 532 const MultipleOfflinePageItemCallback& callback) {
535 OfflinePageModelQueryBuilder builder; 533 OfflinePageModelQueryBuilder builder;
536 RunWhenLoaded(base::Bind(&OfflinePageModelImpl::GetPagesMatchingQuery, 534 RunWhenLoaded(base::Bind(&OfflinePageModelImpl::GetPagesMatchingQuery,
537 weak_ptr_factory_.GetWeakPtr(), 535 weak_ptr_factory_.GetWeakPtr(),
538 base::Passed(builder.Build(GetPolicyController())), 536 base::Passed(builder.Build(GetPolicyController())),
539 callback)); 537 callback));
540 } 538 }
541 539
542 void OfflinePageModelImpl::GetAllPagesWithExpired(
543 const MultipleOfflinePageItemCallback& callback) {
544 OfflinePageModelQueryBuilder builder;
545 builder.AllowExpiredPages(true);
546
547 RunWhenLoaded(base::Bind(&OfflinePageModelImpl::GetPagesMatchingQuery,
548 weak_ptr_factory_.GetWeakPtr(),
549 base::Passed(builder.Build(GetPolicyController())),
550 callback));
551 }
552
553 void OfflinePageModelImpl::GetOfflineIdsForClientId( 540 void OfflinePageModelImpl::GetOfflineIdsForClientId(
554 const ClientId& client_id, 541 const ClientId& client_id,
555 const MultipleOfflineIdCallback& callback) { 542 const MultipleOfflineIdCallback& callback) {
556 RunWhenLoaded( 543 RunWhenLoaded(
557 base::Bind(&OfflinePageModelImpl::GetOfflineIdsForClientIdWhenLoadDone, 544 base::Bind(&OfflinePageModelImpl::GetOfflineIdsForClientIdWhenLoadDone,
558 weak_ptr_factory_.GetWeakPtr(), client_id, callback)); 545 weak_ptr_factory_.GetWeakPtr(), client_id, callback));
559 } 546 }
560 547
561 void OfflinePageModelImpl::GetOfflineIdsForClientIdWhenLoadDone( 548 void OfflinePageModelImpl::GetOfflineIdsForClientIdWhenLoadDone(
562 const ClientId& client_id, 549 const ClientId& client_id,
563 const MultipleOfflineIdCallback& callback) const { 550 const MultipleOfflineIdCallback& callback) const {
564 callback.Run(MaybeGetOfflineIdsForClientId(client_id)); 551 callback.Run(MaybeGetOfflineIdsForClientId(client_id));
565 } 552 }
566 553
567 const std::vector<int64_t> OfflinePageModelImpl::MaybeGetOfflineIdsForClientId( 554 const std::vector<int64_t> OfflinePageModelImpl::MaybeGetOfflineIdsForClientId(
568 const ClientId& client_id) const { 555 const ClientId& client_id) const {
569 DCHECK(is_loaded_); 556 DCHECK(is_loaded_);
570 std::vector<int64_t> results; 557 std::vector<int64_t> results;
571 558
572 // We want only all pages, including those marked for deletion. 559 // We want only all pages, including those marked for deletion.
573 // TODO(fgorski): actually use an index rather than linear scan. 560 // TODO(fgorski): actually use an index rather than linear scan.
574 for (const auto& id_page_pair : offline_pages_) { 561 for (const auto& id_page_pair : offline_pages_) {
575 if (id_page_pair.second.client_id == client_id && 562 if (id_page_pair.second.client_id == client_id) {
576 !id_page_pair.second.IsExpired()) {
577 results.push_back(id_page_pair.second.offline_id); 563 results.push_back(id_page_pair.second.offline_id);
578 } 564 }
579 } 565 }
580 return results; 566 return results;
581 } 567 }
582 568
583 void OfflinePageModelImpl::GetPageByOfflineId( 569 void OfflinePageModelImpl::GetPageByOfflineId(
584 int64_t offline_id, 570 int64_t offline_id,
585 const SingleOfflinePageItemCallback& callback) { 571 const SingleOfflinePageItemCallback& callback) {
586 std::vector<int64_t> query_ids; 572 std::vector<int64_t> query_ids;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 const MultipleOfflinePageItemCallback& callback) const { 607 const MultipleOfflinePageItemCallback& callback) const {
622 std::vector<OfflinePageItem> result; 608 std::vector<OfflinePageItem> result;
623 609
624 GURL::Replacements remove_params; 610 GURL::Replacements remove_params;
625 remove_params.ClearRef(); 611 remove_params.ClearRef();
626 612
627 GURL online_url_without_fragment = 613 GURL online_url_without_fragment =
628 online_url.ReplaceComponents(remove_params); 614 online_url.ReplaceComponents(remove_params);
629 615
630 for (const auto& id_page_pair : offline_pages_) { 616 for (const auto& id_page_pair : offline_pages_) {
631 if (id_page_pair.second.IsExpired())
632 continue;
633 if (online_url == id_page_pair.second.url) { 617 if (online_url == id_page_pair.second.url) {
634 result.push_back(id_page_pair.second); 618 result.push_back(id_page_pair.second);
635 continue; 619 continue;
636 } 620 }
637 // If the full URL does not match, try with the fragment identifier 621 // If the full URL does not match, try with the fragment identifier
638 // stripped. 622 // stripped.
639 if (online_url_without_fragment == 623 if (online_url_without_fragment ==
640 id_page_pair.second.url.ReplaceComponents(remove_params)) { 624 id_page_pair.second.url.ReplaceComponents(remove_params)) {
641 result.push_back(id_page_pair.second); 625 result.push_back(id_page_pair.second);
642 } 626 }
643 } 627 }
644 628
645 callback.Run(result); 629 callback.Run(result);
646 } 630 }
647 631
648 void OfflinePageModelImpl::CheckMetadataConsistency() { 632 void OfflinePageModelImpl::CheckMetadataConsistency() {
649 DCHECK(is_loaded_); 633 DCHECK(is_loaded_);
650 archive_manager_->GetAllArchives( 634 archive_manager_->GetAllArchives(
651 base::Bind(&OfflinePageModelImpl::CheckMetadataConsistencyForArchivePaths, 635 base::Bind(&OfflinePageModelImpl::CheckMetadataConsistencyForArchivePaths,
652 weak_ptr_factory_.GetWeakPtr())); 636 weak_ptr_factory_.GetWeakPtr()));
653 } 637 }
654 638
655 void OfflinePageModelImpl::ExpirePages(
656 const std::vector<int64_t>& offline_ids,
657 const base::Time& expiration_time,
658 const base::Callback<void(bool)>& callback) {
659 std::vector<base::FilePath> paths_to_delete;
660 std::vector<OfflinePageItem> items_to_update;
661 for (int64_t offline_id : offline_ids) {
662 auto iter = offline_pages_.find(offline_id);
663 if (iter == offline_pages_.end())
664 continue;
665
666 OfflinePageItem offline_page = iter->second;
667 paths_to_delete.push_back(offline_page.file_path);
668 offline_page.expiration_time = expiration_time;
669
670 items_to_update.push_back(offline_page);
671 }
672
673 store_->UpdateOfflinePages(
674 items_to_update,
675 base::Bind(&OfflinePageModelImpl::OnExpirePageDone,
676 weak_ptr_factory_.GetWeakPtr(), expiration_time));
677
678 if (paths_to_delete.empty()) {
679 callback.Run(true);
680 return;
681 }
682 archive_manager_->DeleteMultipleArchives(paths_to_delete, callback);
683 }
684
685 void OfflinePageModelImpl::OnExpirePageDone(
686 const base::Time& expiration_time,
687 std::unique_ptr<OfflinePagesUpdateResult> result) {
688 UMA_HISTOGRAM_BOOLEAN("OfflinePages.ExpirePage.StoreUpdateResult",
689 result->updated_items.size() > 0);
690 for (const auto& expired_page : result->updated_items) {
691 const auto& iter = offline_pages_.find(expired_page.offline_id);
692 if (iter == offline_pages_.end())
693 continue;
694
695 iter->second.expiration_time = expiration_time;
696 ClientId client_id = iter->second.client_id;
697 offline_event_logger_.RecordPageExpired(
698 std::to_string(expired_page.offline_id));
699 base::HistogramBase* histogram = base::Histogram::FactoryGet(
700 AddHistogramSuffix(client_id, "OfflinePages.ExpirePage.PageLifetime"),
701 1, base::TimeDelta::FromDays(30).InMinutes(), 50,
702 base::HistogramBase::kUmaTargetedHistogramFlag);
703 histogram->Add((expiration_time - iter->second.creation_time).InMinutes());
704 histogram = base::Histogram::FactoryGet(
705 AddHistogramSuffix(client_id,
706 "OfflinePages.ExpirePage.TimeSinceLastAccess"),
707 1, base::TimeDelta::FromDays(30).InMinutes(), 50,
708 base::HistogramBase::kUmaTargetedHistogramFlag);
709 histogram->Add(
710 (expiration_time - iter->second.last_access_time).InMinutes());
711 }
712 }
713
714 ClientPolicyController* OfflinePageModelImpl::GetPolicyController() { 639 ClientPolicyController* OfflinePageModelImpl::GetPolicyController() {
715 return policy_controller_.get(); 640 return policy_controller_.get();
716 } 641 }
717 642
718 OfflinePageMetadataStore* OfflinePageModelImpl::GetStoreForTesting() { 643 OfflinePageMetadataStore* OfflinePageModelImpl::GetStoreForTesting() {
719 return store_.get(); 644 return store_.get();
720 } 645 }
721 646
722 OfflinePageStorageManager* OfflinePageModelImpl::GetStorageManager() { 647 OfflinePageStorageManager* OfflinePageModelImpl::GetStorageManager() {
723 return storage_manager_.get(); 648 return storage_manager_.get();
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
980 static_cast<int>(result), 905 static_cast<int>(result),
981 static_cast<int>(DeletePageResult::RESULT_COUNT)); 906 static_cast<int>(DeletePageResult::RESULT_COUNT));
982 archive_manager_->GetStorageStats( 907 archive_manager_->GetStorageStats(
983 base::Bind(&ReportStorageHistogramsAfterDelete)); 908 base::Bind(&ReportStorageHistogramsAfterDelete));
984 if (!callback.is_null()) 909 if (!callback.is_null())
985 callback.Run(result); 910 callback.Run(result);
986 } 911 }
987 912
988 void OfflinePageModelImpl::CheckMetadataConsistencyForArchivePaths( 913 void OfflinePageModelImpl::CheckMetadataConsistencyForArchivePaths(
989 const std::set<base::FilePath>& archive_paths) { 914 const std::set<base::FilePath>& archive_paths) {
990 ExpirePagesMissingArchiveFile(archive_paths); 915 DeletePagesMissingArchiveFile(archive_paths);
991 DeleteOrphanedArchives(archive_paths); 916 DeleteOrphanedArchives(archive_paths);
992 } 917 }
993 918
994 void OfflinePageModelImpl::ExpirePagesMissingArchiveFile( 919 void OfflinePageModelImpl::DeletePagesMissingArchiveFile(
995 const std::set<base::FilePath>& archive_paths) { 920 const std::set<base::FilePath>& archive_paths) {
996 std::vector<int64_t> ids_of_pages_missing_archive_file; 921 std::vector<int64_t> ids_of_pages_missing_archive_file;
997 for (const auto& id_page_pair : offline_pages_) { 922 for (const auto& id_page_pair : offline_pages_) {
998 if (archive_paths.count(id_page_pair.second.file_path) == 0UL) 923 if (archive_paths.count(id_page_pair.second.file_path) == 0UL)
999 ids_of_pages_missing_archive_file.push_back(id_page_pair.first); 924 ids_of_pages_missing_archive_file.push_back(id_page_pair.first);
1000 } 925 }
1001 926
1002 if (ids_of_pages_missing_archive_file.empty()) 927 if (ids_of_pages_missing_archive_file.empty())
1003 return; 928 return;
1004 929
1005 ExpirePages( 930 DeletePagesByOfflineId(
1006 ids_of_pages_missing_archive_file, GetCurrentTime(), 931 ids_of_pages_missing_archive_file,
1007 base::Bind(&OfflinePageModelImpl::OnExpirePagesMissingArchiveFileDone, 932 base::Bind(&OfflinePageModelImpl::OnDeletePagesMissingArchiveFileDone,
1008 weak_ptr_factory_.GetWeakPtr(), 933 weak_ptr_factory_.GetWeakPtr(),
1009 ids_of_pages_missing_archive_file)); 934 ids_of_pages_missing_archive_file));
1010 } 935 }
1011 936
1012 void OfflinePageModelImpl::OnExpirePagesMissingArchiveFileDone( 937 void OfflinePageModelImpl::OnDeletePagesMissingArchiveFileDone(
1013 const std::vector<int64_t>& offline_ids, 938 const std::vector<int64_t>& offline_ids,
1014 bool success) { 939 DeletePageResult result) {
1015 UMA_HISTOGRAM_COUNTS("OfflinePages.Consistency.PagesMissingArchiveFileCount", 940 UMA_HISTOGRAM_COUNTS("OfflinePages.Consistency.PagesMissingArchiveFileCount",
1016 static_cast<int32_t>(offline_ids.size())); 941 static_cast<int32_t>(offline_ids.size()));
1017 UMA_HISTOGRAM_BOOLEAN( 942 UMA_HISTOGRAM_ENUMERATION(
1018 "OfflinePages.Consistency.ExpirePagesMissingArchiveFileResult", success); 943 "OfflinePages.Consistency.DeletePagesMissingArchiveFileResult",
944 static_cast<int>(result),
945 static_cast<int>(DeletePageResult::RESULT_COUNT));
1019 } 946 }
1020 947
1021 void OfflinePageModelImpl::DeleteOrphanedArchives( 948 void OfflinePageModelImpl::DeleteOrphanedArchives(
1022 const std::set<base::FilePath>& archive_paths) { 949 const std::set<base::FilePath>& archive_paths) {
1023 // Archives are considered orphaned unless they are pointed to by some pages. 950 // Archives are considered orphaned unless they are pointed to by some pages.
1024 std::set<base::FilePath> orphaned_archive_set(archive_paths); 951 std::set<base::FilePath> orphaned_archive_set(archive_paths);
1025 for (const auto& id_page_pair : offline_pages_) 952 for (const auto& id_page_pair : offline_pages_)
1026 orphaned_archive_set.erase(id_page_pair.second.file_path); 953 orphaned_archive_set.erase(id_page_pair.second.file_path);
1027 954
1028 if (orphaned_archive_set.empty()) 955 if (orphaned_archive_set.empty())
(...skipping 21 matching lines...) Expand all
1050 offline_pages_.clear(); 977 offline_pages_.clear();
1051 for (const auto& offline_page : offline_pages) 978 for (const auto& offline_page : offline_pages)
1052 offline_pages_[offline_page.offline_id] = offline_page; 979 offline_pages_[offline_page.offline_id] = offline_page;
1053 } 980 }
1054 981
1055 void OfflinePageModelImpl::ClearStorageIfNeeded( 982 void OfflinePageModelImpl::ClearStorageIfNeeded(
1056 const ClearStorageCallback& callback) { 983 const ClearStorageCallback& callback) {
1057 storage_manager_->ClearPagesIfNeeded(callback); 984 storage_manager_->ClearPagesIfNeeded(callback);
1058 } 985 }
1059 986
1060 void OfflinePageModelImpl::OnStorageCleared(size_t expired_page_count, 987 void OfflinePageModelImpl::OnStorageCleared(size_t deleted_page_count,
1061 ClearStorageResult result) { 988 ClearStorageResult result) {
1062 UMA_HISTOGRAM_ENUMERATION("OfflinePages.ClearStorageResult", 989 UMA_HISTOGRAM_ENUMERATION("OfflinePages.ClearStorageResult",
1063 static_cast<int>(result), 990 static_cast<int>(result),
1064 static_cast<int>(ClearStorageResult::RESULT_COUNT)); 991 static_cast<int>(ClearStorageResult::RESULT_COUNT));
1065 if (expired_page_count > 0) { 992 if (deleted_page_count > 0) {
1066 UMA_HISTOGRAM_COUNTS("OfflinePages.ExpirePage.BatchSize", 993 UMA_HISTOGRAM_COUNTS("OfflinePages.ClearStorageBatchSize",
1067 static_cast<int32_t>(expired_page_count)); 994 static_cast<int32_t>(deleted_page_count));
1068 } 995 }
1069 } 996 }
1070 997
1071 void OfflinePageModelImpl::PostClearStorageIfNeededTask() { 998 void OfflinePageModelImpl::PostClearStorageIfNeededTask() {
1072 base::ThreadTaskRunnerHandle::Get()->PostTask( 999 base::ThreadTaskRunnerHandle::Get()->PostTask(
1073 FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded, 1000 FROM_HERE, base::Bind(&OfflinePageModelImpl::ClearStorageIfNeeded,
1074 weak_ptr_factory_.GetWeakPtr(), 1001 weak_ptr_factory_.GetWeakPtr(),
1075 base::Bind(&OfflinePageModelImpl::OnStorageCleared, 1002 base::Bind(&OfflinePageModelImpl::OnStorageCleared,
1076 weak_ptr_factory_.GetWeakPtr()))); 1003 weak_ptr_factory_.GetWeakPtr())));
1077 } 1004 }
(...skipping 11 matching lines...) Expand all
1089 } 1016 }
1090 1017
1091 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task); 1018 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task);
1092 } 1019 }
1093 1020
1094 base::Time OfflinePageModelImpl::GetCurrentTime() const { 1021 base::Time OfflinePageModelImpl::GetCurrentTime() const {
1095 return testing_clock_ ? testing_clock_->Now() : base::Time::Now(); 1022 return testing_clock_ ? testing_clock_->Now() : base::Time::Now();
1096 } 1023 }
1097 1024
1098 } // namespace offline_pages 1025 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698