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

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

Issue 531493002: Move encoding SkBitmaps to PNG out of FaviconService::SetFavicons() and onto the history thread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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
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 26 matching lines...) Expand all
37 #include "chrome/browser/history/visit_filter.h" 37 #include "chrome/browser/history/visit_filter.h"
38 #include "chrome/common/chrome_constants.h" 38 #include "chrome/common/chrome_constants.h"
39 #include "chrome/common/importer/imported_favicon_usage.h" 39 #include "chrome/common/importer/imported_favicon_usage.h"
40 #include "chrome/common/url_constants.h" 40 #include "chrome/common/url_constants.h"
41 #include "components/favicon_base/select_favicon_frames.h" 41 #include "components/favicon_base/select_favicon_frames.h"
42 #include "components/history/core/browser/history_client.h" 42 #include "components/history/core/browser/history_client.h"
43 #include "components/history/core/browser/keyword_search_term.h" 43 #include "components/history/core/browser/keyword_search_term.h"
44 #include "components/history/core/browser/page_usage_data.h" 44 #include "components/history/core/browser/page_usage_data.h"
45 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" 45 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
46 #include "sql/error_delegate_util.h" 46 #include "sql/error_delegate_util.h"
47 #include "third_party/skia/include/core/SkBitmap.h"
48 #include "ui/gfx/codec/png_codec.h"
47 #include "url/gurl.h" 49 #include "url/gurl.h"
48 50
49 #if defined(OS_ANDROID) 51 #if defined(OS_ANDROID)
50 #include "chrome/browser/history/android/android_provider_backend.h" 52 #include "chrome/browser/history/android/android_provider_backend.h"
51 #endif 53 #endif
52 54
53 using base::Time; 55 using base::Time;
54 using base::TimeDelta; 56 using base::TimeDelta;
55 using base::TimeTicks; 57 using base::TimeTicks;
56 58
(...skipping 1710 matching lines...) Expand 10 before | Expand all | Expand 10 after
1767 favicon_ids.push_back(favicon_id); 1769 favicon_ids.push_back(favicon_id);
1768 SetFaviconMappingsForPageAndRedirects(page_url, icon_type, favicon_ids); 1770 SetFaviconMappingsForPageAndRedirects(page_url, icon_type, favicon_ids);
1769 mapping_changed = true; 1771 mapping_changed = true;
1770 } 1772 }
1771 1773
1772 if (mapping_changed || !bitmap_identical) 1774 if (mapping_changed || !bitmap_identical)
1773 SendFaviconChangedNotificationForPageAndRedirects(page_url); 1775 SendFaviconChangedNotificationForPageAndRedirects(page_url);
1774 ScheduleCommit(); 1776 ScheduleCommit();
1775 } 1777 }
1776 1778
1777 void HistoryBackend::SetFavicons( 1779 void HistoryBackend::SetFavicon(const GURL& page_url,
1778 const GURL& page_url, 1780 favicon_base::IconType icon_type,
1779 favicon_base::IconType icon_type, 1781 const GURL& icon_url,
1780 const std::vector<favicon_base::FaviconRawBitmapData>& 1782 const std::vector<SkBitmap>& bitmaps) {
1781 favicon_bitmap_data) {
1782 if (!thumbnail_db_ || !db_) 1783 if (!thumbnail_db_ || !db_)
1783 return; 1784 return;
1784 1785
1785 DCHECK(ValidateSetFaviconsParams(favicon_bitmap_data)); 1786 DCHECK_GE(kMaxFaviconBitmapsPerIconURL, bitmaps.size());
1786
1787 // Build map of FaviconRawBitmapData for each icon url.
1788 typedef std::map<GURL, std::vector<favicon_base::FaviconRawBitmapData> >
1789 BitmapDataByIconURL;
1790 BitmapDataByIconURL grouped_by_icon_url;
1791 for (size_t i = 0; i < favicon_bitmap_data.size(); ++i) {
1792 const GURL& icon_url = favicon_bitmap_data[i].icon_url;
1793 grouped_by_icon_url[icon_url].push_back(favicon_bitmap_data[i]);
1794 }
1795 1787
1796 // Track whether the method modifies or creates any favicon bitmaps, favicons 1788 // Track whether the method modifies or creates any favicon bitmaps, favicons
1797 // or icon mappings. 1789 // or icon mappings.
1798 bool data_modified = false; 1790 bool data_modified = false;
1799 1791
1800 std::vector<favicon_base::FaviconID> icon_ids; 1792 favicon_base::FaviconID icon_id =
1801 for (BitmapDataByIconURL::const_iterator it = grouped_by_icon_url.begin(); 1793 thumbnail_db_->GetFaviconIDForFaviconURL(icon_url, icon_type, NULL);
1802 it != grouped_by_icon_url.end(); ++it) {
1803 const GURL& icon_url = it->first;
1804 favicon_base::FaviconID icon_id =
1805 thumbnail_db_->GetFaviconIDForFaviconURL(icon_url, icon_type, NULL);
1806 1794
1807 if (!icon_id) { 1795 if (!icon_id) {
1808 // TODO(pkotwicz): Remove the favicon sizes attribute from 1796 icon_id = thumbnail_db_->AddFavicon(icon_url, icon_type);
1809 // ThumbnailDatabase::AddFavicon(). 1797 data_modified = true;
1810 icon_id = thumbnail_db_->AddFavicon(icon_url, icon_type);
1811 data_modified = true;
1812 }
1813 icon_ids.push_back(icon_id);
1814
1815 if (!data_modified)
1816 SetFaviconBitmaps(icon_id, it->second, &data_modified);
1817 else
1818 SetFaviconBitmaps(icon_id, it->second, NULL);
1819 } 1798 }
1820 1799
1800 if (!data_modified)
1801 SetFaviconBitmaps(icon_id, bitmaps, &data_modified);
1802 else
1803 SetFaviconBitmaps(icon_id, bitmaps, NULL);
1804
1805 std::vector<favicon_base::FaviconID> icon_ids(1u, icon_id);
1821 data_modified |= 1806 data_modified |=
1822 SetFaviconMappingsForPageAndRedirects(page_url, icon_type, icon_ids); 1807 SetFaviconMappingsForPageAndRedirects(page_url, icon_type, icon_ids);
1823 1808
1824 if (data_modified) { 1809 if (data_modified) {
1825 // Send notification to the UI as an icon mapping, favicon, or favicon 1810 // Send notification to the UI as an icon mapping, favicon, or favicon
1826 // bitmap was changed by this function. 1811 // bitmap was changed by this function.
1827 SendFaviconChangedNotificationForPageAndRedirects(page_url); 1812 SendFaviconChangedNotificationForPageAndRedirects(page_url);
1828 } 1813 }
1829 ScheduleCommit(); 1814 ScheduleCommit();
1830 } 1815 }
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1977 if (mappings_updated) { 1962 if (mappings_updated) {
1978 SendFaviconChangedNotificationForPageAndRedirects(*page_url); 1963 SendFaviconChangedNotificationForPageAndRedirects(*page_url);
1979 ScheduleCommit(); 1964 ScheduleCommit();
1980 } 1965 }
1981 } 1966 }
1982 1967
1983 GetFaviconBitmapResultsForBestMatch(favicon_ids, desired_sizes, 1968 GetFaviconBitmapResultsForBestMatch(favicon_ids, desired_sizes,
1984 bitmap_results); 1969 bitmap_results);
1985 } 1970 }
1986 1971
1987 void HistoryBackend::SetFaviconBitmaps( 1972 void HistoryBackend::SetFaviconBitmaps(favicon_base::FaviconID icon_id,
1988 favicon_base::FaviconID icon_id, 1973 const std::vector<SkBitmap>& bitmaps,
1989 const std::vector<favicon_base::FaviconRawBitmapData>& favicon_bitmap_data, 1974 bool* favicon_bitmaps_changed) {
sky 2014/09/02 17:57:42 This code and call site would be simpler if you re
pkotwicz 2014/09/03 04:15:08 You're right, done!
1990 bool* favicon_bitmaps_changed) {
1991 if (favicon_bitmaps_changed) 1975 if (favicon_bitmaps_changed)
1992 *favicon_bitmaps_changed = false; 1976 *favicon_bitmaps_changed = false;
1993 1977
1994 std::vector<FaviconBitmapIDSize> bitmap_id_sizes; 1978 std::vector<FaviconBitmapIDSize> bitmap_id_sizes;
1995 thumbnail_db_->GetFaviconBitmapIDSizes(icon_id, &bitmap_id_sizes); 1979 thumbnail_db_->GetFaviconBitmapIDSizes(icon_id, &bitmap_id_sizes);
1996 1980
1997 std::vector<favicon_base::FaviconRawBitmapData> to_add = favicon_bitmap_data; 1981 typedef std::pair<scoped_refptr<base::RefCountedBytes>, gfx::Size>
1982 PNGEncodedBitmap;
1983 std::vector<PNGEncodedBitmap> to_add;
1984 for (size_t i = 0; i < bitmaps.size(); ++i) {
1985 scoped_refptr<base::RefCountedBytes> bitmap_data(
1986 new base::RefCountedBytes);
1987 if (!gfx::PNGCodec::EncodeBGRASkBitmap(
1988 bitmaps[i], false, &bitmap_data->data())) {
1989 continue;
1990 }
1991 to_add.push_back(std::make_pair(
1992 bitmap_data, gfx::Size(bitmaps[i].width(), bitmaps[i].height())));
1993 }
1998 1994
1999 for (size_t i = 0; i < bitmap_id_sizes.size(); ++i) { 1995 for (size_t i = 0; i < bitmap_id_sizes.size(); ++i) {
2000 const gfx::Size& pixel_size = bitmap_id_sizes[i].pixel_size; 1996 const gfx::Size& pixel_size = bitmap_id_sizes[i].pixel_size;
2001 std::vector<favicon_base::FaviconRawBitmapData>::iterator match_it = 1997 std::vector<PNGEncodedBitmap>::iterator match_it = to_add.end();
2002 to_add.end(); 1998 for (std::vector<PNGEncodedBitmap>::iterator it = to_add.begin();
2003 for (std::vector<favicon_base::FaviconRawBitmapData>::iterator it =
2004 to_add.begin();
2005 it != to_add.end(); 1999 it != to_add.end();
2006 ++it) { 2000 ++it) {
2007 if (it->pixel_size == pixel_size) { 2001 if (it->second == pixel_size) {
2008 match_it = it; 2002 match_it = it;
2009 break; 2003 break;
2010 } 2004 }
2011 } 2005 }
2012 2006
2013 FaviconBitmapID bitmap_id = bitmap_id_sizes[i].bitmap_id; 2007 FaviconBitmapID bitmap_id = bitmap_id_sizes[i].bitmap_id;
2014 if (match_it == to_add.end()) { 2008 if (match_it == to_add.end()) {
2015 thumbnail_db_->DeleteFaviconBitmap(bitmap_id); 2009 thumbnail_db_->DeleteFaviconBitmap(bitmap_id);
2016 2010
2017 if (favicon_bitmaps_changed) 2011 if (favicon_bitmaps_changed)
2018 *favicon_bitmaps_changed = true; 2012 *favicon_bitmaps_changed = true;
2019 } else { 2013 } else {
2020 if (favicon_bitmaps_changed && 2014 if (favicon_bitmaps_changed &&
2021 !*favicon_bitmaps_changed && 2015 !*favicon_bitmaps_changed &&
2022 IsFaviconBitmapDataEqual(bitmap_id, match_it->bitmap_data)) { 2016 IsFaviconBitmapDataEqual(bitmap_id, match_it->first)) {
2023 thumbnail_db_->SetFaviconBitmapLastUpdateTime( 2017 thumbnail_db_->SetFaviconBitmapLastUpdateTime(
2024 bitmap_id, base::Time::Now()); 2018 bitmap_id, base::Time::Now());
2025 } else { 2019 } else {
2026 thumbnail_db_->SetFaviconBitmap(bitmap_id, match_it->bitmap_data, 2020 thumbnail_db_->SetFaviconBitmap(bitmap_id, match_it->first,
2027 base::Time::Now()); 2021 base::Time::Now());
2028 2022
2029 if (favicon_bitmaps_changed) 2023 if (favicon_bitmaps_changed)
2030 *favicon_bitmaps_changed = true; 2024 *favicon_bitmaps_changed = true;
2031 } 2025 }
2032 to_add.erase(match_it); 2026 to_add.erase(match_it);
2033 } 2027 }
2034 } 2028 }
2035 2029
2036 for (size_t i = 0; i < to_add.size(); ++i) { 2030 for (size_t i = 0; i < to_add.size(); ++i) {
2037 thumbnail_db_->AddFaviconBitmap(icon_id, to_add[i].bitmap_data, 2031 thumbnail_db_->AddFaviconBitmap(icon_id, to_add[i].first,
2038 base::Time::Now(), to_add[i].pixel_size); 2032 base::Time::Now(), to_add[i].second);
2039 2033
2040 if (favicon_bitmaps_changed) 2034 if (favicon_bitmaps_changed)
2041 *favicon_bitmaps_changed = true; 2035 *favicon_bitmaps_changed = true;
2042 } 2036 }
2043 } 2037 }
2044 2038
2045 bool HistoryBackend::ValidateSetFaviconsParams(const std::vector<
2046 favicon_base::FaviconRawBitmapData>& favicon_bitmap_data) const {
2047 typedef std::map<GURL, size_t> BitmapsPerIconURL;
2048 BitmapsPerIconURL num_bitmaps_per_icon_url;
2049 for (size_t i = 0; i < favicon_bitmap_data.size(); ++i) {
2050 if (!favicon_bitmap_data[i].bitmap_data.get())
2051 return false;
2052
2053 const GURL& icon_url = favicon_bitmap_data[i].icon_url;
2054 if (!num_bitmaps_per_icon_url.count(icon_url))
2055 num_bitmaps_per_icon_url[icon_url] = 1u;
2056 else
2057 ++num_bitmaps_per_icon_url[icon_url];
2058 }
2059
2060 if (num_bitmaps_per_icon_url.size() > kMaxFaviconsPerPage)
2061 return false;
2062
2063 for (BitmapsPerIconURL::const_iterator it = num_bitmaps_per_icon_url.begin();
2064 it != num_bitmaps_per_icon_url.end(); ++it) {
2065 if (it->second > kMaxFaviconBitmapsPerIconURL)
2066 return false;
2067 }
2068 return true;
2069 }
2070
2071 bool HistoryBackend::IsFaviconBitmapDataEqual( 2039 bool HistoryBackend::IsFaviconBitmapDataEqual(
2072 FaviconBitmapID bitmap_id, 2040 FaviconBitmapID bitmap_id,
2073 const scoped_refptr<base::RefCountedMemory>& new_bitmap_data) { 2041 const scoped_refptr<base::RefCountedMemory>& new_bitmap_data) {
2074 if (!new_bitmap_data.get()) 2042 if (!new_bitmap_data.get())
2075 return false; 2043 return false;
2076 2044
2077 scoped_refptr<base::RefCountedMemory> original_bitmap_data; 2045 scoped_refptr<base::RefCountedMemory> original_bitmap_data;
2078 thumbnail_db_->GetFaviconBitmap(bitmap_id, 2046 thumbnail_db_->GetFaviconBitmap(bitmap_id,
2079 NULL, 2047 NULL,
2080 &original_bitmap_data, 2048 &original_bitmap_data,
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after
2753 int rank = kPageVisitStatsMaxTopSites; 2721 int rank = kPageVisitStatsMaxTopSites;
2754 std::map<GURL, int>::const_iterator it = most_visited_urls_map_.find(url); 2722 std::map<GURL, int>::const_iterator it = most_visited_urls_map_.find(url);
2755 if (it != most_visited_urls_map_.end()) 2723 if (it != most_visited_urls_map_.end())
2756 rank = (*it).second; 2724 rank = (*it).second;
2757 UMA_HISTOGRAM_ENUMERATION("History.TopSitesVisitsByRank", 2725 UMA_HISTOGRAM_ENUMERATION("History.TopSitesVisitsByRank",
2758 rank, kPageVisitStatsMaxTopSites + 1); 2726 rank, kPageVisitStatsMaxTopSites + 1);
2759 } 2727 }
2760 #endif 2728 #endif
2761 2729
2762 } // namespace history 2730 } // namespace history
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698