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 "content/renderer/manifest/manifest_parser.h" | 5 #include "content/renderer/manifest/manifest_parser.h" |
6 | 6 |
7 #include "base/strings/string_util.h" | 7 #include "base/strings/string_util.h" |
8 #include "content/public/common/manifest.h" | 8 #include "content/public/common/manifest.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
10 | 10 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
71 EXPECT_EQ("Manifest parsing error: Line: 1, column: 1, Unexpected token.", | 71 EXPECT_EQ("Manifest parsing error: Line: 1, column: 1, Unexpected token.", |
72 errors()[0]); | 72 errors()[0]); |
73 | 73 |
74 // A parsing error is equivalent to an empty manifest. | 74 // A parsing error is equivalent to an empty manifest. |
75 ASSERT_TRUE(manifest.IsEmpty()); | 75 ASSERT_TRUE(manifest.IsEmpty()); |
76 ASSERT_TRUE(manifest.name.is_null()); | 76 ASSERT_TRUE(manifest.name.is_null()); |
77 ASSERT_TRUE(manifest.short_name.is_null()); | 77 ASSERT_TRUE(manifest.short_name.is_null()); |
78 ASSERT_TRUE(manifest.start_url.is_empty()); | 78 ASSERT_TRUE(manifest.start_url.is_empty()); |
79 ASSERT_EQ(manifest.display, Manifest::DISPLAY_MODE_UNSPECIFIED); | 79 ASSERT_EQ(manifest.display, Manifest::DISPLAY_MODE_UNSPECIFIED); |
80 ASSERT_EQ(manifest.orientation, blink::WebScreenOrientationLockDefault); | 80 ASSERT_EQ(manifest.orientation, blink::WebScreenOrientationLockDefault); |
81 ASSERT_EQ(manifest.theme_color, Manifest::kInvalidOrMissingThemeColor); | |
81 ASSERT_TRUE(manifest.gcm_sender_id.is_null()); | 82 ASSERT_TRUE(manifest.gcm_sender_id.is_null()); |
82 } | 83 } |
83 | 84 |
84 TEST_F(ManifestParserTest, ValidNoContentParses) { | 85 TEST_F(ManifestParserTest, ValidNoContentParses) { |
85 Manifest manifest = ParseManifest("{}"); | 86 Manifest manifest = ParseManifest("{}"); |
86 | 87 |
87 // Empty Manifest is not a parsing error. | 88 // Empty Manifest is not a parsing error. |
88 EXPECT_EQ(0u, GetErrorCount()); | 89 EXPECT_EQ(0u, GetErrorCount()); |
89 | 90 |
90 // Check that all the fields are null in that case. | 91 // Check that all the fields are null in that case. |
91 ASSERT_TRUE(manifest.IsEmpty()); | 92 ASSERT_TRUE(manifest.IsEmpty()); |
92 ASSERT_TRUE(manifest.name.is_null()); | 93 ASSERT_TRUE(manifest.name.is_null()); |
93 ASSERT_TRUE(manifest.short_name.is_null()); | 94 ASSERT_TRUE(manifest.short_name.is_null()); |
94 ASSERT_TRUE(manifest.start_url.is_empty()); | 95 ASSERT_TRUE(manifest.start_url.is_empty()); |
95 ASSERT_EQ(manifest.display, Manifest::DISPLAY_MODE_UNSPECIFIED); | 96 ASSERT_EQ(manifest.display, Manifest::DISPLAY_MODE_UNSPECIFIED); |
96 ASSERT_EQ(manifest.orientation, blink::WebScreenOrientationLockDefault); | 97 ASSERT_EQ(manifest.orientation, blink::WebScreenOrientationLockDefault); |
98 ASSERT_EQ(manifest.theme_color, Manifest::kInvalidOrMissingThemeColor); | |
97 ASSERT_TRUE(manifest.gcm_sender_id.is_null()); | 99 ASSERT_TRUE(manifest.gcm_sender_id.is_null()); |
98 } | 100 } |
99 | 101 |
100 TEST_F(ManifestParserTest, MultipleErrorsReporting) { | 102 TEST_F(ManifestParserTest, MultipleErrorsReporting) { |
101 Manifest manifest = ParseManifest("{ \"name\": 42, \"short_name\": 4," | 103 Manifest manifest = ParseManifest("{ \"name\": 42, \"short_name\": 4," |
102 "\"orientation\": {}, \"display\": \"foo\", \"start_url\": null," | 104 "\"orientation\": {}, \"display\": \"foo\"," |
103 "\"icons\": {} }"); | 105 "\"start_url\": null, \"icons\": {}, \"theme_color\": 42 }"); |
104 | 106 |
105 EXPECT_EQ(6u, GetErrorCount()); | 107 EXPECT_EQ(7u, GetErrorCount()); |
106 | 108 |
107 EXPECT_EQ("Manifest parsing error: property 'name' ignored," | 109 EXPECT_EQ("Manifest parsing error: property 'name' ignored," |
108 " type string expected.", | 110 " type string expected.", |
109 errors()[0]); | 111 errors()[0]); |
110 EXPECT_EQ("Manifest parsing error: property 'short_name' ignored," | 112 EXPECT_EQ("Manifest parsing error: property 'short_name' ignored," |
111 " type string expected.", | 113 " type string expected.", |
112 errors()[1]); | 114 errors()[1]); |
113 EXPECT_EQ("Manifest parsing error: property 'start_url' ignored," | 115 EXPECT_EQ("Manifest parsing error: property 'start_url' ignored," |
114 " type string expected.", | 116 " type string expected.", |
115 errors()[2]); | 117 errors()[2]); |
116 EXPECT_EQ("Manifest parsing error: unknown 'display' value ignored.", | 118 EXPECT_EQ("Manifest parsing error: unknown 'display' value ignored.", |
117 errors()[3]); | 119 errors()[3]); |
118 EXPECT_EQ("Manifest parsing error: property 'orientation' ignored," | 120 EXPECT_EQ("Manifest parsing error: property 'orientation' ignored," |
119 " type string expected.", | 121 " type string expected.", |
120 errors()[4]); | 122 errors()[4]); |
121 EXPECT_EQ("Manifest parsing error: property 'icons' ignored, " | 123 EXPECT_EQ("Manifest parsing error: property 'icons' ignored, " |
122 "type array expected.", | 124 "type array expected.", |
123 errors()[5]); | 125 errors()[5]); |
126 EXPECT_EQ("Manifest parsing error: property 'theme_color' ignored," | |
127 " type string expected.", | |
128 errors()[6]); | |
124 } | 129 } |
125 | 130 |
126 TEST_F(ManifestParserTest, NameParseRules) { | 131 TEST_F(ManifestParserTest, NameParseRules) { |
127 // Smoke test. | 132 // Smoke test. |
128 { | 133 { |
129 Manifest manifest = ParseManifest("{ \"name\": \"foo\" }"); | 134 Manifest manifest = ParseManifest("{ \"name\": \"foo\" }"); |
130 ASSERT_TRUE(base::EqualsASCII(manifest.name.string(), "foo")); | 135 ASSERT_TRUE(base::EqualsASCII(manifest.name.string(), "foo")); |
131 ASSERT_FALSE(manifest.IsEmpty()); | 136 ASSERT_FALSE(manifest.IsEmpty()); |
132 EXPECT_EQ(0u, GetErrorCount()); | 137 EXPECT_EQ(0u, GetErrorCount()); |
133 } | 138 } |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
343 } | 348 } |
344 | 349 |
345 // Case insensitive. | 350 // Case insensitive. |
346 { | 351 { |
347 Manifest manifest = ParseManifest("{ \"display\": \"BROWSER\" }"); | 352 Manifest manifest = ParseManifest("{ \"display\": \"BROWSER\" }"); |
348 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_BROWSER); | 353 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_BROWSER); |
349 EXPECT_EQ(0u, GetErrorCount()); | 354 EXPECT_EQ(0u, GetErrorCount()); |
350 } | 355 } |
351 } | 356 } |
352 | 357 |
358 TEST_F(ManifestParserTest, ThemeColorParserRules) { | |
359 // Smoke test. | |
360 { | |
361 Manifest manifest = ParseManifest("{ \"theme_color\": \"#FF0000\" }"); | |
362 EXPECT_EQ(manifest.theme_color, 0xFFFF0000); | |
363 EXPECT_FALSE(manifest.IsEmpty()); | |
364 EXPECT_EQ(0u, GetErrorCount()); | |
365 } | |
366 | |
367 // Trim whitespaces. | |
368 { | |
369 Manifest manifest = ParseManifest("{ \"theme_color\": \" blue \" }"); | |
370 EXPECT_EQ(manifest.theme_color, 0xFF0000FF); | |
371 EXPECT_EQ(0u, GetErrorCount()); | |
372 } | |
373 | |
374 // Don't parse if theme_color isn't a string. | |
375 { | |
376 Manifest manifest = ParseManifest("{ \"theme_color\": {} }"); | |
377 EXPECT_EQ(manifest.theme_color, Manifest::kInvalidOrMissingThemeColor); | |
378 EXPECT_EQ(1u, GetErrorCount()); | |
379 EXPECT_EQ("Manifest parsing error: property 'theme_color' ignored," | |
380 " type string expected.", | |
381 errors()[0]); | |
382 } | |
383 | |
384 // Don't parse if theme_color isn't a string. | |
nasko
2015/07/17 09:48:53
If this is meant to be exhaustive test for differe
Lalit Maganti
2015/07/17 10:30:00
Done.
| |
385 { | |
386 Manifest manifest = ParseManifest("{ \"theme_color\": 42 }"); | |
387 EXPECT_EQ(manifest.theme_color, Manifest::kInvalidOrMissingThemeColor); | |
388 EXPECT_EQ(1u, GetErrorCount()); | |
389 EXPECT_EQ("Manifest parsing error: property 'theme_color' ignored," | |
390 " type string expected.", | |
391 errors()[0]); | |
392 } | |
393 | |
394 // Parse fails if string is not in a known format. | |
395 { | |
396 Manifest manifest = ParseManifest("{ \"theme_color\": \"foo(bar)\" }"); | |
397 EXPECT_EQ(manifest.theme_color, Manifest::kInvalidOrMissingThemeColor); | |
398 EXPECT_EQ(1u, GetErrorCount()); | |
399 EXPECT_EQ("Manifest parsing error: property 'theme_color' ignored," | |
400 " 'foo(bar)' is not a valid color.", | |
401 errors()[0]); | |
402 } | |
403 | |
404 // Parse fails if string is not in a known format. | |
405 { | |
406 Manifest manifest = ParseManifest("{ \"theme_color\": \"bleu\" }"); | |
407 EXPECT_EQ(manifest.theme_color, Manifest::kInvalidOrMissingThemeColor); | |
408 EXPECT_EQ(1u, GetErrorCount()); | |
409 EXPECT_EQ("Manifest parsing error: property 'theme_color' ignored, 'bleu'" | |
410 " is not a valid color.", | |
411 errors()[0]); | |
412 } | |
413 | |
414 // Parse fails if string is not in a known format. | |
415 { | |
416 Manifest manifest = ParseManifest("{ \"theme_color\": \"FF00FF\" }"); | |
417 EXPECT_EQ(manifest.theme_color, Manifest::kInvalidOrMissingThemeColor); | |
418 EXPECT_EQ(1u, GetErrorCount()); | |
419 EXPECT_EQ("Manifest parsing error: property 'theme_color' ignored, 'FF00FF'" | |
420 " is not a valid color.", | |
421 errors()[0]); | |
422 } | |
423 | |
424 // Parse fails if multiple values for theme_color are given. | |
425 { | |
426 Manifest manifest = ParseManifest("{ \"theme_color\": \"#ABC #DEF\" }"); | |
427 EXPECT_EQ(manifest.theme_color, Manifest::kInvalidOrMissingThemeColor); | |
428 EXPECT_EQ(1u, GetErrorCount()); | |
429 EXPECT_EQ("Manifest parsing error: property 'theme_color' ignored, " | |
430 "'#ABC #DEF' is not a valid color.", | |
431 errors()[0]); | |
432 } | |
433 | |
434 // Parse fails if multiple values for theme_color are given. | |
nasko
2015/07/17 09:48:53
What happens if there are multiple theme_color ins
Lalit Maganti
2015/07/17 10:30:00
This depends on the JSON parser used - the JSON sp
nasko
2015/07/17 16:36:18
Well, there is one JSON parser that Chrome will u
| |
435 { | |
436 Manifest manifest = ParseManifest( | |
437 "{ \"theme_color\": \"#AABBCC #DDEEFF\" }"); | |
438 EXPECT_EQ(manifest.theme_color, Manifest::kInvalidOrMissingThemeColor); | |
439 EXPECT_EQ(1u, GetErrorCount()); | |
440 EXPECT_EQ("Manifest parsing error: property 'theme_color' ignored, " | |
441 "'#AABBCC #DDEEFF' is not a valid color.", | |
442 errors()[0]); | |
443 } | |
444 | |
445 // Accept CSS color keyword format. | |
446 { | |
447 Manifest manifest = ParseManifest("{ \"theme_color\": \"blue\" }"); | |
448 EXPECT_EQ(manifest.theme_color, 0xFF0000FF); | |
449 EXPECT_EQ(0u, GetErrorCount()); | |
450 } | |
451 | |
452 // Accept CSS color keyword format. | |
453 { | |
454 Manifest manifest = ParseManifest("{ \"theme_color\": \"chartreuse\" }"); | |
455 EXPECT_EQ(manifest.theme_color, 0xFF7FFF00); | |
456 EXPECT_EQ(0u, GetErrorCount()); | |
457 } | |
458 | |
459 // Accept CSS RGB format. | |
460 { | |
461 Manifest manifest = ParseManifest("{ \"theme_color\": \"#FFF\" }"); | |
462 EXPECT_EQ(manifest.theme_color, 0xFFFFFFFF); | |
463 EXPECT_EQ(0u, GetErrorCount()); | |
464 } | |
465 | |
466 // Accept CSS RGB format. | |
467 { | |
468 Manifest manifest = ParseManifest("{ \"theme_color\": \"#ABC\" }"); | |
469 EXPECT_EQ(manifest.theme_color, 0xFFAABBCC); | |
470 EXPECT_EQ(0u, GetErrorCount()); | |
471 } | |
472 | |
473 // Accept CSS RRGGBB format. | |
474 { | |
475 Manifest manifest = ParseManifest("{ \"theme_color\": \"#FF0000\" }"); | |
476 EXPECT_EQ(manifest.theme_color, 0xFFFF0000); | |
477 EXPECT_EQ(0u, GetErrorCount()); | |
478 } | |
479 } | |
480 | |
353 TEST_F(ManifestParserTest, OrientationParserRules) { | 481 TEST_F(ManifestParserTest, OrientationParserRules) { |
354 // Smoke test. | 482 // Smoke test. |
355 { | 483 { |
356 Manifest manifest = ParseManifest("{ \"orientation\": \"natural\" }"); | 484 Manifest manifest = ParseManifest("{ \"orientation\": \"natural\" }"); |
357 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockNatural); | 485 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockNatural); |
358 EXPECT_FALSE(manifest.IsEmpty()); | 486 EXPECT_FALSE(manifest.IsEmpty()); |
359 EXPECT_EQ(0u, GetErrorCount()); | 487 EXPECT_EQ(0u, GetErrorCount()); |
360 } | 488 } |
361 | 489 |
362 // Trim whitespaces. | 490 // Trim whitespaces. |
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1007 Manifest manifest = ParseManifest("{ \"gcm_sender_id\": 42 }"); | 1135 Manifest manifest = ParseManifest("{ \"gcm_sender_id\": 42 }"); |
1008 EXPECT_TRUE(manifest.gcm_sender_id.is_null()); | 1136 EXPECT_TRUE(manifest.gcm_sender_id.is_null()); |
1009 EXPECT_EQ(1u, GetErrorCount()); | 1137 EXPECT_EQ(1u, GetErrorCount()); |
1010 EXPECT_EQ("Manifest parsing error: property 'gcm_sender_id' ignored," | 1138 EXPECT_EQ("Manifest parsing error: property 'gcm_sender_id' ignored," |
1011 " type string expected.", | 1139 " type string expected.", |
1012 errors()[0]); | 1140 errors()[0]); |
1013 } | 1141 } |
1014 } | 1142 } |
1015 | 1143 |
1016 } // namespace content | 1144 } // namespace content |
OLD | NEW |