OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "chrome/browser/history/top_sites_impl.h" | 5 #include "chrome/browser/history/top_sites_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
618 new_url.redirects.push_back(url); | 618 new_url.redirects.push_back(url); |
619 } | 619 } |
620 new_url.last_forced_time = time; | 620 new_url.last_forced_time = time; |
621 // Add forced URLs and sort. Added to the end of the list of forced URLs | 621 // Add forced URLs and sort. Added to the end of the list of forced URLs |
622 // since this is almost always where it needs to go, unless the user's local | 622 // since this is almost always where it needs to go, unless the user's local |
623 // clock is fiddled with. | 623 // clock is fiddled with. |
624 MostVisitedURLList::iterator mid = new_list.begin() + num_forced; | 624 MostVisitedURLList::iterator mid = new_list.begin() + num_forced; |
625 new_list.insert(mid, new_url); | 625 new_list.insert(mid, new_url); |
626 mid = new_list.begin() + num_forced; // Mid was invalidated. | 626 mid = new_list.begin() + num_forced; // Mid was invalidated. |
627 std::inplace_merge(new_list.begin(), mid, mid + 1, ForcedURLComparator); | 627 std::inplace_merge(new_list.begin(), mid, mid + 1, ForcedURLComparator); |
628 SetTopSites(new_list); | 628 SetTopSites(new_list, TopSitesBackend::CALL_LOCATION_FROM_OTHER_PLACES); |
629 return true; | 629 return true; |
630 } | 630 } |
631 | 631 |
632 bool TopSitesImpl::AddPrepopulatedPages(MostVisitedURLList* urls, | 632 bool TopSitesImpl::AddPrepopulatedPages(MostVisitedURLList* urls, |
633 size_t num_forced_urls) { | 633 size_t num_forced_urls) { |
634 bool added = false; | 634 bool added = false; |
635 for (const auto& prepopulated_page : prepopulated_pages_) { | 635 for (const auto& prepopulated_page : prepopulated_pages_) { |
636 if (urls->size() - num_forced_urls < kNonForcedTopSitesNumber && | 636 if (urls->size() - num_forced_urls < kNonForcedTopSitesNumber && |
637 IndexOf(*urls, prepopulated_page.most_visited.url) == -1) { | 637 IndexOf(*urls, prepopulated_page.most_visited.url) == -1) { |
638 urls->push_back(prepopulated_page.most_visited); | 638 urls->push_back(prepopulated_page.most_visited); |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
745 return; | 745 return; |
746 const GURL& url = load_details->entry->GetURL(); | 746 const GURL& url = load_details->entry->GetURL(); |
747 if (!cache_->IsKnownURL(url) && CanAddURLToHistory(url)) { | 747 if (!cache_->IsKnownURL(url) && CanAddURLToHistory(url)) { |
748 // To avoid slamming history we throttle requests when the url updates. | 748 // To avoid slamming history we throttle requests when the url updates. |
749 // To do otherwise negatively impacts perf tests. | 749 // To do otherwise negatively impacts perf tests. |
750 RestartQueryForTopSitesTimer(GetUpdateDelay()); | 750 RestartQueryForTopSitesTimer(GetUpdateDelay()); |
751 } | 751 } |
752 } | 752 } |
753 } | 753 } |
754 | 754 |
755 void TopSitesImpl::SetTopSites(const MostVisitedURLList& new_top_sites) { | 755 void TopSitesImpl::SetTopSites( |
| 756 const MostVisitedURLList& new_top_sites, |
| 757 const TopSitesBackend::CallLocation location) { |
756 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 758 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
757 | 759 |
758 MostVisitedURLList top_sites(new_top_sites); | 760 MostVisitedURLList top_sites(new_top_sites); |
759 size_t num_forced_urls = MergeCachedForcedURLs(&top_sites); | 761 size_t num_forced_urls = MergeCachedForcedURLs(&top_sites); |
760 AddPrepopulatedPages(&top_sites, num_forced_urls); | 762 AddPrepopulatedPages(&top_sites, num_forced_urls); |
761 | 763 |
762 TopSitesDelta delta; | 764 TopSitesDelta delta; |
763 DiffMostVisited(cache_->top_sites(), top_sites, &delta); | 765 DiffMostVisited(cache_->top_sites(), top_sites, &delta); |
| 766 |
| 767 // Record the delta size into a histogram if this function is called from |
| 768 // function OnGotMostVisitedThumbnails and no histogram value has been |
| 769 // recorded before. |
| 770 if (location == |
| 771 TopSitesBackend::CALL_LOCATION_FROM_ON_GOT_MOST_VISITED_THUMBNAILS && |
| 772 backend_->histogram_recorded() == |
| 773 TopSitesBackend::HISTOGRAM_RECORDING_NOT_YET) { |
| 774 size_t delta_size = |
| 775 delta.deleted.size() + delta.added.size() + delta.moved.size(); |
| 776 UMA_HISTOGRAM_COUNTS_100( |
| 777 "History.UpdateTopSitesOnDBThread_Startup_DeltaSize", delta_size); |
| 778 // Increase the enum value so that TopSitesBackend knows that it should |
| 779 // record the relevant histogram value as well. |
| 780 backend_->IncraseHistogramRecordingStatus(); |
| 781 } |
| 782 |
764 if (!delta.deleted.empty() || !delta.added.empty() || !delta.moved.empty()) { | 783 if (!delta.deleted.empty() || !delta.added.empty() || !delta.moved.empty()) { |
765 backend_->UpdateTopSites(delta); | 784 backend_->UpdateTopSites(delta, location); |
766 } | 785 } |
767 | 786 |
768 last_num_urls_changed_ = delta.added.size() + delta.moved.size(); | 787 last_num_urls_changed_ = delta.added.size() + delta.moved.size(); |
769 | 788 |
770 // We always do the following steps (setting top sites in cache, and resetting | 789 // We always do the following steps (setting top sites in cache, and resetting |
771 // thread safe cache ...) as this method is invoked during startup at which | 790 // thread safe cache ...) as this method is invoked during startup at which |
772 // point the caches haven't been updated yet. | 791 // point the caches haven't been updated yet. |
773 cache_->SetTopSites(top_sites); | 792 cache_->SetTopSites(top_sites); |
774 | 793 |
775 // See if we have any tmp thumbnails for the new sites. | 794 // See if we have any tmp thumbnails for the new sites. |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
872 timer_.Start(FROM_HERE, delta, this, &TopSitesImpl::TimerFired); | 891 timer_.Start(FROM_HERE, delta, this, &TopSitesImpl::TimerFired); |
873 } | 892 } |
874 | 893 |
875 void TopSitesImpl::OnGotMostVisitedThumbnails( | 894 void TopSitesImpl::OnGotMostVisitedThumbnails( |
876 const scoped_refptr<MostVisitedThumbnails>& thumbnails) { | 895 const scoped_refptr<MostVisitedThumbnails>& thumbnails) { |
877 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 896 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
878 | 897 |
879 // Set the top sites directly in the cache so that SetTopSites diffs | 898 // Set the top sites directly in the cache so that SetTopSites diffs |
880 // correctly. | 899 // correctly. |
881 cache_->SetTopSites(thumbnails->most_visited); | 900 cache_->SetTopSites(thumbnails->most_visited); |
882 SetTopSites(thumbnails->most_visited); | 901 SetTopSites( |
| 902 thumbnails->most_visited, |
| 903 TopSitesBackend::CALL_LOCATION_FROM_ON_GOT_MOST_VISITED_THUMBNAILS); |
883 cache_->SetThumbnails(thumbnails->url_to_images_map); | 904 cache_->SetThumbnails(thumbnails->url_to_images_map); |
884 | 905 |
885 ResetThreadSafeImageCache(); | 906 ResetThreadSafeImageCache(); |
886 | 907 |
887 MoveStateToLoaded(); | 908 MoveStateToLoaded(); |
888 | 909 |
889 // Start a timer that refreshes top sites from history. | 910 // Start a timer that refreshes top sites from history. |
890 RestartQueryForTopSitesTimer( | 911 RestartQueryForTopSitesTimer( |
891 base::TimeDelta::FromSeconds(kUpdateIntervalSecs)); | 912 base::TimeDelta::FromSeconds(kUpdateIntervalSecs)); |
892 } | 913 } |
893 | 914 |
894 void TopSitesImpl::OnTopSitesAvailableFromHistory( | 915 void TopSitesImpl::OnTopSitesAvailableFromHistory( |
895 const MostVisitedURLList* pages) { | 916 const MostVisitedURLList* pages) { |
896 DCHECK(pages); | 917 DCHECK(pages); |
897 SetTopSites(*pages); | 918 SetTopSites(*pages, TopSitesBackend::CALL_LOCATION_FROM_OTHER_PLACES); |
898 } | 919 } |
899 | 920 |
900 void TopSitesImpl::OnURLsDeleted(HistoryService* history_service, | 921 void TopSitesImpl::OnURLsDeleted(HistoryService* history_service, |
901 bool all_history, | 922 bool all_history, |
902 bool expired, | 923 bool expired, |
903 const URLRows& deleted_rows, | 924 const URLRows& deleted_rows, |
904 const std::set<GURL>& favicon_urls) { | 925 const std::set<GURL>& favicon_urls) { |
905 if (!loaded_) | 926 if (!loaded_) |
906 return; | 927 return; |
907 | 928 |
908 if (all_history) { | 929 if (all_history) { |
909 SetTopSites(MostVisitedURLList()); | 930 SetTopSites(MostVisitedURLList(), |
| 931 TopSitesBackend::CALL_LOCATION_FROM_OTHER_PLACES); |
910 backend_->ResetDatabase(); | 932 backend_->ResetDatabase(); |
911 } else { | 933 } else { |
912 std::set<size_t> indices_to_delete; // Indices into top_sites_. | 934 std::set<size_t> indices_to_delete; // Indices into top_sites_. |
913 for (const auto& row : deleted_rows) { | 935 for (const auto& row : deleted_rows) { |
914 if (cache_->IsKnownURL(row.url())) | 936 if (cache_->IsKnownURL(row.url())) |
915 indices_to_delete.insert(cache_->GetURLIndex(row.url())); | 937 indices_to_delete.insert(cache_->GetURLIndex(row.url())); |
916 } | 938 } |
917 | 939 |
918 if (indices_to_delete.empty()) | 940 if (indices_to_delete.empty()) |
919 return; | 941 return; |
920 | 942 |
921 MostVisitedURLList new_top_sites(cache_->top_sites()); | 943 MostVisitedURLList new_top_sites(cache_->top_sites()); |
922 for (std::set<size_t>::reverse_iterator i = indices_to_delete.rbegin(); | 944 for (std::set<size_t>::reverse_iterator i = indices_to_delete.rbegin(); |
923 i != indices_to_delete.rend(); i++) { | 945 i != indices_to_delete.rend(); i++) { |
924 new_top_sites.erase(new_top_sites.begin() + *i); | 946 new_top_sites.erase(new_top_sites.begin() + *i); |
925 } | 947 } |
926 SetTopSites(new_top_sites); | 948 SetTopSites(new_top_sites, |
| 949 TopSitesBackend::CALL_LOCATION_FROM_OTHER_PLACES); |
927 } | 950 } |
928 StartQueryForMostVisited(); | 951 StartQueryForMostVisited(); |
929 } | 952 } |
930 | 953 |
931 void TopSitesImpl::HistoryServiceBeingDeleted(HistoryService* history_service) { | 954 void TopSitesImpl::HistoryServiceBeingDeleted(HistoryService* history_service) { |
932 history_service_observer_.Remove(history_service); | 955 history_service_observer_.Remove(history_service); |
933 } | 956 } |
934 | 957 |
935 } // namespace history | 958 } // namespace history |
OLD | NEW |