Index: chrome/browser/extensions/bookmark_app_helper_unittest.cc |
diff --git a/chrome/browser/extensions/bookmark_app_helper_unittest.cc b/chrome/browser/extensions/bookmark_app_helper_unittest.cc |
index dc5c7e6b99508f32a1fa8e7b8a705e54892a830c..f5d70c9de5d2d5e5918ae741604c542c0caf05bd 100644 |
--- a/chrome/browser/extensions/bookmark_app_helper_unittest.cc |
+++ b/chrome/browser/extensions/bookmark_app_helper_unittest.cc |
@@ -20,6 +20,8 @@ |
#include "third_party/skia/include/core/SkBitmap.h" |
#include "ui/gfx/skia_util.h" |
+namespace extensions { |
+ |
namespace { |
const char kAppUrl[] = "http://www.chromium.org"; |
@@ -31,11 +33,16 @@ const char kAppDescription[] = "Test description"; |
const char kAppIcon1[] = "fav1.png"; |
const char kAppIcon2[] = "fav2.png"; |
const char kAppIcon3[] = "fav3.png"; |
+const char kAppIconURL1[] = "http://foo.com/1.png"; |
+const char kAppIconURL2[] = "http://foo.com/2.png"; |
+const char kAppIconURL3[] = "http://foo.com/3.png"; |
+const char kAppIconURL4[] = "http://foo.com/4.png"; |
const int kIconSizeTiny = extension_misc::EXTENSION_ICON_BITTY; |
const int kIconSizeSmall = extension_misc::EXTENSION_ICON_SMALL; |
const int kIconSizeMedium = extension_misc::EXTENSION_ICON_MEDIUM; |
const int kIconSizeLarge = extension_misc::EXTENSION_ICON_LARGE; |
+const int kIconSizeUnsupported = 123; |
class BookmarkAppHelperTest : public testing::Test { |
public: |
@@ -83,6 +90,21 @@ SkBitmap CreateSquareBitmapWithColor(int size, SkColor color) { |
return bitmap; |
} |
+BookmarkAppHelper::BitmapAndSource CreateSquareBitmapAndSourceWithColor( |
+ int size, |
+ SkColor color) { |
+ return BookmarkAppHelper::BitmapAndSource( |
+ GURL(), CreateSquareBitmapWithColor(size, color)); |
+} |
+ |
+void ValidateBitmapSizeAndColor(SkBitmap bitmap, int size, SkColor color) { |
+ // Obtain pixel lock to access pixels. |
+ SkAutoLockPixels lock(bitmap); |
+ EXPECT_EQ(color, bitmap.getColor(0, 0)); |
+ EXPECT_EQ(size, bitmap.width()); |
+ EXPECT_EQ(size, bitmap.height()); |
+} |
+ |
WebApplicationInfo::IconInfo CreateIconInfoWithBitmap(int size, SkColor color) { |
WebApplicationInfo::IconInfo icon_info; |
icon_info.width = size; |
@@ -91,27 +113,36 @@ WebApplicationInfo::IconInfo CreateIconInfoWithBitmap(int size, SkColor color) { |
return icon_info; |
} |
-void ValidateWebApplicationInfo(base::Closure callback, |
- const WebApplicationInfo& expected, |
- const WebApplicationInfo& actual) { |
- EXPECT_EQ(expected.title, actual.title); |
- EXPECT_EQ(expected.description, actual.description); |
- EXPECT_EQ(expected.app_url, actual.app_url); |
- EXPECT_EQ(expected.icons.size(), actual.icons.size()); |
- for (size_t i = 0; i < expected.icons.size(); ++i) { |
- EXPECT_EQ(expected.icons[i].width, actual.icons[i].width); |
- EXPECT_EQ(expected.icons[i].height, actual.icons[i].height); |
- EXPECT_EQ(expected.icons[i].url, actual.icons[i].url); |
- EXPECT_TRUE( |
- gfx::BitmapsAreEqual(expected.icons[i].data, actual.icons[i].data)); |
+void ValidateAllIconsWithURLsArePresent(const WebApplicationInfo& info_to_check, |
+ const WebApplicationInfo& other_info) { |
+ for (const auto& icon : info_to_check.icons) { |
+ if (!icon.url.is_empty()) { |
+ bool found = false; |
+ for (const auto& other_icon : info_to_check.icons) { |
+ if (other_icon.url == icon.url && other_icon.width == icon.width) { |
+ found = true; |
+ break; |
+ } |
+ } |
+ EXPECT_TRUE(found); |
+ } |
} |
+} |
+ |
+void ValidateWebApplicationInfo(base::Closure callback, |
+ const WebApplicationInfo& original, |
+ const WebApplicationInfo& newly_made) { |
+ EXPECT_EQ(original.title, newly_made.title); |
+ EXPECT_EQ(original.description, newly_made.description); |
+ EXPECT_EQ(original.app_url, newly_made.app_url); |
+ // There should be 6 icons, as there are three sizes which need to be |
+ // generated, and each will generate a 1x and 2x icon. |
+ EXPECT_EQ(6u, newly_made.icons.size()); |
callback.Run(); |
} |
} // namespace |
-namespace extensions { |
- |
class TestBookmarkAppHelper : public BookmarkAppHelper { |
public: |
TestBookmarkAppHelper(ExtensionService* service, |
@@ -226,8 +257,7 @@ TEST_F(BookmarkAppHelperExtensionServiceTest, CreateBookmarkAppNoContents) { |
EXPECT_EQ(kAppTitle, extension->name()); |
EXPECT_EQ(kAppDescription, extension->description()); |
EXPECT_EQ(GURL(kAppUrl), AppLaunchInfo::GetLaunchWebURL(extension)); |
- // The tiny icon should have been removed and only the generated ones used. |
- EXPECT_TRUE( |
+ EXPECT_FALSE( |
IconsInfo::GetIconResource(extension, kIconSizeTiny, |
ExtensionIconSet::MATCH_EXACTLY).empty()); |
EXPECT_FALSE( |
@@ -285,9 +315,9 @@ TEST_F(BookmarkAppHelperExtensionServiceTest, CreateAndUpdateBookmarkApp) { |
EXPECT_EQ(kAlternativeAppTitle, extension->name()); |
EXPECT_EQ(kAppDescription, extension->description()); |
EXPECT_EQ(GURL(kAppUrl), AppLaunchInfo::GetLaunchWebURL(extension)); |
- EXPECT_TRUE(extensions::IconsInfo::GetIconResource( |
- extension, kIconSizeSmall, ExtensionIconSet::MATCH_EXACTLY) |
- .empty()); |
+ EXPECT_FALSE(extensions::IconsInfo::GetIconResource( |
+ extension, kIconSizeSmall, ExtensionIconSet::MATCH_EXACTLY) |
+ .empty()); |
EXPECT_FALSE(extensions::IconsInfo::GetIconResource( |
extension, kIconSizeLarge, ExtensionIconSet::MATCH_EXACTLY) |
.empty()); |
@@ -300,11 +330,6 @@ TEST_F(BookmarkAppHelperExtensionServiceTest, GetWebApplicationInfo) { |
web_app_info.title = base::UTF8ToUTF16(kAppTitle); |
web_app_info.description = base::UTF8ToUTF16(kAppDescription); |
- web_app_info.icons.push_back( |
- CreateIconInfoWithBitmap(kIconSizeSmall, SK_ColorRED)); |
- web_app_info.icons.push_back( |
- CreateIconInfoWithBitmap(kIconSizeLarge, SK_ColorRED)); |
- |
extensions::CreateOrUpdateBookmarkApp(service_, &web_app_info); |
base::RunLoop().RunUntilIdle(); |
@@ -317,6 +342,53 @@ TEST_F(BookmarkAppHelperExtensionServiceTest, GetWebApplicationInfo) { |
run_loop.Run(); |
} |
+TEST_F(BookmarkAppHelperExtensionServiceTest, LinkedAppIconsAreNotChanged) { |
+ WebApplicationInfo web_app_info; |
+ |
+ // Add two icons with a URL and bitmap, two icons with just a bitmap, an |
+ // icon with just URL and an icon in an unsupported size with just a URL. |
+ WebApplicationInfo::IconInfo icon_info = |
+ CreateIconInfoWithBitmap(kIconSizeSmall, SK_ColorRED); |
+ icon_info.url = GURL(kAppIconURL1); |
+ web_app_info.icons.push_back(icon_info); |
+ |
+ icon_info = CreateIconInfoWithBitmap(kIconSizeMedium, SK_ColorRED); |
+ icon_info.url = GURL(kAppIconURL2); |
+ web_app_info.icons.push_back(icon_info); |
+ |
+ icon_info.data = SkBitmap(); |
+ icon_info.url = GURL(kAppIconURL3); |
+ icon_info.width = 0; |
+ icon_info.height = 0; |
+ web_app_info.icons.push_back(icon_info); |
+ |
+ icon_info.url = GURL(kAppIconURL4); |
+ web_app_info.icons.push_back(icon_info); |
+ |
+ icon_info = CreateIconInfoWithBitmap(kIconSizeLarge, SK_ColorRED); |
+ web_app_info.icons.push_back(icon_info); |
+ |
+ icon_info = CreateIconInfoWithBitmap(kIconSizeUnsupported, SK_ColorRED); |
+ web_app_info.icons.push_back(icon_info); |
+ |
+ // 'Download' one of the icons without a size or bitmap. |
+ std::vector<BookmarkAppHelper::BitmapAndSource> downloaded; |
+ downloaded.push_back(BookmarkAppHelper::BitmapAndSource( |
+ GURL(kAppIconURL3), |
+ CreateSquareBitmapWithColor(kIconSizeLarge, SK_ColorBLACK))); |
+ |
+ // Now run the resizing and generation into a new web app info. |
+ WebApplicationInfo new_web_app_info; |
+ std::map<int, BookmarkAppHelper::BitmapAndSource> size_map = |
+ BookmarkAppHelper::ResizeIconsAndGenerateMissing(downloaded, |
+ &new_web_app_info); |
+ |
+ // Now check that the linked app icons (i.e. those with URLs) are matching in |
+ // both lists. |
+ ValidateAllIconsWithURLsArePresent(web_app_info, new_web_app_info); |
+ ValidateAllIconsWithURLsArePresent(new_web_app_info, web_app_info); |
+} |
+ |
TEST_F(BookmarkAppHelperTest, UpdateWebAppInfoFromManifest) { |
WebApplicationInfo web_app_info; |
web_app_info.title = base::UTF8ToUTF16(kAlternativeAppTitle); |
@@ -357,6 +429,46 @@ TEST_F(BookmarkAppHelperTest, UpdateWebAppInfoFromManifest) { |
EXPECT_EQ(GURL(kAppIcon3), web_app_info.icons[1].url); |
} |
+TEST_F(BookmarkAppHelperTest, ConstrainBitmapsToSizes) { |
+ std::set<int> desired_sizes; |
+ desired_sizes.insert(16); |
+ desired_sizes.insert(32); |
+ desired_sizes.insert(128); |
+ desired_sizes.insert(256); |
+ |
+ { |
+ std::vector<BookmarkAppHelper::BitmapAndSource> bitmaps; |
+ bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(16, SK_ColorRED)); |
+ bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(32, SK_ColorGREEN)); |
+ bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(48, SK_ColorBLUE)); |
+ bitmaps.push_back( |
+ CreateSquareBitmapAndSourceWithColor(144, SK_ColorYELLOW)); |
+ |
+ std::map<int, BookmarkAppHelper::BitmapAndSource> results( |
+ BookmarkAppHelper::ConstrainBitmapsToSizes(bitmaps, desired_sizes)); |
+ |
+ EXPECT_EQ(3u, results.size()); |
+ ValidateBitmapSizeAndColor(results[16].bitmap, 16, SK_ColorRED); |
+ ValidateBitmapSizeAndColor(results[32].bitmap, 32, SK_ColorGREEN); |
+ ValidateBitmapSizeAndColor(results[128].bitmap, 128, SK_ColorYELLOW); |
+ } |
+ { |
+ std::vector<BookmarkAppHelper::BitmapAndSource> bitmaps; |
+ bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(512, SK_ColorRED)); |
+ bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(18, SK_ColorGREEN)); |
+ bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(33, SK_ColorBLUE)); |
+ bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(17, SK_ColorYELLOW)); |
+ |
+ std::map<int, BookmarkAppHelper::BitmapAndSource> results( |
+ BookmarkAppHelper::ConstrainBitmapsToSizes(bitmaps, desired_sizes)); |
+ |
+ EXPECT_EQ(3u, results.size()); |
+ ValidateBitmapSizeAndColor(results[16].bitmap, 16, SK_ColorYELLOW); |
+ ValidateBitmapSizeAndColor(results[32].bitmap, 32, SK_ColorBLUE); |
+ ValidateBitmapSizeAndColor(results[256].bitmap, 256, SK_ColorRED); |
+ } |
+} |
+ |
TEST_F(BookmarkAppHelperTest, IsValidBookmarkAppUrl) { |
EXPECT_TRUE(IsValidBookmarkAppUrl(GURL("https://www.chromium.org"))); |
EXPECT_TRUE(IsValidBookmarkAppUrl(GURL("http://www.chromium.org/path"))); |