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

Side by Side Diff: components/favicon/core/favicon_handler.cc

Issue 1401053002: Make ProcessCurrentUrl() and OnFaviconDataForInitialURLFromFaviconService() share code (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@page_changed_under_us
Patch Set: Created 5 years, 2 months 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
« no previous file with comments | « components/favicon/core/favicon_handler.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "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 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 return; 370 return;
371 } 371 }
372 372
373 download_requests_.clear(); 373 download_requests_.clear();
374 image_urls_ = pruned_candidates; 374 image_urls_ = pruned_candidates;
375 current_candidate_index_ = 0u; 375 current_candidate_index_ = 0u;
376 best_favicon_candidate_ = FaviconCandidate(); 376 best_favicon_candidate_ = FaviconCandidate();
377 377
378 // TODO(davemoore) Should clear on empty url. Currently we ignore it. 378 // TODO(davemoore) Should clear on empty url. Currently we ignore it.
379 // This appears to be what FF does as well. 379 // This appears to be what FF does as well.
380 if (current_candidate()) 380 if (current_candidate() && got_favicon_from_history_)
381 ProcessCurrentUrl(); 381 OnGotInitialHistoryDataAndIconURLCandidates();
382 } 382 }
383 383
384 void FaviconHandler::ProcessCurrentUrl() { 384 void FaviconHandler::OnGotInitialHistoryDataAndIconURLCandidates() {
385 DCHECK(!image_urls_.empty()); 385 if (!favicon_expired_or_incomplete_ && HasValidResult(history_results_) &&
386
387 if (!favicon_expired_or_incomplete_ && got_favicon_from_history_ &&
388 HasValidResult(history_results_) &&
389 DoUrlsAndIconsMatch(*current_candidate(), history_results_)) { 386 DoUrlsAndIconsMatch(*current_candidate(), history_results_)) {
387 // The data from history is valid and not expired. The icon URL of the
388 // history data matches one of the page's icon URLs. We are done. No
389 // additional downloads or history requests are needed.
390 // TODO: Store all of the icon URLs associated with a page in history so
391 // that we can check whether the page's icon URLs match the page's icon URLs
392 // at the time that the favicon data was stored to the history database.
390 return; 393 return;
391 } 394 }
392 395
393 if (got_favicon_from_history_) 396 DownloadCurrentCandidateOrAskFaviconService();
394 DownloadFaviconOrAskFaviconService(current_candidate()->icon_url,
395 current_candidate()->icon_type);
396 } 397 }
397 398
398 void FaviconHandler::OnDidDownloadFavicon( 399 void FaviconHandler::OnDidDownloadFavicon(
399 int id, 400 int id,
400 const GURL& image_url, 401 const GURL& image_url,
401 const std::vector<SkBitmap>& bitmaps, 402 const std::vector<SkBitmap>& bitmaps,
402 const std::vector<gfx::Size>& original_bitmap_sizes) { 403 const std::vector<gfx::Size>& original_bitmap_sizes) {
403 DownloadRequests::iterator i = download_requests_.find(id); 404 DownloadRequests::iterator i = download_requests_.find(id);
404 if (i == download_requests_.end()) { 405 if (i == download_requests_.end()) {
405 // Currently WebContents notifies us of ANY downloads so that it is 406 // Currently WebContents notifies us of ANY downloads so that it is
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 // The downloaded icon is still valid when there is no FaviconURL update 447 // The downloaded icon is still valid when there is no FaviconURL update
447 // during the downloading. 448 // during the downloading.
448 request_next_icon = !UpdateFaviconCandidate(image_url, image, score, 449 request_next_icon = !UpdateFaviconCandidate(image_url, image, score,
449 download_request.icon_type); 450 download_request.icon_type);
450 } 451 }
451 } 452 }
452 453
453 if (request_next_icon && current_candidate_index_ + 1 < image_urls_.size()) { 454 if (request_next_icon && current_candidate_index_ + 1 < image_urls_.size()) {
454 // Process the next candidate. 455 // Process the next candidate.
455 ++current_candidate_index_; 456 ++current_candidate_index_;
456 ProcessCurrentUrl(); 457 DownloadCurrentCandidateOrAskFaviconService();
457 } else { 458 } else {
458 // We have either found the ideal candidate or run out of candidates. 459 // We have either found the ideal candidate or run out of candidates.
459 if (best_favicon_candidate_.icon_type != favicon_base::INVALID_ICON) { 460 if (best_favicon_candidate_.icon_type != favicon_base::INVALID_ICON) {
460 // No more icons to request, set the favicon from the candidate. 461 // No more icons to request, set the favicon from the candidate.
461 SetFavicon(best_favicon_candidate_.image_url, 462 SetFavicon(best_favicon_candidate_.image_url,
462 best_favicon_candidate_.image, 463 best_favicon_candidate_.image,
463 best_favicon_candidate_.icon_type); 464 best_favicon_candidate_.icon_type);
464 } 465 }
465 // Clear download related state. 466 // Clear download related state.
466 download_requests_.clear(); 467 download_requests_.clear();
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 // to be expired (or the wrong url) we'll fetch later on. This way the 578 // to be expired (or the wrong url) we'll fetch later on. This way the
578 // user doesn't see a flash of the default favicon. 579 // user doesn't see a flash of the default favicon.
579 NotifyFaviconAvailable(favicon_bitmap_results); 580 NotifyFaviconAvailable(favicon_bitmap_results);
580 } else { 581 } else {
581 // If |favicon_bitmap_results| does not have any valid results, treat the 582 // If |favicon_bitmap_results| does not have any valid results, treat the
582 // favicon as if it's expired. 583 // favicon as if it's expired.
583 // TODO(pkotwicz): Do something better. 584 // TODO(pkotwicz): Do something better.
584 favicon_expired_or_incomplete_ = true; 585 favicon_expired_or_incomplete_ = true;
585 } 586 }
586 } 587 }
587 if (has_results && !favicon_expired_or_incomplete_) {
588 if (current_candidate() &&
589 !DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results)) {
590 // Mapping in the database is wrong. DownloadFavIconOrAskHistory will
591 // update the mapping for this url and download the favicon if we don't
592 // already have it.
593 DownloadFaviconOrAskFaviconService(current_candidate()->icon_url,
594 current_candidate()->icon_type);
595 }
596 } else if (current_candidate()) {
597 // We know the official url for the favicon, but either don't have the
598 // favicon or it's expired. Continue on to DownloadFaviconOrAskHistory to
599 // either download or check history again.
600 DownloadFaviconOrAskFaviconService(current_candidate()->icon_url,
601 current_candidate()->icon_type);
602 }
603 // else we haven't got the icon url. When we get it we'll ask the
604 // renderer to download the icon.
605 588
606 if (has_valid_result && (handler_type_ != FAVICON || download_largest_icon_)) 589 if (has_valid_result && (handler_type_ != FAVICON || download_largest_icon_))
607 NotifyFaviconAvailable(favicon_bitmap_results); 590 NotifyFaviconAvailable(favicon_bitmap_results);
591
592 if (current_candidate())
593 OnGotInitialHistoryDataAndIconURLCandidates();
608 } 594 }
609 595
610 void FaviconHandler::DownloadFaviconOrAskFaviconService( 596 void FaviconHandler::DownloadCurrentCandidateOrAskFaviconService() {
611 const GURL& icon_url, 597 GURL icon_url = current_candidate()->icon_url;
612 favicon_base::IconType icon_type) { 598 favicon_base::IconType icon_type = current_candidate()->icon_type;
599
613 if (favicon_expired_or_incomplete_) { 600 if (favicon_expired_or_incomplete_) {
614 // We have the mapping, but the favicon is out of date. Download it now. 601 // We have the mapping, but the favicon is out of date. Download it now.
615 ScheduleDownload(icon_url, icon_type); 602 ScheduleDownload(icon_url, icon_type);
616 } else { 603 } else {
617 // We don't know the favicon, but we may have previously downloaded the 604 // We don't know the favicon, but we may have previously downloaded the
618 // favicon for another page that shares the same favicon. Ask for the 605 // favicon for another page that shares the same favicon. Ask for the
619 // favicon given the favicon URL. 606 // favicon given the favicon URL.
620 if (driver_->IsOffTheRecord()) { 607 if (driver_->IsOffTheRecord()) {
621 GetFaviconFromFaviconService( 608 GetFaviconFromFaviconService(
622 icon_url, icon_type, 609 icon_url, icon_type,
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 // If DownloadFavicon() did not start a download, it returns a download id 668 // If DownloadFavicon() did not start a download, it returns a download id
682 // of 0. We still need to call OnDidDownloadFavicon() because the method is 669 // of 0. We still need to call OnDidDownloadFavicon() because the method is
683 // responsible for initiating the data request for the next candidate. 670 // responsible for initiating the data request for the next candidate.
684 OnDidDownloadFavicon(download_id, image_url, std::vector<SkBitmap>(), 671 OnDidDownloadFavicon(download_id, image_url, std::vector<SkBitmap>(),
685 std::vector<gfx::Size>()); 672 std::vector<gfx::Size>());
686 673
687 } 674 }
688 } 675 }
689 676
690 } // namespace favicon 677 } // namespace favicon
OLDNEW
« no previous file with comments | « components/favicon/core/favicon_handler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698