| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/favicon/favicon_service.h" | 5 #include "chrome/browser/favicon/favicon_service.h" |
| 6 | 6 |
| 7 #include "base/hash.h" | 7 #include "base/hash.h" |
| 8 #include "base/message_loop/message_loop_proxy.h" | 8 #include "base/message_loop/message_loop_proxy.h" |
| 9 #include "chrome/browser/favicon/favicon_util.h" | 9 #include "chrome/browser/favicon/favicon_util.h" |
| 10 #include "chrome/browser/history/history_backend.h" | 10 #include "chrome/browser/history/history_backend.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "ui/gfx/favicon_size.h" | 21 #include "ui/gfx/favicon_size.h" |
| 22 #include "ui/gfx/image/image_skia.h" | 22 #include "ui/gfx/image/image_skia.h" |
| 23 | 23 |
| 24 using base::Bind; | 24 using base::Bind; |
| 25 | 25 |
| 26 namespace { | 26 namespace { |
| 27 | 27 |
| 28 void CancelOrRunFaviconResultsCallback( | 28 void CancelOrRunFaviconResultsCallback( |
| 29 const base::CancelableTaskTracker::IsCanceledCallback& is_canceled, | 29 const base::CancelableTaskTracker::IsCanceledCallback& is_canceled, |
| 30 const favicon_base::FaviconResultsCallback& callback, | 30 const favicon_base::FaviconResultsCallback& callback, |
| 31 const std::vector<favicon_base::FaviconBitmapResult>& results) { | 31 const std::vector<favicon_base::FaviconRawBitmapResult>& results) { |
| 32 if (is_canceled.Run()) | 32 if (is_canceled.Run()) |
| 33 return; | 33 return; |
| 34 callback.Run(results); | 34 callback.Run(results); |
| 35 } | 35 } |
| 36 | 36 |
| 37 // Helper to run callback with empty results if we cannot get the history | 37 // Helper to run callback with empty results if we cannot get the history |
| 38 // service. | 38 // service. |
| 39 base::CancelableTaskTracker::TaskId RunWithEmptyResultAsync( | 39 base::CancelableTaskTracker::TaskId RunWithEmptyResultAsync( |
| 40 const favicon_base::FaviconResultsCallback& callback, | 40 const favicon_base::FaviconResultsCallback& callback, |
| 41 base::CancelableTaskTracker* tracker) { | 41 base::CancelableTaskTracker* tracker) { |
| 42 return tracker->PostTask( | 42 return tracker->PostTask( |
| 43 base::MessageLoopProxy::current().get(), | 43 base::MessageLoopProxy::current().get(), |
| 44 FROM_HERE, | 44 FROM_HERE, |
| 45 Bind(callback, std::vector<favicon_base::FaviconBitmapResult>())); | 45 Bind(callback, std::vector<favicon_base::FaviconRawBitmapResult>())); |
| 46 } | 46 } |
| 47 | 47 |
| 48 // Return the TaskId to retreive the favicon from chrome specific URL. | 48 // Return the TaskId to retreive the favicon from chrome specific URL. |
| 49 base::CancelableTaskTracker::TaskId GetFaviconForChromeURL( | 49 base::CancelableTaskTracker::TaskId GetFaviconForChromeURL( |
| 50 Profile* profile, | 50 Profile* profile, |
| 51 const GURL& page_url, | 51 const GURL& page_url, |
| 52 const std::vector<ui::ScaleFactor>& desired_scale_factors, | 52 const std::vector<ui::ScaleFactor>& desired_scale_factors, |
| 53 const favicon_base::FaviconResultsCallback& callback, | 53 const favicon_base::FaviconResultsCallback& callback, |
| 54 base::CancelableTaskTracker* tracker) { | 54 base::CancelableTaskTracker* tracker) { |
| 55 base::CancelableTaskTracker::IsCanceledCallback is_canceled_cb; | 55 base::CancelableTaskTracker::IsCanceledCallback is_canceled_cb; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 66 | 66 |
| 67 FaviconService::FaviconService(Profile* profile) | 67 FaviconService::FaviconService(Profile* profile) |
| 68 : history_service_(HistoryServiceFactory::GetForProfile( | 68 : history_service_(HistoryServiceFactory::GetForProfile( |
| 69 profile, Profile::EXPLICIT_ACCESS)), | 69 profile, Profile::EXPLICIT_ACCESS)), |
| 70 profile_(profile) { | 70 profile_(profile) { |
| 71 } | 71 } |
| 72 | 72 |
| 73 // static | 73 // static |
| 74 void FaviconService::FaviconResultsCallbackRunner( | 74 void FaviconService::FaviconResultsCallbackRunner( |
| 75 const favicon_base::FaviconResultsCallback& callback, | 75 const favicon_base::FaviconResultsCallback& callback, |
| 76 const std::vector<favicon_base::FaviconBitmapResult>* results) { | 76 const std::vector<favicon_base::FaviconRawBitmapResult>* results) { |
| 77 callback.Run(*results); | 77 callback.Run(*results); |
| 78 } | 78 } |
| 79 | 79 |
| 80 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconImage( | 80 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconImage( |
| 81 const GURL& icon_url, | 81 const GURL& icon_url, |
| 82 favicon_base::IconType icon_type, | 82 favicon_base::IconType icon_type, |
| 83 int desired_size_in_dip, | 83 int desired_size_in_dip, |
| 84 const favicon_base::FaviconImageCallback& callback, | 84 const favicon_base::FaviconImageCallback& callback, |
| 85 base::CancelableTaskTracker* tracker) { | 85 base::CancelableTaskTracker* tracker) { |
| 86 favicon_base::FaviconResultsCallback callback_runner = | 86 favicon_base::FaviconResultsCallback callback_runner = |
| 87 Bind(&FaviconService::RunFaviconImageCallbackWithBitmapResults, | 87 Bind(&FaviconService::RunFaviconImageCallbackWithBitmapResults, |
| 88 base::Unretained(this), callback, desired_size_in_dip); | 88 base::Unretained(this), callback, desired_size_in_dip); |
| 89 if (history_service_) { | 89 if (history_service_) { |
| 90 std::vector<GURL> icon_urls; | 90 std::vector<GURL> icon_urls; |
| 91 icon_urls.push_back(icon_url); | 91 icon_urls.push_back(icon_url); |
| 92 return history_service_->GetFavicons( | 92 return history_service_->GetFavicons( |
| 93 icon_urls, icon_type, desired_size_in_dip, | 93 icon_urls, icon_type, desired_size_in_dip, |
| 94 FaviconUtil::GetFaviconScaleFactors(), callback_runner, tracker); | 94 FaviconUtil::GetFaviconScaleFactors(), callback_runner, tracker); |
| 95 } | 95 } |
| 96 return RunWithEmptyResultAsync(callback_runner, tracker); | 96 return RunWithEmptyResultAsync(callback_runner, tracker); |
| 97 } | 97 } |
| 98 | 98 |
| 99 base::CancelableTaskTracker::TaskId FaviconService::GetRawFavicon( | 99 base::CancelableTaskTracker::TaskId FaviconService::GetRawFavicon( |
| 100 const GURL& icon_url, | 100 const GURL& icon_url, |
| 101 favicon_base::IconType icon_type, | 101 favicon_base::IconType icon_type, |
| 102 int desired_size_in_dip, | 102 int desired_size_in_dip, |
| 103 ui::ScaleFactor desired_scale_factor, | 103 ui::ScaleFactor desired_scale_factor, |
| 104 const favicon_base::FaviconRawCallback& callback, | 104 const favicon_base::FaviconRawBitmapCallback& callback, |
| 105 base::CancelableTaskTracker* tracker) { | 105 base::CancelableTaskTracker* tracker) { |
| 106 favicon_base::FaviconResultsCallback callback_runner = | 106 favicon_base::FaviconResultsCallback callback_runner = |
| 107 Bind(&FaviconService::RunFaviconRawCallbackWithBitmapResults, | 107 Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, |
| 108 base::Unretained(this), | 108 base::Unretained(this), |
| 109 callback, desired_size_in_dip, desired_scale_factor); | 109 callback, |
| 110 desired_size_in_dip, |
| 111 desired_scale_factor); |
| 110 | 112 |
| 111 if (history_service_) { | 113 if (history_service_) { |
| 112 std::vector<GURL> icon_urls; | 114 std::vector<GURL> icon_urls; |
| 113 icon_urls.push_back(icon_url); | 115 icon_urls.push_back(icon_url); |
| 114 std::vector<ui::ScaleFactor> desired_scale_factors; | 116 std::vector<ui::ScaleFactor> desired_scale_factors; |
| 115 desired_scale_factors.push_back(desired_scale_factor); | 117 desired_scale_factors.push_back(desired_scale_factor); |
| 116 | 118 |
| 117 return history_service_->GetFavicons( | 119 return history_service_->GetFavicons( |
| 118 icon_urls, icon_type, desired_size_in_dip, desired_scale_factors, | 120 icon_urls, icon_type, desired_size_in_dip, desired_scale_factors, |
| 119 callback_runner, tracker); | 121 callback_runner, tracker); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 146 const favicon_base::FaviconResultsCallback& callback, | 148 const favicon_base::FaviconResultsCallback& callback, |
| 147 base::CancelableTaskTracker* tracker) { | 149 base::CancelableTaskTracker* tracker) { |
| 148 if (history_service_) { | 150 if (history_service_) { |
| 149 return history_service_->UpdateFaviconMappingsAndFetch( | 151 return history_service_->UpdateFaviconMappingsAndFetch( |
| 150 page_url, icon_urls, icon_types, desired_size_in_dip, | 152 page_url, icon_urls, icon_types, desired_size_in_dip, |
| 151 FaviconUtil::GetFaviconScaleFactors(), callback, tracker); | 153 FaviconUtil::GetFaviconScaleFactors(), callback, tracker); |
| 152 } | 154 } |
| 153 return RunWithEmptyResultAsync(callback, tracker); | 155 return RunWithEmptyResultAsync(callback, tracker); |
| 154 } | 156 } |
| 155 | 157 |
| 156 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconImageForURL( | 158 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconImageForPageURL( |
| 157 const FaviconForURLParams& params, | 159 const FaviconForPageURLParams& params, |
| 158 const favicon_base::FaviconImageCallback& callback, | 160 const favicon_base::FaviconImageCallback& callback, |
| 159 base::CancelableTaskTracker* tracker) { | 161 base::CancelableTaskTracker* tracker) { |
| 160 return GetFaviconForURLImpl( | 162 return GetFaviconForPageURLImpl( |
| 161 params, | 163 params, |
| 162 FaviconUtil::GetFaviconScaleFactors(), | 164 FaviconUtil::GetFaviconScaleFactors(), |
| 163 Bind(&FaviconService::RunFaviconImageCallbackWithBitmapResults, | 165 Bind(&FaviconService::RunFaviconImageCallbackWithBitmapResults, |
| 164 base::Unretained(this), | 166 base::Unretained(this), |
| 165 callback, | 167 callback, |
| 166 params.desired_size_in_dip), | 168 params.desired_size_in_dip), |
| 167 tracker); | 169 tracker); |
| 168 } | 170 } |
| 169 | 171 |
| 170 base::CancelableTaskTracker::TaskId FaviconService::GetRawFaviconForURL( | 172 base::CancelableTaskTracker::TaskId FaviconService::GetRawFaviconForPageURL( |
| 171 const FaviconForURLParams& params, | 173 const FaviconForPageURLParams& params, |
| 172 ui::ScaleFactor desired_scale_factor, | 174 ui::ScaleFactor desired_scale_factor, |
| 173 const favicon_base::FaviconRawCallback& callback, | 175 const favicon_base::FaviconRawBitmapCallback& callback, |
| 174 base::CancelableTaskTracker* tracker) { | 176 base::CancelableTaskTracker* tracker) { |
| 175 std::vector<ui::ScaleFactor> desired_scale_factors; | 177 std::vector<ui::ScaleFactor> desired_scale_factors; |
| 176 desired_scale_factors.push_back(desired_scale_factor); | 178 desired_scale_factors.push_back(desired_scale_factor); |
| 177 return GetFaviconForURLImpl( | 179 return GetFaviconForPageURLImpl( |
| 178 params, | 180 params, |
| 179 desired_scale_factors, | 181 desired_scale_factors, |
| 180 Bind(&FaviconService::RunFaviconRawCallbackWithBitmapResults, | 182 Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, |
| 181 base::Unretained(this), | 183 base::Unretained(this), |
| 182 callback, | 184 callback, |
| 183 params.desired_size_in_dip, | 185 params.desired_size_in_dip, |
| 184 desired_scale_factor), | 186 desired_scale_factor), |
| 185 tracker); | 187 tracker); |
| 186 } | 188 } |
| 187 | 189 |
| 188 base::CancelableTaskTracker::TaskId FaviconService::GetLargestRawFaviconForURL( | 190 base::CancelableTaskTracker::TaskId |
| 191 FaviconService::GetLargestRawFaviconForPageURL( |
| 189 Profile* profile, | 192 Profile* profile, |
| 190 const GURL& page_url, | 193 const GURL& page_url, |
| 191 const std::vector<int>& icon_types, | 194 const std::vector<int>& icon_types, |
| 192 int minimum_size_in_pixels, | 195 int minimum_size_in_pixels, |
| 193 const favicon_base::FaviconRawCallback& callback, | 196 const favicon_base::FaviconRawBitmapCallback& callback, |
| 194 base::CancelableTaskTracker* tracker) { | 197 base::CancelableTaskTracker* tracker) { |
| 195 favicon_base::FaviconResultsCallback favicon_results_callback = | 198 favicon_base::FaviconResultsCallback favicon_results_callback = |
| 196 Bind(&FaviconService::RunFaviconRawCallbackWithBitmapResults, | 199 Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, |
| 197 base::Unretained(this), callback, 0, ui::ScaleFactor()); | 200 base::Unretained(this), |
| 201 callback, |
| 202 0, |
| 203 ui::ScaleFactor()); |
| 198 if (page_url.SchemeIs(content::kChromeUIScheme) || | 204 if (page_url.SchemeIs(content::kChromeUIScheme) || |
| 199 page_url.SchemeIs(extensions::kExtensionScheme)) { | 205 page_url.SchemeIs(extensions::kExtensionScheme)) { |
| 200 std::vector<ui::ScaleFactor> scale_factor; | 206 std::vector<ui::ScaleFactor> scale_factor; |
| 201 scale_factor.push_back(ui::SCALE_FACTOR_100P); | 207 scale_factor.push_back(ui::SCALE_FACTOR_100P); |
| 202 return GetFaviconForChromeURL(profile, page_url, scale_factor, | 208 return GetFaviconForChromeURL(profile, page_url, scale_factor, |
| 203 favicon_results_callback, tracker); | 209 favicon_results_callback, tracker); |
| 204 } | 210 } |
| 205 if (history_service_) { | 211 if (history_service_) { |
| 206 return history_service_->GetLargestFaviconForURL(page_url, icon_types, | 212 return history_service_->GetLargestFaviconForURL(page_url, icon_types, |
| 207 minimum_size_in_pixels, callback, tracker); | 213 minimum_size_in_pixels, callback, tracker); |
| 208 } | 214 } |
| 209 return RunWithEmptyResultAsync(favicon_results_callback, tracker); | 215 return RunWithEmptyResultAsync(favicon_results_callback, tracker); |
| 210 } | 216 } |
| 211 | 217 |
| 212 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconForURL( | 218 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconForPageURL( |
| 213 const FaviconForURLParams& params, | 219 const FaviconForPageURLParams& params, |
| 214 const favicon_base::FaviconResultsCallback& callback, | 220 const favicon_base::FaviconResultsCallback& callback, |
| 215 base::CancelableTaskTracker* tracker) { | 221 base::CancelableTaskTracker* tracker) { |
| 216 return GetFaviconForURLImpl(params, | 222 return GetFaviconForPageURLImpl( |
| 217 FaviconUtil::GetFaviconScaleFactors(), | 223 params, FaviconUtil::GetFaviconScaleFactors(), callback, tracker); |
| 218 callback, | |
| 219 tracker); | |
| 220 } | 224 } |
| 221 | 225 |
| 222 base::CancelableTaskTracker::TaskId FaviconService::GetLargestRawFaviconForID( | 226 base::CancelableTaskTracker::TaskId FaviconService::GetLargestRawFaviconForID( |
| 223 favicon_base::FaviconID favicon_id, | 227 favicon_base::FaviconID favicon_id, |
| 224 const favicon_base::FaviconRawCallback& callback, | 228 const favicon_base::FaviconRawBitmapCallback& callback, |
| 225 base::CancelableTaskTracker* tracker) { | 229 base::CancelableTaskTracker* tracker) { |
| 226 // Use 0 as |desired_size_in_dip| to get the largest bitmap for |favicon_id| | 230 // Use 0 as |desired_size_in_dip| to get the largest bitmap for |favicon_id| |
| 227 // without any resizing. | 231 // without any resizing. |
| 228 int desired_size_in_dip = 0; | 232 int desired_size_in_dip = 0; |
| 229 ui::ScaleFactor desired_scale_factor = ui::SCALE_FACTOR_100P; | 233 ui::ScaleFactor desired_scale_factor = ui::SCALE_FACTOR_100P; |
| 230 favicon_base::FaviconResultsCallback callback_runner = | 234 favicon_base::FaviconResultsCallback callback_runner = |
| 231 Bind(&FaviconService::RunFaviconRawCallbackWithBitmapResults, | 235 Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, |
| 232 base::Unretained(this), | 236 base::Unretained(this), |
| 233 callback, desired_size_in_dip, desired_scale_factor); | 237 callback, |
| 238 desired_size_in_dip, |
| 239 desired_scale_factor); |
| 234 | 240 |
| 235 if (history_service_) { | 241 if (history_service_) { |
| 236 return history_service_->GetFaviconForID( | 242 return history_service_->GetFaviconForID( |
| 237 favicon_id, desired_size_in_dip, desired_scale_factor, | 243 favicon_id, desired_size_in_dip, desired_scale_factor, |
| 238 callback_runner, tracker); | 244 callback_runner, tracker); |
| 239 } | 245 } |
| 240 return RunWithEmptyResultAsync(callback_runner, tracker); | 246 return RunWithEmptyResultAsync(callback_runner, tracker); |
| 241 } | 247 } |
| 242 | 248 |
| 243 void FaviconService::SetFaviconOutOfDateForPage(const GURL& page_url) { | 249 void FaviconService::SetFaviconOutOfDateForPage(const GURL& page_url) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 272 void FaviconService::SetFavicons(const GURL& page_url, | 278 void FaviconService::SetFavicons(const GURL& page_url, |
| 273 const GURL& icon_url, | 279 const GURL& icon_url, |
| 274 favicon_base::IconType icon_type, | 280 favicon_base::IconType icon_type, |
| 275 const gfx::Image& image) { | 281 const gfx::Image& image) { |
| 276 if (!history_service_) | 282 if (!history_service_) |
| 277 return; | 283 return; |
| 278 | 284 |
| 279 gfx::ImageSkia image_skia = image.AsImageSkia(); | 285 gfx::ImageSkia image_skia = image.AsImageSkia(); |
| 280 image_skia.EnsureRepsForSupportedScales(); | 286 image_skia.EnsureRepsForSupportedScales(); |
| 281 const std::vector<gfx::ImageSkiaRep>& image_reps = image_skia.image_reps(); | 287 const std::vector<gfx::ImageSkiaRep>& image_reps = image_skia.image_reps(); |
| 282 std::vector<favicon_base::FaviconBitmapData> favicon_bitmap_data; | 288 std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data; |
| 283 for (size_t i = 0; i < image_reps.size(); ++i) { | 289 for (size_t i = 0; i < image_reps.size(); ++i) { |
| 284 scoped_refptr<base::RefCountedBytes> bitmap_data( | 290 scoped_refptr<base::RefCountedBytes> bitmap_data( |
| 285 new base::RefCountedBytes()); | 291 new base::RefCountedBytes()); |
| 286 if (gfx::PNGCodec::EncodeBGRASkBitmap(image_reps[i].sk_bitmap(), | 292 if (gfx::PNGCodec::EncodeBGRASkBitmap(image_reps[i].sk_bitmap(), |
| 287 false, | 293 false, |
| 288 &bitmap_data->data())) { | 294 &bitmap_data->data())) { |
| 289 gfx::Size pixel_size(image_reps[i].pixel_width(), | 295 gfx::Size pixel_size(image_reps[i].pixel_width(), |
| 290 image_reps[i].pixel_height()); | 296 image_reps[i].pixel_height()); |
| 291 favicon_base::FaviconBitmapData bitmap_data_element; | 297 favicon_base::FaviconRawBitmapData bitmap_data_element; |
| 292 bitmap_data_element.bitmap_data = bitmap_data; | 298 bitmap_data_element.bitmap_data = bitmap_data; |
| 293 bitmap_data_element.pixel_size = pixel_size; | 299 bitmap_data_element.pixel_size = pixel_size; |
| 294 bitmap_data_element.icon_url = icon_url; | 300 bitmap_data_element.icon_url = icon_url; |
| 295 | 301 |
| 296 favicon_bitmap_data.push_back(bitmap_data_element); | 302 favicon_bitmap_data.push_back(bitmap_data_element); |
| 297 } | 303 } |
| 298 } | 304 } |
| 299 | 305 |
| 300 history_service_->SetFavicons(page_url, icon_type, favicon_bitmap_data); | 306 history_service_->SetFavicons(page_url, icon_type, favicon_bitmap_data); |
| 301 } | 307 } |
| 302 | 308 |
| 303 void FaviconService::UnableToDownloadFavicon(const GURL& icon_url) { | 309 void FaviconService::UnableToDownloadFavicon(const GURL& icon_url) { |
| 304 MissingFaviconURLHash url_hash = base::Hash(icon_url.spec()); | 310 MissingFaviconURLHash url_hash = base::Hash(icon_url.spec()); |
| 305 missing_favicon_urls_.insert(url_hash); | 311 missing_favicon_urls_.insert(url_hash); |
| 306 } | 312 } |
| 307 | 313 |
| 308 bool FaviconService::WasUnableToDownloadFavicon(const GURL& icon_url) const { | 314 bool FaviconService::WasUnableToDownloadFavicon(const GURL& icon_url) const { |
| 309 MissingFaviconURLHash url_hash = base::Hash(icon_url.spec()); | 315 MissingFaviconURLHash url_hash = base::Hash(icon_url.spec()); |
| 310 return missing_favicon_urls_.find(url_hash) != missing_favicon_urls_.end(); | 316 return missing_favicon_urls_.find(url_hash) != missing_favicon_urls_.end(); |
| 311 } | 317 } |
| 312 | 318 |
| 313 void FaviconService::ClearUnableToDownloadFavicons() { | 319 void FaviconService::ClearUnableToDownloadFavicons() { |
| 314 missing_favicon_urls_.clear(); | 320 missing_favicon_urls_.clear(); |
| 315 } | 321 } |
| 316 | 322 |
| 317 FaviconService::~FaviconService() {} | 323 FaviconService::~FaviconService() {} |
| 318 | 324 |
| 319 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconForURLImpl( | 325 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconForPageURLImpl( |
| 320 const FaviconForURLParams& params, | 326 const FaviconForPageURLParams& params, |
| 321 const std::vector<ui::ScaleFactor>& desired_scale_factors, | 327 const std::vector<ui::ScaleFactor>& desired_scale_factors, |
| 322 const favicon_base::FaviconResultsCallback& callback, | 328 const favicon_base::FaviconResultsCallback& callback, |
| 323 base::CancelableTaskTracker* tracker) { | 329 base::CancelableTaskTracker* tracker) { |
| 324 if (params.page_url.SchemeIs(content::kChromeUIScheme) || | 330 if (params.page_url.SchemeIs(content::kChromeUIScheme) || |
| 325 params.page_url.SchemeIs(extensions::kExtensionScheme)) { | 331 params.page_url.SchemeIs(extensions::kExtensionScheme)) { |
| 326 return GetFaviconForChromeURL(profile_, params.page_url, | 332 return GetFaviconForChromeURL(profile_, params.page_url, |
| 327 desired_scale_factors, callback, tracker); | 333 desired_scale_factors, callback, tracker); |
| 328 } | 334 } |
| 329 if (history_service_) { | 335 if (history_service_) { |
| 330 return history_service_->GetFaviconsForURL(params.page_url, | 336 return history_service_->GetFaviconsForURL(params.page_url, |
| 331 params.icon_types, | 337 params.icon_types, |
| 332 params.desired_size_in_dip, | 338 params.desired_size_in_dip, |
| 333 desired_scale_factors, | 339 desired_scale_factors, |
| 334 callback, | 340 callback, |
| 335 tracker); | 341 tracker); |
| 336 } | 342 } |
| 337 return RunWithEmptyResultAsync(callback, tracker); | 343 return RunWithEmptyResultAsync(callback, tracker); |
| 338 } | 344 } |
| 339 | 345 |
| 340 void FaviconService::RunFaviconImageCallbackWithBitmapResults( | 346 void FaviconService::RunFaviconImageCallbackWithBitmapResults( |
| 341 const favicon_base::FaviconImageCallback& callback, | 347 const favicon_base::FaviconImageCallback& callback, |
| 342 int desired_size_in_dip, | 348 int desired_size_in_dip, |
| 343 const std::vector<favicon_base::FaviconBitmapResult>& | 349 const std::vector<favicon_base::FaviconRawBitmapResult>& |
| 344 favicon_bitmap_results) { | 350 favicon_bitmap_results) { |
| 345 favicon_base::FaviconImageResult image_result; | 351 favicon_base::FaviconImageResult image_result; |
| 346 image_result.image = FaviconUtil::SelectFaviconFramesFromPNGs( | 352 image_result.image = FaviconUtil::SelectFaviconFramesFromPNGs( |
| 347 favicon_bitmap_results, | 353 favicon_bitmap_results, |
| 348 FaviconUtil::GetFaviconScaleFactors(), | 354 FaviconUtil::GetFaviconScaleFactors(), |
| 349 desired_size_in_dip); | 355 desired_size_in_dip); |
| 350 FaviconUtil::SetFaviconColorSpace(&image_result.image); | 356 FaviconUtil::SetFaviconColorSpace(&image_result.image); |
| 351 | 357 |
| 352 image_result.icon_url = image_result.image.IsEmpty() ? | 358 image_result.icon_url = image_result.image.IsEmpty() ? |
| 353 GURL() : favicon_bitmap_results[0].icon_url; | 359 GURL() : favicon_bitmap_results[0].icon_url; |
| 354 callback.Run(image_result); | 360 callback.Run(image_result); |
| 355 } | 361 } |
| 356 | 362 |
| 357 void FaviconService::RunFaviconRawCallbackWithBitmapResults( | 363 void FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults( |
| 358 const favicon_base::FaviconRawCallback& callback, | 364 const favicon_base::FaviconRawBitmapCallback& callback, |
| 359 int desired_size_in_dip, | 365 int desired_size_in_dip, |
| 360 ui::ScaleFactor desired_scale_factor, | 366 ui::ScaleFactor desired_scale_factor, |
| 361 const std::vector<favicon_base::FaviconBitmapResult>& | 367 const std::vector<favicon_base::FaviconRawBitmapResult>& |
| 362 favicon_bitmap_results) { | 368 favicon_bitmap_results) { |
| 363 if (favicon_bitmap_results.empty() || !favicon_bitmap_results[0].is_valid()) { | 369 if (favicon_bitmap_results.empty() || !favicon_bitmap_results[0].is_valid()) { |
| 364 callback.Run(favicon_base::FaviconBitmapResult()); | 370 callback.Run(favicon_base::FaviconRawBitmapResult()); |
| 365 return; | 371 return; |
| 366 } | 372 } |
| 367 | 373 |
| 368 DCHECK_EQ(1u, favicon_bitmap_results.size()); | 374 DCHECK_EQ(1u, favicon_bitmap_results.size()); |
| 369 favicon_base::FaviconBitmapResult bitmap_result = favicon_bitmap_results[0]; | 375 favicon_base::FaviconRawBitmapResult bitmap_result = |
| 376 favicon_bitmap_results[0]; |
| 370 | 377 |
| 371 // If the desired size is 0, SelectFaviconFrames() will return the largest | 378 // If the desired size is 0, SelectFaviconFrames() will return the largest |
| 372 // bitmap without doing any resizing. As |favicon_bitmap_results| has bitmap | 379 // bitmap without doing any resizing. As |favicon_bitmap_results| has bitmap |
| 373 // data for a single bitmap, return it and avoid an unnecessary decode. | 380 // data for a single bitmap, return it and avoid an unnecessary decode. |
| 374 if (desired_size_in_dip == 0) { | 381 if (desired_size_in_dip == 0) { |
| 375 callback.Run(bitmap_result); | 382 callback.Run(bitmap_result); |
| 376 return; | 383 return; |
| 377 } | 384 } |
| 378 | 385 |
| 379 // If history bitmap is already desired pixel size, return early. | 386 // If history bitmap is already desired pixel size, return early. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 391 // Convert raw bytes to SkBitmap, resize via SelectFaviconFrames(), then | 398 // Convert raw bytes to SkBitmap, resize via SelectFaviconFrames(), then |
| 392 // convert back. | 399 // convert back. |
| 393 std::vector<ui::ScaleFactor> desired_scale_factors; | 400 std::vector<ui::ScaleFactor> desired_scale_factors; |
| 394 desired_scale_factors.push_back(desired_scale_factor); | 401 desired_scale_factors.push_back(desired_scale_factor); |
| 395 gfx::Image resized_image = FaviconUtil::SelectFaviconFramesFromPNGs( | 402 gfx::Image resized_image = FaviconUtil::SelectFaviconFramesFromPNGs( |
| 396 favicon_bitmap_results, desired_scale_factors, desired_size_in_dip); | 403 favicon_bitmap_results, desired_scale_factors, desired_size_in_dip); |
| 397 | 404 |
| 398 std::vector<unsigned char> resized_bitmap_data; | 405 std::vector<unsigned char> resized_bitmap_data; |
| 399 if (!gfx::PNGCodec::EncodeBGRASkBitmap(resized_image.AsBitmap(), false, | 406 if (!gfx::PNGCodec::EncodeBGRASkBitmap(resized_image.AsBitmap(), false, |
| 400 &resized_bitmap_data)) { | 407 &resized_bitmap_data)) { |
| 401 callback.Run(favicon_base::FaviconBitmapResult()); | 408 callback.Run(favicon_base::FaviconRawBitmapResult()); |
| 402 return; | 409 return; |
| 403 } | 410 } |
| 404 | 411 |
| 405 bitmap_result.bitmap_data = base::RefCountedBytes::TakeVector( | 412 bitmap_result.bitmap_data = base::RefCountedBytes::TakeVector( |
| 406 &resized_bitmap_data); | 413 &resized_bitmap_data); |
| 407 callback.Run(bitmap_result); | 414 callback.Run(bitmap_result); |
| 408 } | 415 } |
| OLD | NEW |