Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |