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 "chrome/browser/favicon/favicon_handler.h" | 5 #include "chrome/browser/favicon/favicon_handler.h" |
6 | 6 |
7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/bind_helpers.h" | 13 #include "base/bind_helpers.h" |
14 #include "base/memory/ref_counted_memory.h" | 14 #include "base/memory/ref_counted_memory.h" |
15 #include "chrome/browser/bookmarks/bookmark_model.h" | 15 #include "chrome/browser/bookmarks/bookmark_model.h" |
16 #include "chrome/browser/bookmarks/bookmark_model_factory.h" | 16 #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
17 #include "chrome/browser/favicon/favicon_service_factory.h" | 17 #include "chrome/browser/favicon/favicon_service_factory.h" |
18 #include "chrome/browser/favicon/favicon_util.h" | 18 #include "chrome/browser/favicon/favicon_util.h" |
19 #include "chrome/browser/history/select_favicon_frames.h" | 19 #include "chrome/browser/history/select_favicon_frames.h" |
20 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
21 #include "chrome/common/icon_messages.h" | 21 #include "chrome/common/icon_messages.h" |
22 #include "content/public/browser/favicon_status.h" | 22 #include "content/public/browser/favicon_status.h" |
23 #include "content/public/browser/navigation_entry.h" | 23 #include "content/public/browser/navigation_entry.h" |
| 24 #include "grit/ui_resources.h" |
24 #include "skia/ext/image_operations.h" | 25 #include "skia/ext/image_operations.h" |
| 26 #include "ui/base/resource/resource_bundle.h" |
25 #include "ui/gfx/codec/png_codec.h" | 27 #include "ui/gfx/codec/png_codec.h" |
26 #include "ui/gfx/image/image.h" | 28 #include "ui/gfx/image/image.h" |
27 #include "ui/gfx/image/image_skia.h" | 29 #include "ui/gfx/image/image_skia.h" |
28 #include "ui/gfx/image/image_util.h" | 30 #include "ui/gfx/image/image_util.h" |
29 | 31 |
30 using content::NavigationEntry; | 32 using content::NavigationEntry; |
31 | 33 |
32 namespace { | 34 namespace { |
33 | 35 |
34 // Returns history::IconType the given icon_type corresponds to. | 36 // Returns history::IconType the given icon_type corresponds to. |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
363 if (!entry) | 365 if (!entry) |
364 return; | 366 return; |
365 | 367 |
366 // For FAVICON. | 368 // For FAVICON. |
367 if (current_candidate()->icon_type == FaviconURL::FAVICON) { | 369 if (current_candidate()->icon_type == FaviconURL::FAVICON) { |
368 if (!favicon_expired_or_incomplete_ && entry->GetFavicon().valid && | 370 if (!favicon_expired_or_incomplete_ && entry->GetFavicon().valid && |
369 DoUrlAndIconMatch(*current_candidate(), entry->GetFavicon().url, | 371 DoUrlAndIconMatch(*current_candidate(), entry->GetFavicon().url, |
370 history::FAVICON)) | 372 history::FAVICON)) |
371 return; | 373 return; |
372 | 374 |
| 375 // TODO(msw): valid depending on url, or leave as-is? |
| 376 entry->GetFavicon().valid = false; |
373 entry->GetFavicon().url = current_candidate()->icon_url; | 377 entry->GetFavicon().url = current_candidate()->icon_url; |
| 378 // TODO(msw): Will this cause flicker? Do this when the fetch errors out? |
| 379 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| 380 entry->GetFavicon().image = rb.GetNativeImageNamed(IDR_DEFAULT_FAVICON); |
374 } else if (!favicon_expired_or_incomplete_ && got_favicon_from_history_ && | 381 } else if (!favicon_expired_or_incomplete_ && got_favicon_from_history_ && |
375 HasValidResult(history_results_) && | 382 HasValidResult(history_results_) && |
376 DoUrlsAndIconsMatch(*current_candidate(), history_results_)) { | 383 DoUrlsAndIconsMatch(*current_candidate(), history_results_)) { |
377 return; | 384 return; |
378 } | 385 } |
379 | 386 |
380 if (got_favicon_from_history_) | 387 if (got_favicon_from_history_) |
381 DownloadFaviconOrAskHistory(entry->GetURL(), current_candidate()->icon_url, | 388 DownloadFaviconOrAskHistory(entry->GetURL(), current_candidate()->icon_url, |
382 ToHistoryIconType(current_candidate()->icon_type)); | 389 ToHistoryIconType(current_candidate()->icon_type)); |
383 } | 390 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 // during the downloading. | 428 // during the downloading. |
422 bool request_next_icon = true; | 429 bool request_next_icon = true; |
423 if (!errored) { | 430 if (!errored) { |
424 request_next_icon = !UpdateFaviconCandidate( | 431 request_next_icon = !UpdateFaviconCandidate( |
425 i->second.url, image_url, image, score, i->second.icon_type); | 432 i->second.url, image_url, image, score, i->second.icon_type); |
426 } | 433 } |
427 if (request_next_icon && GetEntry() && image_urls_.size() > 1) { | 434 if (request_next_icon && GetEntry() && image_urls_.size() > 1) { |
428 // Remove the first member of image_urls_ and process the remaining. | 435 // Remove the first member of image_urls_ and process the remaining. |
429 image_urls_.pop_front(); | 436 image_urls_.pop_front(); |
430 ProcessCurrentUrl(); | 437 ProcessCurrentUrl(); |
431 } else if (favicon_candidate_.icon_type != history::INVALID_ICON) { | 438 } else { |
| 439 // Show the default favicon if the response was invalid. |
| 440 if (favicon_candidate_.icon_type != history::INVALID_ICON) { |
| 441 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| 442 favicon_candidate_.image = rb.GetNativeImageNamed(IDR_DEFAULT_FAVICON); |
| 443 // TODO(msw): the icon_type is not necessarily |FAVICON|... |
| 444 favicon_candidate_.icon_type = history::FAVICON; |
| 445 } |
| 446 |
432 // No more icons to request, set the favicon from the candidate. | 447 // No more icons to request, set the favicon from the candidate. |
433 SetFavicon(favicon_candidate_.url, | 448 SetFavicon(favicon_candidate_.url, |
434 favicon_candidate_.image_url, | 449 favicon_candidate_.image_url, |
435 favicon_candidate_.image, | 450 favicon_candidate_.image, |
436 favicon_candidate_.icon_type); | 451 favicon_candidate_.icon_type); |
437 // Reset candidate. | 452 // Reset candidate. |
438 image_urls_.clear(); | 453 image_urls_.clear(); |
439 favicon_candidate_ = FaviconCandidate(); | 454 favicon_candidate_ = FaviconCandidate(); |
440 } | 455 } |
441 } | 456 } |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 const int download_id = DownloadFavicon(image_url, image_size); | 660 const int download_id = DownloadFavicon(image_url, image_size); |
646 if (download_id) { | 661 if (download_id) { |
647 // Download ids should be unique. | 662 // Download ids should be unique. |
648 DCHECK(download_requests_.find(download_id) == download_requests_.end()); | 663 DCHECK(download_requests_.find(download_id) == download_requests_.end()); |
649 download_requests_[download_id] = | 664 download_requests_[download_id] = |
650 DownloadRequest(url, image_url, callback, icon_type); | 665 DownloadRequest(url, image_url, callback, icon_type); |
651 } | 666 } |
652 | 667 |
653 return download_id; | 668 return download_id; |
654 } | 669 } |
OLD | NEW |