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 |