favicon_service.cc revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
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) 790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/hash.h" 8b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_backend.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/select_favicon_frames.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" 159ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/common/favicon/favicon_types.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/imported_favicon_usage.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/codec/png_codec.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/favicon_size.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::Bind; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CancelOrRunFaviconResultsCallback( 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CancelableTaskTracker::IsCanceledCallback& is_canceled, 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconService::FaviconResultsCallback& callback, 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::vector<chrome::FaviconBitmapResult>& results) { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_canceled.Run()) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(results); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Helper to run callback with empty results if we cannot get the history 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// service. 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelableTaskTracker::TaskId RunWithEmptyResultAsync( 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconService::FaviconResultsCallback& callback, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker* tracker) { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tracker->PostTask( 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::MessageLoopProxy::current().get(), 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Bind(callback, std::vector<chrome::FaviconBitmapResult>())); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Return the TaskId to retreive the favicon from chrome specific URL. 498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)CancelableTaskTracker::TaskId GetFaviconForChromeURL( 508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Profile* profile, 518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const GURL& page_url, 528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::vector<ui::ScaleFactor>& desired_scale_factors, 538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const FaviconService::FaviconResultsCallback& callback, 548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CancelableTaskTracker* tracker) { 558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CancelableTaskTracker::IsCanceledCallback is_canceled_cb; 568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CancelableTaskTracker::TaskId id = tracker->NewTrackedTaskId(&is_canceled_cb); 578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FaviconService::FaviconResultsCallback cancelable_cb = 588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Bind(&CancelOrRunFaviconResultsCallback, is_canceled_cb, callback); 598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ChromeWebUIControllerFactory::GetInstance()->GetFaviconForURL(profile, 608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) page_url, desired_scale_factors, cancelable_cb); 618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return id; 628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FaviconService::FaviconService(HistoryService* history_service) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : history_service_(history_service) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FaviconService::FaviconResultsCallbackRunner( 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconResultsCallback& callback, 7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::vector<chrome::FaviconBitmapResult>* results) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(*results); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelableTaskTracker::TaskId FaviconService::GetFaviconImage( 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url, 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconImageCallback& callback, 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker* tracker) { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FaviconResultsCallback callback_runner = 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FaviconService::RunFaviconImageCallbackWithBitmapResults, 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), callback, desired_size_in_dip); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> icon_urls; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_urls.push_back(icon_url); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return history_service_->GetFavicons( 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_urls, icon_type, desired_size_in_dip, 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FaviconUtil::GetFaviconScaleFactors(), callback_runner, tracker); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RunWithEmptyResultAsync(callback_runner, tracker); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelableTaskTracker::TaskId FaviconService::GetRawFavicon( 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url, 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ScaleFactor desired_scale_factor, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconRawCallback& callback, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker* tracker) { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FaviconResultsCallback callback_runner = 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FaviconService::RunFaviconRawCallbackWithBitmapResults, 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback, desired_size_in_dip, desired_scale_factor); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> icon_urls; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_urls.push_back(icon_url); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ui::ScaleFactor> desired_scale_factors; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_scale_factors.push_back(desired_scale_factor); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return history_service_->GetFavicons( 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_urls, icon_type, desired_size_in_dip, desired_scale_factors, 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_runner, tracker); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RunWithEmptyResultAsync(callback_runner, tracker); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelableTaskTracker::TaskId FaviconService::GetFavicon( 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url, 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconResultsCallback& callback, 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker* tracker) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> icon_urls; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_urls.push_back(icon_url); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return history_service_->GetFavicons( 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_urls, icon_type, desired_size_in_dip, 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FaviconUtil::GetFaviconScaleFactors(), callback, tracker); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RunWithEmptyResultAsync(callback, tracker); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelableTaskTracker::TaskId FaviconService::UpdateFaviconMappingsAndFetch( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<GURL>& icon_urls, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int icon_types, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconResultsCallback& callback, 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker* tracker) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) { 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return history_service_->UpdateFaviconMappingsAndFetch( 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_url, icon_urls, icon_types, desired_size_in_dip, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FaviconUtil::GetFaviconScaleFactors(), callback, tracker); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RunWithEmptyResultAsync(callback, tracker); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelableTaskTracker::TaskId FaviconService::GetFaviconImageForURL( 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconForURLParams& params, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconImageCallback& callback, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker* tracker) { 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetFaviconForURLImpl( 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FaviconUtil::GetFaviconScaleFactors(), 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FaviconService::RunFaviconImageCallbackWithBitmapResults, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.desired_size_in_dip), 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tracker); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelableTaskTracker::TaskId FaviconService::GetRawFaviconForURL( 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconForURLParams& params, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ScaleFactor desired_scale_factor, 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconRawCallback& callback, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker* tracker) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ui::ScaleFactor> desired_scale_factors; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_scale_factors.push_back(desired_scale_factor); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetFaviconForURLImpl( 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params, 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) desired_scale_factors, 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FaviconService::RunFaviconRawCallbackWithBitmapResults, 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.desired_size_in_dip, 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) desired_scale_factor), 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tracker); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)CancelableTaskTracker::TaskId FaviconService::GetLargestRawFaviconForURL( 1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Profile* profile, 1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const GURL& page_url, 1918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::vector<int>& icon_types, 1928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int minimum_size_in_pixels, 1938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const FaviconRawCallback& callback, 1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CancelableTaskTracker* tracker) { 1958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FaviconResultsCallback favicon_results_callback = 1968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Bind(&FaviconService::RunFaviconRawCallbackWithBitmapResults, 1978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::Unretained(this), callback, 0, ui::ScaleFactor()); 1988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (page_url.SchemeIs(chrome::kChromeUIScheme) || 1998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) page_url.SchemeIs(extensions::kExtensionScheme)) { 2008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<ui::ScaleFactor> scale_factor; 2018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scale_factor.push_back(ui::SCALE_FACTOR_100P); 2028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return GetFaviconForChromeURL(profile, page_url, scale_factor, 2038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) favicon_results_callback, tracker); 2048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } else if (history_service_) { 2058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return history_service_->GetLargestFaviconForURL(page_url, icon_types, 2068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) minimum_size_in_pixels, callback, tracker); 2078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return RunWithEmptyResultAsync(favicon_results_callback, tracker); 2098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 2108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelableTaskTracker::TaskId FaviconService::GetFaviconForURL( 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconForURLParams& params, 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconResultsCallback& callback, 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker* tracker) { 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetFaviconForURLImpl(params, 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FaviconUtil::GetFaviconScaleFactors(), 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback, 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tracker); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelableTaskTracker::TaskId FaviconService::GetLargestRawFaviconForID( 22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID favicon_id, 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconRawCallback& callback, 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker* tracker) { 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use 0 as |desired_size_in_dip| to get the largest bitmap for |favicon_id| 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // without any resizing. 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int desired_size_in_dip = 0; 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScaleFactor desired_scale_factor = ui::SCALE_FACTOR_100P; 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FaviconResultsCallback callback_runner = 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FaviconService::RunFaviconRawCallbackWithBitmapResults, 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback, desired_size_in_dip, desired_scale_factor); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) { 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return history_service_->GetFaviconForID( 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) favicon_id, desired_size_in_dip, desired_scale_factor, 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_runner, tracker); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RunWithEmptyResultAsync(callback_runner, tracker); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FaviconService::SetFaviconOutOfDateForPage(const GURL& page_url) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service_->SetFaviconsOutOfDateForPage(page_url); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FaviconService::CloneFavicon(const GURL& old_page_url, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_page_url) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service_->CloneFavicons(old_page_url, new_page_url); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FaviconService::SetImportedFavicons( 255a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::vector<ImportedFaviconUsage>& favicon_usage) { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service_->SetImportedFavicons(favicon_usage); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FaviconService::MergeFavicon( 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& icon_url, 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> bitmap_data, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& pixel_size) { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_service_) { 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history_service_->MergeFavicon(page_url, icon_url, icon_type, bitmap_data, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixel_size); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void FaviconService::SetFavicons(const GURL& page_url, 27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const GURL& icon_url, 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type, 27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gfx::Image& image) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!history_service_) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia image_skia = image.AsImageSkia(); 28068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) image_skia.EnsureRepsForSupportedScales(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::ImageSkiaRep>& image_reps = image_skia.image_reps(); 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < image_reps.size(); ++i) { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> bitmap_data( 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes()); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gfx::PNGCodec::EncodeBGRASkBitmap(image_reps[i].sk_bitmap(), 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &bitmap_data->data())) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size pixel_size(image_reps[i].pixel_width(), 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_reps[i].pixel_height()); 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconBitmapData bitmap_data_element; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data_element.bitmap_data = bitmap_data; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data_element.pixel_size = pixel_size; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data_element.icon_url = icon_url; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap_data.push_back(bitmap_data_element); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history_service_->SetFavicons(page_url, icon_type, favicon_bitmap_data); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void FaviconService::UnableToDownloadFavicon(const GURL& icon_url) { 30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MissingFaviconURLHash url_hash = base::Hash(icon_url.spec()); 30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) missing_favicon_urls_.insert(url_hash); 30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool FaviconService::WasUnableToDownloadFavicon(const GURL& icon_url) const { 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MissingFaviconURLHash url_hash = base::Hash(icon_url.spec()); 31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return missing_favicon_urls_.find(url_hash) != missing_favicon_urls_.end(); 31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void FaviconService::ClearUnableToDownloadFavicons() { 31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) missing_favicon_urls_.clear(); 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FaviconService::~FaviconService() {} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelableTaskTracker::TaskId FaviconService::GetFaviconForURLImpl( 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconForURLParams& params, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ui::ScaleFactor>& desired_scale_factors, 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconResultsCallback& callback, 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker* tracker) { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.page_url.SchemeIs(chrome::kChromeUIScheme) || 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.page_url.SchemeIs(extensions::kExtensionScheme)) { 3268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return GetFaviconForChromeURL(params.profile, params.page_url, 3278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) desired_scale_factors, callback, tracker); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (history_service_) { 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return history_service_->GetFaviconsForURL(params.page_url, 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.icon_types, 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.desired_size_in_dip, 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) desired_scale_factors, 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback, 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tracker); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return RunWithEmptyResultAsync(callback, tracker); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FaviconService::RunFaviconImageCallbackWithBitmapResults( 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconImageCallback& callback, 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::vector<chrome::FaviconBitmapResult>& favicon_bitmap_results) { 34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconImageResult image_result; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_result.image = FaviconUtil::SelectFaviconFramesFromPNGs( 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap_results, 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FaviconUtil::GetFaviconScaleFactors(), 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_size_in_dip); 348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FaviconUtil::SetFaviconColorSpace(&image_result.image); 349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_result.icon_url = image_result.image.IsEmpty() ? 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL() : favicon_bitmap_results[0].icon_url; 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(image_result); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FaviconService::RunFaviconRawCallbackWithBitmapResults( 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconRawCallback& callback, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ScaleFactor desired_scale_factor, 35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::vector<chrome::FaviconBitmapResult>& favicon_bitmap_results) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (favicon_bitmap_results.empty() || !favicon_bitmap_results[0].is_valid()) { 36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callback.Run(chrome::FaviconBitmapResult()); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(1u, favicon_bitmap_results.size()); 36690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconBitmapResult bitmap_result = favicon_bitmap_results[0]; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the desired size is 0, SelectFaviconFrames() will return the largest 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bitmap without doing any resizing. As |favicon_bitmap_results| has bitmap 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data for a single bitmap, return it and avoid an unnecessary decode. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (desired_size_in_dip == 0) { 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(bitmap_result); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If history bitmap is already desired pixel size, return early. 37768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) float desired_scale = ui::GetImageScale(desired_scale_factor); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_edge_width_in_pixel = static_cast<int>( 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_size_in_dip * desired_scale + 0.5f); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size desired_size_in_pixel(desired_edge_width_in_pixel, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_edge_width_in_pixel); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bitmap_result.pixel_size == desired_size_in_pixel) { 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(bitmap_result); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert raw bytes to SkBitmap, resize via SelectFaviconFrames(), then 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // convert back. 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ui::ScaleFactor> desired_scale_factors; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_scale_factors.push_back(desired_scale_factor); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Image resized_image = FaviconUtil::SelectFaviconFramesFromPNGs( 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) favicon_bitmap_results, desired_scale_factors, desired_size_in_dip); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> resized_bitmap_data; 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gfx::PNGCodec::EncodeBGRASkBitmap(resized_image.AsBitmap(), false, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &resized_bitmap_data)) { 39790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callback.Run(chrome::FaviconBitmapResult()); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_result.bitmap_data = base::RefCountedBytes::TakeVector( 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &resized_bitmap_data); 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(bitmap_result); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405