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 <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 | 269 |
270 // For FAVICON. | 270 // For FAVICON. |
271 if (current_candidate()->icon_type == FaviconURL::FAVICON) { | 271 if (current_candidate()->icon_type == FaviconURL::FAVICON) { |
272 if (!favicon_expired_ && entry->GetFavicon().valid && | 272 if (!favicon_expired_ && entry->GetFavicon().valid && |
273 DoUrlAndIconMatch(*current_candidate(), entry->GetFavicon().url, | 273 DoUrlAndIconMatch(*current_candidate(), entry->GetFavicon().url, |
274 history::FAVICON)) | 274 history::FAVICON)) |
275 return; | 275 return; |
276 | 276 |
277 entry->GetFavicon().url = current_candidate()->icon_url; | 277 entry->GetFavicon().url = current_candidate()->icon_url; |
278 } else if (!favicon_expired_ && got_favicon_from_history_ && | 278 } else if (!favicon_expired_ && got_favicon_from_history_ && |
279 history_icon_.is_valid() && | 279 history_icon_.has_valid_bitmaps() && |
280 DoUrlAndIconMatch( | 280 DoUrlAndIconMatch( |
281 *current_candidate(), | 281 *current_candidate(), |
282 history_icon_.icon_url, history_icon_.icon_type)) { | 282 history_icon_.icon_url, history_icon_.icon_type)) { |
283 return; | 283 return; |
284 } | 284 } |
285 | 285 |
286 if (got_favicon_from_history_) | 286 if (got_favicon_from_history_) |
287 DownloadFaviconOrAskHistory(entry->GetURL(), current_candidate()->icon_url, | 287 DownloadFaviconOrAskHistory(entry->GetURL(), current_candidate()->icon_url, |
288 ToHistoryIconType(current_candidate()->icon_type)); | 288 ToHistoryIconType(current_candidate()->icon_type)); |
289 } | 289 } |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 return true; | 389 return true; |
390 | 390 |
391 // Otherwise store the favicon if the page is bookmarked. | 391 // Otherwise store the favicon if the page is bookmarked. |
392 BookmarkModel* bookmark_model = | 392 BookmarkModel* bookmark_model = |
393 BookmarkModelFactory::GetForProfile(profile_); | 393 BookmarkModelFactory::GetForProfile(profile_); |
394 return bookmark_model && bookmark_model->IsBookmarked(url); | 394 return bookmark_model && bookmark_model->IsBookmarked(url); |
395 } | 395 } |
396 | 396 |
397 void FaviconHandler::OnFaviconDataForInitialURL( | 397 void FaviconHandler::OnFaviconDataForInitialURL( |
398 FaviconService::Handle handle, | 398 FaviconService::Handle handle, |
399 history::FaviconData favicon) { | 399 history::FaviconData favicon_data, |
| 400 std::vector<GURL> icon_urls_in_db) { |
400 NavigationEntry* entry = GetEntry(); | 401 NavigationEntry* entry = GetEntry(); |
401 if (!entry) | 402 if (!entry) |
402 return; | 403 return; |
403 | 404 |
404 got_favicon_from_history_ = true; | 405 got_favicon_from_history_ = true; |
405 history_icon_ = favicon; | 406 history_icon_ = favicon_data; |
406 | 407 |
407 favicon_expired_ = (favicon.known_icon && favicon.expired); | 408 favicon_expired_ = (favicon_data.known_icon && favicon_data.expired()); |
408 | 409 |
409 if (favicon.known_icon && favicon.icon_type == history::FAVICON && | 410 if (favicon_data.known_icon && favicon_data.icon_type == history::FAVICON && |
410 !entry->GetFavicon().valid && | 411 !entry->GetFavicon().valid && |
411 (!current_candidate() || | 412 (!current_candidate() || |
412 DoUrlAndIconMatch( | 413 DoUrlAndIconMatch(*current_candidate(), |
413 *current_candidate(), favicon.icon_url, favicon.icon_type))) { | 414 favicon_data.icon_url, favicon_data.icon_type))) { |
414 // The db knows the favicon (although it may be out of date) and the entry | 415 // The db knows the favicon (although it may be out of date) and the entry |
415 // doesn't have an icon. Set the favicon now, and if the favicon turns out | 416 // doesn't have an icon. Set the favicon now, and if the favicon turns out |
416 // to be expired (or the wrong url) we'll fetch later on. This way the | 417 // to be expired (or the wrong url) we'll fetch later on. This way the |
417 // user doesn't see a flash of the default favicon. | 418 // user doesn't see a flash of the default favicon. |
418 entry->GetFavicon().url = favicon.icon_url; | 419 entry->GetFavicon().url = favicon_data.icon_url; |
419 if (favicon.is_valid()) | 420 if (favicon_data.has_valid_bitmaps()) |
420 UpdateFavicon(entry, favicon.image_data); | 421 UpdateFavicon(entry, favicon_data.first_bitmap()); |
421 entry->GetFavicon().valid = true; | 422 entry->GetFavicon().valid = true; |
422 } | 423 } |
423 | 424 |
424 if (favicon.known_icon && !favicon.expired) { | 425 if (favicon_data.known_icon && !favicon_data.expired()) { |
425 if (current_candidate() && | 426 if (current_candidate() && |
426 !DoUrlAndIconMatch( | 427 !DoUrlAndIconMatch(*current_candidate(), |
427 *current_candidate(), favicon.icon_url, favicon.icon_type)) { | 428 favicon_data.icon_url, favicon_data.icon_type)) { |
428 // Mapping in the database is wrong. DownloadFavIconOrAskHistory will | 429 // Mapping in the database is wrong. DownloadFavIconOrAskHistory will |
429 // update the mapping for this url and download the favicon if we don't | 430 // update the mapping for this url and download the favicon if we don't |
430 // already have it. | 431 // already have it. |
431 DownloadFaviconOrAskHistory(entry->GetURL(), | 432 DownloadFaviconOrAskHistory(entry->GetURL(), |
432 current_candidate()->icon_url, | 433 current_candidate()->icon_url, |
433 static_cast<history::IconType>(current_candidate()->icon_type)); | 434 static_cast<history::IconType>(current_candidate()->icon_type)); |
434 } | 435 } |
435 } else if (current_candidate()) { | 436 } else if (current_candidate()) { |
436 // We know the official url for the favicon, by either don't have the | 437 // We know the official url for the favicon, by either don't have the |
437 // favicon or its expired. Continue on to DownloadFaviconOrAskHistory to | 438 // favicon or its expired. Continue on to DownloadFaviconOrAskHistory to |
(...skipping 28 matching lines...) Expand all Loading... |
466 // This is asynchronous. The history service will call back when done. | 467 // This is asynchronous. The history service will call back when done. |
467 // Issue the request and associate the current page ID with it. | 468 // Issue the request and associate the current page ID with it. |
468 UpdateFaviconMappingAndFetch(page_url, icon_url, icon_type, | 469 UpdateFaviconMappingAndFetch(page_url, icon_url, icon_type, |
469 &cancelable_consumer_, | 470 &cancelable_consumer_, |
470 base::Bind(&FaviconHandler::OnFaviconData, base::Unretained(this))); | 471 base::Bind(&FaviconHandler::OnFaviconData, base::Unretained(this))); |
471 } | 472 } |
472 } | 473 } |
473 } | 474 } |
474 | 475 |
475 void FaviconHandler::OnFaviconData(FaviconService::Handle handle, | 476 void FaviconHandler::OnFaviconData(FaviconService::Handle handle, |
476 history::FaviconData favicon) { | 477 history::FaviconData favicon_data, |
| 478 std::vector<GURL> icon_urls_in_db) { |
477 NavigationEntry* entry = GetEntry(); | 479 NavigationEntry* entry = GetEntry(); |
478 if (!entry) | 480 if (!entry) |
479 return; | 481 return; |
480 | 482 |
481 // No need to update the favicon url. By the time we get here | 483 // No need to update the favicon url. By the time we get here |
482 // UpdateFaviconURL will have set the favicon url. | 484 // UpdateFaviconURL will have set the favicon url. |
483 if (favicon.icon_type == history::FAVICON) { | 485 if (favicon_data.icon_type == history::FAVICON) { |
484 if (favicon.is_valid()) { | 486 if (favicon_data.has_valid_bitmaps()) { |
485 // There is a favicon, set it now. If expired we'll download the current | 487 // There is a favicon, set it now. If expired we'll download the current |
486 // one again, but at least the user will get some icon instead of the | 488 // one again, but at least the user will get some icon instead of the |
487 // default and most likely the current one is fine anyway. | 489 // default and most likely the current one is fine anyway. |
488 UpdateFavicon(entry, favicon.image_data); | 490 UpdateFavicon(entry, favicon_data.first_bitmap()); |
489 } | 491 } |
490 if (!favicon.known_icon || favicon.expired) { | 492 if (!favicon_data.known_icon || favicon_data.expired()) { |
491 // We don't know the favicon, or it is out of date. Request the current | 493 // We don't know the favicon, or it is out of date. Request the current |
492 // one. | 494 // one. |
493 ScheduleDownload(entry->GetURL(), entry->GetFavicon().url, | 495 ScheduleDownload(entry->GetURL(), entry->GetFavicon().url, |
494 preferred_icon_size(), | 496 preferred_icon_size(), |
495 history::FAVICON, | 497 history::FAVICON, |
496 FaviconTabHelper::ImageDownloadCallback()); | 498 FaviconTabHelper::ImageDownloadCallback()); |
497 } | 499 } |
498 } else if (current_candidate() && (!favicon.known_icon || favicon.expired || | 500 } else if (current_candidate() && |
499 !(DoUrlAndIconMatch( | 501 (!favicon_data.known_icon || favicon_data.expired() || |
500 *current_candidate(), favicon.icon_url, favicon.icon_type)))) { | 502 !(DoUrlAndIconMatch(*current_candidate(), |
| 503 favicon_data.icon_url, favicon_data.icon_type)))) { |
501 // We don't know the favicon, it is out of date or its type is not same as | 504 // We don't know the favicon, it is out of date or its type is not same as |
502 // one got from page. Request the current one. | 505 // one got from page. Request the current one. |
503 ScheduleDownload(entry->GetURL(), current_candidate()->icon_url, | 506 ScheduleDownload(entry->GetURL(), current_candidate()->icon_url, |
504 preferred_icon_size(), | 507 preferred_icon_size(), |
505 ToHistoryIconType(current_candidate()->icon_type), | 508 ToHistoryIconType(current_candidate()->icon_type), |
506 FaviconTabHelper::ImageDownloadCallback()); | 509 FaviconTabHelper::ImageDownloadCallback()); |
507 } | 510 } |
508 history_icon_ = favicon; | 511 history_icon_ = favicon_data; |
509 } | 512 } |
510 | 513 |
511 int FaviconHandler::ScheduleDownload( | 514 int FaviconHandler::ScheduleDownload( |
512 const GURL& url, | 515 const GURL& url, |
513 const GURL& image_url, | 516 const GURL& image_url, |
514 int image_size, | 517 int image_size, |
515 history::IconType icon_type, | 518 history::IconType icon_type, |
516 const FaviconTabHelper::ImageDownloadCallback& callback) { | 519 const FaviconTabHelper::ImageDownloadCallback& callback) { |
517 const int download_id = DownloadFavicon(image_url, image_size); | 520 const int download_id = DownloadFavicon(image_url, image_size); |
518 if (download_id) { | 521 if (download_id) { |
(...skipping 13 matching lines...) Expand all Loading... |
532 int height = bitmap.height(); | 535 int height = bitmap.height(); |
533 if (width > 0 && height > 0) { | 536 if (width > 0 && height > 0) { |
534 gfx::CalculateFaviconTargetSize(&width, &height); | 537 gfx::CalculateFaviconTargetSize(&width, &height); |
535 return gfx::Image(skia::ImageOperations::Resize( | 538 return gfx::Image(skia::ImageOperations::Resize( |
536 bitmap, skia::ImageOperations::RESIZE_LANCZOS3, | 539 bitmap, skia::ImageOperations::RESIZE_LANCZOS3, |
537 width, height)); | 540 width, height)); |
538 } | 541 } |
539 | 542 |
540 return image; | 543 return image; |
541 } | 544 } |
OLD | NEW |