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

Unified Diff: chrome/browser/history/history_backend.cc

Issue 26563004: Find Favicon in priority of icon_type. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments Created 7 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/history/history_backend.cc
diff --git a/chrome/browser/history/history_backend.cc b/chrome/browser/history/history_backend.cc
index feb1664dabcf0792729a04d66c0bd65cccccdcb6..13dbcb768e7e90fe0f593d33ccccdf3ff252e24f 100644
--- a/chrome/browser/history/history_backend.cc
+++ b/chrome/browser/history/history_backend.cc
@@ -1696,6 +1696,100 @@ void HistoryBackend::GetFavicons(
bitmap_results);
}
+void HistoryBackend::GetLargestFaviconForURL(
pkotwicz 2013/10/15 21:39:41 Nit: Order method in same order as in header file
michaelbai 2013/10/15 22:52:34 Changed the header file order. On 2013/10/15 21:3
+ const GURL& page_url,
+ const std::vector<int>& icon_types,
pkotwicz 2013/10/15 21:39:41 Given your current implementation, is there any re
michaelbai 2013/10/15 22:52:34 No, the icon_types could be FAVICON TOUCH_ICON |
pkotwicz 2013/10/16 16:59:41 I see your point. In practice we only ever save on
michaelbai 2013/10/16 18:17:05 Don't like this, the TOUCH_ICON and PRECOMPOSED_TO
+ int minimal_size_in_pixels,
+ std::vector<chrome::FaviconBitmapResult>* favicon_bitmap_results) {
+ DCHECK(favicon_bitmap_results);
+ favicon_bitmap_results->clear();
+
+ if (!db_ || !thumbnail_db_)
+ return;
+
+ TimeTicks beginning_time = TimeTicks::Now();
+
+ std::vector<IconMapping> icon_mappings;
+ if (!thumbnail_db_->GetIconMappingsForPageURL(page_url, &icon_mappings)) {
pkotwicz 2013/10/15 21:39:41 Nit: the braces are not necessary
michaelbai 2013/10/15 22:52:34 Done.
+ return;
+ }
+ if (icon_mappings.empty()) return;
pkotwicz 2013/10/15 21:39:41 Nit: Return on a new line
michaelbai 2013/10/15 22:52:34 Sky want to use this style in his previous comment
sky 2013/10/16 13:27:15 Not sure what you mean here. I do not like single
+
+ int required_icon_types = 0;
+ for (std::vector<int>::const_iterator i = icon_types.begin();
+ i != icon_types.end(); ++i) {
+ required_icon_types |= *i;
+ }
+
+ // Find the largest bitmap for each favicon in icon_types.
pkotwicz 2013/10/15 21:39:41 How about: "Find the largest favicon bitmap for ea
michaelbai 2013/10/15 22:52:34 Done.
+ std::map<chrome::IconType, FaviconBitmap> largest_favicon_bitmaps;
+ for (std::vector<IconMapping>::const_iterator i = icon_mappings.begin();
+ i != icon_mappings.end(); ++i) {
+ if (!(i->icon_type & required_icon_types)) continue;
pkotwicz 2013/10/15 21:39:41 Nit: "continue" on a new line
michaelbai 2013/10/15 22:52:34 ditto On 2013/10/15 21:39:41, pkotwicz wrote:
+ std::vector<FaviconBitmapIDSize> bitmap_id_sizes;
+ thumbnail_db_->GetFaviconBitmapIDSizes(i->icon_id, &bitmap_id_sizes);
+ FaviconBitmap& largest = largest_favicon_bitmaps[i->icon_type];
+ for (std::vector<FaviconBitmapIDSize>::const_iterator j =
+ bitmap_id_sizes.begin(); j != bitmap_id_sizes.end(); ++j) {
+ if (largest.pixel_size.width() < j->pixel_size.width() &&
+ largest.pixel_size.height() < j->pixel_size.height()) {
+ largest.icon_id = i->icon_id;
+ largest.bitmap_id = j->bitmap_id;
+ largest.pixel_size = j->pixel_size;
+ }
+ }
+ }
+ if (largest_favicon_bitmaps.empty()) return;
pkotwicz 2013/10/15 21:39:41 Nit: return on a separate line
michaelbai 2013/10/15 22:52:34 ditto On 2013/10/15 21:39:41, pkotwicz wrote:
+
+ // Find an icon which is larger than minimal_size_in_pixels in the order of
+ // icon_types.
+ FaviconBitmap largest_icon;
+ for (std::vector<int>::const_iterator t = icon_types.begin();
+ t != icon_types.end(); ++t) {
+ for (std::map<chrome::IconType, FaviconBitmap>::const_iterator f =
+ largest_favicon_bitmaps.begin(); f != largest_favicon_bitmaps.end();
+ ++f) {
+ if (f->first & *t &&
+ largest_icon.pixel_size.width() < f->second.pixel_size.width() &&
+ largest_icon.pixel_size.height() < f->second.pixel_size.height())
+ largest_icon = f->second;
+ }
+ if (largest_icon.pixel_size.width() > minimal_size_in_pixels &&
+ largest_icon.pixel_size.height() > minimal_size_in_pixels)
+ break;
+ }
+ if (largest_icon.pixel_size.width() == 0 ||
+ largest_icon.pixel_size.height() == 0) {
pkotwicz 2013/10/15 21:39:41 This is wrong. A pixel width and height in the dat
michaelbai 2013/10/15 22:52:34 In which situation, it is unknown? On 2013/10/15
pkotwicz 2013/10/16 16:59:41 FaviconSQLHandler::Insert() is an example.
michaelbai 2013/10/16 18:17:05 Is this the only case? On 2013/10/16 16:59:41, pk
pkotwicz 2013/10/16 18:28:24 HistoryBackend::SetImportedFavicons() is another c
+ return;
+ }
+
+ GURL icon_url;
+ chrome::IconType icon_type;
+ if (!thumbnail_db_->GetFaviconHeader(largest_icon.icon_id, &icon_url,
+ &icon_type)) {
+ return;
+ }
+
+ base::Time last_updated;
+ chrome::FaviconBitmapResult bitmap_result;
+ bitmap_result.icon_url = icon_url;
+ bitmap_result.icon_type = icon_type;
+ if (!thumbnail_db_->GetFaviconBitmap(largest_icon.bitmap_id,
+ &last_updated,
+ &bitmap_result.bitmap_data,
+ &bitmap_result.pixel_size)) {
+ return;
+ }
+
+ bitmap_result.expired = (Time::Now() - last_updated) >
+ TimeDelta::FromDays(kFaviconRefetchDays);
+ if (bitmap_result.is_valid())
+ favicon_bitmap_results->push_back(bitmap_result);
+
+ HISTOGRAM_TIMES("History.GetLargestFaviconForURL",
+ TimeTicks::Now() - beginning_time);
+}
+
void HistoryBackend::GetFaviconsForURL(
const GURL& page_url,
int icon_types,

Powered by Google App Engine
This is Rietveld 408576698