Index: components/history/core/browser/history_backend.cc |
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc |
index 0f6df3e380670e6cd12fc8133a5b714099b9417e..d6dcb62c17e9c73e8342a5fb92200c03a1c32f0f 100644 |
--- a/components/history/core/browser/history_backend.cc |
+++ b/components/history/core/browser/history_backend.cc |
@@ -1630,9 +1630,11 @@ void HistoryBackend::MergeFavicon( |
favicon_base::FaviconID favicon_id = |
thumbnail_db_->GetFaviconIDForFaviconURL(icon_url, icon_type, nullptr); |
+ bool favicon_created = false; |
if (!favicon_id) { |
// There is no favicon at |icon_url|, create it. |
favicon_id = thumbnail_db_->AddFavicon(icon_url, icon_type); |
+ favicon_created = true; |
} |
std::vector<FaviconBitmapIDSize> bitmap_id_sizes; |
@@ -1720,6 +1722,7 @@ void HistoryBackend::MergeFavicon( |
// Copy the favicon bitmaps mapped to |page_url| to the favicon at |icon_url| |
// till the limit of |kMaxFaviconBitmapsPerIconURL| is reached. |
+ bool favicon_bitmaps_copied = false; |
for (size_t i = 0; i < icon_mappings.size(); ++i) { |
if (favicon_sizes.size() >= kMaxFaviconBitmapsPerIconURL) |
break; |
@@ -1747,6 +1750,7 @@ void HistoryBackend::MergeFavicon( |
favicon_id, bitmaps_to_copy[j].bitmap_data, base::Time(), |
bitmaps_to_copy[j].pixel_size); |
favicon_sizes.push_back(bitmaps_to_copy[j].pixel_size); |
+ favicon_bitmaps_copied = true; |
if (favicon_sizes.size() >= kMaxFaviconBitmapsPerIconURL) |
break; |
@@ -1755,16 +1759,20 @@ void HistoryBackend::MergeFavicon( |
// Update the favicon mappings such that only |icon_url| is mapped to |
// |page_url|. |
- bool mapping_changed = false; |
if (icon_mappings.size() != 1 || icon_mappings[0].icon_url != icon_url) { |
std::vector<favicon_base::FaviconID> favicon_ids; |
favicon_ids.push_back(favicon_id); |
SetFaviconMappingsForPageAndRedirects(page_url, icon_type, favicon_ids); |
- mapping_changed = true; |
+ SendFaviconChangedNotificationForPageAndRedirects(page_url); |
+ } |
+ |
+ if (!favicon_created && (!bitmap_identical || favicon_bitmaps_copied)) { |
+ // If there was a favicon at |icon_url| prior to MergeFavicon() being |
+ // called, there may be page URLs which also use the favicon at |icon_url|. |
+ // Notify the UI that the favicon has changed for |icon_url|. |
+ SendFaviconChangedNotificationForIconURL(icon_url); |
} |
- if (mapping_changed || !bitmap_identical) |
- SendFaviconChangedNotificationForPageAndRedirects(page_url); |
ScheduleCommit(); |
} |
@@ -1777,29 +1785,32 @@ void HistoryBackend::SetFavicons(const GURL& page_url, |
DCHECK_GE(kMaxFaviconBitmapsPerIconURL, bitmaps.size()); |
- // Track whether the method modifies or creates any favicon bitmaps, favicons |
- // or icon mappings. |
- bool data_modified = false; |
- |
favicon_base::FaviconID icon_id = |
thumbnail_db_->GetFaviconIDForFaviconURL(icon_url, icon_type, nullptr); |
+ bool favicon_created = false; |
if (!icon_id) { |
icon_id = thumbnail_db_->AddFavicon(icon_url, icon_type); |
- data_modified = true; |
+ favicon_created = true; |
} |
- data_modified |= SetFaviconBitmaps(icon_id, bitmaps); |
+ bool favicon_data_modified = SetFaviconBitmaps(icon_id, bitmaps); |
std::vector<favicon_base::FaviconID> icon_ids(1u, icon_id); |
- data_modified |= |
+ bool mapping_changed = |
SetFaviconMappingsForPageAndRedirects(page_url, icon_type, icon_ids); |
- if (data_modified) { |
- // Send notification to the UI as an icon mapping, favicon, or favicon |
- // bitmap was changed by this function. |
+ if (mapping_changed) { |
+ // Notify the UI that this function changed an icon mapping. |
SendFaviconChangedNotificationForPageAndRedirects(page_url); |
} |
+ |
+ if (favicon_data_modified && !favicon_created) { |
+ // If there was a favicon at |icon_url| prior to SetFavicons() being called, |
+ // there may be page URLs which also use the favicon at |icon_url|. Notify |
+ // the UI that the favicon has changed for |icon_url|. |
+ SendFaviconChangedNotificationForIconURL(icon_url); |
+ } |
ScheduleCommit(); |
} |
@@ -1874,7 +1885,7 @@ void HistoryBackend::SetImportedFavicons( |
if (!favicons_changed.empty()) { |
// Send the notification about the changed favicon URLs. |
- NotifyFaviconChanged(favicons_changed); |
+ NotifyFaviconsChanged(favicons_changed, GURL()); |
} |
} |
@@ -2219,11 +2230,17 @@ void HistoryBackend::SendFaviconChangedNotificationForPageAndRedirects( |
RedirectList redirect_list; |
GetCachedRecentRedirects(page_url, &redirect_list); |
if (!redirect_list.empty()) { |
- std::set<GURL> favicons_changed(redirect_list.begin(), redirect_list.end()); |
- NotifyFaviconChanged(favicons_changed); |
+ std::set<GURL> favicons_changed(redirect_list.begin(), |
+ redirect_list.end()); |
+ NotifyFaviconsChanged(favicons_changed, GURL()); |
} |
} |
+void HistoryBackend::SendFaviconChangedNotificationForIconURL( |
+ const GURL& icon_url) { |
+ NotifyFaviconsChanged(std::set<GURL>(), icon_url); |
+} |
+ |
void HistoryBackend::Commit() { |
if (!db_) |
return; |
@@ -2506,9 +2523,10 @@ void HistoryBackend::ProcessDBTask( |
ProcessDBTaskImpl(); |
} |
-void HistoryBackend::NotifyFaviconChanged(const std::set<GURL>& urls) { |
+void HistoryBackend::NotifyFaviconsChanged(const std::set<GURL>& page_urls, |
+ const GURL& icon_url) { |
if (delegate_) |
- delegate_->NotifyFaviconChanged(urls); |
+ delegate_->NotifyFaviconsChanged(page_urls, icon_url); |
} |
void HistoryBackend::NotifyURLVisited(ui::PageTransition transition, |