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

Side by Side Diff: chrome/browser/manifest/manifest_icon_selector_unittest.cc

Issue 1285063003: manifest: rework icon selector to include small icon cut-off (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix final comments Created 5 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "chrome/browser/manifest/manifest_icon_selector.h" 5 #include "chrome/browser/manifest/manifest_icon_selector.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 CreateIcon("http://foo.com/icon.png", "", 1.0, std::vector<gfx::Size>())); 76 CreateIcon("http://foo.com/icon.png", "", 1.0, std::vector<gfx::Size>()));
77 77
78 GURL url = FindBestMatchingIcon(icons); 78 GURL url = FindBestMatchingIcon(icons);
79 EXPECT_TRUE(url.is_empty()); 79 EXPECT_TRUE(url.is_empty());
80 } 80 }
81 81
82 TEST_F(ManifestIconSelectorTest, MIMETypeFiltering) { 82 TEST_F(ManifestIconSelectorTest, MIMETypeFiltering) {
83 // Icons with type specified to a MIME type that isn't a valid image MIME type 83 // Icons with type specified to a MIME type that isn't a valid image MIME type
84 // are ignored. 84 // are ignored.
85 std::vector<gfx::Size> sizes; 85 std::vector<gfx::Size> sizes;
86 sizes.push_back(gfx::Size(10, 10)); 86 sizes.push_back(gfx::Size(1024, 1024));
87 87
88 std::vector<content::Manifest::Icon> icons; 88 std::vector<content::Manifest::Icon> icons;
89 icons.push_back( 89 icons.push_back(
90 CreateIcon("http://foo.com/icon.png", "image/foo_bar", 1.0, sizes)); 90 CreateIcon("http://foo.com/icon.png", "image/foo_bar", 1.0, sizes));
91 icons.push_back(CreateIcon("http://foo.com/icon.png", "image/", 1.0, sizes)); 91 icons.push_back(CreateIcon("http://foo.com/icon.png", "image/", 1.0, sizes));
92 icons.push_back(CreateIcon("http://foo.com/icon.png", "image/", 1.0, sizes)); 92 icons.push_back(CreateIcon("http://foo.com/icon.png", "image/", 1.0, sizes));
93 icons.push_back( 93 icons.push_back(
94 CreateIcon("http://foo.com/icon.png", "video/mp4", 1.0, sizes)); 94 CreateIcon("http://foo.com/icon.png", "video/mp4", 1.0, sizes));
95 95
96 GURL url = FindBestMatchingIcon(icons); 96 GURL url = FindBestMatchingIcon(icons);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 EXPECT_EQ("http://foo.com/icon_x2.png", url.spec()); 144 EXPECT_EQ("http://foo.com/icon_x2.png", url.spec());
145 145
146 SetDisplayDeviceScaleFactor(3.0f); 146 SetDisplayDeviceScaleFactor(3.0f);
147 url = FindBestMatchingIcon(icons); 147 url = FindBestMatchingIcon(icons);
148 EXPECT_EQ("http://foo.com/icon_x3.png", url.spec()); 148 EXPECT_EQ("http://foo.com/icon_x3.png", url.spec());
149 } 149 }
150 150
151 TEST_F(ManifestIconSelectorTest, PreferredSizeOfDefaultDensityIsUsedSecond) { 151 TEST_F(ManifestIconSelectorTest, PreferredSizeOfDefaultDensityIsUsedSecond) {
152 // This test has three icons. The first one is of density zero and is marked 152 // This test has three icons. The first one is of density zero and is marked
153 // with three sizes which are the preferred icon size for density 1, 2 and 3. 153 // with three sizes which are the preferred icon size for density 1, 2 and 3.
154 // The icon for density 2 and 3 have a size set to 2x2 and 3x3. 154 // The icon for density 2 and 3 have a size set to 1024x1024.
155 // Regardless of the device scale factor, the icon of density 1 is going to be 155 // Regardless of the device scale factor, the icon of density 1 is going to be
156 // used because it matches the preferred size. 156 // used because it matches the preferred size.
157 std::vector<gfx::Size> sizes_1; 157 std::vector<gfx::Size> sizes_1;
158 sizes_1.push_back(gfx::Size(GetPreferredIconSizeInDp(), 158 sizes_1.push_back(gfx::Size(GetPreferredIconSizeInDp(),
159 GetPreferredIconSizeInDp())); 159 GetPreferredIconSizeInDp()));
160 sizes_1.push_back(gfx::Size(GetPreferredIconSizeInDp() * 2, 160 sizes_1.push_back(gfx::Size(GetPreferredIconSizeInDp() * 2,
161 GetPreferredIconSizeInDp() * 2)); 161 GetPreferredIconSizeInDp() * 2));
162 sizes_1.push_back(gfx::Size(GetPreferredIconSizeInDp() * 3, 162 sizes_1.push_back(gfx::Size(GetPreferredIconSizeInDp() * 3,
163 GetPreferredIconSizeInDp() * 3)); 163 GetPreferredIconSizeInDp() * 3));
164 164
165 std::vector<gfx::Size> sizes_2; 165 std::vector<gfx::Size> sizes_2;
166 sizes_2.push_back(gfx::Size(2, 2)); 166 sizes_2.push_back(gfx::Size(1024, 1024));
167 167
168 std::vector<gfx::Size> sizes_3; 168 std::vector<gfx::Size> sizes_3;
169 sizes_3.push_back(gfx::Size(3, 3)); 169 sizes_3.push_back(gfx::Size(1024, 1024));
170 170
171 std::vector<content::Manifest::Icon> icons; 171 std::vector<content::Manifest::Icon> icons;
172 icons.push_back(CreateIcon("http://foo.com/icon_x1.png", "", 1.0, sizes_1)); 172 icons.push_back(CreateIcon("http://foo.com/icon_x1.png", "", 1.0, sizes_1));
173 icons.push_back(CreateIcon("http://foo.com/icon_x2.png", "", 2.0, sizes_2)); 173 icons.push_back(CreateIcon("http://foo.com/icon_x2.png", "", 2.0, sizes_2));
174 icons.push_back(CreateIcon("http://foo.com/icon_x3.png", "", 3.0, sizes_3)); 174 icons.push_back(CreateIcon("http://foo.com/icon_x3.png", "", 3.0, sizes_3));
175 175
176 SetDisplayDeviceScaleFactor(1.0f); 176 SetDisplayDeviceScaleFactor(1.0f);
177 GURL url = FindBestMatchingIcon(icons); 177 GURL url = FindBestMatchingIcon(icons);
178 EXPECT_EQ("http://foo.com/icon_x1.png", url.spec()); 178 EXPECT_EQ("http://foo.com/icon_x1.png", url.spec());
179 179
180 SetDisplayDeviceScaleFactor(2.0f); 180 SetDisplayDeviceScaleFactor(2.0f);
181 url = FindBestMatchingIcon(icons); 181 url = FindBestMatchingIcon(icons);
182 EXPECT_EQ("http://foo.com/icon_x1.png", url.spec()); 182 EXPECT_EQ("http://foo.com/icon_x1.png", url.spec());
183 183
184 SetDisplayDeviceScaleFactor(3.0f); 184 SetDisplayDeviceScaleFactor(3.0f);
185 url = FindBestMatchingIcon(icons); 185 url = FindBestMatchingIcon(icons);
186 EXPECT_EQ("http://foo.com/icon_x1.png", url.spec()); 186 EXPECT_EQ("http://foo.com/icon_x1.png", url.spec());
187 } 187 }
188 188
189 TEST_F(ManifestIconSelectorTest, DeviceDensityFirst) { 189 TEST_F(ManifestIconSelectorTest, DeviceDensityFirst) {
190 // If there is no perfect icon but an icon of the current device density is 190 // If there is no perfect icon but an icon of the current device density is
191 // present, it will be picked. 191 // present, it will be picked.
192 // This test has three icons each are marked with sizes set to the preferred 192 // This test has three icons each are marked with sizes set to the preferred
193 // icon size for the associated density. 193 // icon size for the associated density.
194 std::vector<gfx::Size> sizes; 194 std::vector<gfx::Size> sizes;
195 sizes.push_back(gfx::Size(2, 2)); 195 sizes.push_back(gfx::Size(1024, 1024));
196 196
197 std::vector<content::Manifest::Icon> icons; 197 std::vector<content::Manifest::Icon> icons;
198 icons.push_back(CreateIcon("http://foo.com/icon_x1.png", "", 1.0, sizes)); 198 icons.push_back(CreateIcon("http://foo.com/icon_x1.png", "", 1.0, sizes));
199 icons.push_back(CreateIcon("http://foo.com/icon_x2.png", "", 2.0, sizes)); 199 icons.push_back(CreateIcon("http://foo.com/icon_x2.png", "", 2.0, sizes));
200 icons.push_back(CreateIcon("http://foo.com/icon_x3.png", "", 3.0, sizes)); 200 icons.push_back(CreateIcon("http://foo.com/icon_x3.png", "", 3.0, sizes));
201 201
202 SetDisplayDeviceScaleFactor(1.0f); 202 SetDisplayDeviceScaleFactor(1.0f);
203 GURL url = FindBestMatchingIcon(icons); 203 GURL url = FindBestMatchingIcon(icons);
204 EXPECT_EQ("http://foo.com/icon_x1.png", url.spec()); 204 EXPECT_EQ("http://foo.com/icon_x1.png", url.spec());
205 205
206 SetDisplayDeviceScaleFactor(2.0f); 206 SetDisplayDeviceScaleFactor(2.0f);
207 url = FindBestMatchingIcon(icons); 207 url = FindBestMatchingIcon(icons);
208 EXPECT_EQ("http://foo.com/icon_x2.png", url.spec()); 208 EXPECT_EQ("http://foo.com/icon_x2.png", url.spec());
209 209
210 SetDisplayDeviceScaleFactor(3.0f); 210 SetDisplayDeviceScaleFactor(3.0f);
211 url = FindBestMatchingIcon(icons); 211 url = FindBestMatchingIcon(icons);
212 EXPECT_EQ("http://foo.com/icon_x3.png", url.spec()); 212 EXPECT_EQ("http://foo.com/icon_x3.png", url.spec());
213 } 213 }
214 214
215 TEST_F(ManifestIconSelectorTest, DeviceDensityFallback) { 215 TEST_F(ManifestIconSelectorTest, DeviceDensityFallback) {
216 // If there is no perfect icon but and no icon of the current display density, 216 // If there is no perfect icon but and no icon of the current display density,
217 // an icon of density 1.0 will be used. 217 // an icon of density 1.0 will be used.
218 std::vector<gfx::Size> sizes; 218 std::vector<gfx::Size> sizes;
219 sizes.push_back(gfx::Size(2, 2)); 219 sizes.push_back(gfx::Size(1024, 1024));
220 220
221 std::vector<content::Manifest::Icon> icons; 221 std::vector<content::Manifest::Icon> icons;
222 icons.push_back(CreateIcon("http://foo.com/icon_x1.png", "", 1.0, sizes)); 222 icons.push_back(CreateIcon("http://foo.com/icon_x1.png", "", 1.0, sizes));
223 icons.push_back(CreateIcon("http://foo.com/icon_x2.png", "", 2.0, sizes)); 223 icons.push_back(CreateIcon("http://foo.com/icon_x2.png", "", 2.0, sizes));
224 224
225 SetDisplayDeviceScaleFactor(3.0f); 225 SetDisplayDeviceScaleFactor(3.0f);
226 GURL url = FindBestMatchingIcon(icons); 226 GURL url = FindBestMatchingIcon(icons);
227 EXPECT_EQ("http://foo.com/icon_x1.png", url.spec()); 227 EXPECT_EQ("http://foo.com/icon_x1.png", url.spec());
228 } 228 }
229 229
230 TEST_F(ManifestIconSelectorTest, DeviceDensityMatchRejectsTooSmall) {
231 // If we have to resort to density matching to find icons, then an icon of
232 // the correct size has not been found. Make sure that an icon which is just
233 // slightly smaller than one density bucket below the device is not chosen
234 // even if the density matches.
235 std::vector<gfx::Size> sizes_1_2;
236 std::vector<gfx::Size> sizes_3;
237
238 sizes_1_2.push_back(gfx::Size(47, 47));
239 sizes_3.push_back(gfx::Size(95, 95));
240
241 std::vector<content::Manifest::Icon> icons;
242 icons.push_back(CreateIcon("http://foo.com/icon_x1.png", "", 1.0, sizes_1_2));
243 icons.push_back(CreateIcon("http://foo.com/icon_x2.png", "", 2.0, sizes_1_2));
244 icons.push_back(CreateIcon("http://foo.com/icon_x3.png", "", 3.0, sizes_3));
245
246 // Nothing matches here because there is a density scale factor lower bound of
247 // of 1.0 which since there is no density bucket smaller than the one
248 // associated with this scale factor.
249 SetDisplayDeviceScaleFactor(1.0f);
250 GURL url = FindBestMatchingIcon(icons);
251 EXPECT_TRUE(url.is_empty());
252
253 // Nothing matches here as the icon is just smaller than the icon size
254 // one density bucket below (i.e. 96 is expected and 48 is the minimum).
255 SetDisplayDeviceScaleFactor(2.0f);
256 url = FindBestMatchingIcon(icons);
257 EXPECT_TRUE(url.is_empty());
258
259 // Nothing matches here as the icon is just smaller than the icon size
260 // one density bucket below (i.e. 144 is expected and 96 is the minimum).
261 SetDisplayDeviceScaleFactor(3.0f);
262 url = FindBestMatchingIcon(icons);
263 EXPECT_TRUE(url.is_empty());
264 }
265
230 TEST_F(ManifestIconSelectorTest, DoNotUseOtherDensities) { 266 TEST_F(ManifestIconSelectorTest, DoNotUseOtherDensities) {
231 // If there are only icons of densities that are not the current display 267 // If there are only icons of densities that are not the current display
232 // density or the default density, they are ignored. 268 // density or the default density, they are ignored.
233 std::vector<gfx::Size> sizes; 269 std::vector<gfx::Size> sizes;
234 sizes.push_back(gfx::Size(2, 2)); 270 sizes.push_back(gfx::Size(1024, 1024));
235 271
236 std::vector<content::Manifest::Icon> icons; 272 std::vector<content::Manifest::Icon> icons;
237 icons.push_back(CreateIcon("http://foo.com/icon_x2.png", "", 2.0, sizes)); 273 icons.push_back(CreateIcon("http://foo.com/icon_x2.png", "", 2.0, sizes));
238 274
239 SetDisplayDeviceScaleFactor(3.0f); 275 SetDisplayDeviceScaleFactor(3.0f);
240 GURL url = FindBestMatchingIcon(icons); 276 GURL url = FindBestMatchingIcon(icons);
241 EXPECT_TRUE(url.is_empty()); 277 EXPECT_TRUE(url.is_empty());
242 } 278 }
243 279
244 TEST_F(ManifestIconSelectorTest, NotSquareIconsAreIgnored) { 280 TEST_F(ManifestIconSelectorTest, NotSquareIconsAreIgnored) {
245 std::vector<gfx::Size> sizes; 281 std::vector<gfx::Size> sizes;
246 sizes.push_back(gfx::Size(20, 2)); 282 sizes.push_back(gfx::Size(1024, 1023));
247 283
248 std::vector<content::Manifest::Icon> icons; 284 std::vector<content::Manifest::Icon> icons;
249 icons.push_back(CreateIcon("http://foo.com/icon.png", "", 1.0, sizes)); 285 icons.push_back(CreateIcon("http://foo.com/icon.png", "", 1.0, sizes));
250 286
251 GURL url = FindBestMatchingIcon(icons); 287 GURL url = FindBestMatchingIcon(icons);
252 EXPECT_TRUE(url.is_empty()); 288 EXPECT_TRUE(url.is_empty());
253 } 289 }
254 290
255 TEST_F(ManifestIconSelectorTest, ClosestIconToPreferred) { 291 TEST_F(ManifestIconSelectorTest, ClosestIconToPreferred) {
256 // This test verifies ManifestIconSelector::FindBestMatchingIcon by passing 292 // This test verifies ManifestIconSelector::FindBestMatchingIcon by passing
257 // different icon sizes and checking which one is picked. 293 // different icon sizes and checking which one is picked.
258 // The Device Scale Factor is 1.0 and the preferred icon size is returned by 294 // The Device Scale Factor is 1.0 and the preferred icon size is returned by
259 // GetPreferredIconSizeInDp(). 295 // GetPreferredIconSizeInDp().
260 int very_small = GetPreferredIconSizeInDp() / 4; 296 int very_small = GetPreferredIconSizeInDp() / 4;
261 int small_size = GetPreferredIconSizeInDp() / 2; 297 int small_size = GetPreferredIconSizeInDp() / 2;
262 int bit_small = GetPreferredIconSizeInDp() - 1; 298 int bit_small = GetPreferredIconSizeInDp() - 1;
263 int bit_big = GetPreferredIconSizeInDp() + 1; 299 int bit_big = GetPreferredIconSizeInDp() + 1;
264 int big = GetPreferredIconSizeInDp() * 2; 300 int big = GetPreferredIconSizeInDp() * 2;
265 int very_big = GetPreferredIconSizeInDp() * 4; 301 int very_big = GetPreferredIconSizeInDp() * 4;
266 302
267 // (very_small, bit_small) => bit_small 303 // (very_small, bit_small) => empty (since both are too small)
268 { 304 {
269 std::vector<gfx::Size> sizes_1; 305 std::vector<gfx::Size> sizes_1;
270 sizes_1.push_back(gfx::Size(very_small, very_small)); 306 sizes_1.push_back(gfx::Size(very_small, very_small));
271 307
272 std::vector<gfx::Size> sizes_2; 308 std::vector<gfx::Size> sizes_2;
273 sizes_2.push_back(gfx::Size(bit_small, bit_small)); 309 sizes_2.push_back(gfx::Size(bit_small, bit_small));
274 310
275 std::vector<content::Manifest::Icon> icons; 311 std::vector<content::Manifest::Icon> icons;
276 icons.push_back(CreateIcon("http://foo.com/icon_no.png", "", 1.0, sizes_1)); 312 icons.push_back(CreateIcon("http://foo.com/icon_no.png", "", 1.0, sizes_1));
277 icons.push_back(CreateIcon("http://foo.com/icon.png", "", 1.0, sizes_2)); 313 icons.push_back(CreateIcon("http://foo.com/icon.png", "", 1.0, sizes_2));
278 314
279 GURL url = FindBestMatchingIcon(icons); 315 GURL url = FindBestMatchingIcon(icons);
280 EXPECT_EQ("http://foo.com/icon.png", url.spec()); 316 EXPECT_EQ("", url.spec());
281 } 317 }
282 318
283 // (very_small, bit_small, smaller) => bit_small 319 // (very_small, bit_small, smaller) => empty (since both are too small)
284 { 320 {
285 std::vector<gfx::Size> sizes_1; 321 std::vector<gfx::Size> sizes_1;
286 sizes_1.push_back(gfx::Size(very_small, very_small)); 322 sizes_1.push_back(gfx::Size(very_small, very_small));
287 323
288 std::vector<gfx::Size> sizes_2; 324 std::vector<gfx::Size> sizes_2;
289 sizes_2.push_back(gfx::Size(bit_small, bit_small)); 325 sizes_2.push_back(gfx::Size(bit_small, bit_small));
290 326
291 std::vector<gfx::Size> sizes_3; 327 std::vector<gfx::Size> sizes_3;
292 sizes_3.push_back(gfx::Size(small_size, small_size)); 328 sizes_3.push_back(gfx::Size(small_size, small_size));
293 329
294 std::vector<content::Manifest::Icon> icons; 330 std::vector<content::Manifest::Icon> icons;
295 icons.push_back(CreateIcon("http://foo.com/icon_no.png", "", 1.0, sizes_1)); 331 icons.push_back(CreateIcon("http://foo.com/icon_no.png", "", 1.0, sizes_1));
296 icons.push_back(CreateIcon("http://foo.com/icon.png", "", 1.0, sizes_2)); 332 icons.push_back(CreateIcon("http://foo.com/icon.png", "", 1.0, sizes_2));
297 icons.push_back(CreateIcon("http://foo.com/icon_no.png", "", 1.0, sizes_3)); 333 icons.push_back(CreateIcon("http://foo.com/icon_no.png", "", 1.0, sizes_3));
298 334
299 GURL url = FindBestMatchingIcon(icons); 335 GURL url = FindBestMatchingIcon(icons);
300 EXPECT_EQ("http://foo.com/icon.png", url.spec()); 336 EXPECT_EQ("", url.spec());
301 } 337 }
302 338
303 // (very_big, big) => big 339 // (very_big, big) => big
304 { 340 {
305 std::vector<gfx::Size> sizes_1; 341 std::vector<gfx::Size> sizes_1;
306 sizes_1.push_back(gfx::Size(very_big, very_big)); 342 sizes_1.push_back(gfx::Size(very_big, very_big));
307 343
308 std::vector<gfx::Size> sizes_2; 344 std::vector<gfx::Size> sizes_2;
309 sizes_2.push_back(gfx::Size(big, big)); 345 sizes_2.push_back(gfx::Size(big, big));
310 346
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 449
414 std::vector<content::Manifest::Icon> icons; 450 std::vector<content::Manifest::Icon> icons;
415 icons.push_back(CreateIcon("http://foo.com/icon_no.png", "", 1.0, sizes)); 451 icons.push_back(CreateIcon("http://foo.com/icon_no.png", "", 1.0, sizes));
416 icons.push_back(CreateIcon("http://foo.com/icon.png", "", 3.0, sizes)); 452 icons.push_back(CreateIcon("http://foo.com/icon.png", "", 3.0, sizes));
417 453
418 SetDisplayDeviceScaleFactor(3.0f); 454 SetDisplayDeviceScaleFactor(3.0f);
419 GURL url = FindBestMatchingIcon(icons); 455 GURL url = FindBestMatchingIcon(icons);
420 EXPECT_EQ("http://foo.com/icon.png", url.spec()); 456 EXPECT_EQ("http://foo.com/icon.png", url.spec());
421 } 457 }
422 } 458 }
OLDNEW
« no previous file with comments | « chrome/browser/manifest/manifest_icon_selector.cc ('k') | chrome/test/data/banners/launcher-icon-4x.png » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698