Index: chrome/browser/favicon/favicon_handler_unittest.cc |
diff --git a/chrome/browser/favicon/favicon_handler_unittest.cc b/chrome/browser/favicon/favicon_handler_unittest.cc |
index 16952d14efa520ee0b4a20cbd7c76563e82ba37d..2b0bb5f4e8d1097da919fcdd99c072092547a656 100644 |
--- a/chrome/browser/favicon/favicon_handler_unittest.cc |
+++ b/chrome/browser/favicon/favicon_handler_unittest.cc |
@@ -2,6 +2,7 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "base/memory/scoped_ptr.h" |
#include "chrome/browser/favicon/favicon_handler.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/test/base/chrome_render_view_host_test_harness.h" |
@@ -45,40 +46,47 @@ void FillBitmap(int w, int h, std::vector<unsigned char>* output) { |
// It also will be used to invoke the onDidDownload callback. |
class DownloadHandler { |
public: |
- DownloadHandler(int download_id, |
- const GURL& image_url, |
- int image_size, |
- TestFaviconHandler* favicon_helper) |
- : image_url_(image_url), |
- image_size_(image_size), |
- failed_(false), |
- download_id_(download_id), |
- favicon_helper_(favicon_helper) { |
- FillDataToBitmap(16, 16, &bitmap_); |
+ explicit DownloadHandler(TestFaviconHandler* favicon_helper) |
+ : favicon_helper_(favicon_helper), |
+ failed_(false) { |
} |
virtual ~DownloadHandler() { |
} |
- static void UpdateFaviconURL(FaviconHandler* helper, |
- const std::vector<FaviconURL> urls); |
+ void Reset() { |
+ download_.reset(NULL); |
+ failed_ = false; |
+ } |
- void InvokeCallback(); |
+ void AddDownload(int download_id, const GURL& image_url, int image_size) { |
+ download_.reset(new Download(download_id, image_url, image_size, false)); |
+ } |
- void UpdateFaviconURL(const std::vector<FaviconURL> urls); |
+ void InvokeCallback(); |
- const GURL image_url_; |
- const int image_size_; |
+ void set_failed(bool failed) { failed_ = failed; } |
- // Simulates download failed or not. |
- bool failed_; |
+ bool HasDownload() const { return download_.get() != NULL; } |
+ const GURL& GetImageUrl() const { return download_->image_url; } |
+ int GetImageSize() const { return download_->image_size; } |
+ void SetImageSize(int size) { download_->image_size = size; } |
private: |
- // Identified the specific download, will also be passed in |
- // OnDidDownloadFavicon callback. |
- int download_id_; |
+ struct Download { |
+ Download(int id, GURL url, int size, bool failed) |
+ : download_id(id), |
+ image_url(url), |
+ image_size(size) {} |
+ ~Download() {} |
+ int download_id; |
+ GURL image_url; |
+ int image_size; |
+ }; |
+ |
TestFaviconHandler* favicon_helper_; |
- SkBitmap bitmap_; |
+ scoped_ptr<Download> download_; |
+ bool failed_; |
DISALLOW_COPY_AND_ASSIGN(DownloadHandler); |
}; |
@@ -169,6 +177,7 @@ class TestFaviconHandler : public FaviconHandler { |
entry_(NavigationEntry::Create()), |
download_id_(0) { |
entry_->SetURL(page_url); |
+ download_handler_.reset(new DownloadHandler(this)); |
} |
virtual ~TestFaviconHandler() { |
@@ -187,17 +196,12 @@ class TestFaviconHandler : public FaviconHandler { |
return download_handler_.get(); |
} |
- // This method will take the ownership of the given download_handler. |
- void set_download_handler(DownloadHandler* download_handler) { |
- download_handler_.reset(download_handler); |
- } |
- |
virtual NavigationEntry* GetEntry() { |
return entry_.get(); |
} |
- const std::vector<FaviconURL>& urls() { |
- return urls_; |
+ const std::deque<FaviconURL>& urls() { |
+ return image_urls_; |
} |
void FetchFavicon(const GURL& url) { |
@@ -209,13 +213,6 @@ class TestFaviconHandler : public FaviconHandler { |
return FaviconHandler::current_candidate(); |
} |
- void OnDidDownloadFavicon(int id, |
- const GURL& image_url, |
- bool errored, |
- gfx::Image& image) { |
- FaviconHandler::OnDidDownloadFavicon(id, image_url, errored, image); |
- } |
- |
protected: |
virtual void UpdateFaviconMappingAndFetch( |
const GURL& page_url, |
@@ -247,8 +244,7 @@ class TestFaviconHandler : public FaviconHandler { |
virtual int DownloadFavicon(const GURL& image_url, int image_size) OVERRIDE { |
download_id_++; |
- download_handler_.reset(new DownloadHandler(download_id_, image_url, |
- image_size, this)); |
+ download_handler_->AddDownload(download_id_, image_url, image_size); |
return download_id_; |
} |
@@ -290,23 +286,19 @@ class TestFaviconHandler : public FaviconHandler { |
namespace { |
-void DownloadHandler::UpdateFaviconURL(FaviconHandler* helper, |
- const std::vector<FaviconURL> urls) { |
- helper->OnUpdateFaviconURL(0, urls); |
-} |
- |
-void DownloadHandler::UpdateFaviconURL(const std::vector<FaviconURL> urls) { |
- UpdateFaviconURL(favicon_helper_, urls); |
+void HistoryRequestHandler::InvokeCallback() { |
+ if (!callback_.is_null()) |
+ callback_.Run(0, favicon_data_); |
} |
void DownloadHandler::InvokeCallback() { |
- gfx::Image image(new SkBitmap(bitmap_)); |
- favicon_helper_->OnDidDownloadFavicon(download_id_, image_url_, failed_, |
- image); |
-} |
- |
-void HistoryRequestHandler::InvokeCallback() { |
- callback_.Run(0, favicon_data_); |
+ SkBitmap bitmap; |
+ int bitmap_size = (download_->image_size > 0) ? |
+ download_->image_size : gfx::kFaviconSize; |
+ FillDataToBitmap(bitmap_size, bitmap_size, &bitmap); |
+ gfx::Image image(bitmap); |
+ favicon_helper_->OnDidDownloadFavicon( |
+ download_->download_id, download_->image_url, failed_, image); |
} |
class FaviconHandlerTest : public ChromeRenderViewHostTestHarness { |
@@ -348,7 +340,7 @@ TEST_F(FaviconHandlerTest, GetFaviconFromHistory) { |
// Simulates update favicon url. |
std::vector<FaviconURL> urls; |
urls.push_back(FaviconURL(icon_url, FaviconURL::FAVICON)); |
- DownloadHandler::UpdateFaviconURL(&helper, urls); |
+ helper.OnUpdateFaviconURL(0, urls); |
// Verify FaviconHandler status |
EXPECT_EQ(1U, helper.urls().size()); |
@@ -357,8 +349,7 @@ TEST_F(FaviconHandlerTest, GetFaviconFromHistory) { |
ASSERT_EQ(FaviconURL::FAVICON, helper.current_candidate()->icon_type); |
// Favicon shouldn't request to download icon. |
- DownloadHandler* download_handler = helper.download_handler(); |
- ASSERT_FALSE(download_handler); |
+ EXPECT_FALSE(helper.download_handler()->HasDownload()); |
} |
TEST_F(FaviconHandlerTest, DownloadFavicon) { |
@@ -393,7 +384,7 @@ TEST_F(FaviconHandlerTest, DownloadFavicon) { |
// Simulates update favicon url. |
std::vector<FaviconURL> urls; |
urls.push_back(FaviconURL(icon_url, FaviconURL::FAVICON)); |
- DownloadHandler::UpdateFaviconURL(&helper, urls); |
+ helper.OnUpdateFaviconURL(0, urls); |
// Verify FaviconHandler status |
EXPECT_EQ(1U, helper.urls().size()); |
@@ -403,10 +394,11 @@ TEST_F(FaviconHandlerTest, DownloadFavicon) { |
// Favicon should request to download icon now. |
DownloadHandler* download_handler = helper.download_handler(); |
- ASSERT_TRUE(download_handler); |
+ EXPECT_TRUE(helper.download_handler()->HasDownload()); |
+ |
// Verify the download request. |
- EXPECT_EQ(icon_url, download_handler->image_url_); |
- EXPECT_EQ(gfx::kFaviconSize, download_handler->image_size_); |
+ EXPECT_EQ(icon_url, download_handler->GetImageUrl()); |
+ EXPECT_EQ(gfx::kFaviconSize, download_handler->GetImageSize()); |
// Reset the history_handler to verify whether favicon is set. |
helper.set_history_handler(NULL); |
@@ -469,7 +461,7 @@ TEST_F(FaviconHandlerTest, UpdateAndDownloadFavicon) { |
// Simulates update with the different favicon url. |
std::vector<FaviconURL> urls; |
urls.push_back(FaviconURL(new_icon_url, FaviconURL::FAVICON)); |
- DownloadHandler::UpdateFaviconURL(&helper, urls); |
+ helper.OnUpdateFaviconURL(0, urls); |
// Verify FaviconHandler status. |
EXPECT_EQ(1U, helper.urls().size()); |
@@ -492,10 +484,11 @@ TEST_F(FaviconHandlerTest, UpdateAndDownloadFavicon) { |
// Favicon should request to download icon now. |
DownloadHandler* download_handler = helper.download_handler(); |
- ASSERT_TRUE(download_handler); |
+ EXPECT_TRUE(helper.download_handler()->HasDownload()); |
+ |
// Verify the download request. |
- EXPECT_EQ(new_icon_url, download_handler->image_url_); |
- EXPECT_EQ(gfx::kFaviconSize, download_handler->image_size_); |
+ EXPECT_EQ(new_icon_url, download_handler->GetImageUrl()); |
+ EXPECT_EQ(gfx::kFaviconSize, download_handler->GetImageSize()); |
// Reset the history_handler to verify whether favicon is set. |
helper.set_history_handler(NULL); |
@@ -558,7 +551,7 @@ TEST_F(FaviconHandlerTest, UpdateFavicon) { |
// Simulates update with the different favicon url. |
std::vector<FaviconURL> urls; |
urls.push_back(FaviconURL(new_icon_url, FaviconURL::FAVICON)); |
- DownloadHandler::UpdateFaviconURL(&helper, urls); |
+ helper.OnUpdateFaviconURL(0, urls); |
// Verify FaviconHandler status. |
EXPECT_EQ(1U, helper.urls().size()); |
@@ -584,7 +577,7 @@ TEST_F(FaviconHandlerTest, UpdateFavicon) { |
history_handler->InvokeCallback(); |
// Shouldn't request download favicon |
- EXPECT_FALSE(helper.download_handler()); |
+ EXPECT_FALSE(helper.download_handler()->HasDownload()); |
// Verify the favicon status. |
EXPECT_EQ(new_icon_url, helper.GetEntry()->GetFavicon().url); |
@@ -629,8 +622,7 @@ TEST_F(FaviconHandlerTest, Download2ndFaviconURLCandidate) { |
urls.push_back(FaviconURL(icon_url, FaviconURL::TOUCH_PRECOMPOSED_ICON)); |
urls.push_back(FaviconURL(new_icon_url, FaviconURL::TOUCH_ICON)); |
urls.push_back(FaviconURL(new_icon_url, FaviconURL::FAVICON)); |
- |
- DownloadHandler::UpdateFaviconURL(&helper, urls); |
+ helper.OnUpdateFaviconURL(0, urls); |
// Verify FaviconHandler status. |
EXPECT_EQ(2U, helper.urls().size()); |
@@ -652,16 +644,17 @@ TEST_F(FaviconHandlerTest, Download2ndFaviconURLCandidate) { |
// Should request download favicon. |
DownloadHandler* download_handler = helper.download_handler(); |
- EXPECT_TRUE(download_handler); |
+ EXPECT_TRUE(helper.download_handler()->HasDownload()); |
+ |
// Verify the download request. |
- EXPECT_EQ(icon_url, download_handler->image_url_); |
- EXPECT_EQ(0, download_handler->image_size_); |
+ EXPECT_EQ(icon_url, download_handler->GetImageUrl()); |
+ EXPECT_EQ(0, download_handler->GetImageSize()); |
// Reset the history_handler to verify whether favicon is request from |
// history. |
helper.set_history_handler(NULL); |
// Smulates download failed. |
- download_handler->failed_ = true; |
+ download_handler->set_failed(true); |
download_handler->InvokeCallback(); |
// Left 1 url. |
@@ -678,7 +671,7 @@ TEST_F(FaviconHandlerTest, Download2ndFaviconURLCandidate) { |
EXPECT_EQ(page_url, history_handler->page_url_); |
// Reset download handler |
- helper.set_download_handler(NULL); |
+ download_handler->Reset(); |
// Smulates getting a expired icon from history. |
history_handler->favicon_data_.known_icon = true; |
@@ -691,10 +684,9 @@ TEST_F(FaviconHandlerTest, Download2ndFaviconURLCandidate) { |
history_handler->InvokeCallback(); |
// Verify the download request. |
- download_handler = helper.download_handler(); |
- EXPECT_TRUE(download_handler); |
- EXPECT_EQ(new_icon_url, download_handler->image_url_); |
- EXPECT_EQ(0, download_handler->image_size_); |
+ EXPECT_TRUE(helper.download_handler()->HasDownload()); |
+ EXPECT_EQ(new_icon_url, download_handler->GetImageUrl()); |
+ EXPECT_EQ(0, download_handler->GetImageSize()); |
helper.set_history_handler(NULL); |
@@ -747,8 +739,7 @@ TEST_F(FaviconHandlerTest, UpdateDuringDownloading) { |
urls.push_back(FaviconURL(icon_url, FaviconURL::TOUCH_PRECOMPOSED_ICON)); |
urls.push_back(FaviconURL(new_icon_url, FaviconURL::TOUCH_ICON)); |
urls.push_back(FaviconURL(new_icon_url, FaviconURL::FAVICON)); |
- |
- DownloadHandler::UpdateFaviconURL(&helper, urls); |
+ helper.OnUpdateFaviconURL(0, urls); |
// Verify FaviconHandler status. |
EXPECT_EQ(2U, helper.urls().size()); |
@@ -770,10 +761,11 @@ TEST_F(FaviconHandlerTest, UpdateDuringDownloading) { |
// Should request download favicon. |
DownloadHandler* download_handler = helper.download_handler(); |
- EXPECT_TRUE(download_handler); |
+ EXPECT_TRUE(helper.download_handler()->HasDownload()); |
+ |
// Verify the download request. |
- EXPECT_EQ(icon_url, download_handler->image_url_); |
- EXPECT_EQ(0, download_handler->image_size_); |
+ EXPECT_EQ(icon_url, download_handler->GetImageUrl()); |
+ EXPECT_EQ(0, download_handler->GetImageSize()); |
// Reset the history_handler to verify whether favicon is request from |
// history. |
@@ -781,7 +773,8 @@ TEST_F(FaviconHandlerTest, UpdateDuringDownloading) { |
const GURL latest_icon_url("http://www.google.com/latest_favicon"); |
std::vector<FaviconURL> latest_urls; |
latest_urls.push_back(FaviconURL(latest_icon_url, FaviconURL::TOUCH_ICON)); |
- DownloadHandler::UpdateFaviconURL(&helper, latest_urls); |
+ helper.OnUpdateFaviconURL(0, latest_urls); |
+ |
EXPECT_EQ(1U, helper.urls().size()); |
EXPECT_EQ(latest_icon_url, helper.current_candidate()->icon_url); |
EXPECT_EQ(FaviconURL::TOUCH_ICON, helper.current_candidate()->icon_type); |
@@ -804,7 +797,7 @@ TEST_F(FaviconHandlerTest, UpdateDuringDownloading) { |
// The downloaded icon should be thrown away as there is favicon update. |
EXPECT_FALSE(helper.history_handler()); |
- helper.set_download_handler(NULL); |
+ download_handler->Reset(); |
// Simulates getting the icon from history. |
scoped_ptr<HistoryRequestHandler> handler; |
@@ -821,7 +814,77 @@ TEST_F(FaviconHandlerTest, UpdateDuringDownloading) { |
handler->InvokeCallback(); |
// No download request. |
- EXPECT_FALSE(helper.download_handler()); |
+ EXPECT_FALSE(download_handler->HasDownload()); |
+} |
+ |
+TEST_F(FaviconHandlerTest, MultipleFavicon) { |
+ const GURL page_url("http://www.google.com"); |
+ const GURL icon_url("http://www.google.com/favicon"); |
+ const GURL icon_url_small("http://www.google.com/favicon_small"); |
+ const GURL icon_url_large("http://www.google.com/favicon_large"); |
+ const GURL icon_url_preferred("http://www.google.com/favicon_preferred"); |
+ |
+ TestFaviconHandlerDelegate delegate(contents()); |
+ Profile* profile = Profile::FromBrowserContext( |
+ contents()->GetBrowserContext()); |
+ TestFaviconHandler helper(page_url, profile, |
+ &delegate, FaviconHandler::FAVICON); |
+ |
+ helper.FetchFavicon(page_url); |
+ HistoryRequestHandler* history_handler = helper.history_handler(); |
+ |
+ // Set valid icon data. |
+ history_handler->favicon_data_.known_icon = true; |
+ history_handler->favicon_data_.icon_type = history::FAVICON; |
+ history_handler->favicon_data_.expired = false; |
+ history_handler->favicon_data_.icon_url = icon_url; |
+ scoped_refptr<RefCountedBytes> data = new RefCountedBytes(); |
+ FillBitmap(gfx::kFaviconSize, gfx::kFaviconSize, &data->data()); |
+ history_handler->favicon_data_.image_data = data; |
+ |
+ // Send history response. |
+ history_handler->InvokeCallback(); |
+ |
+ // Simulates update with the different favicon url. |
+ std::vector<FaviconURL> urls; |
+ // Note: the code will stop making requests when an icon matching the |
+ // preferred size is found, so icon_url_preferred must be last. |
+ urls.push_back(FaviconURL(icon_url_small, FaviconURL::FAVICON)); |
+ urls.push_back(FaviconURL(icon_url_large, FaviconURL::FAVICON)); |
+ urls.push_back(FaviconURL(icon_url_preferred, FaviconURL::FAVICON)); |
+ helper.OnUpdateFaviconURL(0, urls); |
+ |
+ DownloadHandler* download_handler = helper.download_handler(); |
+ |
+ // Download the first icon (set not in history). |
+ helper.history_handler()->favicon_data_.known_icon = false; |
+ helper.history_handler()->InvokeCallback(); |
+ ASSERT_TRUE(download_handler->HasDownload()); |
+ EXPECT_EQ(icon_url_small, download_handler->GetImageUrl()); |
+ download_handler->SetImageSize(gfx::kFaviconSize / 2); |
+ download_handler->InvokeCallback(); |
+ |
+ // Download the second icon (set not in history). |
+ helper.history_handler()->favicon_data_.known_icon = false; |
+ helper.history_handler()->InvokeCallback(); |
+ ASSERT_TRUE(download_handler->HasDownload()); |
+ EXPECT_EQ(icon_url_large, download_handler->GetImageUrl()); |
+ download_handler->SetImageSize(gfx::kFaviconSize * 2); |
+ download_handler->InvokeCallback(); |
+ |
+ // Download the third icon (set not in history). |
+ helper.history_handler()->favicon_data_.known_icon = false; |
+ helper.history_handler()->InvokeCallback(); |
+ ASSERT_TRUE(download_handler->HasDownload()); |
+ EXPECT_EQ(icon_url_preferred, download_handler->GetImageUrl()); |
+ download_handler->SetImageSize(gfx::kFaviconSize); |
+ download_handler->InvokeCallback(); |
+ |
+ // Verify correct icon size chosen. |
+ EXPECT_EQ(icon_url_preferred, helper.GetEntry()->GetFavicon().url); |
+ EXPECT_TRUE(helper.GetEntry()->GetFavicon().valid); |
+ EXPECT_FALSE(helper.GetEntry()->GetFavicon().bitmap.empty()); |
+ EXPECT_EQ(gfx::kFaviconSize, helper.GetEntry()->GetFavicon().bitmap.width()); |
} |
} // namespace. |