Chromium Code Reviews| 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 "components/favicon/core/favicon_service.h" | 5 #include "components/favicon/core/favicon_service.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #include "base/hash.h" | 9 #include "base/hash.h" |
| 10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 44 sizes_in_pixel.push_back(std::ceil(size_in_dip * scales[i])); | 44 sizes_in_pixel.push_back(std::ceil(size_in_dip * scales[i])); |
| 45 } | 45 } |
| 46 return sizes_in_pixel; | 46 return sizes_in_pixel; |
| 47 } | 47 } |
| 48 | 48 |
| 49 } // namespace | 49 } // namespace |
| 50 | 50 |
| 51 FaviconService::FaviconService(FaviconClient* favicon_client, | 51 FaviconService::FaviconService(FaviconClient* favicon_client, |
| 52 history::HistoryService* history_service) | 52 history::HistoryService* history_service) |
| 53 : history_service_(history_service), favicon_client_(favicon_client) { | 53 : history_service_(history_service), favicon_client_(favicon_client) { |
| 54 large_icon_types_.push_back(favicon_base::IconType::FAVICON); | |
| 55 large_icon_types_.push_back(favicon_base::IconType::TOUCH_ICON); | |
| 56 large_icon_types_.push_back(favicon_base::IconType::TOUCH_PRECOMPOSED_ICON); | |
| 54 } | 57 } |
| 55 | 58 |
| 56 FaviconService::~FaviconService() { | 59 FaviconService::~FaviconService() { |
| 57 } | 60 } |
| 58 | 61 |
| 59 // static | 62 // static |
| 60 void FaviconService::FaviconResultsCallbackRunner( | 63 void FaviconService::FaviconResultsCallbackRunner( |
| 61 const favicon_base::FaviconResultsCallback& callback, | 64 const favicon_base::FaviconResultsCallback& callback, |
| 62 const std::vector<favicon_base::FaviconRawBitmapResult>* results) { | 65 const std::vector<favicon_base::FaviconRawBitmapResult>* results) { |
| 63 callback.Run(*results); | 66 callback.Run(*results); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 148 page_url, icon_types, desired_sizes_in_pixel, | 151 page_url, icon_types, desired_sizes_in_pixel, |
| 149 base::Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, | 152 base::Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, |
| 150 base::Unretained(this), callback, desired_size_in_pixel), | 153 base::Unretained(this), callback, desired_size_in_pixel), |
| 151 tracker); | 154 tracker); |
| 152 } | 155 } |
| 153 | 156 |
| 154 base::CancelableTaskTracker::TaskId | 157 base::CancelableTaskTracker::TaskId |
| 155 FaviconService::GetLargestRawFaviconForPageURL( | 158 FaviconService::GetLargestRawFaviconForPageURL( |
| 156 const GURL& page_url, | 159 const GURL& page_url, |
| 157 const std::vector<int>& icon_types, | 160 const std::vector<int>& icon_types, |
| 158 int minimum_size_in_pixels, | 161 int minimum_size_in_pixel, |
| 159 const favicon_base::FaviconRawBitmapCallback& callback, | 162 const favicon_base::FaviconRawBitmapCallback& callback, |
| 160 base::CancelableTaskTracker* tracker) { | 163 base::CancelableTaskTracker* tracker) { |
| 161 favicon_base::FaviconResultsCallback favicon_results_callback = | 164 favicon_base::FaviconResultsCallback favicon_results_callback = |
| 162 base::Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, | 165 base::Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, |
| 163 base::Unretained(this), callback, 0); | 166 base::Unretained(this), callback, 0); |
| 164 if (favicon_client_ && favicon_client_->IsNativeApplicationURL(page_url)) { | 167 if (favicon_client_ && favicon_client_->IsNativeApplicationURL(page_url)) { |
| 165 std::vector<int> desired_sizes_in_pixel; | 168 std::vector<int> desired_sizes_in_pixel; |
| 166 desired_sizes_in_pixel.push_back(0); | 169 desired_sizes_in_pixel.push_back(0); |
| 167 return favicon_client_->GetFaviconForNativeApplicationURL( | 170 return favicon_client_->GetFaviconForNativeApplicationURL( |
| 168 page_url, desired_sizes_in_pixel, favicon_results_callback, tracker); | 171 page_url, desired_sizes_in_pixel, favicon_results_callback, tracker); |
| 169 } | 172 } |
| 170 if (history_service_) { | 173 if (history_service_) { |
| 171 return history_service_->GetLargestFaviconForURL(page_url, icon_types, | 174 return history_service_->GetLargestFaviconForURL(page_url, icon_types, |
| 172 minimum_size_in_pixels, callback, tracker); | 175 minimum_size_in_pixel, callback, tracker); |
| 173 } | 176 } |
| 174 return RunWithEmptyResultAsync(favicon_results_callback, tracker); | 177 return RunWithEmptyResultAsync(favicon_results_callback, tracker); |
| 175 } | 178 } |
| 176 | 179 |
| 180 base::CancelableTaskTracker::TaskId FaviconService::GetLargeIconOrFallbackStyle( | |
| 181 const GURL& page_url, | |
| 182 int desired_size_in_pixel, | |
| 183 const favicon_base::LargeIconCallback& callback, | |
| 184 base::CancelableTaskTracker* tracker) { | |
| 185 // TODO(beaudoin): For now this is just a wrapper around | |
| 186 // GetLargestRawFaviconForPageURL. Add the logic required to select the best | |
| 187 // possible large icon. Also add logic to fetch-on-demand when the URL of | |
| 188 // a large icon is known but its bitmap is not available. | |
|
pkotwicz
2015/04/17 18:39:14
I recommend creating a new service LargeIconServic
beaudoin
2015/04/17 20:29:05
Ok, I'll get that out in another service. Another
| |
| 189 return GetLargestRawFaviconForPageURL( | |
| 190 page_url, | |
| 191 large_icon_types_, | |
| 192 desired_size_in_pixel, | |
| 193 base::Bind(&FaviconService::RunLargeIconCallback, | |
| 194 base::Unretained(this), callback, desired_size_in_pixel), | |
| 195 tracker); | |
| 196 } | |
| 197 | |
| 177 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconForPageURL( | 198 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconForPageURL( |
| 178 const GURL& page_url, | 199 const GURL& page_url, |
| 179 int icon_types, | 200 int icon_types, |
| 180 int desired_size_in_dip, | 201 int desired_size_in_dip, |
| 181 const favicon_base::FaviconResultsCallback& callback, | 202 const favicon_base::FaviconResultsCallback& callback, |
| 182 base::CancelableTaskTracker* tracker) { | 203 base::CancelableTaskTracker* tracker) { |
| 183 return GetFaviconForPageURLImpl( | 204 return GetFaviconForPageURLImpl( |
| 184 page_url, | 205 page_url, |
| 185 icon_types, | 206 icon_types, |
| 186 GetPixelSizesForFaviconScales(desired_size_in_dip), | 207 GetPixelSizesForFaviconScales(desired_size_in_dip), |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 364 &resized_bitmap_data)) { | 385 &resized_bitmap_data)) { |
| 365 callback.Run(favicon_base::FaviconRawBitmapResult()); | 386 callback.Run(favicon_base::FaviconRawBitmapResult()); |
| 366 return; | 387 return; |
| 367 } | 388 } |
| 368 | 389 |
| 369 bitmap_result.bitmap_data = base::RefCountedBytes::TakeVector( | 390 bitmap_result.bitmap_data = base::RefCountedBytes::TakeVector( |
| 370 &resized_bitmap_data); | 391 &resized_bitmap_data); |
| 371 callback.Run(bitmap_result); | 392 callback.Run(bitmap_result); |
| 372 } | 393 } |
| 373 | 394 |
| 395 void FaviconService::RunLargeIconCallback( | |
| 396 const favicon_base::LargeIconCallback& callback, | |
| 397 int desired_size_in_pixel, | |
| 398 const favicon_base::FaviconRawBitmapResult& bitmap_result) { | |
| 399 // If there are no bitmap, we return a result with an empty |bitmap| and a | |
| 400 // default |fallback_icon_style|. | |
| 401 favicon_base::LargeIconResult result; | |
| 402 if (!bitmap_result.is_valid()) { | |
| 403 callback.Run(result); | |
| 404 return; | |
| 405 } | |
| 406 | |
| 407 // If there is a bitmap but it's smaller than the requested size, we compute | |
| 408 // its dominant color and use it as background for |fallback_icon_style|. | |
| 409 if (bitmap_result.pixel_size.width() < desired_size_in_pixel || | |
| 410 bitmap_result.pixel_size.height() < desired_size_in_pixel) { | |
| 411 favicon_base::SetDominantColorAsBackground(bitmap_result.bitmap_data, | |
| 412 &result.fallback_icon_style); | |
| 413 callback.Run(result); | |
| 414 return; | |
| 415 } | |
| 416 | |
| 417 // The bitmap is the right size, use it. | |
| 418 result.bitmap = bitmap_result; | |
|
huangs
2015/04/17 15:30:47
Can move this into "else" of previous "if" to use
huangs
2015/04/17 20:44:04
Ping on this comment (feel to reject, but just wan
beaudoin
2015/04/20 19:15:05
Done.
| |
| 419 callback.Run(result); | |
| 420 } | |
| 421 | |
| 374 } // namespace favicon | 422 } // namespace favicon |
| OLD | NEW |