Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(145)

Side by Side Diff: chrome/browser/favicon/favicon_handler.cc

Issue 684983003: Add Observer in FaviconTabHelper (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_handler.h" 5 #include "chrome/browser/favicon/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 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 if (!b1.icon_sizes.empty()) 151 if (!b1.icon_sizes.empty())
152 area1 = b1.icon_sizes.front().GetArea(); 152 area1 = b1.icon_sizes.front().GetArea();
153 153
154 int area2 = 0; 154 int area2 = 0;
155 if (!b2.icon_sizes.empty()) 155 if (!b2.icon_sizes.empty())
156 area2 = b2.icon_sizes.front().GetArea(); 156 area2 = b2.icon_sizes.front().GetArea();
157 157
158 return area1 > area2; 158 return area1 > area2;
159 } 159 }
160 160
161 // Return the first |favicon_bitmap_results|'s icon_url if the result isn't
162 // empty, otherwise empty GURL is returned.
163 inline GURL GetIconURL(const std::vector<
sky 2014/10/30 03:34:30 GetFirstIconURL
sky 2014/10/30 03:34:31 Is it really necessary to inline here?
michaelbai 2014/10/30 19:22:50 Function was removed
michaelbai 2014/10/30 19:22:50 Function was removed
164 favicon_base::FaviconRawBitmapResult>& favicon_bitmap_results) {
165 // The history service sends back results for a single icon URL, so it does
166 // not matter which result we get the |icon_url| from.
167 return favicon_bitmap_results.empty() ?
168 GURL() : favicon_bitmap_results[0].icon_url;
169 }
170
161 } // namespace 171 } // namespace
162 172
163 //////////////////////////////////////////////////////////////////////////////// 173 ////////////////////////////////////////////////////////////////////////////////
164 174
165 FaviconHandler::DownloadRequest::DownloadRequest() 175 FaviconHandler::DownloadRequest::DownloadRequest()
166 : icon_type(favicon_base::INVALID_ICON) {} 176 : icon_type(favicon_base::INVALID_ICON) {}
167 177
168 FaviconHandler::DownloadRequest::~DownloadRequest() { 178 FaviconHandler::DownloadRequest::~DownloadRequest() {
169 } 179 }
170 180
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 return exact_match; 291 return exact_match;
282 } 292 }
283 293
284 void FaviconHandler::SetFavicon(const GURL& url, 294 void FaviconHandler::SetFavicon(const GURL& url,
285 const GURL& icon_url, 295 const GURL& icon_url,
286 const gfx::Image& image, 296 const gfx::Image& image,
287 favicon_base::IconType icon_type) { 297 favicon_base::IconType icon_type) {
288 if (client_->GetFaviconService() && ShouldSaveFavicon(url)) 298 if (client_->GetFaviconService() && ShouldSaveFavicon(url))
289 SetHistoryFavicons(url, icon_url, icon_type, image); 299 SetHistoryFavicons(url, icon_url, icon_type, image);
290 300
291 if (UrlMatches(url, url_) && icon_type == favicon_base::FAVICON) { 301 if (!UrlMatches(url, url_) || PageChangedSinceFaviconWasRequested())
292 if (!PageChangedSinceFaviconWasRequested()) 302 return;
303
304 if (icon_type == favicon_base::FAVICON && !download_largest_icon_)
293 SetFaviconOnActivePage(icon_url, image); 305 SetFaviconOnActivePage(icon_url, image);
sky 2014/10/30 03:34:30 nit: spacing is off now (use git cl format).
michaelbai 2014/10/30 19:22:50 Acknowledged.
294 } 306 driver_->OnFaviconAvailable(image);
295 } 307 }
296 308
297 void FaviconHandler::SetFaviconOnActivePage(const std::vector< 309 gfx::Image FaviconHandler::SelectFaviconFrames(const std::vector<
298 favicon_base::FaviconRawBitmapResult>& favicon_bitmap_results) { 310 favicon_base::FaviconRawBitmapResult>& favicon_bitmap_results) {
299 gfx::Image resized_image = favicon_base::SelectFaviconFramesFromPNGs( 311 return favicon_base::SelectFaviconFramesFromPNGs(
300 favicon_bitmap_results, 312 favicon_bitmap_results,
301 favicon_base::GetFaviconScales(), 313 favicon_base::GetFaviconScales(),
302 preferred_icon_size()); 314 preferred_icon_size());
303 // The history service sends back results for a single icon URL, so it does
304 // not matter which result we get the |icon_url| from.
305 const GURL icon_url = favicon_bitmap_results.empty() ?
306 GURL() : favicon_bitmap_results[0].icon_url;
307 SetFaviconOnActivePage(icon_url, resized_image);
308 } 315 }
309 316
310 void FaviconHandler::SetFaviconOnActivePage(const GURL& icon_url, 317 void FaviconHandler::SetFaviconOnActivePage(const GURL& icon_url,
311 const gfx::Image& image) { 318 const gfx::Image& image) {
312 // No matter what happens, we need to mark the favicon as being set. 319 // No matter what happens, we need to mark the favicon as being set.
313 driver_->SetActiveFaviconValidity(true); 320 driver_->SetActiveFaviconValidity(true);
314 321
315 bool icon_url_changed = driver_->GetActiveFaviconURL() != icon_url; 322 bool icon_url_changed = driver_->GetActiveFaviconURL() != icon_url;
316 driver_->SetActiveFaviconURL(icon_url); 323 driver_->SetActiveFaviconURL(icon_url);
317 324
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 void FaviconHandler::OnFaviconDataForInitialURLFromFaviconService( 542 void FaviconHandler::OnFaviconDataForInitialURLFromFaviconService(
536 const std::vector<favicon_base::FaviconRawBitmapResult>& 543 const std::vector<favicon_base::FaviconRawBitmapResult>&
537 favicon_bitmap_results) { 544 favicon_bitmap_results) {
538 if (PageChangedSinceFaviconWasRequested()) 545 if (PageChangedSinceFaviconWasRequested())
539 return; 546 return;
540 got_favicon_from_history_ = true; 547 got_favicon_from_history_ = true;
541 history_results_ = favicon_bitmap_results; 548 history_results_ = favicon_bitmap_results;
542 bool has_results = !favicon_bitmap_results.empty(); 549 bool has_results = !favicon_bitmap_results.empty();
543 favicon_expired_or_incomplete_ = has_results && HasExpiredOrIncompleteResult( 550 favicon_expired_or_incomplete_ = has_results && HasExpiredOrIncompleteResult(
544 preferred_icon_size(), favicon_bitmap_results); 551 preferred_icon_size(), favicon_bitmap_results);
552 bool has_valid_result = HasValidResult(favicon_bitmap_results);
553 gfx::Image image;
554 if (has_valid_result)
555 image = SelectFaviconFrames(favicon_bitmap_results);
545 if (has_results && icon_types_ == favicon_base::FAVICON && 556 if (has_results && icon_types_ == favicon_base::FAVICON &&
546 !driver_->GetActiveFaviconValidity() && 557 !driver_->GetActiveFaviconValidity() &&
547 (!current_candidate() || 558 (!current_candidate() ||
548 DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results))) { 559 DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results))) {
549 if (HasValidResult(favicon_bitmap_results)) { 560 if (has_valid_result) {
550 // The db knows the favicon (although it may be out of date) and the entry 561 // The db knows the favicon (although it may be out of date) and the entry
551 // doesn't have an icon. Set the favicon now, and if the favicon turns out 562 // doesn't have an icon. Set the favicon now, and if the favicon turns out
552 // to be expired (or the wrong url) we'll fetch later on. This way the 563 // to be expired (or the wrong url) we'll fetch later on. This way the
553 // user doesn't see a flash of the default favicon. 564 // user doesn't see a flash of the default favicon.
554 SetFaviconOnActivePage(favicon_bitmap_results); 565 if (!download_largest_icon_)
566 SetFaviconOnActivePage(GetIconURL(favicon_bitmap_results), image);
555 } else { 567 } else {
556 // If |favicon_bitmap_results| does not have any valid results, treat the 568 // If |favicon_bitmap_results| does not have any valid results, treat the
557 // favicon as if it's expired. 569 // favicon as if it's expired.
558 // TODO(pkotwicz): Do something better. 570 // TODO(pkotwicz): Do something better.
559 favicon_expired_or_incomplete_ = true; 571 favicon_expired_or_incomplete_ = true;
560 } 572 }
561 } 573 }
562 if (has_results && !favicon_expired_or_incomplete_) { 574 if (has_results && !favicon_expired_or_incomplete_) {
563 if (current_candidate() && 575 if (current_candidate() &&
564 !DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results)) { 576 !DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results)) {
565 // Mapping in the database is wrong. DownloadFavIconOrAskHistory will 577 // Mapping in the database is wrong. DownloadFavIconOrAskHistory will
566 // update the mapping for this url and download the favicon if we don't 578 // update the mapping for this url and download the favicon if we don't
567 // already have it. 579 // already have it.
568 DownloadFaviconOrAskFaviconService(driver_->GetActiveURL(), 580 DownloadFaviconOrAskFaviconService(driver_->GetActiveURL(),
569 current_candidate()->icon_url, 581 current_candidate()->icon_url,
570 current_candidate()->icon_type); 582 current_candidate()->icon_type);
571 } 583 }
572 } else if (current_candidate()) { 584 } else if (current_candidate()) {
573 // We know the official url for the favicon, but either don't have the 585 // We know the official url for the favicon, but either don't have the
574 // favicon or it's expired. Continue on to DownloadFaviconOrAskHistory to 586 // favicon or it's expired. Continue on to DownloadFaviconOrAskHistory to
575 // either download or check history again. 587 // either download or check history again.
576 DownloadFaviconOrAskFaviconService(driver_->GetActiveURL(), 588 DownloadFaviconOrAskFaviconService(driver_->GetActiveURL(),
577 current_candidate()->icon_url, 589 current_candidate()->icon_url,
578 current_candidate()->icon_type); 590 current_candidate()->icon_type);
579 } 591 }
580 // else we haven't got the icon url. When we get it we'll ask the 592 // else we haven't got the icon url. When we get it we'll ask the
581 // renderer to download the icon. 593 // renderer to download the icon.
594
595 if (has_valid_result) {
596 driver_->OnFaviconAvailable(image);
597 }
582 } 598 }
583 599
584 void FaviconHandler::DownloadFaviconOrAskFaviconService( 600 void FaviconHandler::DownloadFaviconOrAskFaviconService(
585 const GURL& page_url, 601 const GURL& page_url,
586 const GURL& icon_url, 602 const GURL& icon_url,
587 favicon_base::IconType icon_type) { 603 favicon_base::IconType icon_type) {
588 if (favicon_expired_or_incomplete_) { 604 if (favicon_expired_or_incomplete_) {
589 // We have the mapping, but the favicon is out of date. Download it now. 605 // We have the mapping, but the favicon is out of date. Download it now.
590 ScheduleDownload(page_url, icon_url, icon_type); 606 ScheduleDownload(page_url, icon_url, icon_type);
591 } else if (client_->GetFaviconService()) { 607 } else if (client_->GetFaviconService()) {
(...skipping 20 matching lines...) Expand all
612 } 628 }
613 629
614 void FaviconHandler::OnFaviconData(const std::vector< 630 void FaviconHandler::OnFaviconData(const std::vector<
615 favicon_base::FaviconRawBitmapResult>& favicon_bitmap_results) { 631 favicon_base::FaviconRawBitmapResult>& favicon_bitmap_results) {
616 if (PageChangedSinceFaviconWasRequested()) 632 if (PageChangedSinceFaviconWasRequested())
617 return; 633 return;
618 634
619 bool has_results = !favicon_bitmap_results.empty(); 635 bool has_results = !favicon_bitmap_results.empty();
620 bool has_expired_or_incomplete_result = HasExpiredOrIncompleteResult( 636 bool has_expired_or_incomplete_result = HasExpiredOrIncompleteResult(
621 preferred_icon_size(), favicon_bitmap_results); 637 preferred_icon_size(), favicon_bitmap_results);
622 638 bool has_valid_result = HasValidResult(favicon_bitmap_results);
639 gfx::Image image;
640 if (has_valid_result)
641 image = SelectFaviconFrames(favicon_bitmap_results);
623 if (has_results && icon_types_ == favicon_base::FAVICON) { 642 if (has_results && icon_types_ == favicon_base::FAVICON) {
624 if (HasValidResult(favicon_bitmap_results)) { 643 if (has_valid_result) {
625 // There is a favicon, set it now. If expired we'll download the current 644 // There is a favicon, set it now. If expired we'll download the current
626 // one again, but at least the user will get some icon instead of the 645 // one again, but at least the user will get some icon instead of the
627 // default and most likely the current one is fine anyway. 646 // default and most likely the current one is fine anyway.
628 SetFaviconOnActivePage(favicon_bitmap_results); 647 if (!download_largest_icon_)
648 SetFaviconOnActivePage(GetIconURL(favicon_bitmap_results), image);
629 } 649 }
630 if (has_expired_or_incomplete_result) { 650 if (has_expired_or_incomplete_result) {
631 // The favicon is out of date. Request the current one. 651 // The favicon is out of date. Request the current one.
632 ScheduleDownload(driver_->GetActiveURL(), 652 ScheduleDownload(driver_->GetActiveURL(),
633 driver_->GetActiveFaviconURL(), 653 driver_->GetActiveFaviconURL(),
634 favicon_base::FAVICON); 654 favicon_base::FAVICON);
635 } 655 }
636 } else if (current_candidate() && 656 } else if (current_candidate() &&
637 (!has_results || has_expired_or_incomplete_result || 657 (!has_results || has_expired_or_incomplete_result ||
638 !(DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results)))) { 658 !(DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results)))) {
639 // We don't know the favicon, it is out of date or its type is not same as 659 // We don't know the favicon, it is out of date or its type is not same as
640 // one got from page. Request the current one. 660 // one got from page. Request the current one.
641 ScheduleDownload(driver_->GetActiveURL(), 661 ScheduleDownload(driver_->GetActiveURL(),
642 current_candidate()->icon_url, 662 current_candidate()->icon_url,
643 current_candidate()->icon_type); 663 current_candidate()->icon_type);
644 } 664 }
645 history_results_ = favicon_bitmap_results; 665 history_results_ = favicon_bitmap_results;
666
667 if (has_valid_result)
668 driver_->OnFaviconAvailable(image);
646 } 669 }
647 670
648 int FaviconHandler::ScheduleDownload(const GURL& url, 671 int FaviconHandler::ScheduleDownload(const GURL& url,
649 const GURL& image_url, 672 const GURL& image_url,
650 favicon_base::IconType icon_type) { 673 favicon_base::IconType icon_type) {
651 // A max bitmap size is specified to avoid receiving huge bitmaps in 674 // A max bitmap size is specified to avoid receiving huge bitmaps in
652 // OnDidDownloadFavicon(). See FaviconDriver::StartDownload() 675 // OnDidDownloadFavicon(). See FaviconDriver::StartDownload()
653 // for more details about the max bitmap size. 676 // for more details about the max bitmap size.
654 const int download_id = DownloadFavicon(image_url, 677 const int download_id = DownloadFavicon(image_url,
655 GetMaximalIconSize(icon_type)); 678 GetMaximalIconSize(icon_type));
(...skipping 13 matching lines...) Expand all
669 if (i->icon_sizes.empty()) 692 if (i->icon_sizes.empty())
670 continue; 693 continue;
671 694
672 gfx::Size largest = i->icon_sizes[GetLargestSizeIndex(i->icon_sizes)]; 695 gfx::Size largest = i->icon_sizes[GetLargestSizeIndex(i->icon_sizes)];
673 i->icon_sizes.clear(); 696 i->icon_sizes.clear();
674 i->icon_sizes.push_back(largest); 697 i->icon_sizes.push_back(largest);
675 } 698 }
676 std::stable_sort(image_urls_.begin(), image_urls_.end(), 699 std::stable_sort(image_urls_.begin(), image_urls_.end(),
677 CompareIconSize); 700 CompareIconSize);
678 } 701 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698