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<set> |
| 8 #include<vector> |
| 9 |
7 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
8 #include "components/favicon/core/favicon_driver.h" | 11 #include "components/favicon/core/favicon_driver.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
10 #include "third_party/skia/include/core/SkBitmap.h" | 13 #include "third_party/skia/include/core/SkBitmap.h" |
11 #include "ui/base/layout.h" | 14 #include "ui/base/layout.h" |
12 #include "ui/gfx/codec/png_codec.h" | 15 #include "ui/gfx/codec/png_codec.h" |
13 #include "ui/gfx/favicon_size.h" | 16 #include "ui/gfx/favicon_size.h" |
14 #include "ui/gfx/image/image.h" | 17 #include "ui/gfx/image/image.h" |
15 | 18 |
16 namespace favicon { | 19 namespace favicon { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 favicon_base::FAVICON, | 65 favicon_base::FAVICON, |
63 false /* expired */, | 66 false /* expired */, |
64 favicon_bitmap_results); | 67 favicon_bitmap_results); |
65 } | 68 } |
66 | 69 |
67 // This class is used to save the download request for verifying with test case. | 70 // This class is used to save the download request for verifying with test case. |
68 // It also will be used to invoke the onDidDownload callback. | 71 // It also will be used to invoke the onDidDownload callback. |
69 class DownloadHandler { | 72 class DownloadHandler { |
70 public: | 73 public: |
71 explicit DownloadHandler(FaviconHandler* favicon_handler) | 74 explicit DownloadHandler(FaviconHandler* favicon_handler) |
72 : favicon_handler_(favicon_handler), failed_(false) {} | 75 : favicon_handler_(favicon_handler), callback_invoked_(false) {} |
73 | 76 |
74 ~DownloadHandler() {} | 77 ~DownloadHandler() {} |
75 | 78 |
76 void Reset() { | 79 void Reset() { |
77 download_.reset(); | 80 download_.reset(); |
78 failed_ = false; | 81 callback_invoked_ = false; |
| 82 // Does not affect |should_fail_download_icon_urls_| and |
| 83 // |failed_download_icon_urls_|. |
| 84 } |
| 85 |
| 86 // Make downloads for any of |icon_urls| fail. |
| 87 void FailDownloadForIconURLs(const std::set<GURL>& icon_urls) { |
| 88 should_fail_download_icon_urls_ = icon_urls; |
| 89 } |
| 90 |
| 91 // Returns whether a download for |icon_url| did fail. |
| 92 bool DidFailDownloadForIconURL(const GURL& icon_url) const { |
| 93 return failed_download_icon_urls_.count(icon_url); |
79 } | 94 } |
80 | 95 |
81 void AddDownload( | 96 void AddDownload( |
82 int download_id, | 97 int download_id, |
83 const GURL& image_url, | 98 const GURL& image_url, |
84 const std::vector<int>& image_sizes, | 99 const std::vector<int>& image_sizes, |
85 int max_image_size) { | 100 int max_image_size) { |
86 download_.reset(new Download( | 101 download_.reset(new Download( |
87 download_id, image_url, image_sizes, max_image_size, false)); | 102 download_id, image_url, image_sizes, max_image_size)); |
88 } | 103 } |
89 | 104 |
90 void InvokeCallback(); | 105 void InvokeCallback(); |
91 | 106 |
92 void set_failed(bool failed) { failed_ = failed; } | |
93 | |
94 bool HasDownload() const { return download_.get(); } | 107 bool HasDownload() const { return download_.get(); } |
95 const GURL& GetImageUrl() const { return download_->image_url; } | 108 const GURL& GetImageUrl() const { return download_->image_url; } |
96 void SetImageSizes(const std::vector<int>& sizes) { | 109 void SetImageSizes(const std::vector<int>& sizes) { |
97 download_->image_sizes = sizes; } | 110 download_->image_sizes = sizes; } |
98 | 111 |
99 private: | 112 private: |
100 struct Download { | 113 struct Download { |
101 Download(int id, | 114 Download(int id, |
102 GURL url, | 115 GURL url, |
103 const std::vector<int>& sizes, | 116 const std::vector<int>& sizes, |
104 int max_size, | 117 int max_size) |
105 bool failed) | |
106 : download_id(id), | 118 : download_id(id), |
107 image_url(url), | 119 image_url(url), |
108 image_sizes(sizes), | 120 image_sizes(sizes), |
109 max_image_size(max_size) {} | 121 max_image_size(max_size) {} |
110 ~Download() {} | 122 ~Download() {} |
111 int download_id; | 123 int download_id; |
112 GURL image_url; | 124 GURL image_url; |
113 std::vector<int> image_sizes; | 125 std::vector<int> image_sizes; |
114 int max_image_size; | 126 int max_image_size; |
115 }; | 127 }; |
116 | 128 |
117 FaviconHandler* favicon_handler_; | 129 FaviconHandler* favicon_handler_; |
118 scoped_ptr<Download> download_; | 130 scoped_ptr<Download> download_; |
119 bool failed_; | 131 bool callback_invoked_; |
| 132 |
| 133 // The icon URLs for which the download should fail. |
| 134 std::set<GURL> should_fail_download_icon_urls_; |
| 135 |
| 136 // The icon URLs for which the download did fail. This should be a subset of |
| 137 // |should_fail_download_icon_urls_|. |
| 138 std::set<GURL> failed_download_icon_urls_; |
120 | 139 |
121 DISALLOW_COPY_AND_ASSIGN(DownloadHandler); | 140 DISALLOW_COPY_AND_ASSIGN(DownloadHandler); |
122 }; | 141 }; |
123 | 142 |
124 // This class is used to save the history request for verifying with test case. | 143 // This class is used to save the history request for verifying with test case. |
125 // It also will be used to simulate the history response. | 144 // It also will be used to simulate the history response. |
126 class HistoryRequestHandler { | 145 class HistoryRequestHandler { |
127 public: | 146 public: |
128 HistoryRequestHandler(const GURL& page_url, | 147 HistoryRequestHandler(const GURL& page_url, |
129 const GURL& icon_url, | 148 const GURL& icon_url, |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 void GetFaviconForURLFromFaviconService( | 371 void GetFaviconForURLFromFaviconService( |
353 const GURL& page_url, | 372 const GURL& page_url, |
354 int icon_types, | 373 int icon_types, |
355 const favicon_base::FaviconResultsCallback& callback, | 374 const favicon_base::FaviconResultsCallback& callback, |
356 base::CancelableTaskTracker* tracker) override { | 375 base::CancelableTaskTracker* tracker) override { |
357 history_handler_.reset(new HistoryRequestHandler(page_url, GURL(), | 376 history_handler_.reset(new HistoryRequestHandler(page_url, GURL(), |
358 icon_types, callback)); | 377 icon_types, callback)); |
359 } | 378 } |
360 | 379 |
361 int DownloadFavicon(const GURL& image_url, int max_bitmap_size) override { | 380 int DownloadFavicon(const GURL& image_url, int max_bitmap_size) override { |
| 381 // Do not do a download if downloading |image_url| failed previously. This |
| 382 // emulates the behavior of FaviconDriver::StartDownload() |
| 383 if (download_handler_->DidFailDownloadForIconURL(image_url)) { |
| 384 download_handler_->AddDownload(download_id_, image_url, |
| 385 std::vector<int>(), 0); |
| 386 return 0; |
| 387 } |
| 388 |
362 download_id_++; | 389 download_id_++; |
363 std::vector<int> sizes; | 390 std::vector<int> sizes; |
364 sizes.push_back(0); | 391 sizes.push_back(0); |
365 download_handler_->AddDownload( | 392 download_handler_->AddDownload( |
366 download_id_, image_url, sizes, max_bitmap_size); | 393 download_id_, image_url, sizes, max_bitmap_size); |
367 return download_id_; | 394 return download_id_; |
368 } | 395 } |
369 | 396 |
370 void SetHistoryFavicons(const GURL& page_url, | 397 void SetHistoryFavicons(const GURL& page_url, |
371 const GURL& icon_url, | 398 const GURL& icon_url, |
(...skipping 24 matching lines...) Expand all Loading... |
396 | 423 |
397 namespace { | 424 namespace { |
398 | 425 |
399 void HistoryRequestHandler::InvokeCallback() { | 426 void HistoryRequestHandler::InvokeCallback() { |
400 if (!callback_.is_null()) { | 427 if (!callback_.is_null()) { |
401 callback_.Run(history_results_); | 428 callback_.Run(history_results_); |
402 } | 429 } |
403 } | 430 } |
404 | 431 |
405 void DownloadHandler::InvokeCallback() { | 432 void DownloadHandler::InvokeCallback() { |
| 433 if (callback_invoked_) |
| 434 return; |
| 435 |
406 std::vector<gfx::Size> original_bitmap_sizes; | 436 std::vector<gfx::Size> original_bitmap_sizes; |
407 std::vector<SkBitmap> bitmaps; | 437 std::vector<SkBitmap> bitmaps; |
408 if (!failed_) { | 438 if (should_fail_download_icon_urls_.count(download_->image_url)) { |
| 439 failed_download_icon_urls_.insert(download_->image_url); |
| 440 } else { |
409 for (std::vector<int>::const_iterator i = download_->image_sizes.begin(); | 441 for (std::vector<int>::const_iterator i = download_->image_sizes.begin(); |
410 i != download_->image_sizes.end(); ++i) { | 442 i != download_->image_sizes.end(); ++i) { |
411 int original_size = (*i > 0) ? *i : gfx::kFaviconSize; | 443 int original_size = (*i > 0) ? *i : gfx::kFaviconSize; |
412 int downloaded_size = original_size; | 444 int downloaded_size = original_size; |
413 if (download_->max_image_size != 0 && | 445 if (download_->max_image_size != 0 && |
414 downloaded_size > download_->max_image_size) { | 446 downloaded_size > download_->max_image_size) { |
415 downloaded_size = download_->max_image_size; | 447 downloaded_size = download_->max_image_size; |
416 } | 448 } |
417 SkBitmap bitmap; | 449 SkBitmap bitmap; |
418 FillDataToBitmap(downloaded_size, downloaded_size, &bitmap); | 450 FillDataToBitmap(downloaded_size, downloaded_size, &bitmap); |
419 bitmaps.push_back(bitmap); | 451 bitmaps.push_back(bitmap); |
420 original_bitmap_sizes.push_back(gfx::Size(original_size, original_size)); | 452 original_bitmap_sizes.push_back(gfx::Size(original_size, original_size)); |
421 } | 453 } |
422 } | 454 } |
423 favicon_handler_->OnDidDownloadFavicon(download_->download_id, | 455 favicon_handler_->OnDidDownloadFavicon(download_->download_id, |
424 download_->image_url, bitmaps, | 456 download_->image_url, bitmaps, |
425 original_bitmap_sizes); | 457 original_bitmap_sizes); |
| 458 callback_invoked_ = true; |
426 } | 459 } |
427 | 460 |
428 class FaviconHandlerTest : public testing::Test { | 461 class FaviconHandlerTest : public testing::Test { |
429 public: | 462 public: |
430 FaviconHandlerTest() { | 463 FaviconHandlerTest() { |
431 } | 464 } |
432 | 465 |
433 ~FaviconHandlerTest() override {} | 466 ~FaviconHandlerTest() override {} |
434 | 467 |
435 // Simulates requesting a favicon for |page_url| given: | 468 // Simulates requesting a favicon for |page_url| given: |
(...skipping 17 matching lines...) Expand all Loading... |
453 favicon_handler->history_handler()->history_results_.clear(); | 486 favicon_handler->history_handler()->history_results_.clear(); |
454 favicon_handler->history_handler()->InvokeCallback(); | 487 favicon_handler->history_handler()->InvokeCallback(); |
455 ASSERT_TRUE(download_handler->HasDownload()); | 488 ASSERT_TRUE(download_handler->HasDownload()); |
456 EXPECT_EQ(download_handler->GetImageUrl(), | 489 EXPECT_EQ(download_handler->GetImageUrl(), |
457 candidate_icons[i].icon_url); | 490 candidate_icons[i].icon_url); |
458 std::vector<int> sizes; | 491 std::vector<int> sizes; |
459 sizes.push_back(candidate_icon_sizes[i]); | 492 sizes.push_back(candidate_icon_sizes[i]); |
460 download_handler->SetImageSizes(sizes); | 493 download_handler->SetImageSizes(sizes); |
461 download_handler->InvokeCallback(); | 494 download_handler->InvokeCallback(); |
462 | 495 |
| 496 download_handler->Reset(); |
| 497 |
463 if (favicon_driver->num_active_favicon()) | 498 if (favicon_driver->num_active_favicon()) |
464 return; | 499 return; |
465 } | 500 } |
466 } | 501 } |
467 | 502 |
468 void UpdateFaviconURL(TestFaviconDriver* favicon_driver, | 503 void UpdateFaviconURL(TestFaviconDriver* favicon_driver, |
469 TestFaviconHandler* favicon_handler, | 504 TestFaviconHandler* favicon_handler, |
470 const GURL& page_url, | 505 const GURL& page_url, |
471 const std::vector<FaviconURL>& candidate_icons) { | 506 const std::vector<FaviconURL>& candidate_icons) { |
472 favicon_driver->ResetNumActiveFavicon(); | 507 favicon_driver->ResetNumActiveFavicon(); |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 EXPECT_FALSE(driver.GetActiveFaviconImage().IsEmpty()); | 845 EXPECT_FALSE(driver.GetActiveFaviconImage().IsEmpty()); |
811 } | 846 } |
812 | 847 |
813 TEST_F(FaviconHandlerTest, Download2ndFaviconURLCandidate) { | 848 TEST_F(FaviconHandlerTest, Download2ndFaviconURLCandidate) { |
814 const GURL page_url("http://www.google.com"); | 849 const GURL page_url("http://www.google.com"); |
815 const GURL icon_url("http://www.google.com/favicon"); | 850 const GURL icon_url("http://www.google.com/favicon"); |
816 const GURL new_icon_url("http://www.google.com/new_favicon"); | 851 const GURL new_icon_url("http://www.google.com/new_favicon"); |
817 | 852 |
818 TestFaviconDriver driver; | 853 TestFaviconDriver driver; |
819 TestFaviconHandler helper(page_url, &driver, FaviconHandler::TOUCH, false); | 854 TestFaviconHandler helper(page_url, &driver, FaviconHandler::TOUCH, false); |
| 855 std::set<GURL> fail_downloads; |
| 856 fail_downloads.insert(icon_url); |
| 857 helper.download_handler()->FailDownloadForIconURLs(fail_downloads); |
820 | 858 |
821 helper.FetchFavicon(page_url); | 859 helper.FetchFavicon(page_url); |
822 HistoryRequestHandler* history_handler = helper.history_handler(); | 860 HistoryRequestHandler* history_handler = helper.history_handler(); |
823 // Ensure the data given to history is correct. | 861 // Ensure the data given to history is correct. |
824 ASSERT_TRUE(history_handler); | 862 ASSERT_TRUE(history_handler); |
825 EXPECT_EQ(page_url, history_handler->page_url_); | 863 EXPECT_EQ(page_url, history_handler->page_url_); |
826 EXPECT_EQ(GURL(), history_handler->icon_url_); | 864 EXPECT_EQ(GURL(), history_handler->icon_url_); |
827 EXPECT_EQ(favicon_base::TOUCH_PRECOMPOSED_ICON | favicon_base::TOUCH_ICON, | 865 EXPECT_EQ(favicon_base::TOUCH_PRECOMPOSED_ICON | favicon_base::TOUCH_ICON, |
828 history_handler->icon_type_); | 866 history_handler->icon_type_); |
829 | 867 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
871 // Should request download favicon. | 909 // Should request download favicon. |
872 DownloadHandler* download_handler = helper.download_handler(); | 910 DownloadHandler* download_handler = helper.download_handler(); |
873 EXPECT_TRUE(helper.download_handler()->HasDownload()); | 911 EXPECT_TRUE(helper.download_handler()->HasDownload()); |
874 | 912 |
875 // Verify the download request. | 913 // Verify the download request. |
876 EXPECT_EQ(icon_url, download_handler->GetImageUrl()); | 914 EXPECT_EQ(icon_url, download_handler->GetImageUrl()); |
877 | 915 |
878 // Reset the history_handler to verify whether favicon is request from | 916 // Reset the history_handler to verify whether favicon is request from |
879 // history. | 917 // history. |
880 helper.set_history_handler(nullptr); | 918 helper.set_history_handler(nullptr); |
881 // Smulates download failed. | |
882 download_handler->set_failed(true); | |
883 download_handler->InvokeCallback(); | 919 download_handler->InvokeCallback(); |
884 | 920 |
885 // Left 1 url. | 921 // Left 1 url. |
886 EXPECT_EQ(1U, helper.urls().size()); | 922 EXPECT_EQ(1U, helper.urls().size()); |
887 ASSERT_TRUE(helper.current_candidate()); | 923 ASSERT_TRUE(helper.current_candidate()); |
888 EXPECT_EQ(new_icon_url, helper.current_candidate()->icon_url); | 924 EXPECT_EQ(new_icon_url, helper.current_candidate()->icon_url); |
889 EXPECT_EQ(favicon_base::TOUCH_ICON, helper.current_candidate()->icon_type); | 925 EXPECT_EQ(favicon_base::TOUCH_ICON, helper.current_candidate()->icon_type); |
890 | 926 |
891 // Favicon should be requested from history. | 927 // Favicon should be requested from history. |
892 history_handler = helper.history_handler(); | 928 history_handler = helper.history_handler(); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1028 SetFaviconRawBitmapResult(latest_icon_url, | 1064 SetFaviconRawBitmapResult(latest_icon_url, |
1029 favicon_base::TOUCH_ICON, | 1065 favicon_base::TOUCH_ICON, |
1030 false /* expired */, | 1066 false /* expired */, |
1031 &handler->history_results_); | 1067 &handler->history_results_); |
1032 handler->InvokeCallback(); | 1068 handler->InvokeCallback(); |
1033 | 1069 |
1034 // No download request. | 1070 // No download request. |
1035 EXPECT_FALSE(download_handler->HasDownload()); | 1071 EXPECT_FALSE(download_handler->HasDownload()); |
1036 } | 1072 } |
1037 | 1073 |
1038 #if !defined(OS_ANDROID) | |
1039 | |
1040 // Test the favicon which is selected when the web page provides several | 1074 // Test the favicon which is selected when the web page provides several |
1041 // favicons and none of the favicons are cached in history. | 1075 // favicons and none of the favicons are cached in history. |
1042 // The goal of this test is to be more of an integration test than | 1076 // The goal of this test is to be more of an integration test than |
1043 // SelectFaviconFramesTest.*. | 1077 // SelectFaviconFramesTest.*. |
1044 TEST_F(FaviconHandlerTest, MultipleFavicons) { | 1078 TEST_F(FaviconHandlerTest, MultipleFavicons) { |
1045 const GURL kPageURL("http://www.google.com"); | 1079 const GURL kPageURL("http://www.google.com"); |
1046 const FaviconURL kSourceIconURLs[] = { | 1080 const FaviconURL kSourceIconURLs[] = { |
1047 FaviconURL(GURL("http://www.google.com/a"), | 1081 FaviconURL(GURL("http://www.google.com/a"), |
1048 favicon_base::FAVICON, | 1082 favicon_base::FAVICON, |
1049 std::vector<gfx::Size>()), | 1083 std::vector<gfx::Size>()), |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1132 kSourceIconURLs + arraysize(kSizes4)); | 1166 kSourceIconURLs + arraysize(kSizes4)); |
1133 DownloadTillDoneIgnoringHistory( | 1167 DownloadTillDoneIgnoringHistory( |
1134 &driver4, &handler4, kPageURL, urls4, kSizes4); | 1168 &driver4, &handler4, kPageURL, urls4, kSizes4); |
1135 EXPECT_TRUE(driver4.GetActiveFaviconValidity()); | 1169 EXPECT_TRUE(driver4.GetActiveFaviconValidity()); |
1136 expected_index = 0u; | 1170 expected_index = 0u; |
1137 EXPECT_EQ(17, kSizes4[expected_index]); | 1171 EXPECT_EQ(17, kSizes4[expected_index]); |
1138 EXPECT_EQ(kSourceIconURLs[expected_index].icon_url, | 1172 EXPECT_EQ(kSourceIconURLs[expected_index].icon_url, |
1139 driver4.GetActiveFaviconURL()); | 1173 driver4.GetActiveFaviconURL()); |
1140 } | 1174 } |
1141 | 1175 |
1142 #endif | 1176 // Test that the best favicon is selected when: |
| 1177 // - The page provides several favicons. |
| 1178 // - Downloading one of the page's icon URLs previously returned a 404. |
| 1179 // - None of the favicons are cached in the Favicons database. |
| 1180 TEST_F(FaviconHandlerTest, MultipleFavicons404) { |
| 1181 const GURL kPageURL("http://www.google.com"); |
| 1182 const GURL k404IconURL("http://www.google.com/404.png"); |
| 1183 const FaviconURL k404FaviconURL( |
| 1184 k404IconURL, favicon_base::FAVICON, std::vector<gfx::Size>()); |
| 1185 const FaviconURL kFaviconURLs[] = { |
| 1186 FaviconURL(GURL("http://www.google.com/a"), |
| 1187 favicon_base::FAVICON, |
| 1188 std::vector<gfx::Size>()), |
| 1189 k404FaviconURL, |
| 1190 FaviconURL(GURL("http://www.google.com/c"), |
| 1191 favicon_base::FAVICON, |
| 1192 std::vector<gfx::Size>()), |
| 1193 }; |
| 1194 |
| 1195 TestFaviconDriver driver; |
| 1196 TestFaviconHandler handler(kPageURL, &driver, FaviconHandler::FAVICON, false); |
| 1197 DownloadHandler* download_handler = handler.download_handler(); |
| 1198 |
| 1199 std::set<GURL> k404URLs; |
| 1200 k404URLs.insert(k404IconURL); |
| 1201 download_handler->FailDownloadForIconURLs(k404URLs); |
| 1202 |
| 1203 // Make the initial download for |k404IconURL| fail. |
| 1204 const int kSizes1[] = { 0 }; |
| 1205 std::vector<FaviconURL> urls1(1u, k404FaviconURL); |
| 1206 DownloadTillDoneIgnoringHistory( |
| 1207 &driver, &handler, kPageURL, urls1, kSizes1); |
| 1208 EXPECT_TRUE(download_handler->DidFailDownloadForIconURL(k404IconURL)); |
| 1209 |
| 1210 // Do a fetch now that the initial download for |k404IconURL| has failed. The |
| 1211 // behavior is different because OnDidDownloadFavicon() is invoked |
| 1212 // synchronously from DownloadFavicon(). |
| 1213 const int kSizes2[] = { 10, 0, 16 }; |
| 1214 std::vector<FaviconURL> urls2(kFaviconURLs, |
| 1215 kFaviconURLs + arraysize(kFaviconURLs)); |
| 1216 DownloadTillDoneIgnoringHistory( |
| 1217 &driver, &handler, kPageURL, urls2, kSizes2); |
| 1218 |
| 1219 EXPECT_EQ(0u, handler.image_urls().size()); |
| 1220 EXPECT_TRUE(driver.GetActiveFaviconValidity()); |
| 1221 EXPECT_FALSE(driver.GetActiveFaviconImage().IsEmpty()); |
| 1222 int expected_index = 2u; |
| 1223 EXPECT_EQ(16, kSizes2[expected_index]); |
| 1224 EXPECT_EQ(kFaviconURLs[expected_index].icon_url, |
| 1225 driver.GetActiveFaviconURL()); |
| 1226 } |
| 1227 |
| 1228 // Test that no favicon is selected when: |
| 1229 // - The page provides several favicons. |
| 1230 // - Downloading the page's icons has previously returned a 404. |
| 1231 // - None of the favicons are cached in the Favicons database. |
| 1232 TEST_F(FaviconHandlerTest, MultipleFaviconsAll404) { |
| 1233 const GURL kPageURL("http://www.google.com"); |
| 1234 const GURL k404IconURL1("http://www.google.com/4041.png"); |
| 1235 const GURL k404IconURL2("http://www.google.com/4042.png"); |
| 1236 const FaviconURL kFaviconURLs[] = { |
| 1237 FaviconURL(k404IconURL1, |
| 1238 favicon_base::FAVICON, |
| 1239 std::vector<gfx::Size>()), |
| 1240 FaviconURL(k404IconURL2, |
| 1241 favicon_base::FAVICON, |
| 1242 std::vector<gfx::Size>()), |
| 1243 }; |
| 1244 |
| 1245 TestFaviconDriver driver; |
| 1246 TestFaviconHandler handler(kPageURL, &driver, FaviconHandler::FAVICON, false); |
| 1247 DownloadHandler* download_handler = handler.download_handler(); |
| 1248 |
| 1249 std::set<GURL> k404URLs; |
| 1250 k404URLs.insert(k404IconURL1); |
| 1251 k404URLs.insert(k404IconURL2); |
| 1252 download_handler->FailDownloadForIconURLs(k404URLs); |
| 1253 |
| 1254 // Make the initial downloads for |kFaviconURLs| fail. |
| 1255 for (const FaviconURL& favicon_url : kFaviconURLs) { |
| 1256 const int kSizes[] = { 0 }; |
| 1257 std::vector<FaviconURL> urls(1u, favicon_url); |
| 1258 DownloadTillDoneIgnoringHistory(&driver, &handler, kPageURL, urls, kSizes); |
| 1259 } |
| 1260 EXPECT_TRUE(download_handler->DidFailDownloadForIconURL(k404IconURL1)); |
| 1261 EXPECT_TRUE(download_handler->DidFailDownloadForIconURL(k404IconURL2)); |
| 1262 |
| 1263 // Do a fetch now that the initial downloads for |kFaviconURLs| have failed. |
| 1264 // The behavior is different because OnDidDownloadFavicon() is invoked |
| 1265 // synchronously from DownloadFavicon(). |
| 1266 const int kSizes[] = { 0, 0 }; |
| 1267 std::vector<FaviconURL> urls(kFaviconURLs, |
| 1268 kFaviconURLs + arraysize(kFaviconURLs)); |
| 1269 DownloadTillDoneIgnoringHistory(&driver, &handler, kPageURL, urls, kSizes); |
| 1270 |
| 1271 EXPECT_EQ(0u, handler.image_urls().size()); |
| 1272 EXPECT_FALSE(driver.GetActiveFaviconValidity()); |
| 1273 EXPECT_TRUE(driver.GetActiveFaviconImage().IsEmpty()); |
| 1274 } |
| 1275 |
| 1276 // Test that no favicon is selected when the page's only icon uses an invalid |
| 1277 // URL syntax. |
| 1278 TEST_F(FaviconHandlerTest, FaviconInvalidURL) { |
| 1279 const GURL kPageURL("http://www.google.com"); |
| 1280 const GURL kInvalidFormatURL("invalid"); |
| 1281 ASSERT_TRUE(kInvalidFormatURL.is_empty()); |
| 1282 |
| 1283 FaviconURL favicon_url(kInvalidFormatURL, favicon_base::FAVICON, |
| 1284 std::vector<gfx::Size>()); |
| 1285 |
| 1286 TestFaviconDriver driver; |
| 1287 TestFaviconHandler handler(kPageURL, &driver, FaviconHandler::FAVICON, false); |
| 1288 UpdateFaviconURL(&driver, &handler, kPageURL, |
| 1289 std::vector<FaviconURL>(1u, favicon_url)); |
| 1290 EXPECT_EQ(0u, handler.image_urls().size()); |
| 1291 } |
1143 | 1292 |
1144 TEST_F(FaviconHandlerTest, TestSortFavicon) { | 1293 TEST_F(FaviconHandlerTest, TestSortFavicon) { |
1145 const GURL kPageURL("http://www.google.com"); | 1294 const GURL kPageURL("http://www.google.com"); |
1146 std::vector<gfx::Size> icon1; | 1295 std::vector<gfx::Size> icon1; |
1147 icon1.push_back(gfx::Size(1024, 1024)); | 1296 icon1.push_back(gfx::Size(1024, 1024)); |
1148 icon1.push_back(gfx::Size(512, 512)); | 1297 icon1.push_back(gfx::Size(512, 512)); |
1149 | 1298 |
1150 std::vector<gfx::Size> icon2; | 1299 std::vector<gfx::Size> icon2; |
1151 icon2.push_back(gfx::Size(15, 15)); | 1300 icon2.push_back(gfx::Size(15, 15)); |
1152 icon2.push_back(gfx::Size(16, 16)); | 1301 icon2.push_back(gfx::Size(16, 16)); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1225 FaviconURL(GURL("http://www.google.com/d"), | 1374 FaviconURL(GURL("http://www.google.com/d"), |
1226 favicon_base::FAVICON, | 1375 favicon_base::FAVICON, |
1227 std::vector<gfx::Size>()), | 1376 std::vector<gfx::Size>()), |
1228 FaviconURL(GURL("http://www.google.com/e"), | 1377 FaviconURL(GURL("http://www.google.com/e"), |
1229 favicon_base::FAVICON, | 1378 favicon_base::FAVICON, |
1230 std::vector<gfx::Size>())}; | 1379 std::vector<gfx::Size>())}; |
1231 | 1380 |
1232 TestFaviconDriver driver1; | 1381 TestFaviconDriver driver1; |
1233 TestFaviconHandler handler1(kPageURL, &driver1, FaviconHandler::FAVICON, | 1382 TestFaviconHandler handler1(kPageURL, &driver1, FaviconHandler::FAVICON, |
1234 true); | 1383 true); |
| 1384 |
| 1385 std::set<GURL> fail_icon_urls; |
| 1386 for (size_t i = 0; i < arraysize(kSourceIconURLs); ++i) { |
| 1387 fail_icon_urls.insert(kSourceIconURLs[i].icon_url); |
| 1388 } |
| 1389 handler1.download_handler()->FailDownloadForIconURLs(fail_icon_urls); |
| 1390 |
1235 std::vector<FaviconURL> urls1(kSourceIconURLs, | 1391 std::vector<FaviconURL> urls1(kSourceIconURLs, |
1236 kSourceIconURLs + arraysize(kSourceIconURLs)); | 1392 kSourceIconURLs + arraysize(kSourceIconURLs)); |
1237 UpdateFaviconURL(&driver1, &handler1, kPageURL, urls1); | 1393 UpdateFaviconURL(&driver1, &handler1, kPageURL, urls1); |
1238 | 1394 |
1239 // Simulate the download failed, to check whether the icons were requested | 1395 // Simulate the download failed, to check whether the icons were requested |
1240 // to download according their size. | 1396 // to download according their size. |
1241 struct ExpectedResult { | 1397 struct ExpectedResult { |
1242 // The size of image_urls_. | 1398 // The size of image_urls_. |
1243 size_t image_urls_size; | 1399 size_t image_urls_size; |
1244 // The favicon's index in kSourceIconURLs. | 1400 // The favicon's index in kSourceIconURLs. |
(...skipping 20 matching lines...) Expand all Loading... |
1265 | 1421 |
1266 // Simulate no favicon from history. | 1422 // Simulate no favicon from history. |
1267 handler1.history_handler()->history_results_.clear(); | 1423 handler1.history_handler()->history_results_.clear(); |
1268 handler1.history_handler()->InvokeCallback(); | 1424 handler1.history_handler()->InvokeCallback(); |
1269 | 1425 |
1270 // Verify download request | 1426 // Verify download request |
1271 ASSERT_TRUE(handler1.download_handler()->HasDownload()); | 1427 ASSERT_TRUE(handler1.download_handler()->HasDownload()); |
1272 EXPECT_EQ(kSourceIconURLs[results[i].favicon_index].icon_url, | 1428 EXPECT_EQ(kSourceIconURLs[results[i].favicon_index].icon_url, |
1273 handler1.download_handler()->GetImageUrl()); | 1429 handler1.download_handler()->GetImageUrl()); |
1274 | 1430 |
1275 // Simulate the download failed. | |
1276 handler1.download_handler()->set_failed(true); | |
1277 handler1.download_handler()->InvokeCallback(); | 1431 handler1.download_handler()->InvokeCallback(); |
| 1432 handler1.download_handler()->Reset(); |
1278 } | 1433 } |
1279 } | 1434 } |
1280 | 1435 |
1281 TEST_F(FaviconHandlerTest, TestSelectLargestFavicon) { | 1436 TEST_F(FaviconHandlerTest, TestSelectLargestFavicon) { |
1282 const GURL kPageURL("http://www.google.com"); | 1437 const GURL kPageURL("http://www.google.com"); |
1283 | 1438 |
1284 std::vector<gfx::Size> one_icon; | 1439 std::vector<gfx::Size> one_icon; |
1285 one_icon.push_back(gfx::Size(15, 15)); | 1440 one_icon.push_back(gfx::Size(15, 15)); |
1286 | 1441 |
1287 std::vector<gfx::Size> two_icons; | 1442 std::vector<gfx::Size> two_icons; |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1437 // Verify the first icon was request to download | 1592 // Verify the first icon was request to download |
1438 ASSERT_TRUE(handler1.download_handler()->HasDownload()); | 1593 ASSERT_TRUE(handler1.download_handler()->HasDownload()); |
1439 EXPECT_EQ(kSourceIconURLs[0].icon_url, | 1594 EXPECT_EQ(kSourceIconURLs[0].icon_url, |
1440 handler1.download_handler()->GetImageUrl()); | 1595 handler1.download_handler()->GetImageUrl()); |
1441 | 1596 |
1442 // Give the incorrect size. | 1597 // Give the incorrect size. |
1443 std::vector<int> sizes; | 1598 std::vector<int> sizes; |
1444 sizes.push_back(actual_size1); | 1599 sizes.push_back(actual_size1); |
1445 handler1.download_handler()->SetImageSizes(sizes); | 1600 handler1.download_handler()->SetImageSizes(sizes); |
1446 handler1.download_handler()->InvokeCallback(); | 1601 handler1.download_handler()->InvokeCallback(); |
| 1602 handler1.download_handler()->Reset(); |
1447 | 1603 |
1448 // Simulate no favicon from history. | 1604 // Simulate no favicon from history. |
1449 handler1.history_handler()->history_results_.clear(); | 1605 handler1.history_handler()->history_results_.clear(); |
1450 handler1.history_handler()->InvokeCallback(); | 1606 handler1.history_handler()->InvokeCallback(); |
1451 | 1607 |
1452 // Verify the 2nd icon was request to download | 1608 // Verify the 2nd icon was request to download |
1453 ASSERT_TRUE(handler1.download_handler()->HasDownload()); | 1609 ASSERT_TRUE(handler1.download_handler()->HasDownload()); |
1454 EXPECT_EQ(kSourceIconURLs[1].icon_url, | 1610 EXPECT_EQ(kSourceIconURLs[1].icon_url, |
1455 handler1.download_handler()->GetImageUrl()); | 1611 handler1.download_handler()->GetImageUrl()); |
1456 | 1612 |
1457 // Very the best candidate is icon1 | 1613 // Very the best candidate is icon1 |
1458 EXPECT_EQ(kSourceIconURLs[0].icon_url, | 1614 EXPECT_EQ(kSourceIconURLs[0].icon_url, |
1459 handler1.best_favicon_candidate().image_url); | 1615 handler1.best_favicon_candidate().image_url); |
1460 EXPECT_EQ(gfx::Size(actual_size1, actual_size1), | 1616 EXPECT_EQ(gfx::Size(actual_size1, actual_size1), |
1461 handler1.best_favicon_candidate().image.Size()); | 1617 handler1.best_favicon_candidate().image.Size()); |
1462 | 1618 |
1463 // Give the incorrect size. | 1619 // Give the incorrect size. |
1464 sizes.clear(); | 1620 sizes.clear(); |
1465 sizes.push_back(actual_size2); | 1621 sizes.push_back(actual_size2); |
1466 handler1.download_handler()->SetImageSizes(sizes); | 1622 handler1.download_handler()->SetImageSizes(sizes); |
1467 handler1.download_handler()->InvokeCallback(); | 1623 handler1.download_handler()->InvokeCallback(); |
| 1624 handler1.download_handler()->Reset(); |
1468 | 1625 |
1469 // Verify icon2 has been saved into history. | 1626 // Verify icon2 has been saved into history. |
1470 EXPECT_EQ(kSourceIconURLs[1].icon_url, handler1.history_handler()->icon_url_); | 1627 EXPECT_EQ(kSourceIconURLs[1].icon_url, handler1.history_handler()->icon_url_); |
1471 EXPECT_EQ(gfx::Size(actual_size2, actual_size2), | 1628 EXPECT_EQ(gfx::Size(actual_size2, actual_size2), |
1472 handler1.history_handler()->size_); | 1629 handler1.history_handler()->size_); |
1473 } | 1630 } |
1474 | 1631 |
1475 class FaviconHandlerActiveFaviconValidityParamTest : | 1632 class FaviconHandlerActiveFaviconValidityParamTest : |
1476 public FaviconHandlerTest, | 1633 public FaviconHandlerTest, |
1477 public ::testing::WithParamInterface<bool> { | 1634 public ::testing::WithParamInterface<bool> { |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1548 EXPECT_FALSE(driver1.update_active_favicon()); | 1705 EXPECT_FALSE(driver1.update_active_favicon()); |
1549 EXPECT_EQ(3u, driver1.num_favicon_available()); | 1706 EXPECT_EQ(3u, driver1.num_favicon_available()); |
1550 } | 1707 } |
1551 | 1708 |
1552 INSTANTIATE_TEST_CASE_P(FaviconHandlerTestActiveFaviconValidityTrueOrFalse, | 1709 INSTANTIATE_TEST_CASE_P(FaviconHandlerTestActiveFaviconValidityTrueOrFalse, |
1553 FaviconHandlerActiveFaviconValidityParamTest, | 1710 FaviconHandlerActiveFaviconValidityParamTest, |
1554 ::testing::Bool()); | 1711 ::testing::Bool()); |
1555 | 1712 |
1556 } // namespace | 1713 } // namespace |
1557 } // namespace favicon | 1714 } // namespace favicon |
OLD | NEW |