Index: components/bookmarks/browser/bookmark_model_unittest.cc |
diff --git a/components/bookmarks/browser/bookmark_model_unittest.cc b/components/bookmarks/browser/bookmark_model_unittest.cc |
index 37d6bf6912db8654f5c0e7e5a4d9c6a157da40be..271d182222d8fb9aaeb11dd12d671ccc63f4bf21 100644 |
--- a/components/bookmarks/browser/bookmark_model_unittest.cc |
+++ b/components/bookmarks/browser/bookmark_model_unittest.cc |
@@ -21,9 +21,12 @@ |
#include "components/bookmarks/browser/bookmark_utils.h" |
#include "components/bookmarks/test/bookmark_test_helpers.h" |
#include "components/bookmarks/test/test_bookmark_client.h" |
+#include "components/favicon_base/favicon_callback.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "third_party/skia/include/core/SkBitmap.h" |
#include "ui/base/models/tree_node_iterator.h" |
#include "ui/base/models/tree_node_model.h" |
+#include "ui/gfx/image/image.h" |
#include "url/gurl.h" |
using base::ASCIIToUTF16; |
@@ -1181,4 +1184,148 @@ TEST(BookmarkModelTest2, CreateAndRestore) { |
} |
} // namespace |
+ |
+class BookmarkModelFaviconTest : public testing::Test, |
+ public BookmarkModelObserver { |
+ public: |
+ BookmarkModelFaviconTest() : model_(client_.CreateModel()) { |
+ model_->AddObserver(this); |
+ } |
+ |
+ // Emulates the favicon getting asynchronously loaded. In production, the |
+ // favicon is asynchronously loaded when BookmarkModel::GetFavicon() is |
+ // called. |
+ void OnFaviconLoaded(BookmarkNode* node, const GURL& icon_url) { |
+ SkBitmap bitmap; |
+ bitmap.allocN32Pixels(16, 16); |
+ bitmap.eraseColor(SK_ColorBLUE); |
+ gfx::Image image = gfx::Image::CreateFrom1xBitmap(bitmap); |
+ |
+ favicon_base::FaviconImageResult image_result; |
+ image_result.image = image; |
+ image_result.icon_url = icon_url; |
+ model_->OnFaviconDataAvailable(node, favicon_base::IconType::FAVICON, |
+ image_result); |
+ } |
+ |
+ bool WasNodeUpdated(const BookmarkNode* node) { |
+ return std::find(updated_nodes_.begin(), updated_nodes_.end(), node) != |
+ updated_nodes_.end(); |
+ } |
+ |
+ void ClearUpdatedNodes() { |
+ updated_nodes_.clear(); |
+ } |
+ |
+ protected: |
+ void BookmarkModelLoaded(BookmarkModel* model, bool ids_reassigned) override { |
+ } |
+ |
+ void BookmarkNodeMoved(BookmarkModel* model, |
+ const BookmarkNode* old_parent, |
+ int old_index, |
+ const BookmarkNode* new_parent, |
+ int new_index) override {} |
+ |
+ void BookmarkNodeAdded(BookmarkModel* model, |
+ const BookmarkNode* parent, |
+ int index) override {} |
+ |
+ void BookmarkNodeRemoved(BookmarkModel* model, |
+ const BookmarkNode* parent, |
+ int old_index, |
+ const BookmarkNode* node, |
+ const std::set<GURL>& removed_urls) override {} |
+ |
+ void BookmarkNodeChanged(BookmarkModel* model, |
+ const BookmarkNode* node) override {} |
+ |
+ void BookmarkNodeFaviconChanged(BookmarkModel* model, |
+ const BookmarkNode* node) override { |
+ updated_nodes_.push_back(node); |
+ } |
+ |
+ void BookmarkNodeChildrenReordered(BookmarkModel* model, |
+ const BookmarkNode* node) override {} |
+ |
+ void BookmarkAllUserNodesRemoved( |
+ BookmarkModel* model, |
+ const std::set<GURL>& removed_urls) override { |
+ } |
+ |
+ TestBookmarkClient client_; |
+ scoped_ptr<BookmarkModel> model_; |
+ std::vector<const BookmarkNode*> updated_nodes_; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(BookmarkModelFaviconTest); |
+}; |
+ |
+// Test that BookmarkModel::OnFaviconsChanged() sends a notification that the |
+// favicon changed to each BookmarkNode which has either a matching page URL |
+// (e.g. http://www.google.com) or a matching icon URL |
+// (e.g. http://www.google.com/favicon.ico). |
+TEST_F(BookmarkModelFaviconTest, FaviconsChangedObserver) { |
+ const BookmarkNode* root = model_->bookmark_bar_node(); |
+ base::string16 kTitle(ASCIIToUTF16("foo")); |
+ GURL kPageURL1("http://www.google.com"); |
+ GURL kPageURL2("http://www.google.ca"); |
+ GURL kPageURL3("http://www.amazon.com"); |
+ GURL kFaviconURL12("http://www.google.com/favicon.ico"); |
+ GURL kFaviconURL3("http://www.amazon.com/favicon.ico"); |
+ |
+ const BookmarkNode* node1 = model_->AddURL(root, 0, kTitle, kPageURL1); |
+ const BookmarkNode* node2 = model_->AddURL(root, 0, kTitle, kPageURL2); |
+ const BookmarkNode* node3 = model_->AddURL(root, 0, kTitle, kPageURL3); |
+ const BookmarkNode* node4 = model_->AddURL(root, 0, kTitle, kPageURL3); |
+ |
+ { |
+ OnFaviconLoaded(AsMutable(node1), kFaviconURL12); |
+ OnFaviconLoaded(AsMutable(node2), kFaviconURL12); |
+ OnFaviconLoaded(AsMutable(node3), kFaviconURL3); |
+ OnFaviconLoaded(AsMutable(node4), kFaviconURL3); |
+ |
+ ClearUpdatedNodes(); |
+ std::set<GURL> changed_page_urls; |
+ changed_page_urls.insert(kPageURL2); |
+ changed_page_urls.insert(kPageURL3); |
+ model_->OnFaviconsChanged(changed_page_urls, GURL()); |
+ ASSERT_EQ(3u, updated_nodes_.size()); |
+ EXPECT_TRUE(WasNodeUpdated(node2)); |
+ EXPECT_TRUE(WasNodeUpdated(node3)); |
+ EXPECT_TRUE(WasNodeUpdated(node4)); |
+ } |
+ |
+ { |
+ // Reset the favicon data because BookmarkModel::OnFaviconsChanged() clears |
+ // the BookmarkNode's favicon data for all of the BookmarkNodes whose |
+ // favicon data changed. |
+ OnFaviconLoaded(AsMutable(node1), kFaviconURL12); |
+ OnFaviconLoaded(AsMutable(node2), kFaviconURL12); |
+ OnFaviconLoaded(AsMutable(node3), kFaviconURL3); |
+ OnFaviconLoaded(AsMutable(node4), kFaviconURL3); |
+ |
+ ClearUpdatedNodes(); |
+ model_->OnFaviconsChanged(std::set<GURL>(), kFaviconURL12); |
+ ASSERT_EQ(2u, updated_nodes_.size()); |
+ EXPECT_TRUE(WasNodeUpdated(node1)); |
+ EXPECT_TRUE(WasNodeUpdated(node2)); |
+ } |
+ |
+ { |
+ OnFaviconLoaded(AsMutable(node1), kFaviconURL12); |
+ OnFaviconLoaded(AsMutable(node2), kFaviconURL12); |
+ OnFaviconLoaded(AsMutable(node3), kFaviconURL3); |
+ OnFaviconLoaded(AsMutable(node4), kFaviconURL3); |
+ |
+ ClearUpdatedNodes(); |
+ std::set<GURL> changed_page_urls; |
+ changed_page_urls.insert(kPageURL1); |
+ model_->OnFaviconsChanged(changed_page_urls, kFaviconURL12); |
+ ASSERT_EQ(2u, updated_nodes_.size()); |
+ EXPECT_TRUE(WasNodeUpdated(node1)); |
+ EXPECT_TRUE(WasNodeUpdated(node2)); |
+ } |
+} |
+ |
} // namespace bookmarks |