Index: chrome/browser/history/top_sites.cc |
diff --git a/chrome/browser/history/top_sites.cc b/chrome/browser/history/top_sites.cc |
index 3d9a719b8cdacc24e3170e07bdbc39c43c0bab4c..324f207bea20f4792c675ae28f4e927858e93c10 100644 |
--- a/chrome/browser/history/top_sites.cc |
+++ b/chrome/browser/history/top_sites.cc |
@@ -532,6 +532,14 @@ void TopSites::StartQueryForThumbnail(size_t index) { |
cancelable_consumer_.SetClientData(hs, handle, index); |
} |
+void TopSites::GenerateCanonicalURLs() { |
+ canonical_urls_.clear(); |
+ for (size_t i = 0; i < top_sites_.size(); i++) { |
+ const MostVisitedURL& mv = top_sites_[i]; |
+ StoreRedirectChain(mv.redirects, i); |
+ } |
+} |
+ |
void TopSites::StoreMostVisited(MostVisitedURLList* most_visited) { |
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::DB)); |
// Take ownership of the most visited data. |
@@ -540,11 +548,10 @@ void TopSites::StoreMostVisited(MostVisitedURLList* most_visited) { |
waiting_for_results_ = false; |
// Save the redirect information for quickly mapping to the canonical URLs. |
- canonical_urls_.clear(); |
+ GenerateCanonicalURLs(); |
+ |
for (size_t i = 0; i < top_sites_.size(); i++) { |
const MostVisitedURL& mv = top_sites_[i]; |
- StoreRedirectChain(mv.redirects, i); |
- |
std::map<GURL, Images>::iterator it = temp_thumbnails_map_.begin(); |
GURL canonical_url = GetCanonicalURL(mv.url); |
for (; it != temp_thumbnails_map_.end(); it++) { |
@@ -802,17 +809,24 @@ void TopSites::Observe(NotificationType type, |
ChromeThread::PostTask(ChromeThread::DB, FROM_HERE, |
NewRunnableMethod(this, &TopSites::ResetDatabase)); |
} else { |
+ std::set<size_t> indices_to_delete; // Indices into top_sites_. |
std::set<GURL>::iterator it; |
for (it = deleted_details->urls.begin(); |
it != deleted_details->urls.end(); ++it) { |
- for (size_t i = 0; i < top_sites_.size(); i++) { |
- if (top_sites_[i].url == *it) { |
- top_sites_.erase(top_sites_.begin() + i); |
- break; |
- } |
- } |
+ std::map<GURL,size_t>::const_iterator found = canonical_urls_.find(*it); |
+ if (found != canonical_urls_.end()) |
+ indices_to_delete.insert(found->second); |
+ } |
+ |
+ for (std::set<size_t>::reverse_iterator i = indices_to_delete.rbegin(); |
+ i != indices_to_delete.rend(); i++) { |
+ size_t index = *i; |
+ RemovePinnedURL(top_sites_[index].url); |
+ top_sites_.erase(top_sites_.begin() + index); |
} |
} |
+ // Canonical URLs are not valid any more. |
+ GenerateCanonicalURLs(); |
StartQueryForMostVisited(); |
} else if (type == NotificationType::NAV_ENTRY_COMMITTED) { |
if (top_sites_.size() < kTopSitesNumber) { |