Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(134)

Side by Side Diff: chrome/browser/extensions/extension_icon_image_unittest.cc

Issue 10825012: chromeos: Fix pixelated icons in app list and launcher (part 2) (by xiyuan) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: minor cleanup Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/extensions/extension_icon_image.h"
6
7 #include "base/json/json_file_value_serializer.h"
8 #include "base/message_loop.h"
9 #include "base/path_service.h"
10 #include "chrome/common/chrome_paths.h"
11 #include "chrome/common/extensions/extension.h"
12 #include "content/public/test/test_browser_thread.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 using content::BrowserThread;
16 using extensions::Extension;
17 using extensions::IconImage;
18
19 namespace {
20
21 ExtensionIconSet* CreateCopyWithInvalidImage(
22 const ExtensionIconSet& origin,
23 ExtensionIconSet::Icons invalid_size) {
24 ExtensionIconSet* result = new ExtensionIconSet();
25 for (ExtensionIconSet::IconMap::const_iterator it = origin.map().begin();
26 it != origin.map().end();
27 ++it) {
28 result->Add(it->first, it->second);
29 }
30 result->Add(invalid_size, "invalid.png");
31 return result;
32 }
33
34 class ExtensionIconImageTest : public testing::Test,
35 public IconImage::Observer {
36 public:
37 ExtensionIconImageTest()
38 : image_loaded_count_(0),
39 image_load_failure_count_(0),
40 quit_in_image_loaded_(false),
41 ui_thread_(BrowserThread::UI, &ui_loop_),
42 file_thread_(BrowserThread::FILE),
43 io_thread_(BrowserThread::IO) {
44 }
45
46 virtual ~ExtensionIconImageTest() {}
47
48 void WaitForImageLoad() {
49 // ExtensionIconImage may return synchronously, in which case there's
50 // nothing to wait for.
51 if (image_loaded_count_ > 0 || image_load_failure_count_ > 0)
52 return;
53 quit_in_image_loaded_ = true;
54 MessageLoop::current()->Run();
55 quit_in_image_loaded_ = false;
56 }
57
58 int ImageLoadedCount() {
59 int result = image_loaded_count_;
60 image_loaded_count_ = 0;
61 return result;
62 }
63
64 int ImageLoadFailureCount() {
65 int result = image_load_failure_count_;
66 image_load_failure_count_ = 0;
67 return result;
68 }
69
70 scoped_refptr<Extension> CreateExtension(const char* name,
71 Extension::Location location) {
72 // Create and load an extension.
73 FilePath test_file;
74 if (!PathService::Get(chrome::DIR_TEST_DATA, &test_file)) {
75 EXPECT_FALSE(true);
76 return NULL;
77 }
78 test_file = test_file.AppendASCII("extensions").AppendASCII(name);
79 int error_code = 0;
80 std::string error;
81 JSONFileValueSerializer serializer(test_file.AppendASCII("app.json"));
82 scoped_ptr<DictionaryValue> valid_value(
83 static_cast<DictionaryValue*>(serializer.Deserialize(&error_code,
84 &error)));
85 EXPECT_EQ(0, error_code) << error;
86 if (error_code != 0)
87 return NULL;
88
89 EXPECT_TRUE(valid_value.get());
90 if (!valid_value.get())
91 return NULL;
92
93 return Extension::Create(test_file, location, *valid_value,
94 Extension::NO_FLAGS, &error);
95 }
96
97 // testing::Test overrides:
98 virtual void SetUp() OVERRIDE {
99 file_thread_.Start();
100 io_thread_.Start();
101 }
102
103 // IconImage::Delegate overrides:
104 virtual void OnExtensionIconImageChanged(IconImage* image) OVERRIDE {
105 image_loaded_count_++;
106 if (quit_in_image_loaded_)
107 MessageLoop::current()->Quit();
108 }
109
110 virtual void OnIconImageLoadFailed(IconImage* image,
111 ui::ScaleFactor scale_factor) OVERRIDE {
112 image_load_failure_count_++;
113 if (quit_in_image_loaded_)
114 MessageLoop::current()->Quit();
115 }
116
117 private:
118 int image_loaded_count_;
119 int image_load_failure_count_;
120 bool quit_in_image_loaded_;
121 MessageLoop ui_loop_;
122 content::TestBrowserThread ui_thread_;
123 content::TestBrowserThread file_thread_;
124 content::TestBrowserThread io_thread_;
125
126 DISALLOW_COPY_AND_ASSIGN(ExtensionIconImageTest);
127 };
128
129 } // namespace
130
131 TEST_F(ExtensionIconImageTest, Basic) {
132 scoped_refptr<Extension> extension(CreateExtension(
133 "extension_icon_image", Extension::INVALID));
134 ASSERT_TRUE(extension.get() != NULL);
135
136 IconImage image(
137 extension,
138 extension->icons(),
139 ExtensionIconSet::EXTENSION_ICON_BITTY,
140 this);
141
142 // No representations in |image_| yet.
143 gfx::ImageSkia::ImageSkiaReps image_reps = image.image_skia().image_reps();
144 ASSERT_EQ(0u, image_reps.size());
145
146 // Gets representation for a scale factor.
147 image.image_skia().GetRepresentation(ui::SCALE_FACTOR_100P);
148 WaitForImageLoad();
149 EXPECT_EQ(1, ImageLoadedCount());
150 EXPECT_EQ(0, ImageLoadFailureCount());
151
152 // Gets representation for an additional scale factor.
153 image.image_skia().GetRepresentation(ui::SCALE_FACTOR_200P);
154 WaitForImageLoad();
155 EXPECT_EQ(1, ImageLoadedCount());
156 EXPECT_EQ(0, ImageLoadFailureCount());
157
158 gfx::ImageSkiaRep image_rep =
159 image.image_skia().GetRepresentation(ui::SCALE_FACTOR_100P);
160 EXPECT_EQ(ExtensionIconSet::EXTENSION_ICON_BITTY,
161 image_rep.pixel_width());
162
163 image_rep = image.image_skia().GetRepresentation(ui::SCALE_FACTOR_200P);
164 EXPECT_EQ(ExtensionIconSet::EXTENSION_ICON_SMALL,
165 image_rep.pixel_width());
166 }
167
168 // If we can't load icon with the exact size, but a bigger resource is
169 // available.
170 TEST_F(ExtensionIconImageTest, FallbackToBigger) {
171 scoped_refptr<Extension> extension(CreateExtension(
172 "extension_icon_image", Extension::INVALID));
173 ASSERT_TRUE(extension.get() != NULL);
174
175 IconImage image(
176 extension,
177 extension->icons(),
178 ExtensionIconSet::EXTENSION_ICON_BITTY,
179 this);
180
181 // Get representation for 2x.
182 image.image_skia().GetRepresentation(ui::SCALE_FACTOR_200P);
183
184 WaitForImageLoad();
185 EXPECT_EQ(1, ImageLoadedCount());
186 EXPECT_EQ(0, ImageLoadFailureCount());
187
188 gfx::ImageSkiaRep image_rep =
189 image.image_skia().GetRepresentation(ui::SCALE_FACTOR_200P);
190
191 // We should have found a bigger resource and it should have been resized.
192 EXPECT_EQ(ui::SCALE_FACTOR_200P, image_rep.scale_factor());
193 EXPECT_EQ(2 * ExtensionIconSet::EXTENSION_ICON_BITTY,
194 image_rep.pixel_width());
195 }
196
197 // There is no resource with either exact or bigger size, but there is a smaller
198 // resource.
199 TEST_F(ExtensionIconImageTest, FallbackToSmallerWhenNoBigger) {
200 scoped_refptr<Extension> extension(CreateExtension(
201 "extension_icon_image", Extension::INVALID));
202 ASSERT_TRUE(extension.get() != NULL);
203
204 IconImage image(
205 extension,
206 extension->icons(),
207 ExtensionIconSet::EXTENSION_ICON_SMALL,
208 this);
209
210 // Attempt to get representation for 2x.
211 image.image_skia().GetRepresentation(ui::SCALE_FACTOR_200P);
212
213 WaitForImageLoad();
214 EXPECT_EQ(1, ImageLoadedCount());
215 EXPECT_EQ(0, ImageLoadFailureCount());
216
217 gfx::ImageSkiaRep image_rep =
218 image.image_skia().GetRepresentation(ui::SCALE_FACTOR_200P);
219
220 // We should have loaded the biggest smaller resource. In this case the
221 // loaded resource should not be resized.
222 EXPECT_EQ(ui::SCALE_FACTOR_200P, image_rep.scale_factor());
223 EXPECT_EQ(ExtensionIconSet::EXTENSION_ICON_MEDIUM,
224 image_rep.pixel_width());
225 }
226
227 // There is no resource with exact size, but there is a smaller and a bigger
228 // one. Requested size is smaller than 32 though, so the smaller resource should
229 // be loaded.
230 TEST_F(ExtensionIconImageTest, FallbackToSmaller) {
231 scoped_refptr<Extension> extension(CreateExtension(
232 "extension_icon_image", Extension::INVALID));
233 ASSERT_TRUE(extension.get() != NULL);
234
235 IconImage image(
236 extension,
237 extension->icons(),
238 17,
239 this);
240
241 // Attempt to get representation for 1x.
242 image.image_skia().GetRepresentation(ui::SCALE_FACTOR_100P);
243
244 WaitForImageLoad();
245 EXPECT_EQ(1, ImageLoadedCount());
246 EXPECT_EQ(0, ImageLoadFailureCount());
247
248 gfx::ImageSkiaRep image_rep =
249 image.image_skia().GetRepresentation(ui::SCALE_FACTOR_100P);
250
251 // We should have loaded smaller (not resized) resource.
252 EXPECT_EQ(ui::SCALE_FACTOR_100P, image_rep.scale_factor());
253 EXPECT_EQ(ExtensionIconSet::EXTENSION_ICON_BITTY,
254 image_rep.pixel_width());
255 }
256
257 // If there is bigger resource, but I can't be loaded, we should fallback to
258 // smaller one.
259 TEST_F(ExtensionIconImageTest, BiggerIsInvalid) {
260 scoped_refptr<Extension> extension(CreateExtension(
261 "extension_icon_image", Extension::INVALID));
262 ASSERT_TRUE(extension.get() != NULL);
263
264 scoped_ptr<ExtensionIconSet> icons(CreateCopyWithInvalidImage(
265 extension->icons(),
266 ExtensionIconSet::ExtensionIconSet::EXTENSION_ICON_LARGE));
267
268 IconImage image(
269 extension,
270 *icons,
271 ExtensionIconSet::EXTENSION_ICON_SMALL,
272 this);
273
274 // Attempt to get representation for 2x.
275 image.image_skia().GetRepresentation(ui::SCALE_FACTOR_200P);
276
277 WaitForImageLoad();
278 EXPECT_EQ(1, ImageLoadedCount());
279 EXPECT_EQ(0, ImageLoadFailureCount());
280
281 gfx::ImageSkiaRep image_rep =
282 image.image_skia().GetRepresentation(ui::SCALE_FACTOR_200P);
283
284 EXPECT_EQ(ui::SCALE_FACTOR_200P, image_rep.scale_factor());
285 EXPECT_EQ(ExtensionIconSet::EXTENSION_ICON_MEDIUM,
286 image_rep.pixel_width());
287 }
288
289 // If neither exact, bigger nor smaller can be loaded, failure should be
290 // reported.
291 TEST_F(ExtensionIconImageTest, SmallerInvalid) {
292 scoped_refptr<Extension> extension(CreateExtension(
293 "extension_icon_image", Extension::INVALID));
294 ASSERT_TRUE(extension.get() != NULL);
295
296 scoped_ptr<ExtensionIconSet> icons(CreateCopyWithInvalidImage(
297 extension->icons(),
298 ExtensionIconSet::ExtensionIconSet::EXTENSION_ICON_LARGE));
299
300 IconImage image(
301 extension,
302 *icons,
303 ExtensionIconSet::EXTENSION_ICON_LARGE,
304 this);
305
306 // Attempt to get representation for 2x.
307 image.image_skia().GetRepresentation(ui::SCALE_FACTOR_200P);
308
309 WaitForImageLoad();
310 EXPECT_EQ(0, ImageLoadedCount());
311 EXPECT_EQ(1, ImageLoadFailureCount());
312
313 EXPECT_FALSE(image.image_skia().HasRepresentation(ui::SCALE_FACTOR_200P));
314 }
315
316 // If resource set is empty, failure should be reported.
317 TEST_F(ExtensionIconImageTest, NoResources) {
318 scoped_refptr<Extension> extension(CreateExtension(
319 "extension_icon_image", Extension::INVALID));
320 ASSERT_TRUE(extension.get() != NULL);
321
322 IconImage image(
323 extension,
324 ExtensionIconSet(),
325 ExtensionIconSet::EXTENSION_ICON_SMALLISH,
326 this);
327
328 // Attempt to get representation for 2x.
329 image.image_skia().GetRepresentation(ui::SCALE_FACTOR_200P);
330
331 WaitForImageLoad();
332 EXPECT_EQ(0, ImageLoadedCount());
333 EXPECT_EQ(1, ImageLoadFailureCount());
334 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698