Index: chrome/browser/sync/test/integration/bookmarks_helper.cc |
diff --git a/chrome/browser/sync/test/integration/bookmarks_helper.cc b/chrome/browser/sync/test/integration/bookmarks_helper.cc |
index 856797dcdde7e9849b635e759a84429ab8c5dae8..608f1072ace3011d6bfd9f03f0a90941376cc96e 100644 |
--- a/chrome/browser/sync/test/integration/bookmarks_helper.cc |
+++ b/chrome/browser/sync/test/integration/bookmarks_helper.cc |
@@ -15,6 +15,7 @@ |
#include "chrome/browser/bookmarks/bookmark_model_observer.h" |
#include "chrome/browser/bookmarks/bookmark_utils.h" |
#include "chrome/browser/favicon/favicon_service_factory.h" |
+#include "chrome/browser/favicon/favicon_util.h" |
#include "chrome/browser/history/history_service_factory.h" |
#include "chrome/browser/history/history_types.h" |
#include "chrome/browser/profiles/profile.h" |
@@ -25,7 +26,7 @@ |
#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/gfx/codec/png_codec.h" |
+#include "ui/gfx/image/image_skia.h" |
using sync_datatype_helper::test; |
@@ -163,13 +164,32 @@ bool FaviconBitmapsMatch(const SkBitmap& bitmap_a, const SkBitmap& bitmap_b) { |
} |
} |
-// Gets the favicon associated with |node| in |model|. |
-gfx::Image GetFavicon(BookmarkModel* model, const BookmarkNode* node) { |
+// Represents a favicon image and the icon URL associated with it. |
+struct FaviconData { |
+ FaviconData() { |
+ } |
+ |
+ FaviconData(const gfx::Image& favicon_image, |
+ const GURL& favicon_url) |
+ : image(favicon_image), |
+ icon_url(favicon_url) { |
+ } |
+ |
+ ~FaviconData() { |
+ } |
+ |
+ gfx::Image image; |
+ GURL icon_url; |
+}; |
+ |
+// Gets the favicon and icon URL associated with |node| in |model|. |
+FaviconData GetFaviconData(BookmarkModel* model, |
+ const BookmarkNode* node) { |
// If a favicon wasn't explicitly set for a particular URL, simply return its |
// blank favicon. |
if (!urls_with_favicons_ || |
urls_with_favicons_->find(node->url()) == urls_with_favicons_->end()) { |
- return gfx::Image(); |
+ return FaviconData(); |
} |
// If a favicon was explicitly set, we may need to wait for it to be loaded |
// via BookmarkModel::GetFavicon(), which is an asynchronous operation. |
@@ -180,13 +200,14 @@ gfx::Image GetFavicon(BookmarkModel* model, const BookmarkNode* node) { |
} |
EXPECT_TRUE(node->is_favicon_loaded()); |
EXPECT_FALSE(model->GetFavicon(node).IsEmpty()); |
- return model->GetFavicon(node); |
+ return FaviconData(model->GetFavicon(node), node->icon_url()); |
} |
// Sets the favicon for |profile| and |node|. |profile| may be |
// |test()->verifier()|. |
void SetFaviconImpl(Profile* profile, |
const BookmarkNode* node, |
+ const GURL& icon_url, |
const gfx::Image& image) { |
BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile); |
@@ -195,7 +216,7 @@ void SetFaviconImpl(Profile* profile, |
FaviconServiceFactory::GetForProfile(profile, |
Profile::EXPLICIT_ACCESS); |
favicon_service->SetFavicons(node->url(), |
- node->url(), |
+ icon_url, |
history::FAVICON, |
image); |
@@ -203,7 +224,7 @@ void SetFaviconImpl(Profile* profile, |
observer.WaitForSetFavicon(); |
// Wait for the BookmarkModel to fetch the updated favicon and for the new |
// favicon to be sent to BookmarkChangeProcessor. |
- GetFavicon(model, node); |
+ GetFaviconData(model, node); |
} |
// Wait for all currently scheduled tasks on the history thread for all |
@@ -241,13 +262,27 @@ bool FaviconsMatch(BookmarkModel* model_a, |
BookmarkModel* model_b, |
const BookmarkNode* node_a, |
const BookmarkNode* node_b) { |
- const gfx::Image& bitmap_a = GetFavicon(model_a, node_a); |
- const gfx::Image& bitmap_b = GetFavicon(model_b, node_b); |
+ FaviconData favicon_data_a = GetFaviconData(model_a, node_a); |
+ FaviconData favicon_data_b = GetFaviconData(model_b, node_b); |
+ |
+ if (favicon_data_a.icon_url != favicon_data_b.icon_url) |
+ return false; |
+ |
+ gfx::Image image_a = favicon_data_a.image; |
+ gfx::Image image_b = favicon_data_b.image; |
- if (bitmap_a.IsEmpty() && bitmap_b.IsEmpty()) |
+ if (image_a.IsEmpty() && image_b.IsEmpty()) |
return true; // Two empty images are equivalent. |
- return !bitmap_a.IsEmpty() && !bitmap_b.IsEmpty() && |
- FaviconBitmapsMatch(*bitmap_a.ToSkBitmap(), *bitmap_b.ToSkBitmap()); |
+ |
+ if (image_a.IsEmpty() != image_b.IsEmpty()) |
+ return false; |
+ |
+ // Compare only the 1x bitmaps as only those are synced. |
+ SkBitmap bitmap_a = image_a.AsImageSkia().GetRepresentation( |
+ ui::SCALE_FACTOR_100P).sk_bitmap(); |
+ SkBitmap bitmap_b = image_b.AsImageSkia().GetRepresentation( |
+ ui::SCALE_FACTOR_100P).sk_bitmap(); |
+ return FaviconBitmapsMatch(bitmap_a, bitmap_b); |
} |
// Does a deep comparison of BookmarkNode fields in |model_a| and |model_b|. |
@@ -457,10 +492,8 @@ void SetTitle(int profile, |
void SetFavicon(int profile, |
const BookmarkNode* node, |
- const std::vector<unsigned char>& icon_bytes_vector) { |
- scoped_refptr<base::RefCountedBytes> bitmap_data( |
- new base::RefCountedBytes(icon_bytes_vector)); |
- gfx::Image image(bitmap_data->front(), bitmap_data->size()); |
+ const GURL& icon_url, |
+ const gfx::Image& image) { |
ASSERT_EQ(GetBookmarkModel(profile)->GetNodeByID(node->id()), node) |
<< "Node " << node->GetTitle() << " does not belong to " |
<< "Profile " << profile; |
@@ -472,9 +505,9 @@ void SetFavicon(int profile, |
if (test()->use_verifier()) { |
const BookmarkNode* v_node = NULL; |
FindNodeInVerifier(GetBookmarkModel(profile), node, &v_node); |
- SetFaviconImpl(test()->verifier(), v_node, image); |
+ SetFaviconImpl(test()->verifier(), v_node, icon_url, image); |
} |
- SetFaviconImpl(test()->GetProfile(profile), node, image); |
+ SetFaviconImpl(test()->GetProfile(profile), node, icon_url, image); |
} |
const BookmarkNode* SetURL(int profile, |
@@ -653,22 +686,23 @@ int CountFoldersWithTitlesMatching(int profile, const std::wstring& title) { |
WideToUTF16(title)); |
} |
-std::vector<unsigned char> CreateFavicon(int seed) { |
- const int w = 16; |
- const int h = 16; |
- SkBitmap bmp; |
- bmp.setConfig(SkBitmap::kARGB_8888_Config, w, h); |
- bmp.allocPixels(); |
- uint32_t* src_data = bmp.getAddr32(0, 0); |
- for (int i = 0; i < w * h; ++i) { |
- src_data[i] = SkPreMultiplyARGB((seed + i) % 255, |
- (seed + i) % 250, |
- (seed + i) % 245, |
- (seed + i) % 240); |
- } |
- std::vector<unsigned char> favicon; |
- gfx::PNGCodec::EncodeBGRASkBitmap(bmp, false, &favicon); |
- return favicon; |
+gfx::Image CreateFavicon(SkColor color) { |
+ const int dip_width = 16; |
+ const int dip_height = 16; |
+ std::vector<ui::ScaleFactor> favicon_scale_factors = |
+ FaviconUtil::GetFaviconScaleFactors(); |
+ gfx::ImageSkia favicon; |
+ for (size_t i = 0; i < favicon_scale_factors.size(); ++i) { |
+ float scale = ui::GetScaleFactorScale(favicon_scale_factors[i]); |
+ int pixel_width = dip_width * scale; |
+ int pixel_height = dip_height * scale; |
+ SkBitmap bmp; |
+ bmp.setConfig(SkBitmap::kARGB_8888_Config, pixel_width, pixel_height); |
+ bmp.allocPixels(); |
+ bmp.eraseColor(color); |
+ favicon.AddRepresentation(gfx::ImageSkiaRep(bmp, favicon_scale_factors[i])); |
+ } |
+ return gfx::Image(favicon); |
} |
std::string IndexedURL(int i) { |