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 <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 image_urls_ = pruned_candidates; | 388 image_urls_ = pruned_candidates; |
389 current_candidate_index_ = 0u; | 389 current_candidate_index_ = 0u; |
390 best_favicon_candidate_ = FaviconCandidate(); | 390 best_favicon_candidate_ = FaviconCandidate(); |
391 | 391 |
392 // TODO(davemoore) Should clear on empty url. Currently we ignore it. | 392 // TODO(davemoore) Should clear on empty url. Currently we ignore it. |
393 // This appears to be what FF does as well. | 393 // This appears to be what FF does as well. |
394 if (current_candidate() && got_favicon_from_history_) | 394 if (current_candidate() && got_favicon_from_history_) |
395 OnGotInitialHistoryDataAndIconURLCandidates(); | 395 OnGotInitialHistoryDataAndIconURLCandidates(); |
396 } | 396 } |
397 | 397 |
| 398 // static |
| 399 int FaviconHandler::GetMaximalIconSize(favicon_base::IconType icon_type) { |
| 400 switch (icon_type) { |
| 401 case favicon_base::FAVICON: |
| 402 #if defined(OS_ANDROID) |
| 403 return 192; |
| 404 #else |
| 405 return gfx::ImageSkia::GetMaxSupportedScale() * gfx::kFaviconSize; |
| 406 #endif |
| 407 case favicon_base::TOUCH_ICON: |
| 408 case favicon_base::TOUCH_PRECOMPOSED_ICON: |
| 409 return kTouchIconSize; |
| 410 case favicon_base::INVALID_ICON: |
| 411 return 0; |
| 412 } |
| 413 NOTREACHED(); |
| 414 return 0; |
| 415 } |
| 416 |
398 void FaviconHandler::OnGotInitialHistoryDataAndIconURLCandidates() { | 417 void FaviconHandler::OnGotInitialHistoryDataAndIconURLCandidates() { |
399 if (!initial_history_result_expired_or_incomplete_ && | 418 if (!initial_history_result_expired_or_incomplete_ && |
400 DoUrlAndIconMatch(*current_candidate(), notification_icon_url_, | 419 DoUrlAndIconMatch(*current_candidate(), notification_icon_url_, |
401 notification_icon_type_)) { | 420 notification_icon_type_)) { |
402 // - The data from history is valid and not expired. | 421 // - The data from history is valid and not expired. |
403 // - The icon URL of the history data matches one of the page's icon URLs. | 422 // - The icon URL of the history data matches one of the page's icon URLs. |
404 // - The icon URL of the history data matches the icon URL of the last | 423 // - The icon URL of the history data matches the icon URL of the last |
405 // OnFaviconAvailable() notification. | 424 // OnFaviconAvailable() notification. |
406 // We are done. No additional downloads or history requests are needed. | 425 // We are done. No additional downloads or history requests are needed. |
407 // TODO: Store all of the icon URLs associated with a page in history so | 426 // TODO: Store all of the icon URLs associated with a page in history so |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 } | 567 } |
549 | 568 |
550 bool FaviconHandler::ShouldSaveFavicon() { | 569 bool FaviconHandler::ShouldSaveFavicon() { |
551 if (!delegate_->IsOffTheRecord()) | 570 if (!delegate_->IsOffTheRecord()) |
552 return true; | 571 return true; |
553 | 572 |
554 // Always save favicon if the page is bookmarked. | 573 // Always save favicon if the page is bookmarked. |
555 return delegate_->IsBookmarked(url_); | 574 return delegate_->IsBookmarked(url_); |
556 } | 575 } |
557 | 576 |
558 int FaviconHandler::GetMaximalIconSize(favicon_base::IconType icon_type) { | |
559 switch (icon_type) { | |
560 case favicon_base::FAVICON: | |
561 #if defined(OS_ANDROID) | |
562 return 192; | |
563 #else | |
564 return gfx::ImageSkia::GetMaxSupportedScale() * gfx::kFaviconSize; | |
565 #endif | |
566 case favicon_base::TOUCH_ICON: | |
567 case favicon_base::TOUCH_PRECOMPOSED_ICON: | |
568 return kTouchIconSize; | |
569 case favicon_base::INVALID_ICON: | |
570 return 0; | |
571 } | |
572 NOTREACHED(); | |
573 return 0; | |
574 } | |
575 | |
576 void FaviconHandler::OnFaviconDataForInitialURLFromFaviconService( | 577 void FaviconHandler::OnFaviconDataForInitialURLFromFaviconService( |
577 const std::vector<favicon_base::FaviconRawBitmapResult>& | 578 const std::vector<favicon_base::FaviconRawBitmapResult>& |
578 favicon_bitmap_results) { | 579 favicon_bitmap_results) { |
579 got_favicon_from_history_ = true; | 580 got_favicon_from_history_ = true; |
580 bool has_valid_result = HasValidResult(favicon_bitmap_results); | 581 bool has_valid_result = HasValidResult(favicon_bitmap_results); |
581 initial_history_result_expired_or_incomplete_ = | 582 initial_history_result_expired_or_incomplete_ = |
582 !has_valid_result || | 583 !has_valid_result || |
583 HasExpiredOrIncompleteResult(preferred_icon_size(), | 584 HasExpiredOrIncompleteResult(preferred_icon_size(), |
584 favicon_bitmap_results); | 585 favicon_bitmap_results); |
585 redownload_icons_ = initial_history_result_expired_or_incomplete_ && | 586 redownload_icons_ = initial_history_result_expired_or_incomplete_ && |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
654 | 655 |
655 if (has_expired_or_incomplete_result) { | 656 if (has_expired_or_incomplete_result) { |
656 ScheduleDownload(current_candidate()->icon_url, | 657 ScheduleDownload(current_candidate()->icon_url, |
657 current_candidate()->icon_type); | 658 current_candidate()->icon_type); |
658 } | 659 } |
659 } | 660 } |
660 | 661 |
661 void FaviconHandler::ScheduleDownload(const GURL& image_url, | 662 void FaviconHandler::ScheduleDownload(const GURL& image_url, |
662 favicon_base::IconType icon_type) { | 663 favicon_base::IconType icon_type) { |
663 DCHECK(image_url.is_valid()); | 664 DCHECK(image_url.is_valid()); |
664 if (service_ && service_->WasUnableToDownloadFavicon(image_url)) { | 665 int download_id = 0; |
665 DVLOG(1) << "Skip Failed FavIcon: " << image_url; | 666 if (service_ && !service_->WasUnableToDownloadFavicon(image_url)) { |
666 OnDidDownloadFavicon(0, 0, image_url, std::vector<SkBitmap>(), | 667 // A max bitmap size is specified to avoid receiving huge bitmaps in |
667 std::vector<gfx::Size>()); | 668 // OnDidDownloadFavicon(). See FaviconDriver::StartDownload() |
668 return; | 669 // for more details about the max bitmap size. |
| 670 download_id = delegate_->DownloadImage( |
| 671 image_url, GetMaximalIconSize(icon_type), |
| 672 base::Bind(&FaviconHandler::OnDidDownloadFavicon, |
| 673 weak_ptr_factory_.GetWeakPtr())); |
669 } | 674 } |
670 // A max bitmap size is specified to avoid receiving huge bitmaps in | |
671 // OnDidDownloadFavicon(). See FaviconDriver::StartDownload() | |
672 // for more details about the max bitmap size. | |
673 const int download_id = | |
674 delegate_->DownloadImage(image_url, GetMaximalIconSize(icon_type), | |
675 base::Bind(&FaviconHandler::OnDidDownloadFavicon, | |
676 weak_ptr_factory_.GetWeakPtr())); | |
677 | 675 |
678 // Download ids should be unique. | 676 // Download ids should be unique. |
679 DCHECK(download_requests_.find(download_id) == download_requests_.end()); | 677 DCHECK(download_requests_.find(download_id) == download_requests_.end()); |
680 download_requests_[download_id] = DownloadRequest(image_url, icon_type); | 678 download_requests_[download_id] = DownloadRequest(image_url, icon_type); |
681 | 679 |
682 // TODO(mastiz): Remove the download_id == 0 handling because it's not used | |
683 // in production code, only tests. | |
684 if (download_id == 0) { | 680 if (download_id == 0) { |
685 // If DownloadFavicon() did not start a download, it returns a download id | 681 DVLOG(1) << "Skip Failed FavIcon: " << image_url; |
686 // of 0. We still need to call OnDidDownloadFavicon() because the method is | 682 OnDidDownloadFavicon(0, 404, image_url, std::vector<SkBitmap>(), |
687 // responsible for initiating the data request for the next candidate. | |
688 OnDidDownloadFavicon(download_id, 0, image_url, std::vector<SkBitmap>(), | |
689 std::vector<gfx::Size>()); | 683 std::vector<gfx::Size>()); |
690 } | 684 } |
691 } | 685 } |
692 | 686 |
693 } // namespace favicon | 687 } // namespace favicon |
OLD | NEW |