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

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

Issue 11746010: Cleanup history favicon code (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 11 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
« no previous file with comments | « chrome/browser/history/history_backend.h ('k') | chrome/browser/history/history_backend_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/history/history_backend.cc
diff --git a/chrome/browser/history/history_backend.cc b/chrome/browser/history/history_backend.cc
index 9dbf42a44bb898621b27a84f1830a36c91de7c15..4f06823655ccf0ad78ebc08602b5dbc7b02ff364 100644
--- a/chrome/browser/history/history_backend.cc
+++ b/chrome/browser/history/history_backend.cc
@@ -1843,23 +1843,15 @@ bool HistoryBackend::GetThumbnailFromOlderRedirect(
return success;
}
-HistoryBackend::FaviconResults::FaviconResults() {}
-HistoryBackend::FaviconResults::~FaviconResults() {}
-
-void HistoryBackend::FaviconResults::Clear() {
- bitmap_results.clear();
- size_map.clear();
-}
-
void HistoryBackend::GetFavicons(
const std::vector<GURL>& icon_urls,
int icon_types,
int desired_size_in_dip,
const std::vector<ui::ScaleFactor>& desired_scale_factors,
- FaviconResults* results) {
+ std::vector<FaviconBitmapResult>* bitmap_results) {
UpdateFaviconMappingsAndFetchImpl(NULL, icon_urls, icon_types,
- desired_size_in_dip, desired_scale_factors,
- results);
+ desired_size_in_dip, desired_scale_factors,
+ bitmap_results);
}
void HistoryBackend::GetFaviconsForURL(
@@ -1867,18 +1859,17 @@ void HistoryBackend::GetFaviconsForURL(
int icon_types,
int desired_size_in_dip,
const std::vector<ui::ScaleFactor>& desired_scale_factors,
- FaviconResults* results) {
- DCHECK(results);
+ std::vector<FaviconBitmapResult>* bitmap_results) {
+ DCHECK(bitmap_results);
GetFaviconsFromDB(page_url, icon_types, desired_size_in_dip,
- desired_scale_factors, &results->bitmap_results,
- &results->size_map);
+ desired_scale_factors, bitmap_results);
}
void HistoryBackend::GetFaviconForID(
FaviconID favicon_id,
int desired_size_in_dip,
ui::ScaleFactor desired_scale_factor,
- FaviconResults* results) {
+ std::vector<FaviconBitmapResult>* bitmap_results) {
std::vector<FaviconID> favicon_ids;
favicon_ids.push_back(favicon_id);
std::vector<ui::ScaleFactor> desired_scale_factors;
@@ -1888,8 +1879,7 @@ void HistoryBackend::GetFaviconForID(
GetFaviconBitmapResultsForBestMatch(favicon_ids,
desired_size_in_dip,
desired_scale_factors,
- &results->bitmap_results);
- BuildIconURLSizesMap(favicon_ids, &results->size_map);
+ bitmap_results);
}
void HistoryBackend::UpdateFaviconMappingsAndFetch(
@@ -1898,10 +1888,10 @@ void HistoryBackend::UpdateFaviconMappingsAndFetch(
int icon_types,
int desired_size_in_dip,
const std::vector<ui::ScaleFactor>& desired_scale_factors,
- FaviconResults* results) {
+ std::vector<FaviconBitmapResult>* bitmap_results) {
UpdateFaviconMappingsAndFetchImpl(&page_url, icon_urls, icon_types,
- desired_size_in_dip, desired_scale_factors,
- results);
+ desired_size_in_dip, desired_scale_factors,
+ bitmap_results);
}
void HistoryBackend::MergeFavicon(
@@ -1951,6 +1941,10 @@ void HistoryBackend::MergeFavicon(
favicon_sizes.push_back(bitmap_id_sizes[i].pixel_size);
if (!replaced_bitmap) {
+ // Set the preexisting favicon bitmaps as expired as the preexisting favicon
+ // bitmaps are not consistent with the merged in data.
+ thumbnail_db_->SetFaviconOutOfDate(favicon_id);
+
// Delete an arbitrary favicon bitmap to avoid going over the limit of
// |kMaxFaviconBitmapsPerIconURL|.
if (bitmap_id_sizes.size() >= kMaxFaviconBitmapsPerIconURL) {
@@ -2017,8 +2011,11 @@ void HistoryBackend::MergeFavicon(
continue;
migrated_bitmaps = true;
+
+ // Add the favicon bitmap as expired as it is not consistent with the
+ // merged in data.
thumbnail_db_->AddFaviconBitmap(favicon_id,
- bitmaps_to_copy[j].bitmap_data, base::Time::Now(),
+ bitmaps_to_copy[j].bitmap_data, base::Time(),
bitmaps_to_copy[j].pixel_size);
favicon_sizes.push_back(bitmaps_to_copy[j].pixel_size);
@@ -2027,12 +2024,6 @@ void HistoryBackend::MergeFavicon(
}
}
- if (migrated_bitmaps || !replaced_bitmap) {
- // Set the favicon sizes to default to indicate that at least some of the
- // favicon bitmaps for the favicon at |icon_url| are missing or stale.
- thumbnail_db_->SetFaviconSizes(favicon_id, GetDefaultFaviconSizes());
- }
-
// Update the favicon mappings such that only |icon_url| is mapped to
// |page_url|.
if (icon_mappings.size() != 1 || icon_mappings[0].icon_url != icon_url) {
@@ -2054,12 +2045,11 @@ void HistoryBackend::MergeFavicon(
void HistoryBackend::SetFavicons(
const GURL& page_url,
IconType icon_type,
- const std::vector<FaviconBitmapData>& favicon_bitmap_data,
- const IconURLSizesMap& icon_url_sizes) {
+ const std::vector<FaviconBitmapData>& favicon_bitmap_data) {
if (!thumbnail_db_.get() || !db_.get())
return;
- DCHECK(ValidateSetFaviconsParams(favicon_bitmap_data, icon_url_sizes));
+ DCHECK(ValidateSetFaviconsParams(favicon_bitmap_data));
// Build map of FaviconBitmapData for each icon url.
typedef std::map<GURL, std::vector<FaviconBitmapData> >
@@ -2075,36 +2065,25 @@ void HistoryBackend::SetFavicons(
bool data_modified = false;
std::vector<FaviconID> icon_ids;
- for (IconURLSizesMap::const_iterator it = icon_url_sizes.begin();
- it != icon_url_sizes.end(); ++it) {
+ for (BitmapDataByIconURL::const_iterator it = grouped_by_icon_url.begin();
+ it != grouped_by_icon_url.end(); ++it) {
const GURL& icon_url = it->first;
FaviconID icon_id =
thumbnail_db_->GetFaviconIDForFaviconURL(icon_url, icon_type, NULL);
- if (icon_id) {
- bool favicon_bitmaps_deleted = false;
- SetFaviconSizes(icon_id, it->second, &favicon_bitmaps_deleted);
- data_modified |= favicon_bitmaps_deleted;
- } else {
- icon_id = thumbnail_db_->AddFavicon(icon_url, icon_type, it->second);
+
+ if (!icon_id) {
+ // TODO(pkotwicz): Remove the favicon sizes attribute from
+ // ThumbnailDatabase::AddFavicon().
+ icon_id = thumbnail_db_->AddFavicon(icon_url, icon_type,
+ GetDefaultFaviconSizes());
data_modified = true;
}
icon_ids.push_back(icon_id);
- BitmapDataByIconURL::iterator grouped_by_icon_url_it =
- grouped_by_icon_url.find(icon_url);
- if (grouped_by_icon_url_it != grouped_by_icon_url.end()) {
- if (!data_modified) {
- bool favicon_bitmaps_changed = false;
- SetFaviconBitmaps(icon_id,
- grouped_by_icon_url_it->second,
- &favicon_bitmaps_changed);
- data_modified |= favicon_bitmaps_changed;
- } else {
- SetFaviconBitmaps(icon_id,
- grouped_by_icon_url_it->second,
- NULL);
- }
- }
+ if (!data_modified)
+ SetFaviconBitmaps(icon_id, it->second, &data_modified);
+ else
+ SetFaviconBitmaps(icon_id, it->second, NULL);
}
data_modified |=
@@ -2218,7 +2197,7 @@ void HistoryBackend::UpdateFaviconMappingsAndFetchImpl(
int icon_types,
int desired_size_in_dip,
const std::vector<ui::ScaleFactor>& desired_scale_factors,
- FaviconResults* results) {
+ std::vector<FaviconBitmapResult>* bitmap_results) {
// If |page_url| is specified, |icon_types| must be either a single icon
// type or icon types which are equivalent.
DCHECK(!page_url ||
@@ -2226,7 +2205,7 @@ void HistoryBackend::UpdateFaviconMappingsAndFetchImpl(
icon_types == TOUCH_ICON ||
icon_types == TOUCH_PRECOMPOSED_ICON ||
icon_types == (TOUCH_ICON | TOUCH_PRECOMPOSED_ICON));
- results->Clear();
+ bitmap_results->clear();
if (!thumbnail_db_.get()) {
return;
@@ -2268,8 +2247,7 @@ void HistoryBackend::UpdateFaviconMappingsAndFetchImpl(
}
GetFaviconBitmapResultsForBestMatch(favicon_ids, desired_size_in_dip,
- desired_scale_factors, &results->bitmap_results);
- BuildIconURLSizesMap(favicon_ids, &results->size_map);
+ desired_scale_factors, bitmap_results);
}
void HistoryBackend::SetFaviconBitmaps(
@@ -2282,89 +2260,75 @@ void HistoryBackend::SetFaviconBitmaps(
std::vector<FaviconBitmapIDSize> bitmap_id_sizes;
thumbnail_db_->GetFaviconBitmapIDSizes(icon_id, &bitmap_id_sizes);
- // A nested loop is ok because in practice neither |favicon_bitmap_data| nor
- // |bitmap_id_sizes| will have many elements.
- for (size_t i = 0; i < favicon_bitmap_data.size(); ++i) {
- const FaviconBitmapData& bitmap_data_element = favicon_bitmap_data[i];
- FaviconBitmapID bitmap_id = 0;
- for (size_t j = 0; j < bitmap_id_sizes.size(); ++j) {
- if (bitmap_id_sizes[j].pixel_size == bitmap_data_element.pixel_size) {
- bitmap_id = bitmap_id_sizes[j].bitmap_id;
+ std::vector<FaviconBitmapData> to_add = favicon_bitmap_data;
+
+ for (size_t i = 0; i < bitmap_id_sizes.size(); ++i) {
+ const gfx::Size& pixel_size = bitmap_id_sizes[i].pixel_size;
+ std::vector<FaviconBitmapData>::iterator match_it = to_add.end();
+ for (std::vector<FaviconBitmapData>::iterator it = to_add.begin();
+ it != to_add.end(); ++it) {
+ if (it->pixel_size == pixel_size) {
+ match_it = it;
break;
}
}
- if (bitmap_id) {
+
+ FaviconBitmapID bitmap_id = bitmap_id_sizes[i].bitmap_id;
+ if (match_it == to_add.end()) {
+ thumbnail_db_->DeleteFaviconBitmap(bitmap_id);
+
+ if (favicon_bitmaps_changed)
+ *favicon_bitmaps_changed = true;
+ } else {
if (favicon_bitmaps_changed &&
!*favicon_bitmaps_changed &&
- IsFaviconBitmapDataEqual(bitmap_id,
- bitmap_data_element.bitmap_data)) {
+ IsFaviconBitmapDataEqual(bitmap_id, match_it->bitmap_data)) {
thumbnail_db_->SetFaviconBitmapLastUpdateTime(
bitmap_id, base::Time::Now());
} else {
- thumbnail_db_->SetFaviconBitmap(bitmap_id,
- bitmap_data_element.bitmap_data, base::Time::Now());
+ thumbnail_db_->SetFaviconBitmap(bitmap_id, match_it->bitmap_data,
+ base::Time::Now());
+
if (favicon_bitmaps_changed)
*favicon_bitmaps_changed = true;
}
- } else {
- thumbnail_db_->AddFaviconBitmap(icon_id, bitmap_data_element.bitmap_data,
- base::Time::Now(), bitmap_data_element.pixel_size);
- if (favicon_bitmaps_changed)
- *favicon_bitmaps_changed = true;
+ to_add.erase(match_it);
}
}
-}
-bool HistoryBackend::ValidateSetFaviconsParams(
- const std::vector<FaviconBitmapData>& favicon_bitmap_data,
- const IconURLSizesMap& icon_url_sizes) const {
- if (icon_url_sizes.size() > kMaxFaviconsPerPage)
- return false;
+ for (size_t i = 0; i < to_add.size(); ++i) {
+ thumbnail_db_->AddFaviconBitmap(icon_id, to_add[i].bitmap_data,
+ base::Time::Now(), to_add[i].pixel_size);
- for (IconURLSizesMap::const_iterator it = icon_url_sizes.begin();
- it != icon_url_sizes.end(); ++it) {
- if (it->second.size() > kMaxFaviconBitmapsPerIconURL)
- return false;
+ if (favicon_bitmaps_changed)
+ *favicon_bitmaps_changed = true;
}
+}
+bool HistoryBackend::ValidateSetFaviconsParams(
+ const std::vector<FaviconBitmapData>& favicon_bitmap_data) const {
+ typedef std::map<GURL, size_t> BitmapsPerIconURL;
+ BitmapsPerIconURL num_bitmaps_per_icon_url;
for (size_t i = 0; i < favicon_bitmap_data.size(); ++i) {
if (!favicon_bitmap_data[i].bitmap_data.get())
return false;
- IconURLSizesMap::const_iterator it =
- icon_url_sizes.find(favicon_bitmap_data[i].icon_url);
- if (it == icon_url_sizes.end())
- return false;
-
- const FaviconSizes& favicon_sizes = it->second;
- FaviconSizes::const_iterator it2 = std::find(favicon_sizes.begin(),
- favicon_sizes.end(), favicon_bitmap_data[i].pixel_size);
- if (it2 == favicon_sizes.end())
- return false;
+ const GURL& icon_url = favicon_bitmap_data[i].icon_url;
+ if (!num_bitmaps_per_icon_url.count(icon_url))
+ num_bitmaps_per_icon_url[icon_url] = 1u;
+ else
+ ++num_bitmaps_per_icon_url[icon_url];
}
- return true;
-}
-void HistoryBackend::SetFaviconSizes(FaviconID icon_id,
- const FaviconSizes& favicon_sizes,
- bool* favicon_bitmaps_deleted) {
- *favicon_bitmaps_deleted = false;
-
- std::vector<FaviconBitmapIDSize> bitmap_id_sizes;
- thumbnail_db_->GetFaviconBitmapIDSizes(icon_id, &bitmap_id_sizes);
+ if (num_bitmaps_per_icon_url.size() > kMaxFaviconsPerPage)
+ return false;
- // Remove bitmaps whose pixel size is not contained in |favicon_sizes|.
- for (size_t i = 0; i < bitmap_id_sizes.size(); ++i) {
- const gfx::Size& pixel_size = bitmap_id_sizes[i].pixel_size;
- FaviconSizes::const_iterator sizes_it = std::find(favicon_sizes.begin(),
- favicon_sizes.end(), pixel_size);
- if (sizes_it == favicon_sizes.end()) {
- thumbnail_db_->DeleteFaviconBitmap(bitmap_id_sizes[i].bitmap_id);
- *favicon_bitmaps_deleted = true;
- }
+ for (BitmapsPerIconURL::const_iterator it = num_bitmaps_per_icon_url.begin();
+ it != num_bitmaps_per_icon_url.end(); ++it) {
+ if (it->second > kMaxFaviconBitmapsPerIconURL)
+ return false;
}
-
- thumbnail_db_->SetFaviconSizes(icon_id, favicon_sizes);
+ return true;
}
bool HistoryBackend::IsFaviconBitmapDataEqual(
@@ -2386,12 +2350,9 @@ bool HistoryBackend::GetFaviconsFromDB(
int icon_types,
int desired_size_in_dip,
const std::vector<ui::ScaleFactor>& desired_scale_factors,
- std::vector<FaviconBitmapResult>* favicon_bitmap_results,
- IconURLSizesMap* icon_url_sizes) {
+ std::vector<FaviconBitmapResult>* favicon_bitmap_results) {
DCHECK(favicon_bitmap_results);
- DCHECK(icon_url_sizes);
favicon_bitmap_results->clear();
- icon_url_sizes->clear();
if (!db_.get() || !thumbnail_db_.get())
return false;
@@ -2408,20 +2369,18 @@ bool HistoryBackend::GetFaviconsFromDB(
favicon_ids.push_back(icon_mappings[i].icon_id);
// Populate |favicon_bitmap_results| and |icon_url_sizes|.
- bool success =
- GetFaviconBitmapResultsForBestMatch(favicon_ids,
- desired_size_in_dip, desired_scale_factors, favicon_bitmap_results) &&
- BuildIconURLSizesMap(favicon_ids, icon_url_sizes);
+ bool success = GetFaviconBitmapResultsForBestMatch(favicon_ids,
+ desired_size_in_dip, desired_scale_factors, favicon_bitmap_results);
UMA_HISTOGRAM_TIMES("History.GetFavIconFromDB", // historical name
TimeTicks::Now() - beginning_time);
- return success && !icon_url_sizes->empty();
+ return success && !favicon_bitmap_results->empty();
}
bool HistoryBackend::GetFaviconBitmapResultsForBestMatch(
const std::vector<FaviconID>& candidate_favicon_ids,
int desired_size_in_dip,
const std::vector<ui::ScaleFactor>& desired_scale_factors,
- std::vector<history::FaviconBitmapResult>* favicon_bitmap_results) {
+ std::vector<FaviconBitmapResult>* favicon_bitmap_results) {
favicon_bitmap_results->clear();
if (candidate_favicon_ids.empty())
@@ -2492,22 +2451,6 @@ bool HistoryBackend::GetFaviconBitmapResultsForBestMatch(
return true;
}
-bool HistoryBackend::BuildIconURLSizesMap(
- const std::vector<FaviconID>& favicon_ids,
- IconURLSizesMap* icon_url_sizes) {
- icon_url_sizes->clear();
- for (size_t i = 0; i < favicon_ids.size(); ++i) {
- GURL icon_url;
- FaviconSizes favicon_sizes;
- if (!thumbnail_db_->GetFaviconHeader(favicon_ids[i], &icon_url, NULL,
- &favicon_sizes)) {
- return false;
- }
- (*icon_url_sizes)[icon_url] = favicon_sizes;
- }
- return true;
-}
-
bool HistoryBackend::SetFaviconMappingsForPageAndRedirects(
const GURL& page_url,
IconType icon_type,
« no previous file with comments | « chrome/browser/history/history_backend.h ('k') | chrome/browser/history/history_backend_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698