| 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 1548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1559 if (sql::Connection::Delete(current_file)) | 1559 if (sql::Connection::Delete(current_file)) |
| 1560 num_databases_deleted++; | 1560 num_databases_deleted++; |
| 1561 } | 1561 } |
| 1562 UMA_HISTOGRAM_COUNTS("History.DeleteFTSIndexDatabases", | 1562 UMA_HISTOGRAM_COUNTS("History.DeleteFTSIndexDatabases", |
| 1563 num_databases_deleted); | 1563 num_databases_deleted); |
| 1564 } | 1564 } |
| 1565 | 1565 |
| 1566 void HistoryBackend::GetFavicons( | 1566 void HistoryBackend::GetFavicons( |
| 1567 const std::vector<GURL>& icon_urls, | 1567 const std::vector<GURL>& icon_urls, |
| 1568 int icon_types, | 1568 int icon_types, |
| 1569 int desired_size_in_dip, | 1569 const std::vector<int>& desired_sizes, |
| 1570 const std::vector<ui::ScaleFactor>& desired_scale_factors, | |
| 1571 std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { | 1570 std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { |
| 1572 UpdateFaviconMappingsAndFetchImpl(NULL, icon_urls, icon_types, | 1571 UpdateFaviconMappingsAndFetchImpl(NULL, icon_urls, icon_types, desired_sizes, |
| 1573 desired_size_in_dip, desired_scale_factors, | |
| 1574 bitmap_results); | 1572 bitmap_results); |
| 1575 } | 1573 } |
| 1576 | 1574 |
| 1577 void HistoryBackend::GetLargestFaviconForURL( | 1575 void HistoryBackend::GetLargestFaviconForURL( |
| 1578 const GURL& page_url, | 1576 const GURL& page_url, |
| 1579 const std::vector<int>& icon_types, | 1577 const std::vector<int>& icon_types, |
| 1580 int minimum_size_in_pixels, | 1578 int minimum_size_in_pixels, |
| 1581 favicon_base::FaviconRawBitmapResult* favicon_bitmap_result) { | 1579 favicon_base::FaviconRawBitmapResult* favicon_bitmap_result) { |
| 1582 DCHECK(favicon_bitmap_result); | 1580 DCHECK(favicon_bitmap_result); |
| 1583 | 1581 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1665 if (bitmap_result.is_valid()) | 1663 if (bitmap_result.is_valid()) |
| 1666 *favicon_bitmap_result = bitmap_result; | 1664 *favicon_bitmap_result = bitmap_result; |
| 1667 | 1665 |
| 1668 HISTOGRAM_TIMES("History.GetLargestFaviconForURL", | 1666 HISTOGRAM_TIMES("History.GetLargestFaviconForURL", |
| 1669 TimeTicks::Now() - beginning_time); | 1667 TimeTicks::Now() - beginning_time); |
| 1670 } | 1668 } |
| 1671 | 1669 |
| 1672 void HistoryBackend::GetFaviconsForURL( | 1670 void HistoryBackend::GetFaviconsForURL( |
| 1673 const GURL& page_url, | 1671 const GURL& page_url, |
| 1674 int icon_types, | 1672 int icon_types, |
| 1675 int desired_size_in_dip, | 1673 const std::vector<int>& desired_sizes, |
| 1676 const std::vector<ui::ScaleFactor>& desired_scale_factors, | |
| 1677 std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { | 1674 std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { |
| 1678 DCHECK(bitmap_results); | 1675 DCHECK(bitmap_results); |
| 1679 GetFaviconsFromDB(page_url, icon_types, desired_size_in_dip, | 1676 GetFaviconsFromDB(page_url, icon_types, desired_sizes, bitmap_results); |
| 1680 desired_scale_factors, bitmap_results); | |
| 1681 } | 1677 } |
| 1682 | 1678 |
| 1683 void HistoryBackend::GetFaviconForID( | 1679 void HistoryBackend::GetFaviconForID( |
| 1684 favicon_base::FaviconID favicon_id, | 1680 favicon_base::FaviconID favicon_id, |
| 1685 int desired_size_in_dip, | 1681 int desired_size, |
| 1686 ui::ScaleFactor desired_scale_factor, | |
| 1687 std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { | 1682 std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { |
| 1688 std::vector<favicon_base::FaviconID> favicon_ids; | 1683 std::vector<favicon_base::FaviconID> favicon_ids; |
| 1689 favicon_ids.push_back(favicon_id); | 1684 favicon_ids.push_back(favicon_id); |
| 1690 std::vector<ui::ScaleFactor> desired_scale_factors; | 1685 std::vector<int> desired_sizes; |
| 1691 desired_scale_factors.push_back(desired_scale_factor); | 1686 desired_sizes.push_back(desired_size); |
| 1692 | 1687 |
| 1693 // Get results from DB. | 1688 // Get results from DB. |
| 1694 GetFaviconBitmapResultsForBestMatch(favicon_ids, | 1689 GetFaviconBitmapResultsForBestMatch(favicon_ids, |
| 1695 desired_size_in_dip, | 1690 desired_sizes, |
| 1696 desired_scale_factors, | |
| 1697 bitmap_results); | 1691 bitmap_results); |
| 1698 } | 1692 } |
| 1699 | 1693 |
| 1700 void HistoryBackend::UpdateFaviconMappingsAndFetch( | 1694 void HistoryBackend::UpdateFaviconMappingsAndFetch( |
| 1701 const GURL& page_url, | 1695 const GURL& page_url, |
| 1702 const std::vector<GURL>& icon_urls, | 1696 const std::vector<GURL>& icon_urls, |
| 1703 int icon_types, | 1697 int icon_types, |
| 1704 int desired_size_in_dip, | 1698 const std::vector<int>& desired_sizes, |
| 1705 const std::vector<ui::ScaleFactor>& desired_scale_factors, | |
| 1706 std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { | 1699 std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { |
| 1707 UpdateFaviconMappingsAndFetchImpl(&page_url, icon_urls, icon_types, | 1700 UpdateFaviconMappingsAndFetchImpl(&page_url, icon_urls, icon_types, |
| 1708 desired_size_in_dip, desired_scale_factors, | 1701 desired_sizes, bitmap_results); |
| 1709 bitmap_results); | |
| 1710 } | 1702 } |
| 1711 | 1703 |
| 1712 void HistoryBackend::MergeFavicon( | 1704 void HistoryBackend::MergeFavicon( |
| 1713 const GURL& page_url, | 1705 const GURL& page_url, |
| 1714 const GURL& icon_url, | 1706 const GURL& icon_url, |
| 1715 favicon_base::IconType icon_type, | 1707 favicon_base::IconType icon_type, |
| 1716 scoped_refptr<base::RefCountedMemory> bitmap_data, | 1708 scoped_refptr<base::RefCountedMemory> bitmap_data, |
| 1717 const gfx::Size& pixel_size) { | 1709 const gfx::Size& pixel_size) { |
| 1718 if (!thumbnail_db_ || !db_) | 1710 if (!thumbnail_db_ || !db_) |
| 1719 return; | 1711 return; |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1998 changed_details->urls.swap(favicons_changed); | 1990 changed_details->urls.swap(favicons_changed); |
| 1999 BroadcastNotifications(chrome::NOTIFICATION_FAVICON_CHANGED, | 1991 BroadcastNotifications(chrome::NOTIFICATION_FAVICON_CHANGED, |
| 2000 changed_details.PassAs<HistoryDetails>()); | 1992 changed_details.PassAs<HistoryDetails>()); |
| 2001 } | 1993 } |
| 2002 } | 1994 } |
| 2003 | 1995 |
| 2004 void HistoryBackend::UpdateFaviconMappingsAndFetchImpl( | 1996 void HistoryBackend::UpdateFaviconMappingsAndFetchImpl( |
| 2005 const GURL* page_url, | 1997 const GURL* page_url, |
| 2006 const std::vector<GURL>& icon_urls, | 1998 const std::vector<GURL>& icon_urls, |
| 2007 int icon_types, | 1999 int icon_types, |
| 2008 int desired_size_in_dip, | 2000 const std::vector<int>& desired_sizes, |
| 2009 const std::vector<ui::ScaleFactor>& desired_scale_factors, | |
| 2010 std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { | 2001 std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { |
| 2011 // If |page_url| is specified, |icon_types| must be either a single icon | 2002 // If |page_url| is specified, |icon_types| must be either a single icon |
| 2012 // type or icon types which are equivalent. | 2003 // type or icon types which are equivalent. |
| 2013 DCHECK(!page_url || icon_types == favicon_base::FAVICON || | 2004 DCHECK(!page_url || icon_types == favicon_base::FAVICON || |
| 2014 icon_types == favicon_base::TOUCH_ICON || | 2005 icon_types == favicon_base::TOUCH_ICON || |
| 2015 icon_types == favicon_base::TOUCH_PRECOMPOSED_ICON || | 2006 icon_types == favicon_base::TOUCH_PRECOMPOSED_ICON || |
| 2016 icon_types == | 2007 icon_types == |
| 2017 (favicon_base::TOUCH_ICON | favicon_base::TOUCH_PRECOMPOSED_ICON)); | 2008 (favicon_base::TOUCH_ICON | favicon_base::TOUCH_PRECOMPOSED_ICON)); |
| 2018 bitmap_results->clear(); | 2009 bitmap_results->clear(); |
| 2019 | 2010 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2050 if (page_url && !favicon_ids.empty()) { | 2041 if (page_url && !favicon_ids.empty()) { |
| 2051 bool mappings_updated = | 2042 bool mappings_updated = |
| 2052 SetFaviconMappingsForPageAndRedirects(*page_url, selected_icon_type, | 2043 SetFaviconMappingsForPageAndRedirects(*page_url, selected_icon_type, |
| 2053 favicon_ids); | 2044 favicon_ids); |
| 2054 if (mappings_updated) { | 2045 if (mappings_updated) { |
| 2055 SendFaviconChangedNotificationForPageAndRedirects(*page_url); | 2046 SendFaviconChangedNotificationForPageAndRedirects(*page_url); |
| 2056 ScheduleCommit(); | 2047 ScheduleCommit(); |
| 2057 } | 2048 } |
| 2058 } | 2049 } |
| 2059 | 2050 |
| 2060 GetFaviconBitmapResultsForBestMatch(favicon_ids, desired_size_in_dip, | 2051 GetFaviconBitmapResultsForBestMatch(favicon_ids, desired_sizes, |
| 2061 desired_scale_factors, bitmap_results); | 2052 bitmap_results); |
| 2062 } | 2053 } |
| 2063 | 2054 |
| 2064 void HistoryBackend::SetFaviconBitmaps( | 2055 void HistoryBackend::SetFaviconBitmaps( |
| 2065 favicon_base::FaviconID icon_id, | 2056 favicon_base::FaviconID icon_id, |
| 2066 const std::vector<favicon_base::FaviconRawBitmapData>& favicon_bitmap_data, | 2057 const std::vector<favicon_base::FaviconRawBitmapData>& favicon_bitmap_data, |
| 2067 bool* favicon_bitmaps_changed) { | 2058 bool* favicon_bitmaps_changed) { |
| 2068 if (favicon_bitmaps_changed) | 2059 if (favicon_bitmaps_changed) |
| 2069 *favicon_bitmaps_changed = false; | 2060 *favicon_bitmaps_changed = false; |
| 2070 | 2061 |
| 2071 std::vector<FaviconBitmapIDSize> bitmap_id_sizes; | 2062 std::vector<FaviconBitmapIDSize> bitmap_id_sizes; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2155 thumbnail_db_->GetFaviconBitmap(bitmap_id, | 2146 thumbnail_db_->GetFaviconBitmap(bitmap_id, |
| 2156 NULL, | 2147 NULL, |
| 2157 &original_bitmap_data, | 2148 &original_bitmap_data, |
| 2158 NULL); | 2149 NULL); |
| 2159 return new_bitmap_data->Equals(original_bitmap_data); | 2150 return new_bitmap_data->Equals(original_bitmap_data); |
| 2160 } | 2151 } |
| 2161 | 2152 |
| 2162 bool HistoryBackend::GetFaviconsFromDB( | 2153 bool HistoryBackend::GetFaviconsFromDB( |
| 2163 const GURL& page_url, | 2154 const GURL& page_url, |
| 2164 int icon_types, | 2155 int icon_types, |
| 2165 int desired_size_in_dip, | 2156 const std::vector<int>& desired_sizes, |
| 2166 const std::vector<ui::ScaleFactor>& desired_scale_factors, | |
| 2167 std::vector<favicon_base::FaviconRawBitmapResult>* favicon_bitmap_results) { | 2157 std::vector<favicon_base::FaviconRawBitmapResult>* favicon_bitmap_results) { |
| 2168 DCHECK(favicon_bitmap_results); | 2158 DCHECK(favicon_bitmap_results); |
| 2169 favicon_bitmap_results->clear(); | 2159 favicon_bitmap_results->clear(); |
| 2170 | 2160 |
| 2171 if (!db_ || !thumbnail_db_) | 2161 if (!db_ || !thumbnail_db_) |
| 2172 return false; | 2162 return false; |
| 2173 | 2163 |
| 2174 // Time the query. | 2164 // Time the query. |
| 2175 TimeTicks beginning_time = TimeTicks::Now(); | 2165 TimeTicks beginning_time = TimeTicks::Now(); |
| 2176 | 2166 |
| 2177 // Get FaviconIDs for |page_url| and one of |icon_types|. | 2167 // Get FaviconIDs for |page_url| and one of |icon_types|. |
| 2178 std::vector<IconMapping> icon_mappings; | 2168 std::vector<IconMapping> icon_mappings; |
| 2179 thumbnail_db_->GetIconMappingsForPageURL(page_url, icon_types, | 2169 thumbnail_db_->GetIconMappingsForPageURL(page_url, icon_types, |
| 2180 &icon_mappings); | 2170 &icon_mappings); |
| 2181 std::vector<favicon_base::FaviconID> favicon_ids; | 2171 std::vector<favicon_base::FaviconID> favicon_ids; |
| 2182 for (size_t i = 0; i < icon_mappings.size(); ++i) | 2172 for (size_t i = 0; i < icon_mappings.size(); ++i) |
| 2183 favicon_ids.push_back(icon_mappings[i].icon_id); | 2173 favicon_ids.push_back(icon_mappings[i].icon_id); |
| 2184 | 2174 |
| 2185 // Populate |favicon_bitmap_results| and |icon_url_sizes|. | 2175 // Populate |favicon_bitmap_results| and |icon_url_sizes|. |
| 2186 bool success = GetFaviconBitmapResultsForBestMatch(favicon_ids, | 2176 bool success = GetFaviconBitmapResultsForBestMatch(favicon_ids, |
| 2187 desired_size_in_dip, desired_scale_factors, favicon_bitmap_results); | 2177 desired_sizes, favicon_bitmap_results); |
| 2188 UMA_HISTOGRAM_TIMES("History.GetFavIconFromDB", // historical name | 2178 UMA_HISTOGRAM_TIMES("History.GetFavIconFromDB", // historical name |
| 2189 TimeTicks::Now() - beginning_time); | 2179 TimeTicks::Now() - beginning_time); |
| 2190 return success && !favicon_bitmap_results->empty(); | 2180 return success && !favicon_bitmap_results->empty(); |
| 2191 } | 2181 } |
| 2192 | 2182 |
| 2193 bool HistoryBackend::GetFaviconBitmapResultsForBestMatch( | 2183 bool HistoryBackend::GetFaviconBitmapResultsForBestMatch( |
| 2194 const std::vector<favicon_base::FaviconID>& candidate_favicon_ids, | 2184 const std::vector<favicon_base::FaviconID>& candidate_favicon_ids, |
| 2195 int desired_size_in_dip, | 2185 const std::vector<int>& desired_sizes, |
| 2196 const std::vector<ui::ScaleFactor>& desired_scale_factors, | |
| 2197 std::vector<favicon_base::FaviconRawBitmapResult>* favicon_bitmap_results) { | 2186 std::vector<favicon_base::FaviconRawBitmapResult>* favicon_bitmap_results) { |
| 2198 favicon_bitmap_results->clear(); | 2187 favicon_bitmap_results->clear(); |
| 2199 | 2188 |
| 2200 if (candidate_favicon_ids.empty()) | 2189 if (candidate_favicon_ids.empty()) |
| 2201 return true; | 2190 return true; |
| 2202 | 2191 |
| 2203 // Find the FaviconID and the FaviconBitmapIDs which best match | 2192 // Find the FaviconID and the FaviconBitmapIDs which best match |
| 2204 // |desired_size_in_dip| and |desired_scale_factors|. | 2193 // |desired_size_in_dip| and |desired_scale_factors|. |
| 2205 // TODO(pkotwicz): Select bitmap results from multiple favicons once | 2194 // TODO(pkotwicz): Select bitmap results from multiple favicons once |
| 2206 // content::FaviconStatus supports multiple icon URLs. | 2195 // content::FaviconStatus supports multiple icon URLs. |
| 2207 favicon_base::FaviconID best_favicon_id = 0; | 2196 favicon_base::FaviconID best_favicon_id = 0; |
| 2208 std::vector<FaviconBitmapID> best_bitmap_ids; | 2197 std::vector<FaviconBitmapID> best_bitmap_ids; |
| 2209 float highest_score = kSelectFaviconFramesInvalidScore; | 2198 float highest_score = kSelectFaviconFramesInvalidScore; |
| 2210 for (size_t i = 0; i < candidate_favicon_ids.size(); ++i) { | 2199 for (size_t i = 0; i < candidate_favicon_ids.size(); ++i) { |
| 2211 std::vector<FaviconBitmapIDSize> bitmap_id_sizes; | 2200 std::vector<FaviconBitmapIDSize> bitmap_id_sizes; |
| 2212 thumbnail_db_->GetFaviconBitmapIDSizes(candidate_favicon_ids[i], | 2201 thumbnail_db_->GetFaviconBitmapIDSizes(candidate_favicon_ids[i], |
| 2213 &bitmap_id_sizes); | 2202 &bitmap_id_sizes); |
| 2214 | 2203 |
| 2215 // Build vector of gfx::Size from |bitmap_id_sizes|. | 2204 // Build vector of gfx::Size from |bitmap_id_sizes|. |
| 2216 std::vector<gfx::Size> sizes; | 2205 std::vector<gfx::Size> sizes; |
| 2217 for (size_t j = 0; j < bitmap_id_sizes.size(); ++j) | 2206 for (size_t j = 0; j < bitmap_id_sizes.size(); ++j) |
| 2218 sizes.push_back(bitmap_id_sizes[j].pixel_size); | 2207 sizes.push_back(bitmap_id_sizes[j].pixel_size); |
| 2219 | 2208 |
| 2220 std::vector<size_t> candidate_bitmap_indices; | 2209 std::vector<size_t> candidate_bitmap_indices; |
| 2221 float score = 0; | 2210 float score = 0; |
| 2222 SelectFaviconFrameIndices(sizes, | 2211 SelectFaviconFrameIndices(sizes, |
| 2223 desired_scale_factors, | 2212 desired_sizes, |
| 2224 desired_size_in_dip, | |
| 2225 &candidate_bitmap_indices, | 2213 &candidate_bitmap_indices, |
| 2226 &score); | 2214 &score); |
| 2227 if (score > highest_score) { | 2215 if (score > highest_score) { |
| 2228 highest_score = score; | 2216 highest_score = score; |
| 2229 best_favicon_id = candidate_favicon_ids[i], | 2217 best_favicon_id = candidate_favicon_ids[i], |
| 2230 best_bitmap_ids.clear(); | 2218 best_bitmap_ids.clear(); |
| 2231 for (size_t j = 0; j < candidate_bitmap_indices.size(); ++j) { | 2219 for (size_t j = 0; j < candidate_bitmap_indices.size(); ++j) { |
| 2232 size_t candidate_index = candidate_bitmap_indices[j]; | 2220 size_t candidate_index = candidate_bitmap_indices[j]; |
| 2233 best_bitmap_ids.push_back( | 2221 best_bitmap_ids.push_back( |
| 2234 bitmap_id_sizes[candidate_index].bitmap_id); | 2222 bitmap_id_sizes[candidate_index].bitmap_id); |
| (...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2843 int rank = kPageVisitStatsMaxTopSites; | 2831 int rank = kPageVisitStatsMaxTopSites; |
| 2844 std::map<GURL, int>::const_iterator it = most_visited_urls_map_.find(url); | 2832 std::map<GURL, int>::const_iterator it = most_visited_urls_map_.find(url); |
| 2845 if (it != most_visited_urls_map_.end()) | 2833 if (it != most_visited_urls_map_.end()) |
| 2846 rank = (*it).second; | 2834 rank = (*it).second; |
| 2847 UMA_HISTOGRAM_ENUMERATION("History.TopSitesVisitsByRank", | 2835 UMA_HISTOGRAM_ENUMERATION("History.TopSitesVisitsByRank", |
| 2848 rank, kPageVisitStatsMaxTopSites + 1); | 2836 rank, kPageVisitStatsMaxTopSites + 1); |
| 2849 } | 2837 } |
| 2850 #endif | 2838 #endif |
| 2851 | 2839 |
| 2852 } // namespace history | 2840 } // namespace history |
| OLD | NEW |