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

Side by Side Diff: chrome/browser/history/history_backend.cc

Issue 11830007: Avoid sending notifications when the bitmap data in history has not changed (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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/history_backend.h" 5 #include "chrome/browser/history/history_backend.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 #include <list> 9 #include <list>
10 #include <map> 10 #include <map>
(...skipping 1912 matching lines...) Expand 10 before | Expand all | Expand 10 after
1923 } 1923 }
1924 1924
1925 std::vector<FaviconBitmapIDSize> bitmap_id_sizes; 1925 std::vector<FaviconBitmapIDSize> bitmap_id_sizes;
1926 thumbnail_db_->GetFaviconBitmapIDSizes(favicon_id, &bitmap_id_sizes); 1926 thumbnail_db_->GetFaviconBitmapIDSizes(favicon_id, &bitmap_id_sizes);
1927 1927
1928 // If there is already a favicon bitmap of |pixel_size| at |icon_url|, 1928 // If there is already a favicon bitmap of |pixel_size| at |icon_url|,
1929 // replace it. 1929 // replace it.
1930 bool replaced_bitmap = false; 1930 bool replaced_bitmap = false;
1931 for (size_t i = 0; i < bitmap_id_sizes.size(); ++i) { 1931 for (size_t i = 0; i < bitmap_id_sizes.size(); ++i) {
1932 if (bitmap_id_sizes[i].pixel_size == pixel_size) { 1932 if (bitmap_id_sizes[i].pixel_size == pixel_size) {
1933 if (IsFaviconBitmapDataEqual(bitmap_id_sizes[i].bitmap_id, bitmap_data)) {
1934 thumbnail_db_->SetFaviconBitmapLastUpdateTime(
1935 bitmap_id_sizes[i].bitmap_id, base::Time::Now());
1936 // Return early as merging did not alter the bitmap data.
1937 ScheduleCommit();
1938 return;
1939 }
1933 thumbnail_db_->SetFaviconBitmap(bitmap_id_sizes[i].bitmap_id, bitmap_data, 1940 thumbnail_db_->SetFaviconBitmap(bitmap_id_sizes[i].bitmap_id, bitmap_data,
1934 base::Time::Now()); 1941 base::Time::Now());
1935 replaced_bitmap = true; 1942 replaced_bitmap = true;
1936 break; 1943 break;
1937 } 1944 }
1938 } 1945 }
1939 1946
1940 // Create a vector of the pixel sizes of the favicon bitmaps currently at 1947 // Create a vector of the pixel sizes of the favicon bitmaps currently at
1941 // |icon_url|. 1948 // |icon_url|.
1942 std::vector<gfx::Size> favicon_sizes; 1949 std::vector<gfx::Size> favicon_sizes;
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
2052 2059
2053 // Build map of FaviconBitmapData for each icon url. 2060 // Build map of FaviconBitmapData for each icon url.
2054 typedef std::map<GURL, std::vector<FaviconBitmapData> > 2061 typedef std::map<GURL, std::vector<FaviconBitmapData> >
2055 BitmapDataByIconURL; 2062 BitmapDataByIconURL;
2056 BitmapDataByIconURL grouped_by_icon_url; 2063 BitmapDataByIconURL grouped_by_icon_url;
2057 for (size_t i = 0; i < favicon_bitmap_data.size(); ++i) { 2064 for (size_t i = 0; i < favicon_bitmap_data.size(); ++i) {
2058 const GURL& icon_url = favicon_bitmap_data[i].icon_url; 2065 const GURL& icon_url = favicon_bitmap_data[i].icon_url;
2059 grouped_by_icon_url[icon_url].push_back(favicon_bitmap_data[i]); 2066 grouped_by_icon_url[icon_url].push_back(favicon_bitmap_data[i]);
2060 } 2067 }
2061 2068
2069 // Track whether the method modifies or creates any favicon bitmaps, favicons
2070 // or icon mappings.
2071 bool data_modified = false;
2072
2062 std::vector<FaviconID> icon_ids; 2073 std::vector<FaviconID> icon_ids;
2063 for (IconURLSizesMap::const_iterator it = icon_url_sizes.begin(); 2074 for (IconURLSizesMap::const_iterator it = icon_url_sizes.begin();
2064 it != icon_url_sizes.end(); ++it) { 2075 it != icon_url_sizes.end(); ++it) {
2065 const GURL& icon_url = it->first; 2076 const GURL& icon_url = it->first;
2066 FaviconID icon_id = 2077 FaviconID icon_id =
2067 thumbnail_db_->GetFaviconIDForFaviconURL(icon_url, icon_type, NULL); 2078 thumbnail_db_->GetFaviconIDForFaviconURL(icon_url, icon_type, NULL);
2068 if (icon_id) 2079 if (icon_id) {
2069 SetFaviconSizes(icon_id, it->second); 2080 bool favicon_bitmaps_deleted = false;
2070 else 2081 SetFaviconSizes(icon_id, it->second, &favicon_bitmaps_deleted);
2082 data_modified |= favicon_bitmaps_deleted;
2083 } else {
2071 icon_id = thumbnail_db_->AddFavicon(icon_url, icon_type, it->second); 2084 icon_id = thumbnail_db_->AddFavicon(icon_url, icon_type, it->second);
2085 data_modified = true;
2086 }
2072 icon_ids.push_back(icon_id); 2087 icon_ids.push_back(icon_id);
2073 2088
2074 BitmapDataByIconURL::iterator grouped_by_icon_url_it = 2089 BitmapDataByIconURL::iterator grouped_by_icon_url_it =
2075 grouped_by_icon_url.find(icon_url); 2090 grouped_by_icon_url.find(icon_url);
2076 if (grouped_by_icon_url_it != grouped_by_icon_url.end()) 2091 if (grouped_by_icon_url_it != grouped_by_icon_url.end()) {
2077 SetFaviconBitmaps(icon_id, grouped_by_icon_url_it->second); 2092 if (!data_modified) {
2093 bool favicon_bitmaps_changed = false;
2094 SetFaviconBitmaps(icon_id,
2095 grouped_by_icon_url_it->second,
2096 &favicon_bitmaps_changed);
2097 data_modified |= favicon_bitmaps_changed;
2098 } else {
2099 SetFaviconBitmaps(icon_id,
2100 grouped_by_icon_url_it->second,
2101 NULL);
2102 }
2103 }
2078 } 2104 }
2079 2105
2080 SetFaviconMappingsForPageAndRedirects(page_url, icon_type, icon_ids); 2106 data_modified |=
2107 SetFaviconMappingsForPageAndRedirects(page_url, icon_type, icon_ids);
2081 2108
2082 // Send notification to the UI as an icon mapping, favicon, or favicon bitmap 2109 if (data_modified) {
2083 // almost certainly was changed by this function. The situations where no 2110 // Send notification to the UI as an icon mapping, favicon, or favicon
2084 // data was changed, notably when |favicon_bitmap_data| is empty do not occur 2111 // bitmap was changed by this function.
2085 // in practice. 2112 SendFaviconChangedNotificationForPageAndRedirects(page_url);
2086 SendFaviconChangedNotificationForPageAndRedirects(page_url); 2113 }
2087 ScheduleCommit(); 2114 ScheduleCommit();
2088 } 2115 }
2089 2116
2090 void HistoryBackend::SetFaviconsOutOfDateForPage(const GURL& page_url) { 2117 void HistoryBackend::SetFaviconsOutOfDateForPage(const GURL& page_url) {
2091 std::vector<IconMapping> icon_mappings; 2118 std::vector<IconMapping> icon_mappings;
2092 2119
2093 if (!thumbnail_db_.get() || 2120 if (!thumbnail_db_.get() ||
2094 !thumbnail_db_->GetIconMappingsForPageURL(page_url, 2121 !thumbnail_db_->GetIconMappingsForPageURL(page_url,
2095 &icon_mappings)) 2122 &icon_mappings))
2096 return; 2123 return;
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
2236 } 2263 }
2237 } 2264 }
2238 2265
2239 GetFaviconBitmapResultsForBestMatch(favicon_ids, desired_size_in_dip, 2266 GetFaviconBitmapResultsForBestMatch(favicon_ids, desired_size_in_dip,
2240 desired_scale_factors, &results->bitmap_results); 2267 desired_scale_factors, &results->bitmap_results);
2241 BuildIconURLSizesMap(favicon_ids, &results->size_map); 2268 BuildIconURLSizesMap(favicon_ids, &results->size_map);
2242 } 2269 }
2243 2270
2244 void HistoryBackend::SetFaviconBitmaps( 2271 void HistoryBackend::SetFaviconBitmaps(
2245 FaviconID icon_id, 2272 FaviconID icon_id,
2246 const std::vector<FaviconBitmapData>& favicon_bitmap_data) { 2273 const std::vector<FaviconBitmapData>& favicon_bitmap_data,
2274 bool* favicon_bitmaps_changed) {
2275 if (favicon_bitmaps_changed)
2276 *favicon_bitmaps_changed = false;
2277
2247 std::vector<FaviconBitmapIDSize> bitmap_id_sizes; 2278 std::vector<FaviconBitmapIDSize> bitmap_id_sizes;
2248 thumbnail_db_->GetFaviconBitmapIDSizes(icon_id, &bitmap_id_sizes); 2279 thumbnail_db_->GetFaviconBitmapIDSizes(icon_id, &bitmap_id_sizes);
2249 2280
2250 // A nested loop is ok because in practice neither |favicon_bitmap_data| nor 2281 // A nested loop is ok because in practice neither |favicon_bitmap_data| nor
2251 // |bitmap_id_sizes| will have many elements. 2282 // |bitmap_id_sizes| will have many elements.
2252 for (size_t i = 0; i < favicon_bitmap_data.size(); ++i) { 2283 for (size_t i = 0; i < favicon_bitmap_data.size(); ++i) {
2253 const FaviconBitmapData& bitmap_data_element = favicon_bitmap_data[i]; 2284 const FaviconBitmapData& bitmap_data_element = favicon_bitmap_data[i];
2254 FaviconBitmapID bitmap_id = 0; 2285 FaviconBitmapID bitmap_id = 0;
2255 for (size_t j = 0; j < bitmap_id_sizes.size(); ++j) { 2286 for (size_t j = 0; j < bitmap_id_sizes.size(); ++j) {
2256 if (bitmap_id_sizes[j].pixel_size == bitmap_data_element.pixel_size) { 2287 if (bitmap_id_sizes[j].pixel_size == bitmap_data_element.pixel_size) {
2257 bitmap_id = bitmap_id_sizes[j].bitmap_id; 2288 bitmap_id = bitmap_id_sizes[j].bitmap_id;
2258 break; 2289 break;
2259 } 2290 }
2260 } 2291 }
2261 if (bitmap_id) { 2292 if (bitmap_id) {
2262 thumbnail_db_->SetFaviconBitmap(bitmap_id, 2293 if (favicon_bitmaps_changed &&
2263 bitmap_data_element.bitmap_data, base::Time::Now()); 2294 !*favicon_bitmaps_changed &&
2295 IsFaviconBitmapDataEqual(bitmap_id,
2296 bitmap_data_element.bitmap_data)) {
2297 thumbnail_db_->SetFaviconBitmapLastUpdateTime(
2298 bitmap_id, base::Time::Now());
2299 } else {
2300 thumbnail_db_->SetFaviconBitmap(bitmap_id,
2301 bitmap_data_element.bitmap_data, base::Time::Now());
2302 if (favicon_bitmaps_changed)
2303 *favicon_bitmaps_changed = true;
2304 }
2264 } else { 2305 } else {
2265 thumbnail_db_->AddFaviconBitmap(icon_id, bitmap_data_element.bitmap_data, 2306 thumbnail_db_->AddFaviconBitmap(icon_id, bitmap_data_element.bitmap_data,
2266 base::Time::Now(), bitmap_data_element.pixel_size); 2307 base::Time::Now(), bitmap_data_element.pixel_size);
2308 if (favicon_bitmaps_changed)
2309 *favicon_bitmaps_changed = true;
2267 } 2310 }
2268 } 2311 }
2269 } 2312 }
2270 2313
2271 bool HistoryBackend::ValidateSetFaviconsParams( 2314 bool HistoryBackend::ValidateSetFaviconsParams(
2272 const std::vector<FaviconBitmapData>& favicon_bitmap_data, 2315 const std::vector<FaviconBitmapData>& favicon_bitmap_data,
2273 const IconURLSizesMap& icon_url_sizes) const { 2316 const IconURLSizesMap& icon_url_sizes) const {
2274 if (icon_url_sizes.size() > kMaxFaviconsPerPage) 2317 if (icon_url_sizes.size() > kMaxFaviconsPerPage)
2275 return false; 2318 return false;
2276 2319
(...skipping 15 matching lines...) Expand all
2292 const FaviconSizes& favicon_sizes = it->second; 2335 const FaviconSizes& favicon_sizes = it->second;
2293 FaviconSizes::const_iterator it2 = std::find(favicon_sizes.begin(), 2336 FaviconSizes::const_iterator it2 = std::find(favicon_sizes.begin(),
2294 favicon_sizes.end(), favicon_bitmap_data[i].pixel_size); 2337 favicon_sizes.end(), favicon_bitmap_data[i].pixel_size);
2295 if (it2 == favicon_sizes.end()) 2338 if (it2 == favicon_sizes.end())
2296 return false; 2339 return false;
2297 } 2340 }
2298 return true; 2341 return true;
2299 } 2342 }
2300 2343
2301 void HistoryBackend::SetFaviconSizes(FaviconID icon_id, 2344 void HistoryBackend::SetFaviconSizes(FaviconID icon_id,
2302 const FaviconSizes& favicon_sizes) { 2345 const FaviconSizes& favicon_sizes,
2346 bool* favicon_bitmaps_deleted) {
2347 *favicon_bitmaps_deleted = false;
2348
2303 std::vector<FaviconBitmapIDSize> bitmap_id_sizes; 2349 std::vector<FaviconBitmapIDSize> bitmap_id_sizes;
2304 thumbnail_db_->GetFaviconBitmapIDSizes(icon_id, &bitmap_id_sizes); 2350 thumbnail_db_->GetFaviconBitmapIDSizes(icon_id, &bitmap_id_sizes);
2305 2351
2306 // Remove bitmaps whose pixel size is not contained in |favicon_sizes|. 2352 // Remove bitmaps whose pixel size is not contained in |favicon_sizes|.
2307 for (size_t i = 0; i < bitmap_id_sizes.size(); ++i) { 2353 for (size_t i = 0; i < bitmap_id_sizes.size(); ++i) {
2308 const gfx::Size& pixel_size = bitmap_id_sizes[i].pixel_size; 2354 const gfx::Size& pixel_size = bitmap_id_sizes[i].pixel_size;
2309 FaviconSizes::const_iterator sizes_it = std::find(favicon_sizes.begin(), 2355 FaviconSizes::const_iterator sizes_it = std::find(favicon_sizes.begin(),
2310 favicon_sizes.end(), pixel_size); 2356 favicon_sizes.end(), pixel_size);
2311 if (sizes_it == favicon_sizes.end()) 2357 if (sizes_it == favicon_sizes.end()) {
2312 thumbnail_db_->DeleteFaviconBitmap(bitmap_id_sizes[i].bitmap_id); 2358 thumbnail_db_->DeleteFaviconBitmap(bitmap_id_sizes[i].bitmap_id);
2359 *favicon_bitmaps_deleted = true;
2360 }
2313 } 2361 }
2314 2362
2315 thumbnail_db_->SetFaviconSizes(icon_id, favicon_sizes); 2363 thumbnail_db_->SetFaviconSizes(icon_id, favicon_sizes);
2316 } 2364 }
2317 2365
2366 bool HistoryBackend::IsFaviconBitmapDataEqual(
2367 FaviconBitmapID bitmap_id,
2368 const scoped_refptr<base::RefCountedMemory>& new_bitmap_data) {
2369 if (!new_bitmap_data.get())
2370 return false;
2371
2372 scoped_refptr<base::RefCountedMemory> original_bitmap_data;
2373 thumbnail_db_->GetFaviconBitmap(bitmap_id,
2374 NULL,
2375 &original_bitmap_data,
2376 NULL);
2377 return original_bitmap_data.get() &&
sky 2013/01/09 17:55:25 Should this be on RefCountedMemory? Specfically an
2378 original_bitmap_data->size() == new_bitmap_data->size() &&
2379 (memcmp(new_bitmap_data->front(), original_bitmap_data->front(),
2380 new_bitmap_data->size()) == 0);
2381 }
2382
2318 bool HistoryBackend::GetFaviconsFromDB( 2383 bool HistoryBackend::GetFaviconsFromDB(
2319 const GURL& page_url, 2384 const GURL& page_url,
2320 int icon_types, 2385 int icon_types,
2321 int desired_size_in_dip, 2386 int desired_size_in_dip,
2322 const std::vector<ui::ScaleFactor>& desired_scale_factors, 2387 const std::vector<ui::ScaleFactor>& desired_scale_factors,
2323 std::vector<FaviconBitmapResult>* favicon_bitmap_results, 2388 std::vector<FaviconBitmapResult>* favicon_bitmap_results,
2324 IconURLSizesMap* icon_url_sizes) { 2389 IconURLSizesMap* icon_url_sizes) {
2325 DCHECK(favicon_bitmap_results); 2390 DCHECK(favicon_bitmap_results);
2326 DCHECK(icon_url_sizes); 2391 DCHECK(icon_url_sizes);
2327 favicon_bitmap_results->clear(); 2392 favicon_bitmap_results->clear();
(...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after
2976 info.url_id = visit.url_id; 3041 info.url_id = visit.url_id;
2977 info.time = visit.visit_time; 3042 info.time = visit.visit_time;
2978 info.transition = visit.transition; 3043 info.transition = visit.transition;
2979 // If we don't have a delegate yet during setup or shutdown, we will drop 3044 // If we don't have a delegate yet during setup or shutdown, we will drop
2980 // these notifications. 3045 // these notifications.
2981 if (delegate_.get()) 3046 if (delegate_.get())
2982 delegate_->NotifyVisitDBObserversOnAddVisit(info); 3047 delegate_->NotifyVisitDBObserversOnAddVisit(info);
2983 } 3048 }
2984 3049
2985 } // namespace history 3050 } // namespace history
OLDNEW
« 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