| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/browser/extension_icon_image.h" | 5 #include "extensions/browser/extension_icon_image.h" |
| 6 | 6 |
| 7 #include <vector> |
| 8 |
| 7 #include "base/json/json_file_value_serializer.h" | 9 #include "base/json/json_file_value_serializer.h" |
| 8 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| 9 #include "base/path_service.h" | 11 #include "base/path_service.h" |
| 10 #include "chrome/test/base/testing_profile.h" | 12 #include "content/public/browser/notification_service.h" |
| 13 #include "content/public/test/test_browser_context.h" |
| 11 #include "content/public/test/test_browser_thread.h" | 14 #include "content/public/test/test_browser_thread.h" |
| 15 #include "extensions/browser/extensions_test.h" |
| 12 #include "extensions/browser/image_loader.h" | 16 #include "extensions/browser/image_loader.h" |
| 13 #include "extensions/common/extension.h" | 17 #include "extensions/common/extension.h" |
| 14 #include "extensions/common/extension_paths.h" | 18 #include "extensions/common/extension_paths.h" |
| 15 #include "extensions/common/manifest.h" | 19 #include "extensions/common/manifest.h" |
| 16 #include "extensions/common/manifest_handlers/icons_handler.h" | 20 #include "extensions/common/manifest_handlers/icons_handler.h" |
| 17 #include "skia/ext/image_operations.h" | 21 #include "skia/ext/image_operations.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 19 #include "ui/base/resource/resource_bundle.h" | 23 #include "ui/base/resource/resource_bundle.h" |
| 20 #include "ui/gfx/image/image_skia_source.h" | 24 #include "ui/gfx/image/image_skia_source.h" |
| 21 #include "ui/gfx/skia_util.h" | 25 #include "ui/gfx/skia_util.h" |
| 22 | 26 |
| 23 using content::BrowserThread; | 27 using content::BrowserThread; |
| 24 using extensions::Extension; | |
| 25 using extensions::IconImage; | |
| 26 using extensions::Manifest; | |
| 27 | 28 |
| 29 namespace extensions { |
| 28 namespace { | 30 namespace { |
| 29 | 31 |
| 30 SkBitmap CreateBlankBitmapForScale(int size_dip, ui::ScaleFactor scale_factor) { | 32 SkBitmap CreateBlankBitmapForScale(int size_dip, ui::ScaleFactor scale_factor) { |
| 31 SkBitmap bitmap; | 33 SkBitmap bitmap; |
| 32 const float scale = ui::GetScaleForScaleFactor(scale_factor); | 34 const float scale = ui::GetScaleForScaleFactor(scale_factor); |
| 33 bitmap.allocN32Pixels(static_cast<int>(size_dip * scale), | 35 bitmap.allocN32Pixels(static_cast<int>(size_dip * scale), |
| 34 static_cast<int>(size_dip * scale)); | 36 static_cast<int>(size_dip * scale)); |
| 35 bitmap.eraseColor(SkColorSetARGB(0, 0, 0, 0)); | 37 bitmap.eraseColor(SkColorSetARGB(0, 0, 0, 0)); |
| 36 return bitmap; | 38 return bitmap; |
| 37 } | 39 } |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 EXPECT_TRUE(image_loaded_); | 102 EXPECT_TRUE(image_loaded_); |
| 101 | 103 |
| 102 return image_.IsEmpty() ? SkBitmap() : *image_.ToSkBitmap(); | 104 return image_.IsEmpty() ? SkBitmap() : *image_.ToSkBitmap(); |
| 103 } | 105 } |
| 104 | 106 |
| 105 private: | 107 private: |
| 106 const Extension* extension_; | 108 const Extension* extension_; |
| 107 bool waiting_; | 109 bool waiting_; |
| 108 bool image_loaded_; | 110 bool image_loaded_; |
| 109 gfx::Image image_; | 111 gfx::Image image_; |
| 110 extensions::ImageLoader image_loader_; | 112 ImageLoader image_loader_; |
| 111 | 113 |
| 112 DISALLOW_COPY_AND_ASSIGN(TestImageLoader); | 114 DISALLOW_COPY_AND_ASSIGN(TestImageLoader); |
| 113 }; | 115 }; |
| 114 | 116 |
| 115 class ExtensionIconImageTest : public testing::Test, | 117 class ExtensionIconImageTest : public ExtensionsTest, |
| 116 public IconImage::Observer { | 118 public IconImage::Observer { |
| 117 public: | 119 public: |
| 118 ExtensionIconImageTest() | 120 ExtensionIconImageTest() |
| 119 : image_loaded_count_(0), | 121 : image_loaded_count_(0), |
| 120 quit_in_image_loaded_(false), | 122 quit_in_image_loaded_(false), |
| 121 ui_thread_(BrowserThread::UI, &ui_loop_), | 123 ui_thread_(BrowserThread::UI, &ui_loop_), |
| 122 file_thread_(BrowserThread::FILE), | 124 file_thread_(BrowserThread::FILE), |
| 123 io_thread_(BrowserThread::IO) { | 125 io_thread_(BrowserThread::IO), |
| 124 } | 126 notification_service_(content::NotificationService::Create()) {} |
| 125 | 127 |
| 126 virtual ~ExtensionIconImageTest() {} | 128 virtual ~ExtensionIconImageTest() {} |
| 127 | 129 |
| 128 void WaitForImageLoad() { | 130 void WaitForImageLoad() { |
| 129 quit_in_image_loaded_ = true; | 131 quit_in_image_loaded_ = true; |
| 130 base::MessageLoop::current()->Run(); | 132 base::MessageLoop::current()->Run(); |
| 131 quit_in_image_loaded_ = false; | 133 quit_in_image_loaded_ = false; |
| 132 } | 134 } |
| 133 | 135 |
| 134 int ImageLoadedCount() { | 136 int ImageLoadedCount() { |
| 135 int result = image_loaded_count_; | 137 int result = image_loaded_count_; |
| 136 image_loaded_count_ = 0; | 138 image_loaded_count_ = 0; |
| 137 return result; | 139 return result; |
| 138 } | 140 } |
| 139 | 141 |
| 140 scoped_refptr<Extension> CreateExtension(const char* name, | 142 scoped_refptr<Extension> CreateExtension(const char* name, |
| 141 Manifest::Location location) { | 143 Manifest::Location location) { |
| 142 // Create and load an extension. | 144 // Create and load an extension. |
| 143 base::FilePath test_file; | 145 base::FilePath test_file; |
| 144 if (!PathService::Get(extensions::DIR_TEST_DATA, &test_file)) { | 146 if (!PathService::Get(DIR_TEST_DATA, &test_file)) { |
| 145 EXPECT_FALSE(true); | 147 EXPECT_FALSE(true); |
| 146 return NULL; | 148 return NULL; |
| 147 } | 149 } |
| 148 test_file = test_file.AppendASCII(name); | 150 test_file = test_file.AppendASCII(name); |
| 149 int error_code = 0; | 151 int error_code = 0; |
| 150 std::string error; | 152 std::string error; |
| 151 JSONFileValueSerializer serializer(test_file.AppendASCII("manifest.json")); | 153 JSONFileValueSerializer serializer(test_file.AppendASCII("manifest.json")); |
| 152 scoped_ptr<base::DictionaryValue> valid_value( | 154 scoped_ptr<base::DictionaryValue> valid_value( |
| 153 static_cast<base::DictionaryValue*>(serializer.Deserialize(&error_code, | 155 static_cast<base::DictionaryValue*>(serializer.Deserialize(&error_code, |
| 154 &error))); | 156 &error))); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 return image_loader.LoadBitmap(path, size); | 192 return image_loader.LoadBitmap(path, size); |
| 191 } | 193 } |
| 192 | 194 |
| 193 private: | 195 private: |
| 194 int image_loaded_count_; | 196 int image_loaded_count_; |
| 195 bool quit_in_image_loaded_; | 197 bool quit_in_image_loaded_; |
| 196 base::MessageLoop ui_loop_; | 198 base::MessageLoop ui_loop_; |
| 197 content::TestBrowserThread ui_thread_; | 199 content::TestBrowserThread ui_thread_; |
| 198 content::TestBrowserThread file_thread_; | 200 content::TestBrowserThread file_thread_; |
| 199 content::TestBrowserThread io_thread_; | 201 content::TestBrowserThread io_thread_; |
| 202 scoped_ptr<content::NotificationService> notification_service_; |
| 200 | 203 |
| 201 DISALLOW_COPY_AND_ASSIGN(ExtensionIconImageTest); | 204 DISALLOW_COPY_AND_ASSIGN(ExtensionIconImageTest); |
| 202 }; | 205 }; |
| 203 | 206 |
| 204 } // namespace | 207 } // namespace |
| 205 | 208 |
| 206 TEST_F(ExtensionIconImageTest, Basic) { | 209 TEST_F(ExtensionIconImageTest, Basic) { |
| 207 std::vector<ui::ScaleFactor> supported_factors; | 210 std::vector<ui::ScaleFactor> supported_factors; |
| 208 supported_factors.push_back(ui::SCALE_FACTOR_100P); | 211 supported_factors.push_back(ui::SCALE_FACTOR_100P); |
| 209 supported_factors.push_back(ui::SCALE_FACTOR_200P); | 212 supported_factors.push_back(ui::SCALE_FACTOR_200P); |
| 210 ui::test::ScopedSetSupportedScaleFactors scoped_supported(supported_factors); | 213 ui::test::ScopedSetSupportedScaleFactors scoped_supported(supported_factors); |
| 211 scoped_ptr<content::BrowserContext> profile(new TestingProfile()); | |
| 212 scoped_refptr<Extension> extension(CreateExtension( | 214 scoped_refptr<Extension> extension(CreateExtension( |
| 213 "extension_icon_image", Manifest::INVALID_LOCATION)); | 215 "extension_icon_image", Manifest::INVALID_LOCATION)); |
| 214 ASSERT_TRUE(extension.get() != NULL); | 216 ASSERT_TRUE(extension.get() != NULL); |
| 215 | 217 |
| 216 gfx::ImageSkia default_icon = GetDefaultIcon(); | 218 gfx::ImageSkia default_icon = GetDefaultIcon(); |
| 217 | 219 |
| 218 // Load images we expect to find as representations in icon_image, so we | 220 // Load images we expect to find as representations in icon_image, so we |
| 219 // can later use them to validate icon_image. | 221 // can later use them to validate icon_image. |
| 220 SkBitmap bitmap_16 = GetTestBitmap(extension.get(), "16.png", 16); | 222 SkBitmap bitmap_16 = GetTestBitmap(extension.get(), "16.png", 16); |
| 221 ASSERT_FALSE(bitmap_16.empty()); | 223 ASSERT_FALSE(bitmap_16.empty()); |
| 222 | 224 |
| 223 // There is no image of size 32 defined in the extension manifest, so we | 225 // There is no image of size 32 defined in the extension manifest, so we |
| 224 // should expect manifest image of size 48 resized to size 32. | 226 // should expect manifest image of size 48 resized to size 32. |
| 225 SkBitmap bitmap_48_resized_to_32 = | 227 SkBitmap bitmap_48_resized_to_32 = |
| 226 GetTestBitmap(extension.get(), "48.png", 32); | 228 GetTestBitmap(extension.get(), "48.png", 32); |
| 227 ASSERT_FALSE(bitmap_48_resized_to_32.empty()); | 229 ASSERT_FALSE(bitmap_48_resized_to_32.empty()); |
| 228 | 230 |
| 229 IconImage image(profile.get(), | 231 IconImage image(browser_context(), |
| 230 extension.get(), | 232 extension.get(), |
| 231 extensions::IconsInfo::GetIcons(extension.get()), | 233 IconsInfo::GetIcons(extension.get()), |
| 232 16, | 234 16, |
| 233 default_icon, | 235 default_icon, |
| 234 this); | 236 this); |
| 235 | 237 |
| 236 // No representations in |image_| yet. | 238 // No representations in |image_| yet. |
| 237 gfx::ImageSkia::ImageSkiaReps image_reps = image.image_skia().image_reps(); | 239 gfx::ImageSkia::ImageSkiaReps image_reps = image.image_skia().image_reps(); |
| 238 ASSERT_EQ(0u, image_reps.size()); | 240 ASSERT_EQ(0u, image_reps.size()); |
| 239 | 241 |
| 240 // Gets representation for a scale factor. | 242 // Gets representation for a scale factor. |
| 241 gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); | 243 gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 bitmap_48_resized_to_32)); | 277 bitmap_48_resized_to_32)); |
| 276 } | 278 } |
| 277 | 279 |
| 278 // There is no resource with either exact or bigger size, but there is a smaller | 280 // There is no resource with either exact or bigger size, but there is a smaller |
| 279 // resource. | 281 // resource. |
| 280 TEST_F(ExtensionIconImageTest, FallbackToSmallerWhenNoBigger) { | 282 TEST_F(ExtensionIconImageTest, FallbackToSmallerWhenNoBigger) { |
| 281 std::vector<ui::ScaleFactor> supported_factors; | 283 std::vector<ui::ScaleFactor> supported_factors; |
| 282 supported_factors.push_back(ui::SCALE_FACTOR_100P); | 284 supported_factors.push_back(ui::SCALE_FACTOR_100P); |
| 283 supported_factors.push_back(ui::SCALE_FACTOR_200P); | 285 supported_factors.push_back(ui::SCALE_FACTOR_200P); |
| 284 ui::test::ScopedSetSupportedScaleFactors scoped_supported(supported_factors); | 286 ui::test::ScopedSetSupportedScaleFactors scoped_supported(supported_factors); |
| 285 scoped_ptr<content::BrowserContext> profile(new TestingProfile()); | |
| 286 scoped_refptr<Extension> extension(CreateExtension( | 287 scoped_refptr<Extension> extension(CreateExtension( |
| 287 "extension_icon_image", Manifest::INVALID_LOCATION)); | 288 "extension_icon_image", Manifest::INVALID_LOCATION)); |
| 288 ASSERT_TRUE(extension.get() != NULL); | 289 ASSERT_TRUE(extension.get() != NULL); |
| 289 | 290 |
| 290 gfx::ImageSkia default_icon = GetDefaultIcon(); | 291 gfx::ImageSkia default_icon = GetDefaultIcon(); |
| 291 | 292 |
| 292 // Load images we expect to find as representations in icon_image, so we | 293 // Load images we expect to find as representations in icon_image, so we |
| 293 // can later use them to validate icon_image. | 294 // can later use them to validate icon_image. |
| 294 SkBitmap bitmap_48 = GetTestBitmap(extension.get(), "48.png", 48); | 295 SkBitmap bitmap_48 = GetTestBitmap(extension.get(), "48.png", 48); |
| 295 ASSERT_FALSE(bitmap_48.empty()); | 296 ASSERT_FALSE(bitmap_48.empty()); |
| 296 | 297 |
| 297 IconImage image(profile.get(), | 298 IconImage image(browser_context(), |
| 298 extension.get(), | 299 extension.get(), |
| 299 extensions::IconsInfo::GetIcons(extension.get()), | 300 IconsInfo::GetIcons(extension.get()), |
| 300 32, | 301 32, |
| 301 default_icon, | 302 default_icon, |
| 302 this); | 303 this); |
| 303 | 304 |
| 304 gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(2.0f); | 305 gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(2.0f); |
| 305 | 306 |
| 306 WaitForImageLoad(); | 307 WaitForImageLoad(); |
| 307 EXPECT_EQ(1, ImageLoadedCount()); | 308 EXPECT_EQ(1, ImageLoadedCount()); |
| 308 ASSERT_EQ(1u, image.image_skia().image_reps().size()); | 309 ASSERT_EQ(1u, image.image_skia().image_reps().size()); |
| 309 | 310 |
| 310 representation = image.image_skia().GetRepresentation(2.0f); | 311 representation = image.image_skia().GetRepresentation(2.0f); |
| 311 | 312 |
| 312 // We should have loaded the biggest smaller resource resized to the actual | 313 // We should have loaded the biggest smaller resource resized to the actual |
| 313 // size. | 314 // size. |
| 314 EXPECT_EQ(2.0f, representation.scale()); | 315 EXPECT_EQ(2.0f, representation.scale()); |
| 315 EXPECT_EQ(64, representation.pixel_width()); | 316 EXPECT_EQ(64, representation.pixel_width()); |
| 316 EXPECT_TRUE(gfx::BitmapsAreEqual(representation.sk_bitmap(), | 317 EXPECT_TRUE(gfx::BitmapsAreEqual(representation.sk_bitmap(), |
| 317 EnsureBitmapSize(bitmap_48, 64))); | 318 EnsureBitmapSize(bitmap_48, 64))); |
| 318 } | 319 } |
| 319 | 320 |
| 320 // There is no resource with exact size, but there is a smaller and a bigger | 321 // There is no resource with exact size, but there is a smaller and a bigger |
| 321 // one. The bigger resource should be loaded. | 322 // one. The bigger resource should be loaded. |
| 322 TEST_F(ExtensionIconImageTest, FallbackToBigger) { | 323 TEST_F(ExtensionIconImageTest, FallbackToBigger) { |
| 323 scoped_ptr<content::BrowserContext> profile(new TestingProfile()); | |
| 324 scoped_refptr<Extension> extension(CreateExtension( | 324 scoped_refptr<Extension> extension(CreateExtension( |
| 325 "extension_icon_image", Manifest::INVALID_LOCATION)); | 325 "extension_icon_image", Manifest::INVALID_LOCATION)); |
| 326 ASSERT_TRUE(extension.get() != NULL); | 326 ASSERT_TRUE(extension.get() != NULL); |
| 327 | 327 |
| 328 gfx::ImageSkia default_icon = GetDefaultIcon(); | 328 gfx::ImageSkia default_icon = GetDefaultIcon(); |
| 329 | 329 |
| 330 // Load images we expect to find as representations in icon_image, so we | 330 // Load images we expect to find as representations in icon_image, so we |
| 331 // can later use them to validate icon_image. | 331 // can later use them to validate icon_image. |
| 332 SkBitmap bitmap_24 = GetTestBitmap(extension.get(), "24.png", 24); | 332 SkBitmap bitmap_24 = GetTestBitmap(extension.get(), "24.png", 24); |
| 333 ASSERT_FALSE(bitmap_24.empty()); | 333 ASSERT_FALSE(bitmap_24.empty()); |
| 334 | 334 |
| 335 IconImage image(profile.get(), | 335 IconImage image(browser_context(), |
| 336 extension.get(), | 336 extension.get(), |
| 337 extensions::IconsInfo::GetIcons(extension.get()), | 337 IconsInfo::GetIcons(extension.get()), |
| 338 17, | 338 17, |
| 339 default_icon, | 339 default_icon, |
| 340 this); | 340 this); |
| 341 | 341 |
| 342 gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); | 342 gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); |
| 343 | 343 |
| 344 WaitForImageLoad(); | 344 WaitForImageLoad(); |
| 345 EXPECT_EQ(1, ImageLoadedCount()); | 345 EXPECT_EQ(1, ImageLoadedCount()); |
| 346 ASSERT_EQ(1u, image.image_skia().image_reps().size()); | 346 ASSERT_EQ(1u, image.image_skia().image_reps().size()); |
| 347 | 347 |
| 348 representation = image.image_skia().GetRepresentation(1.0f); | 348 representation = image.image_skia().GetRepresentation(1.0f); |
| 349 | 349 |
| 350 // We should have loaded the smallest bigger (resized) resource. | 350 // We should have loaded the smallest bigger (resized) resource. |
| 351 EXPECT_EQ(1.0f, representation.scale()); | 351 EXPECT_EQ(1.0f, representation.scale()); |
| 352 EXPECT_EQ(17, representation.pixel_width()); | 352 EXPECT_EQ(17, representation.pixel_width()); |
| 353 EXPECT_TRUE(gfx::BitmapsAreEqual(representation.sk_bitmap(), | 353 EXPECT_TRUE(gfx::BitmapsAreEqual(representation.sk_bitmap(), |
| 354 EnsureBitmapSize(bitmap_24, 17))); | 354 EnsureBitmapSize(bitmap_24, 17))); |
| 355 } | 355 } |
| 356 | 356 |
| 357 // If resource set is empty, |GetRepresentation| should synchronously return | 357 // If resource set is empty, |GetRepresentation| should synchronously return |
| 358 // default icon, without notifying observer of image change. | 358 // default icon, without notifying observer of image change. |
| 359 TEST_F(ExtensionIconImageTest, NoResources) { | 359 TEST_F(ExtensionIconImageTest, NoResources) { |
| 360 scoped_ptr<content::BrowserContext> profile(new TestingProfile()); | |
| 361 scoped_refptr<Extension> extension(CreateExtension( | 360 scoped_refptr<Extension> extension(CreateExtension( |
| 362 "extension_icon_image", Manifest::INVALID_LOCATION)); | 361 "extension_icon_image", Manifest::INVALID_LOCATION)); |
| 363 ASSERT_TRUE(extension.get() != NULL); | 362 ASSERT_TRUE(extension.get() != NULL); |
| 364 | 363 |
| 365 ExtensionIconSet empty_icon_set; | 364 ExtensionIconSet empty_icon_set; |
| 366 gfx::ImageSkia default_icon = GetDefaultIcon(); | 365 gfx::ImageSkia default_icon = GetDefaultIcon(); |
| 367 | 366 |
| 368 const int kRequestedSize = 24; | 367 const int kRequestedSize = 24; |
| 369 IconImage image(profile.get(), | 368 IconImage image(browser_context(), |
| 370 extension.get(), | 369 extension.get(), |
| 371 empty_icon_set, | 370 empty_icon_set, |
| 372 kRequestedSize, | 371 kRequestedSize, |
| 373 default_icon, | 372 default_icon, |
| 374 this); | 373 this); |
| 375 | 374 |
| 376 gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); | 375 gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); |
| 377 EXPECT_TRUE(gfx::BitmapsAreEqual( | 376 EXPECT_TRUE(gfx::BitmapsAreEqual( |
| 378 representation.sk_bitmap(), | 377 representation.sk_bitmap(), |
| 379 EnsureBitmapSize( | 378 EnsureBitmapSize( |
| 380 default_icon.GetRepresentation(1.0f).sk_bitmap(), | 379 default_icon.GetRepresentation(1.0f).sk_bitmap(), |
| 381 kRequestedSize))); | 380 kRequestedSize))); |
| 382 | 381 |
| 383 EXPECT_EQ(0, ImageLoadedCount()); | 382 EXPECT_EQ(0, ImageLoadedCount()); |
| 384 // We should have a default icon representation. | 383 // We should have a default icon representation. |
| 385 ASSERT_EQ(1u, image.image_skia().image_reps().size()); | 384 ASSERT_EQ(1u, image.image_skia().image_reps().size()); |
| 386 | 385 |
| 387 representation = image.image_skia().GetRepresentation(1.0f); | 386 representation = image.image_skia().GetRepresentation(1.0f); |
| 388 EXPECT_TRUE(gfx::BitmapsAreEqual( | 387 EXPECT_TRUE(gfx::BitmapsAreEqual( |
| 389 representation.sk_bitmap(), | 388 representation.sk_bitmap(), |
| 390 EnsureBitmapSize( | 389 EnsureBitmapSize( |
| 391 default_icon.GetRepresentation(1.0f).sk_bitmap(), | 390 default_icon.GetRepresentation(1.0f).sk_bitmap(), |
| 392 kRequestedSize))); | 391 kRequestedSize))); |
| 393 } | 392 } |
| 394 | 393 |
| 395 // If resource set is invalid, image load should be done asynchronously and | 394 // If resource set is invalid, image load should be done asynchronously and |
| 396 // the observer should be notified when it's done. |GetRepresentation| should | 395 // the observer should be notified when it's done. |GetRepresentation| should |
| 397 // return the default icon representation once image load is done. | 396 // return the default icon representation once image load is done. |
| 398 TEST_F(ExtensionIconImageTest, InvalidResource) { | 397 TEST_F(ExtensionIconImageTest, InvalidResource) { |
| 399 scoped_ptr<content::BrowserContext> profile(new TestingProfile()); | |
| 400 scoped_refptr<Extension> extension(CreateExtension( | 398 scoped_refptr<Extension> extension(CreateExtension( |
| 401 "extension_icon_image", Manifest::INVALID_LOCATION)); | 399 "extension_icon_image", Manifest::INVALID_LOCATION)); |
| 402 ASSERT_TRUE(extension.get() != NULL); | 400 ASSERT_TRUE(extension.get() != NULL); |
| 403 | 401 |
| 404 const int kInvalidIconSize = 24; | 402 const int kInvalidIconSize = 24; |
| 405 ExtensionIconSet invalid_icon_set; | 403 ExtensionIconSet invalid_icon_set; |
| 406 invalid_icon_set.Add(kInvalidIconSize, "invalid.png"); | 404 invalid_icon_set.Add(kInvalidIconSize, "invalid.png"); |
| 407 | 405 |
| 408 gfx::ImageSkia default_icon = GetDefaultIcon(); | 406 gfx::ImageSkia default_icon = GetDefaultIcon(); |
| 409 | 407 |
| 410 IconImage image(profile.get(), | 408 IconImage image(browser_context(), |
| 411 extension.get(), | 409 extension.get(), |
| 412 invalid_icon_set, | 410 invalid_icon_set, |
| 413 kInvalidIconSize, | 411 kInvalidIconSize, |
| 414 default_icon, | 412 default_icon, |
| 415 this); | 413 this); |
| 416 | 414 |
| 417 gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); | 415 gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); |
| 418 EXPECT_TRUE(gfx::BitmapsAreEqual( | 416 EXPECT_TRUE(gfx::BitmapsAreEqual( |
| 419 representation.sk_bitmap(), | 417 representation.sk_bitmap(), |
| 420 CreateBlankBitmapForScale(kInvalidIconSize, ui::SCALE_FACTOR_100P))); | 418 CreateBlankBitmapForScale(kInvalidIconSize, ui::SCALE_FACTOR_100P))); |
| 421 | 419 |
| 422 WaitForImageLoad(); | 420 WaitForImageLoad(); |
| 423 EXPECT_EQ(1, ImageLoadedCount()); | 421 EXPECT_EQ(1, ImageLoadedCount()); |
| 424 // We should have default icon representation now. | 422 // We should have default icon representation now. |
| 425 ASSERT_EQ(1u, image.image_skia().image_reps().size()); | 423 ASSERT_EQ(1u, image.image_skia().image_reps().size()); |
| 426 | 424 |
| 427 representation = image.image_skia().GetRepresentation(1.0f); | 425 representation = image.image_skia().GetRepresentation(1.0f); |
| 428 EXPECT_TRUE(gfx::BitmapsAreEqual( | 426 EXPECT_TRUE(gfx::BitmapsAreEqual( |
| 429 representation.sk_bitmap(), | 427 representation.sk_bitmap(), |
| 430 EnsureBitmapSize( | 428 EnsureBitmapSize( |
| 431 default_icon.GetRepresentation(1.0f).sk_bitmap(), | 429 default_icon.GetRepresentation(1.0f).sk_bitmap(), |
| 432 kInvalidIconSize))); | 430 kInvalidIconSize))); |
| 433 } | 431 } |
| 434 | 432 |
| 435 // Test that IconImage works with lazily (but synchronously) created default | 433 // Test that IconImage works with lazily (but synchronously) created default |
| 436 // icon when IconImage returns synchronously. | 434 // icon when IconImage returns synchronously. |
| 437 TEST_F(ExtensionIconImageTest, LazyDefaultIcon) { | 435 TEST_F(ExtensionIconImageTest, LazyDefaultIcon) { |
| 438 scoped_ptr<content::BrowserContext> profile(new TestingProfile()); | |
| 439 scoped_refptr<Extension> extension(CreateExtension( | 436 scoped_refptr<Extension> extension(CreateExtension( |
| 440 "extension_icon_image", Manifest::INVALID_LOCATION)); | 437 "extension_icon_image", Manifest::INVALID_LOCATION)); |
| 441 ASSERT_TRUE(extension.get() != NULL); | 438 ASSERT_TRUE(extension.get() != NULL); |
| 442 | 439 |
| 443 gfx::ImageSkia default_icon = GetDefaultIcon(); | 440 gfx::ImageSkia default_icon = GetDefaultIcon(); |
| 444 gfx::ImageSkia lazy_default_icon(new MockImageSkiaSource(default_icon), | 441 gfx::ImageSkia lazy_default_icon(new MockImageSkiaSource(default_icon), |
| 445 default_icon.size()); | 442 default_icon.size()); |
| 446 | 443 |
| 447 ExtensionIconSet empty_icon_set; | 444 ExtensionIconSet empty_icon_set; |
| 448 | 445 |
| 449 const int kRequestedSize = 128; | 446 const int kRequestedSize = 128; |
| 450 IconImage image(profile.get(), | 447 IconImage image(browser_context(), |
| 451 extension.get(), | 448 extension.get(), |
| 452 empty_icon_set, | 449 empty_icon_set, |
| 453 kRequestedSize, | 450 kRequestedSize, |
| 454 lazy_default_icon, | 451 lazy_default_icon, |
| 455 this); | 452 this); |
| 456 | 453 |
| 457 ASSERT_FALSE(lazy_default_icon.HasRepresentation(1.0f)); | 454 ASSERT_FALSE(lazy_default_icon.HasRepresentation(1.0f)); |
| 458 | 455 |
| 459 gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); | 456 gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); |
| 460 | 457 |
| 461 // The resouce set is empty, so we should get the result right away. | 458 // The resouce set is empty, so we should get the result right away. |
| 462 EXPECT_TRUE(lazy_default_icon.HasRepresentation(1.0f)); | 459 EXPECT_TRUE(lazy_default_icon.HasRepresentation(1.0f)); |
| 463 EXPECT_TRUE(gfx::BitmapsAreEqual( | 460 EXPECT_TRUE(gfx::BitmapsAreEqual( |
| 464 representation.sk_bitmap(), | 461 representation.sk_bitmap(), |
| 465 EnsureBitmapSize( | 462 EnsureBitmapSize( |
| 466 default_icon.GetRepresentation(1.0f).sk_bitmap(), | 463 default_icon.GetRepresentation(1.0f).sk_bitmap(), |
| 467 kRequestedSize))); | 464 kRequestedSize))); |
| 468 | 465 |
| 469 // We should have a default icon representation. | 466 // We should have a default icon representation. |
| 470 ASSERT_EQ(1u, image.image_skia().image_reps().size()); | 467 ASSERT_EQ(1u, image.image_skia().image_reps().size()); |
| 471 } | 468 } |
| 472 | 469 |
| 473 // Test that IconImage works with lazily (but synchronously) created default | 470 // Test that IconImage works with lazily (but synchronously) created default |
| 474 // icon when IconImage returns asynchronously. | 471 // icon when IconImage returns asynchronously. |
| 475 TEST_F(ExtensionIconImageTest, LazyDefaultIcon_AsyncIconImage) { | 472 TEST_F(ExtensionIconImageTest, LazyDefaultIcon_AsyncIconImage) { |
| 476 scoped_ptr<content::BrowserContext> profile(new TestingProfile()); | |
| 477 scoped_refptr<Extension> extension(CreateExtension( | 473 scoped_refptr<Extension> extension(CreateExtension( |
| 478 "extension_icon_image", Manifest::INVALID_LOCATION)); | 474 "extension_icon_image", Manifest::INVALID_LOCATION)); |
| 479 ASSERT_TRUE(extension.get() != NULL); | 475 ASSERT_TRUE(extension.get() != NULL); |
| 480 | 476 |
| 481 gfx::ImageSkia default_icon = GetDefaultIcon(); | 477 gfx::ImageSkia default_icon = GetDefaultIcon(); |
| 482 gfx::ImageSkia lazy_default_icon(new MockImageSkiaSource(default_icon), | 478 gfx::ImageSkia lazy_default_icon(new MockImageSkiaSource(default_icon), |
| 483 default_icon.size()); | 479 default_icon.size()); |
| 484 | 480 |
| 485 const int kInvalidIconSize = 24; | 481 const int kInvalidIconSize = 24; |
| 486 ExtensionIconSet invalid_icon_set; | 482 ExtensionIconSet invalid_icon_set; |
| 487 invalid_icon_set.Add(kInvalidIconSize, "invalid.png"); | 483 invalid_icon_set.Add(kInvalidIconSize, "invalid.png"); |
| 488 | 484 |
| 489 IconImage image(profile.get(), | 485 IconImage image(browser_context(), |
| 490 extension.get(), | 486 extension.get(), |
| 491 invalid_icon_set, | 487 invalid_icon_set, |
| 492 kInvalidIconSize, | 488 kInvalidIconSize, |
| 493 lazy_default_icon, | 489 lazy_default_icon, |
| 494 this); | 490 this); |
| 495 | 491 |
| 496 ASSERT_FALSE(lazy_default_icon.HasRepresentation(1.0f)); | 492 ASSERT_FALSE(lazy_default_icon.HasRepresentation(1.0f)); |
| 497 | 493 |
| 498 gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); | 494 gfx::ImageSkiaRep representation = image.image_skia().GetRepresentation(1.0f); |
| 499 | 495 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 510 EnsureBitmapSize( | 506 EnsureBitmapSize( |
| 511 default_icon.GetRepresentation(1.0f).sk_bitmap(), | 507 default_icon.GetRepresentation(1.0f).sk_bitmap(), |
| 512 kInvalidIconSize))); | 508 kInvalidIconSize))); |
| 513 } | 509 } |
| 514 | 510 |
| 515 // Tests behavior of image created by IconImage after IconImage host goes | 511 // Tests behavior of image created by IconImage after IconImage host goes |
| 516 // away. The image should still return loaded representations. If requested | 512 // away. The image should still return loaded representations. If requested |
| 517 // representation was not loaded while IconImage host was around, transparent | 513 // representation was not loaded while IconImage host was around, transparent |
| 518 // representations should be returned. | 514 // representations should be returned. |
| 519 TEST_F(ExtensionIconImageTest, IconImageDestruction) { | 515 TEST_F(ExtensionIconImageTest, IconImageDestruction) { |
| 520 scoped_ptr<content::BrowserContext> profile(new TestingProfile()); | |
| 521 scoped_refptr<Extension> extension(CreateExtension( | 516 scoped_refptr<Extension> extension(CreateExtension( |
| 522 "extension_icon_image", Manifest::INVALID_LOCATION)); | 517 "extension_icon_image", Manifest::INVALID_LOCATION)); |
| 523 ASSERT_TRUE(extension.get() != NULL); | 518 ASSERT_TRUE(extension.get() != NULL); |
| 524 | 519 |
| 525 gfx::ImageSkia default_icon = GetDefaultIcon(); | 520 gfx::ImageSkia default_icon = GetDefaultIcon(); |
| 526 | 521 |
| 527 // Load images we expect to find as representations in icon_image, so we | 522 // Load images we expect to find as representations in icon_image, so we |
| 528 // can later use them to validate icon_image. | 523 // can later use them to validate icon_image. |
| 529 SkBitmap bitmap_16 = GetTestBitmap(extension.get(), "16.png", 16); | 524 SkBitmap bitmap_16 = GetTestBitmap(extension.get(), "16.png", 16); |
| 530 ASSERT_FALSE(bitmap_16.empty()); | 525 ASSERT_FALSE(bitmap_16.empty()); |
| 531 | 526 |
| 532 scoped_ptr<IconImage> image( | 527 scoped_ptr<IconImage> image( |
| 533 new IconImage(profile.get(), | 528 new IconImage(browser_context(), |
| 534 extension.get(), | 529 extension.get(), |
| 535 extensions::IconsInfo::GetIcons(extension.get()), | 530 IconsInfo::GetIcons(extension.get()), |
| 536 16, | 531 16, |
| 537 default_icon, | 532 default_icon, |
| 538 this)); | 533 this)); |
| 539 | 534 |
| 540 // Load an image representation. | 535 // Load an image representation. |
| 541 gfx::ImageSkiaRep representation = | 536 gfx::ImageSkiaRep representation = |
| 542 image->image_skia().GetRepresentation(1.0f); | 537 image->image_skia().GetRepresentation(1.0f); |
| 543 | 538 |
| 544 WaitForImageLoad(); | 539 WaitForImageLoad(); |
| 545 EXPECT_EQ(1, ImageLoadedCount()); | 540 EXPECT_EQ(1, ImageLoadedCount()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 559 | 554 |
| 560 // When requesting another representation, we should not crash and return some | 555 // When requesting another representation, we should not crash and return some |
| 561 // image of the size. It could be blank or a rescale from the existing 1.0f | 556 // image of the size. It could be blank or a rescale from the existing 1.0f |
| 562 // icon. | 557 // icon. |
| 563 representation = image_skia.GetRepresentation(2.0f); | 558 representation = image_skia.GetRepresentation(2.0f); |
| 564 | 559 |
| 565 EXPECT_EQ(16, representation.GetWidth()); | 560 EXPECT_EQ(16, representation.GetWidth()); |
| 566 EXPECT_EQ(16, representation.GetHeight()); | 561 EXPECT_EQ(16, representation.GetHeight()); |
| 567 EXPECT_EQ(2.0f, representation.scale()); | 562 EXPECT_EQ(2.0f, representation.scale()); |
| 568 } | 563 } |
| 564 |
| 565 } // namespace extensions |
| OLD | NEW |