Index: chrome/browser/extensions/extension_icon_image_unittest.cc |
diff --git a/chrome/browser/extensions/extension_icon_image_unittest.cc b/chrome/browser/extensions/extension_icon_image_unittest.cc |
deleted file mode 100644 |
index 1e4cd56d3a7e08eb7e73a624ce620ff7ca281910..0000000000000000000000000000000000000000 |
--- a/chrome/browser/extensions/extension_icon_image_unittest.cc |
+++ /dev/null |
@@ -1,574 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/extensions/extension_icon_image.h" |
- |
-#include "base/json/json_file_value_serializer.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/path_service.h" |
-#include "chrome/browser/extensions/image_loader.h" |
-#include "chrome/common/chrome_paths.h" |
-#include "chrome/common/extensions/extension_constants.h" |
-#include "chrome/test/base/testing_profile.h" |
-#include "content/public/test/test_browser_thread.h" |
-#include "extensions/common/extension.h" |
-#include "extensions/common/manifest.h" |
-#include "extensions/common/manifest_handlers/icons_handler.h" |
-#include "grit/theme_resources.h" |
-#include "skia/ext/image_operations.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/gfx/image/image_skia_source.h" |
-#include "ui/gfx/skia_util.h" |
- |
-using content::BrowserThread; |
-using extensions::Extension; |
-using extensions::IconImage; |
-using extensions::Manifest; |
- |
-namespace { |
- |
-SkBitmap CreateBlankBitmapForScale(int size_dip, ui::ScaleFactor scale_factor) { |
- SkBitmap bitmap; |
- const float scale = ui::GetScaleForScaleFactor(scale_factor); |
- bitmap.setConfig(SkBitmap::kARGB_8888_Config, |
- static_cast<int>(size_dip * scale), |
- static_cast<int>(size_dip * scale)); |
- bitmap.allocPixels(); |
- bitmap.eraseColor(SkColorSetARGB(0, 0, 0, 0)); |
- return bitmap; |
-} |
- |
-SkBitmap EnsureBitmapSize(const SkBitmap& original, int size) { |
- if (original.width() == size && original.height() == size) |
- return original; |
- |
- SkBitmap resized = skia::ImageOperations::Resize( |
- original, skia::ImageOperations::RESIZE_LANCZOS3, size, size); |
- return resized; |
-} |
- |
-// Used to test behavior including images defined by an image skia source. |
-// |GetImageForScale| simply returns image representation from the image given |
-// in the ctor. |
-class MockImageSkiaSource : public gfx::ImageSkiaSource { |
- public: |
- explicit MockImageSkiaSource(const gfx::ImageSkia& image) |
- : image_(image) { |
- } |
- virtual ~MockImageSkiaSource() {} |
- |
- virtual gfx::ImageSkiaRep GetImageForScale(float scale) OVERRIDE { |
- return image_.GetRepresentation(scale); |
- } |
- |
- private: |
- gfx::ImageSkia image_; |
-}; |
- |
-// Helper class for synchronously loading extension image resource. |
-class TestImageLoader { |
- public: |
- explicit TestImageLoader(const Extension* extension) |
- : extension_(extension), |
- waiting_(false), |
- image_loaded_(false) { |
- } |
- virtual ~TestImageLoader() {} |
- |
- void OnImageLoaded(const gfx::Image& image) { |
- image_ = image; |
- image_loaded_ = true; |
- if (waiting_) |
- base::MessageLoop::current()->Quit(); |
- } |
- |
- SkBitmap LoadBitmap(const std::string& path, |
- int size) { |
- image_loaded_ = false; |
- |
- image_loader_.LoadImageAsync( |
- extension_, extension_->GetResource(path), gfx::Size(size, size), |
- base::Bind(&TestImageLoader::OnImageLoaded, |
- base::Unretained(this))); |
- |
- // If |image_| still hasn't been loaded (i.e. it is being loaded |
- // asynchronously), wait for it. |
- if (!image_loaded_) { |
- waiting_ = true; |
- base::MessageLoop::current()->Run(); |
- waiting_ = false; |
- } |
- |
- EXPECT_TRUE(image_loaded_); |
- |
- return image_.IsEmpty() ? SkBitmap() : *image_.ToSkBitmap(); |
- } |
- |
- private: |
- const Extension* extension_; |
- bool waiting_; |
- bool image_loaded_; |
- gfx::Image image_; |
- extensions::ImageLoader image_loader_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestImageLoader); |
-}; |
- |
-class ExtensionIconImageTest : public testing::Test, |
- public IconImage::Observer { |
- public: |
- ExtensionIconImageTest() |
- : image_loaded_count_(0), |
- quit_in_image_loaded_(false), |
- ui_thread_(BrowserThread::UI, &ui_loop_), |
- file_thread_(BrowserThread::FILE), |
- io_thread_(BrowserThread::IO) { |
- } |
- |
- virtual ~ExtensionIconImageTest() {} |
- |
- void WaitForImageLoad() { |
- quit_in_image_loaded_ = true; |
- base::MessageLoop::current()->Run(); |
- quit_in_image_loaded_ = false; |
- } |
- |
- int ImageLoadedCount() { |
- int result = image_loaded_count_; |
- image_loaded_count_ = 0; |
- return result; |
- } |
- |
- scoped_refptr<Extension> CreateExtension(const char* name, |
- Manifest::Location location) { |
- // Create and load an extension. |
- base::FilePath test_file; |
- if (!PathService::Get(chrome::DIR_TEST_DATA, &test_file)) { |
- EXPECT_FALSE(true); |
- return NULL; |
- } |
- test_file = test_file.AppendASCII("extensions").AppendASCII(name); |
- int error_code = 0; |
- std::string error; |
- JSONFileValueSerializer serializer(test_file.AppendASCII("app.json")); |
- scoped_ptr<base::DictionaryValue> valid_value( |
- static_cast<base::DictionaryValue*>(serializer.Deserialize(&error_code, |
- &error))); |
- EXPECT_EQ(0, error_code) << error; |
- if (error_code != 0) |
- return NULL; |
- |
- EXPECT_TRUE(valid_value.get()); |
- if (!valid_value) |
- return NULL; |
- |
- return Extension::Create(test_file, location, *valid_value, |
- Extension::NO_FLAGS, &error); |
- } |
- |
- // testing::Test overrides: |
- virtual void SetUp() OVERRIDE { |
- file_thread_.Start(); |
- io_thread_.Start(); |
- } |
- |
- // IconImage::Delegate overrides: |
- virtual void OnExtensionIconImageChanged(IconImage* image) OVERRIDE { |
- image_loaded_count_++; |
- if (quit_in_image_loaded_) |
- base::MessageLoop::current()->Quit(); |
- } |
- |
- gfx::ImageSkia GetDefaultIcon() { |
- return *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
- IDR_EXTENSIONS_FAVICON); |
- } |
- |
- // Loads an image to be used in test from the extension. |
- // The image will be loaded from the relative path |path|. |
- SkBitmap GetTestBitmap(const Extension* extension, |
- const std::string& path, |
- int size) { |
- TestImageLoader image_loader(extension); |
- return image_loader.LoadBitmap(path, size); |
- } |
- |
- private: |
- int image_loaded_count_; |
- bool quit_in_image_loaded_; |
- base::MessageLoop ui_loop_; |
- content::TestBrowserThread ui_thread_; |
- content::TestBrowserThread file_thread_; |
- content::TestBrowserThread io_thread_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ExtensionIconImageTest); |
-}; |
- |
-} // namespace |
- |
-TEST_F(ExtensionIconImageTest, Basic) { |
- std::vector<ui::ScaleFactor> supported_factors; |
- supported_factors.push_back(ui::SCALE_FACTOR_100P); |
- supported_factors.push_back(ui::SCALE_FACTOR_200P); |
- ui::test::ScopedSetSupportedScaleFactors scoped_supported(supported_factors); |
- scoped_ptr<Profile> profile(new TestingProfile()); |
- scoped_refptr<Extension> extension(CreateExtension( |
- "extension_icon_image", Manifest::INVALID_LOCATION)); |
- ASSERT_TRUE(extension.get() != NULL); |
- |
- gfx::ImageSkia default_icon = GetDefaultIcon(); |
- |
- // Load images we expect to find as representations in icon_image, so we |
- // can later use them to validate icon_image. |
- SkBitmap bitmap_16 = GetTestBitmap(extension.get(), "16.png", 16); |
- ASSERT_FALSE(bitmap_16.empty()); |
- |
- // There is no image of size 32 defined in the extension manifest, so we |
- // should expect manifest image of size 48 resized to size 32. |
- SkBitmap bitmap_48_resized_to_32 = |
- GetTestBitmap(extension.get(), "48.png", 32); |
- ASSERT_FALSE(bitmap_48_resized_to_32.empty()); |
- |
- IconImage image(profile.get(), |
- extension.get(), |
- extensions::IconsInfo::GetIcons(extension.get()), |
- 16, |
- default_icon, |
- this); |
- |
- // No representations in |image_| yet. |
- gfx::ImageSkia::ImageSkiaReps image_reps = image.image_skia().image_reps(); |
- ASSERT_EQ(0u, image_reps.size()); |
- |
- // Gets representation for a scale factor. |
- gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); |
- |
- // Before the image representation is loaded, image should contain blank |
- // image representation. |
- EXPECT_TRUE(gfx::BitmapsAreEqual( |
- representation.sk_bitmap(), |
- CreateBlankBitmapForScale(16, ui::SCALE_FACTOR_100P))); |
- |
- WaitForImageLoad(); |
- EXPECT_EQ(1, ImageLoadedCount()); |
- ASSERT_EQ(1u, image.image_skia().image_reps().size()); |
- |
- representation = image.image_skia().GetRepresentation(1.0f); |
- |
- // We should get the right representation now. |
- EXPECT_TRUE(gfx::BitmapsAreEqual(representation.sk_bitmap(), bitmap_16)); |
- EXPECT_EQ(16, representation.pixel_width()); |
- |
- // Gets representation for an additional scale factor. |
- representation = image.image_skia().GetRepresentation(2.0f); |
- |
- EXPECT_TRUE(gfx::BitmapsAreEqual( |
- representation.sk_bitmap(), |
- CreateBlankBitmapForScale(16, ui::SCALE_FACTOR_200P))); |
- |
- WaitForImageLoad(); |
- EXPECT_EQ(1, ImageLoadedCount()); |
- ASSERT_EQ(2u, image.image_skia().image_reps().size()); |
- |
- representation = image.image_skia().GetRepresentation(2.0f); |
- |
- // Image should have been resized. |
- EXPECT_EQ(32, representation.pixel_width()); |
- EXPECT_TRUE(gfx::BitmapsAreEqual(representation.sk_bitmap(), |
- bitmap_48_resized_to_32)); |
-} |
- |
-// There is no resource with either exact or bigger size, but there is a smaller |
-// resource. |
-TEST_F(ExtensionIconImageTest, FallbackToSmallerWhenNoBigger) { |
- std::vector<ui::ScaleFactor> supported_factors; |
- supported_factors.push_back(ui::SCALE_FACTOR_100P); |
- supported_factors.push_back(ui::SCALE_FACTOR_200P); |
- ui::test::ScopedSetSupportedScaleFactors scoped_supported(supported_factors); |
- scoped_ptr<Profile> profile(new TestingProfile()); |
- scoped_refptr<Extension> extension(CreateExtension( |
- "extension_icon_image", Manifest::INVALID_LOCATION)); |
- ASSERT_TRUE(extension.get() != NULL); |
- |
- gfx::ImageSkia default_icon = GetDefaultIcon(); |
- |
- // Load images we expect to find as representations in icon_image, so we |
- // can later use them to validate icon_image. |
- SkBitmap bitmap_48 = GetTestBitmap(extension.get(), "48.png", 48); |
- ASSERT_FALSE(bitmap_48.empty()); |
- |
- IconImage image(profile.get(), |
- extension.get(), |
- extensions::IconsInfo::GetIcons(extension.get()), |
- 32, |
- default_icon, |
- this); |
- |
- gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(2.0f); |
- |
- WaitForImageLoad(); |
- EXPECT_EQ(1, ImageLoadedCount()); |
- ASSERT_EQ(1u, image.image_skia().image_reps().size()); |
- |
- representation = image.image_skia().GetRepresentation(2.0f); |
- |
- // We should have loaded the biggest smaller resource resized to the actual |
- // size. |
- EXPECT_EQ(2.0f, representation.scale()); |
- EXPECT_EQ(64, representation.pixel_width()); |
- EXPECT_TRUE(gfx::BitmapsAreEqual(representation.sk_bitmap(), |
- EnsureBitmapSize(bitmap_48, 64))); |
-} |
- |
-// There is no resource with exact size, but there is a smaller and a bigger |
-// one. Requested size is smaller than 32 though, so the smaller resource should |
-// be loaded. |
-TEST_F(ExtensionIconImageTest, FallbackToSmaller) { |
- scoped_ptr<Profile> profile(new TestingProfile()); |
- scoped_refptr<Extension> extension(CreateExtension( |
- "extension_icon_image", Manifest::INVALID_LOCATION)); |
- ASSERT_TRUE(extension.get() != NULL); |
- |
- gfx::ImageSkia default_icon = GetDefaultIcon(); |
- |
- // Load images we expect to find as representations in icon_image, so we |
- // can later use them to validate icon_image. |
- SkBitmap bitmap_16 = GetTestBitmap(extension.get(), "16.png", 16); |
- ASSERT_FALSE(bitmap_16.empty()); |
- |
- IconImage image(profile.get(), |
- extension.get(), |
- extensions::IconsInfo::GetIcons(extension.get()), |
- 17, |
- default_icon, |
- this); |
- |
- gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); |
- |
- WaitForImageLoad(); |
- EXPECT_EQ(1, ImageLoadedCount()); |
- ASSERT_EQ(1u, image.image_skia().image_reps().size()); |
- |
- representation = image.image_skia().GetRepresentation(1.0f); |
- |
- // We should have loaded smaller (resized) resource. |
- EXPECT_EQ(1.0f, representation.scale()); |
- EXPECT_EQ(17, representation.pixel_width()); |
- EXPECT_TRUE(gfx::BitmapsAreEqual(representation.sk_bitmap(), |
- EnsureBitmapSize(bitmap_16, 17))); |
-} |
- |
-// If resource set is empty, |GetRepresentation| should synchronously return |
-// default icon, without notifying observer of image change. |
-TEST_F(ExtensionIconImageTest, NoResources) { |
- scoped_ptr<Profile> profile(new TestingProfile()); |
- scoped_refptr<Extension> extension(CreateExtension( |
- "extension_icon_image", Manifest::INVALID_LOCATION)); |
- ASSERT_TRUE(extension.get() != NULL); |
- |
- ExtensionIconSet empty_icon_set; |
- gfx::ImageSkia default_icon = GetDefaultIcon(); |
- |
- const int kRequestedSize = 24; |
- IconImage image(profile.get(), |
- extension.get(), |
- empty_icon_set, |
- kRequestedSize, |
- default_icon, |
- this); |
- |
- gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); |
- EXPECT_TRUE(gfx::BitmapsAreEqual( |
- representation.sk_bitmap(), |
- EnsureBitmapSize( |
- default_icon.GetRepresentation(1.0f).sk_bitmap(), |
- kRequestedSize))); |
- |
- EXPECT_EQ(0, ImageLoadedCount()); |
- // We should have a default icon representation. |
- ASSERT_EQ(1u, image.image_skia().image_reps().size()); |
- |
- representation = image.image_skia().GetRepresentation(1.0f); |
- EXPECT_TRUE(gfx::BitmapsAreEqual( |
- representation.sk_bitmap(), |
- EnsureBitmapSize( |
- default_icon.GetRepresentation(1.0f).sk_bitmap(), |
- kRequestedSize))); |
-} |
- |
-// If resource set is invalid, image load should be done asynchronously and |
-// the observer should be notified when it's done. |GetRepresentation| should |
-// return the default icon representation once image load is done. |
-TEST_F(ExtensionIconImageTest, InvalidResource) { |
- scoped_ptr<Profile> profile(new TestingProfile()); |
- scoped_refptr<Extension> extension(CreateExtension( |
- "extension_icon_image", Manifest::INVALID_LOCATION)); |
- ASSERT_TRUE(extension.get() != NULL); |
- |
- const int kInvalidIconSize = 24; |
- ExtensionIconSet invalid_icon_set; |
- invalid_icon_set.Add(kInvalidIconSize, "invalid.png"); |
- |
- gfx::ImageSkia default_icon = GetDefaultIcon(); |
- |
- IconImage image(profile.get(), |
- extension.get(), |
- invalid_icon_set, |
- kInvalidIconSize, |
- default_icon, |
- this); |
- |
- gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); |
- EXPECT_TRUE(gfx::BitmapsAreEqual( |
- representation.sk_bitmap(), |
- CreateBlankBitmapForScale(kInvalidIconSize, ui::SCALE_FACTOR_100P))); |
- |
- WaitForImageLoad(); |
- EXPECT_EQ(1, ImageLoadedCount()); |
- // We should have default icon representation now. |
- ASSERT_EQ(1u, image.image_skia().image_reps().size()); |
- |
- representation = image.image_skia().GetRepresentation(1.0f); |
- EXPECT_TRUE(gfx::BitmapsAreEqual( |
- representation.sk_bitmap(), |
- EnsureBitmapSize( |
- default_icon.GetRepresentation(1.0f).sk_bitmap(), |
- kInvalidIconSize))); |
-} |
- |
-// Test that IconImage works with lazily (but synchronously) created default |
-// icon when IconImage returns synchronously. |
-TEST_F(ExtensionIconImageTest, LazyDefaultIcon) { |
- scoped_ptr<Profile> profile(new TestingProfile()); |
- scoped_refptr<Extension> extension(CreateExtension( |
- "extension_icon_image", Manifest::INVALID_LOCATION)); |
- ASSERT_TRUE(extension.get() != NULL); |
- |
- gfx::ImageSkia default_icon = GetDefaultIcon(); |
- gfx::ImageSkia lazy_default_icon(new MockImageSkiaSource(default_icon), |
- default_icon.size()); |
- |
- ExtensionIconSet empty_icon_set; |
- |
- const int kRequestedSize = 128; |
- IconImage image(profile.get(), |
- extension.get(), |
- empty_icon_set, |
- kRequestedSize, |
- lazy_default_icon, |
- this); |
- |
- ASSERT_FALSE(lazy_default_icon.HasRepresentation(1.0f)); |
- |
- gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); |
- |
- // The resouce set is empty, so we should get the result right away. |
- EXPECT_TRUE(lazy_default_icon.HasRepresentation(1.0f)); |
- EXPECT_TRUE(gfx::BitmapsAreEqual( |
- representation.sk_bitmap(), |
- EnsureBitmapSize( |
- default_icon.GetRepresentation(1.0f).sk_bitmap(), |
- kRequestedSize))); |
- |
- // We should have a default icon representation. |
- ASSERT_EQ(1u, image.image_skia().image_reps().size()); |
-} |
- |
-// Test that IconImage works with lazily (but synchronously) created default |
-// icon when IconImage returns asynchronously. |
-TEST_F(ExtensionIconImageTest, LazyDefaultIcon_AsyncIconImage) { |
- scoped_ptr<Profile> profile(new TestingProfile()); |
- scoped_refptr<Extension> extension(CreateExtension( |
- "extension_icon_image", Manifest::INVALID_LOCATION)); |
- ASSERT_TRUE(extension.get() != NULL); |
- |
- gfx::ImageSkia default_icon = GetDefaultIcon(); |
- gfx::ImageSkia lazy_default_icon(new MockImageSkiaSource(default_icon), |
- default_icon.size()); |
- |
- const int kInvalidIconSize = 24; |
- ExtensionIconSet invalid_icon_set; |
- invalid_icon_set.Add(kInvalidIconSize, "invalid.png"); |
- |
- IconImage image(profile.get(), |
- extension.get(), |
- invalid_icon_set, |
- kInvalidIconSize, |
- lazy_default_icon, |
- this); |
- |
- ASSERT_FALSE(lazy_default_icon.HasRepresentation(1.0f)); |
- |
- gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); |
- |
- WaitForImageLoad(); |
- EXPECT_EQ(1, ImageLoadedCount()); |
- // We should have default icon representation now. |
- ASSERT_EQ(1u, image.image_skia().image_reps().size()); |
- |
- EXPECT_TRUE(lazy_default_icon.HasRepresentation(1.0f)); |
- |
- representation = image.image_skia().GetRepresentation(1.0f); |
- EXPECT_TRUE(gfx::BitmapsAreEqual( |
- representation.sk_bitmap(), |
- EnsureBitmapSize( |
- default_icon.GetRepresentation(1.0f).sk_bitmap(), |
- kInvalidIconSize))); |
-} |
- |
-// Tests behavior of image created by IconImage after IconImage host goes |
-// away. The image should still return loaded representations. If requested |
-// representation was not loaded while IconImage host was around, transparent |
-// representations should be returned. |
-TEST_F(ExtensionIconImageTest, IconImageDestruction) { |
- scoped_ptr<Profile> profile(new TestingProfile()); |
- scoped_refptr<Extension> extension(CreateExtension( |
- "extension_icon_image", Manifest::INVALID_LOCATION)); |
- ASSERT_TRUE(extension.get() != NULL); |
- |
- gfx::ImageSkia default_icon = GetDefaultIcon(); |
- |
- // Load images we expect to find as representations in icon_image, so we |
- // can later use them to validate icon_image. |
- SkBitmap bitmap_16 = GetTestBitmap(extension.get(), "16.png", 16); |
- ASSERT_FALSE(bitmap_16.empty()); |
- |
- scoped_ptr<IconImage> image( |
- new IconImage(profile.get(), |
- extension.get(), |
- extensions::IconsInfo::GetIcons(extension.get()), |
- 16, |
- default_icon, |
- this)); |
- |
- // Load an image representation. |
- gfx::ImageSkiaRep representation = |
- image->image_skia().GetRepresentation(1.0f); |
- |
- WaitForImageLoad(); |
- EXPECT_EQ(1, ImageLoadedCount()); |
- ASSERT_EQ(1u, image->image_skia().image_reps().size()); |
- |
- // Stash loaded image skia, and destroy |image|. |
- gfx::ImageSkia image_skia = image->image_skia(); |
- image.reset(); |
- extension = NULL; |
- |
- // Image skia should still be able to get previously loaded representation. |
- representation = image_skia.GetRepresentation(1.0f); |
- |
- EXPECT_EQ(1.0f, representation.scale()); |
- EXPECT_EQ(16, representation.pixel_width()); |
- EXPECT_TRUE(gfx::BitmapsAreEqual(representation.sk_bitmap(), bitmap_16)); |
- |
- // When requesting another representation, we should not crash and return some |
- // image of the size. It could be blank or a rescale from the existing 1.0f |
- // icon. |
- representation = image_skia.GetRepresentation(2.0f); |
- |
- EXPECT_EQ(16, representation.GetWidth()); |
- EXPECT_EQ(16, representation.GetHeight()); |
- EXPECT_EQ(2.0f, representation.scale()); |
-} |