| 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_handler.h" | 5 #include "components/favicon/core/favicon_handler.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 } | 195 } |
| 196 | 196 |
| 197 // static | 197 // static |
| 198 int FaviconHandler::GetIconTypesFromHandlerType( | 198 int FaviconHandler::GetIconTypesFromHandlerType( |
| 199 FaviconDriverObserver::NotificationIconType handler_type) { | 199 FaviconDriverObserver::NotificationIconType handler_type) { |
| 200 switch (handler_type) { | 200 switch (handler_type) { |
| 201 case FaviconDriverObserver::NON_TOUCH_16_DIP: | 201 case FaviconDriverObserver::NON_TOUCH_16_DIP: |
| 202 case FaviconDriverObserver::NON_TOUCH_LARGEST: | 202 case FaviconDriverObserver::NON_TOUCH_LARGEST: |
| 203 return favicon_base::FAVICON; | 203 return favicon_base::FAVICON; |
| 204 case FaviconDriverObserver::TOUCH_LARGEST: | 204 case FaviconDriverObserver::TOUCH_LARGEST: |
| 205 return favicon_base::TOUCH_ICON | favicon_base::TOUCH_PRECOMPOSED_ICON; | 205 return favicon_base::TOUCH_ICON | favicon_base::TOUCH_PRECOMPOSED_ICON | |
| 206 favicon_base::WEB_MANIFEST_ICON; |
| 206 } | 207 } |
| 207 return 0; | 208 return 0; |
| 208 } | 209 } |
| 209 | 210 |
| 210 void FaviconHandler::FetchFavicon(const GURL& url) { | 211 void FaviconHandler::FetchFavicon(const GURL& url) { |
| 211 cancelable_task_tracker_for_page_url_.TryCancelAll(); | 212 cancelable_task_tracker_for_page_url_.TryCancelAll(); |
| 212 cancelable_task_tracker_for_candidates_.TryCancelAll(); | 213 cancelable_task_tracker_for_candidates_.TryCancelAll(); |
| 213 | 214 |
| 214 url_ = url; | 215 url_ = url; |
| 215 | 216 |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 | 347 |
| 347 // If no manifest available, proceed with the regular candidates only. | 348 // If no manifest available, proceed with the regular candidates only. |
| 348 if (manifest_url_.is_empty()) { | 349 if (manifest_url_.is_empty()) { |
| 349 OnGotFinalIconURLCandidates(candidates); | 350 OnGotFinalIconURLCandidates(candidates); |
| 350 return; | 351 return; |
| 351 } | 352 } |
| 352 | 353 |
| 353 // See if there is a cached favicon for the manifest. This will update the DB | 354 // See if there is a cached favicon for the manifest. This will update the DB |
| 354 // mappings only if the manifest URL is cached. | 355 // mappings only if the manifest URL is cached. |
| 355 GetFaviconAndUpdateMappingsUnlessIncognito( | 356 GetFaviconAndUpdateMappingsUnlessIncognito( |
| 356 /*icon_url=*/manifest_url_, favicon_base::FAVICON, | 357 /*icon_url=*/manifest_url_, favicon_base::WEB_MANIFEST_ICON, |
| 357 base::Bind(&FaviconHandler::OnFaviconDataForManifestFromFaviconService, | 358 base::Bind(&FaviconHandler::OnFaviconDataForManifestFromFaviconService, |
| 358 base::Unretained(this))); | 359 base::Unretained(this))); |
| 359 } | 360 } |
| 360 | 361 |
| 361 void FaviconHandler::OnFaviconDataForManifestFromFaviconService( | 362 void FaviconHandler::OnFaviconDataForManifestFromFaviconService( |
| 362 const std::vector<favicon_base::FaviconRawBitmapResult>& | 363 const std::vector<favicon_base::FaviconRawBitmapResult>& |
| 363 favicon_bitmap_results) { | 364 favicon_bitmap_results) { |
| 364 // The database lookup for the page URL is guaranteed to be completed because | 365 // The database lookup for the page URL is guaranteed to be completed because |
| 365 // the HistoryBackend uses a SequencedTaskRunner, and we also know that | 366 // the HistoryBackend uses a SequencedTaskRunner, and we also know that |
| 366 // FetchFavicon() was called before OnUpdateCandidates(). | 367 // FetchFavicon() was called before OnUpdateCandidates(). |
| 367 DCHECK(got_favicon_from_history_); | 368 DCHECK(got_favicon_from_history_); |
| 368 | 369 |
| 369 bool has_valid_result = HasValidResult(favicon_bitmap_results); | 370 bool has_valid_result = HasValidResult(favicon_bitmap_results); |
| 370 bool has_expired_or_incomplete_result = | 371 bool has_expired_or_incomplete_result = |
| 371 !has_valid_result || HasExpiredOrIncompleteResult(preferred_icon_size(), | 372 !has_valid_result || HasExpiredOrIncompleteResult(preferred_icon_size(), |
| 372 favicon_bitmap_results); | 373 favicon_bitmap_results); |
| 373 | 374 |
| 374 if (has_valid_result && (notification_icon_url_ != manifest_url_ || | 375 if (has_valid_result && |
| 375 notification_icon_type_ != favicon_base::FAVICON)) { | 376 (notification_icon_url_ != manifest_url_ || |
| 377 notification_icon_type_ != favicon_base::WEB_MANIFEST_ICON)) { |
| 376 // There is a valid favicon. Notify any observers. It is useful to notify | 378 // There is a valid favicon. Notify any observers. It is useful to notify |
| 377 // the observers even if the favicon is expired or incomplete (incorrect | 379 // the observers even if the favicon is expired or incomplete (incorrect |
| 378 // size) because temporarily showing the user an expired favicon or | 380 // size) because temporarily showing the user an expired favicon or |
| 379 // streched favicon is preferable to showing the user the default favicon. | 381 // streched favicon is preferable to showing the user the default favicon. |
| 380 NotifyFaviconUpdated(favicon_bitmap_results); | 382 NotifyFaviconUpdated(favicon_bitmap_results); |
| 381 } | 383 } |
| 382 | 384 |
| 383 if (has_expired_or_incomplete_result) { | 385 if (has_expired_or_incomplete_result) { |
| 384 manifest_download_request_.Reset(base::Bind( | 386 manifest_download_request_.Reset(base::Bind( |
| 385 &FaviconHandler::OnDidDownloadManifest, base::Unretained(this))); | 387 &FaviconHandler::OnDidDownloadManifest, base::Unretained(this))); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 516 // OnDidDownloadFavicon() can only be called after requesting a download, so | 518 // OnDidDownloadFavicon() can only be called after requesting a download, so |
| 517 // |num_image_download_requests_| can never be 0. | 519 // |num_image_download_requests_| can never be 0. |
| 518 RecordDownloadAttemptsForHandlerType(handler_type_, | 520 RecordDownloadAttemptsForHandlerType(handler_type_, |
| 519 num_image_download_requests_); | 521 num_image_download_requests_); |
| 520 // We have either found the ideal candidate or run out of candidates. | 522 // We have either found the ideal candidate or run out of candidates. |
| 521 if (best_favicon_.candidate.icon_type != favicon_base::INVALID_ICON) { | 523 if (best_favicon_.candidate.icon_type != favicon_base::INVALID_ICON) { |
| 522 // No more icons to request, set the favicon from the candidate. The | 524 // No more icons to request, set the favicon from the candidate. The |
| 523 // manifest URL, if available, is used instead of the icon URL. | 525 // manifest URL, if available, is used instead of the icon URL. |
| 524 SetFavicon(manifest_url_.is_empty() ? best_favicon_.candidate.icon_url | 526 SetFavicon(manifest_url_.is_empty() ? best_favicon_.candidate.icon_url |
| 525 : manifest_url_, | 527 : manifest_url_, |
| 526 best_favicon_.image, best_favicon_.candidate.icon_type); | 528 best_favicon_.image, |
| 529 manifest_url_.is_empty() ? best_favicon_.candidate.icon_type |
| 530 : favicon_base::WEB_MANIFEST_ICON); |
| 527 } | 531 } |
| 528 // Clear download related state. | 532 // Clear download related state. |
| 529 current_candidate_index_ = candidates_.size(); | 533 current_candidate_index_ = candidates_.size(); |
| 530 num_image_download_requests_ = 0; | 534 num_image_download_requests_ = 0; |
| 531 best_favicon_ = DownloadedFavicon(); | 535 best_favicon_ = DownloadedFavicon(); |
| 532 } | 536 } |
| 533 } | 537 } |
| 534 | 538 |
| 535 const std::vector<GURL> FaviconHandler::GetIconURLs() const { | 539 const std::vector<GURL> FaviconHandler::GetIconURLs() const { |
| 536 std::vector<GURL> icon_urls; | 540 std::vector<GURL> icon_urls; |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 660 // A max bitmap size is specified to avoid receiving huge bitmaps in | 664 // A max bitmap size is specified to avoid receiving huge bitmaps in |
| 661 // OnDidDownloadFavicon(). See FaviconDriver::StartDownload() | 665 // OnDidDownloadFavicon(). See FaviconDriver::StartDownload() |
| 662 // for more details about the max bitmap size. | 666 // for more details about the max bitmap size. |
| 663 const int download_id = | 667 const int download_id = |
| 664 delegate_->DownloadImage(image_url, GetMaximalIconSize(handler_type_), | 668 delegate_->DownloadImage(image_url, GetMaximalIconSize(handler_type_), |
| 665 image_download_request_.callback()); | 669 image_download_request_.callback()); |
| 666 DCHECK_NE(download_id, 0); | 670 DCHECK_NE(download_id, 0); |
| 667 } | 671 } |
| 668 | 672 |
| 669 } // namespace favicon | 673 } // namespace favicon |
| OLD | NEW |