15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_service.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include <cmath> 86d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/hash.h" 10b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_backend.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/common/importer/imported_favicon_usage.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/favicon_base/favicon_types.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/favicon_base/favicon_util.h" 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "components/favicon_base/select_favicon_frames.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/codec/png_codec.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/favicon_size.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::Bind; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CancelOrRunFaviconResultsCallback( 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::CancelableTaskTracker::IsCanceledCallback& is_canceled, 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::vector<favicon_base::FaviconRawBitmapResult>& results) { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_canceled.Run()) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(results); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Helper to run callback with empty results if we cannot get the history 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// service. 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId RunWithEmptyResultAsync( 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tracker->PostTask( 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::MessageLoopProxy::current().get(), 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Bind(callback, std::vector<favicon_base::FaviconRawBitmapResult>())); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Return the TaskId to retreive the favicon from chrome specific URL. 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId GetFaviconForChromeURL( 528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Profile* profile, 538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const GURL& page_url, 546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::vector<int>& desired_sizes_in_pixel, 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker::IsCanceledCallback is_canceled_cb; 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker::TaskId id = 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tracker->NewTrackedTaskId(&is_canceled_cb); 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) favicon_base::FaviconResultsCallback cancelable_cb = 618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Bind(&CancelOrRunFaviconResultsCallback, is_canceled_cb, callback); 626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ChromeWebUIControllerFactory::GetInstance()->GetFaviconForURL( 636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile, page_url, desired_sizes_in_pixel, cancelable_cb); 648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return id; 658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Returns a vector of pixel edge sizes from |size_in_dip| and 686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// favicon_base::GetFaviconScales(). 696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::vector<int> GetPixelSizesForFaviconScales(int size_in_dip) { 706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::vector<float> scales = favicon_base::GetFaviconScales(); 716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::vector<int> sizes_in_pixel; 726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) for (size_t i = 0; i < scales.size(); ++i) { 736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) sizes_in_pixel.push_back(std::ceil(size_in_dip * scales[i])); 746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return sizes_in_pixel; 766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 80116680a4aac90f2aa7413d9095a592090648e557Ben MurdochFaviconService::FaviconService(Profile* profile, FaviconClient* favicon_client) 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : history_service_( 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch HistoryServiceFactory::GetForProfile(profile, 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Profile::EXPLICIT_ACCESS)), 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch profile_(profile), 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch favicon_client_(favicon_client) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FaviconService::FaviconResultsCallbackRunner( 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::vector<favicon_base::FaviconRawBitmapResult>* results) { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(*results); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId FaviconService::GetFaviconImage( 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url, 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconImageCallback& callback, 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) favicon_base::FaviconResultsCallback callback_runner = 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FaviconService::RunFaviconImageCallbackWithBitmapResults, 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(this), callback, gfx::kFaviconSize); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> icon_urls; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_urls.push_back(icon_url); 1056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return history_service_->GetFavicons( 1066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) icon_urls, 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch favicon_base::FAVICON, 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetPixelSizesForFaviconScales(gfx::kFaviconSize), 1096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) callback_runner, 1106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) tracker); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return RunWithEmptyResultAsync(callback_runner, tracker); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId FaviconService::GetRawFavicon( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url, 1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch favicon_base::IconType icon_type, 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int desired_size_in_pixel, 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const favicon_base::FaviconRawBitmapCallback& callback, 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) favicon_base::FaviconResultsCallback callback_runner = 122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback, 1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_size_in_pixel); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> icon_urls; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_urls.push_back(icon_url); 1306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::vector<int> desired_sizes_in_pixel; 1316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_sizes_in_pixel.push_back(desired_size_in_pixel); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return history_service_->GetFavicons( 1346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) icon_urls, icon_type, desired_sizes_in_pixel, callback_runner, tracker); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return RunWithEmptyResultAsync(callback_runner, tracker); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId FaviconService::GetFavicon( 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url, 1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch favicon_base::IconType icon_type, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> icon_urls; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_urls.push_back(icon_url); 1486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return history_service_->GetFavicons( 1496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) icon_urls, 1506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) icon_type, 1516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GetPixelSizesForFaviconScales(desired_size_in_dip), 1526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) callback, 1536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) tracker); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return RunWithEmptyResultAsync(callback, tracker); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::CancelableTaskTracker::TaskId FaviconService::GetFaviconImageForPageURL( 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& page_url, 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconImageCallback& callback, 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return GetFaviconForPageURLImpl( 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch page_url, 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch favicon_base::FAVICON, 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetPixelSizesForFaviconScales(gfx::kFaviconSize), 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FaviconService::RunFaviconImageCallbackWithBitmapResults, 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback, 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::kFaviconSize), 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tracker); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::CancelableTaskTracker::TaskId FaviconService::GetRawFaviconForPageURL( 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& page_url, 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int icon_types, 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int desired_size_in_pixel, 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const favicon_base::FaviconRawBitmapCallback& callback, 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 1796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::vector<int> desired_sizes_in_pixel; 1806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_sizes_in_pixel.push_back(desired_size_in_pixel); 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return GetFaviconForPageURLImpl( 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch page_url, 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch icon_types, 1846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_sizes_in_pixel, 185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback, 1886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_size_in_pixel), 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tracker); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::CancelableTaskTracker::TaskId 193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)FaviconService::GetLargestRawFaviconForPageURL( 1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const GURL& page_url, 1958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::vector<int>& icon_types, 1968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int minimum_size_in_pixels, 197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const favicon_base::FaviconRawBitmapCallback& callback, 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) favicon_base::FaviconResultsCallback favicon_results_callback = 200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Unretained(this), 202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback, 2036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 0); 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (page_url.SchemeIs(content::kChromeUIScheme) || 2058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) page_url.SchemeIs(extensions::kExtensionScheme)) { 2066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::vector<int> desired_sizes_in_pixel; 2076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_sizes_in_pixel.push_back(0); 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return GetFaviconForChromeURL(profile_, 2096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) page_url, 2106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_sizes_in_pixel, 2116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) favicon_results_callback, 2126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) tracker); 213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (history_service_) { 2158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return history_service_->GetLargestFaviconForURL(page_url, icon_types, 2168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) minimum_size_in_pixels, callback, tracker); 2178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return RunWithEmptyResultAsync(favicon_results_callback, tracker); 2198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 2208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::CancelableTaskTracker::TaskId FaviconService::GetFaviconForPageURL( 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& page_url, 223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int icon_types, 224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int desired_size_in_dip, 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return GetFaviconForPageURLImpl( 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch page_url, 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch icon_types, 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetPixelSizesForFaviconScales(desired_size_in_dip), 2316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) callback, 2326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) tracker); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::CancelableTaskTracker::TaskId 236116680a4aac90f2aa7413d9095a592090648e557Ben MurdochFaviconService::UpdateFaviconMappingsAndFetch( 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& page_url, 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::vector<GURL>& icon_urls, 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int icon_types, 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int desired_size_in_dip, 241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const favicon_base::FaviconResultsCallback& callback, 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker* tracker) { 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (history_service_) { 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return history_service_->UpdateFaviconMappingsAndFetch( 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch page_url, 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch icon_urls, 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch icon_types, 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetPixelSizesForFaviconScales(desired_size_in_dip), 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback, 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tracker); 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return RunWithEmptyResultAsync(callback, tracker); 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId FaviconService::GetLargestRawFaviconForID( 2560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch favicon_base::FaviconID favicon_id, 257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const favicon_base::FaviconRawBitmapCallback& callback, 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 2596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Use 0 as |desired_size| to get the largest bitmap for |favicon_id| without 2606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // any resizing. 2616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int desired_size = 0; 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) favicon_base::FaviconResultsCallback callback_runner = 263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), 265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback, 2666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_size); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) { 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return history_service_->GetFaviconForID( 2706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) favicon_id, desired_size, callback_runner, tracker); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return RunWithEmptyResultAsync(callback_runner, tracker); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FaviconService::SetFaviconOutOfDateForPage(const GURL& page_url) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service_->SetFaviconsOutOfDateForPage(page_url); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FaviconService::CloneFavicon(const GURL& old_page_url, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_page_url) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service_->CloneFavicons(old_page_url, new_page_url); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void FaviconService::SetImportedFavicons( 2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::vector<ImportedFaviconUsage>& favicon_usage) { 2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (history_service_) 2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) history_service_->SetImportedFavicons(favicon_usage); 2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FaviconService::MergeFavicon( 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& icon_url, 2950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch favicon_base::IconType icon_type, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> bitmap_data, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& pixel_size) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) { 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history_service_->MergeFavicon(page_url, icon_url, icon_type, bitmap_data, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixel_size); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void FaviconService::SetFavicons(const GURL& page_url, 30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const GURL& icon_url, 3060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch favicon_base::IconType icon_type, 30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gfx::Image& image) { 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!history_service_) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia image_skia = image.AsImageSkia(); 31268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) image_skia.EnsureRepsForSupportedScales(); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::ImageSkiaRep>& image_reps = image_skia.image_reps(); 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<SkBitmap> bitmaps; 315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::vector<float> favicon_scales = favicon_base::GetFaviconScales(); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < image_reps.size(); ++i) { 3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Don't save if the scale isn't one of supported favicon scales. 318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (std::find(favicon_scales.begin(), 319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch favicon_scales.end(), 320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch image_reps[i].scale()) == favicon_scales.end()) { 321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch continue; 322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bitmaps.push_back(image_reps[i].sk_bitmap()); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci history_service_->SetFavicons(page_url, icon_type, icon_url, bitmaps); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void FaviconService::UnableToDownloadFavicon(const GURL& icon_url) { 32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MissingFaviconURLHash url_hash = base::Hash(icon_url.spec()); 33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) missing_favicon_urls_.insert(url_hash); 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool FaviconService::WasUnableToDownloadFavicon(const GURL& icon_url) const { 33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MissingFaviconURLHash url_hash = base::Hash(icon_url.spec()); 33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return missing_favicon_urls_.find(url_hash) != missing_favicon_urls_.end(); 33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void FaviconService::ClearUnableToDownloadFavicons() { 33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) missing_favicon_urls_.clear(); 34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FaviconService::~FaviconService() {} 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::CancelableTaskTracker::TaskId FaviconService::GetFaviconForPageURLImpl( 345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& page_url, 346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int icon_types, 3476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::vector<int>& desired_sizes_in_pixel, 348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (page_url.SchemeIs(content::kChromeUIScheme) || 351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch page_url.SchemeIs(extensions::kExtensionScheme)) { 3526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return GetFaviconForChromeURL( 353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch profile_, page_url, desired_sizes_in_pixel, callback, tracker); 354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (history_service_) { 356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return history_service_->GetFaviconsForURL(page_url, 357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch icon_types, 3586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_sizes_in_pixel, 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback, 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tracker); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return RunWithEmptyResultAsync(callback, tracker); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FaviconService::RunFaviconImageCallbackWithBitmapResults( 366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconImageCallback& callback, 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::vector<favicon_base::FaviconRawBitmapResult>& 3690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch favicon_bitmap_results) { 3700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch favicon_base::FaviconImageResult image_result; 371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) image_result.image = favicon_base::SelectFaviconFramesFromPNGs( 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap_results, 3736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) favicon_base::GetFaviconScales(), 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_size_in_dip); 375f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) favicon_base::SetFaviconColorSpace(&image_result.image); 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_result.icon_url = image_result.image.IsEmpty() ? 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL() : favicon_bitmap_results[0].icon_url; 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(image_result); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 382f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults( 383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const favicon_base::FaviconRawBitmapCallback& callback, 3846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int desired_size_in_pixel, 385f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::vector<favicon_base::FaviconRawBitmapResult>& 3860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch favicon_bitmap_results) { 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (favicon_bitmap_results.empty() || !favicon_bitmap_results[0].is_valid()) { 388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback.Run(favicon_base::FaviconRawBitmapResult()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 392f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) favicon_base::FaviconRawBitmapResult bitmap_result = 393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) favicon_bitmap_results[0]; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the desired size is 0, SelectFaviconFrames() will return the largest 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bitmap without doing any resizing. As |favicon_bitmap_results| has bitmap 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data for a single bitmap, return it and avoid an unnecessary decode. 3986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (desired_size_in_pixel == 0) { 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(bitmap_result); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If history bitmap is already desired pixel size, return early. 4046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (bitmap_result.pixel_size.width() == desired_size_in_pixel && 4056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bitmap_result.pixel_size.height() == desired_size_in_pixel) { 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(bitmap_result); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert raw bytes to SkBitmap, resize via SelectFaviconFrames(), then 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // convert back. 4126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::vector<float> desired_favicon_scales; 4136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_favicon_scales.push_back(1.0f); 414f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) gfx::Image resized_image = favicon_base::SelectFaviconFramesFromPNGs( 4156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) favicon_bitmap_results, desired_favicon_scales, desired_size_in_pixel); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> resized_bitmap_data; 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gfx::PNGCodec::EncodeBGRASkBitmap(resized_image.AsBitmap(), false, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &resized_bitmap_data)) { 420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback.Run(favicon_base::FaviconRawBitmapResult()); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_result.bitmap_data = base::RefCountedBytes::TakeVector( 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &resized_bitmap_data); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(bitmap_result); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 428