| 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 |
| 11 namespace content { | 11 namespace content { |
| 12 | 12 |
| 13 class ManifestParserTest : public testing::Test { | 13 class ManifestParserTest : public testing::Test { |
| 14 protected: | 14 protected: |
| 15 ManifestParserTest() {} | 15 ManifestParserTest() {} |
| 16 ~ManifestParserTest() override {} | 16 ~ManifestParserTest() override {} |
| 17 | 17 |
| 18 Manifest ParseManifest(const base::StringPiece& json, | 18 Manifest ParseManifestWithURLs(const base::StringPiece& data, |
| 19 const GURL& document_url = default_document_url, | 19 const GURL& document_url, |
| 20 const GURL& manifest_url = default_manifest_url) { | 20 const GURL& manifest_url) { |
| 21 return ManifestParser::Parse(json, document_url, manifest_url); | 21 ManifestParser parser(data, document_url, manifest_url); |
| 22 parser.Parse(); |
| 23 errors_ = parser.errors(); |
| 24 return parser.manifest(); |
| 25 } |
| 26 |
| 27 Manifest ParseManifest(const base::StringPiece& data) { |
| 28 return ParseManifestWithURLs( |
| 29 data, default_document_url, default_manifest_url); |
| 30 } |
| 31 |
| 32 const std::vector<std::string>& errors() const { |
| 33 return errors_; |
| 34 } |
| 35 |
| 36 unsigned int GetErrorCount() const { |
| 37 return errors_.size(); |
| 22 } | 38 } |
| 23 | 39 |
| 24 static const GURL default_document_url; | 40 static const GURL default_document_url; |
| 25 static const GURL default_manifest_url; | 41 static const GURL default_manifest_url; |
| 26 | 42 |
| 27 private: | 43 private: |
| 44 std::vector<std::string> errors_; |
| 45 |
| 28 DISALLOW_COPY_AND_ASSIGN(ManifestParserTest); | 46 DISALLOW_COPY_AND_ASSIGN(ManifestParserTest); |
| 29 }; | 47 }; |
| 30 | 48 |
| 31 const GURL ManifestParserTest::default_document_url( | 49 const GURL ManifestParserTest::default_document_url( |
| 32 "http://foo.com/index.html"); | 50 "http://foo.com/index.html"); |
| 33 const GURL ManifestParserTest::default_manifest_url( | 51 const GURL ManifestParserTest::default_manifest_url( |
| 34 "http://foo.com/manifest.json"); | 52 "http://foo.com/manifest.json"); |
| 35 | 53 |
| 36 TEST_F(ManifestParserTest, EmptyStringNull) { | 54 TEST_F(ManifestParserTest, EmptyStringNull) { |
| 37 Manifest manifest = ParseManifest(""); | 55 Manifest manifest = ParseManifest(""); |
| 38 | 56 |
| 57 // This Manifest is not a valid JSON object, it's a parsing error. |
| 58 EXPECT_EQ(1u, GetErrorCount()); |
| 59 EXPECT_EQ("Manifest parsing error: Line: 1, column: 1, Unexpected token.", |
| 60 errors()[0]); |
| 61 |
| 39 // A parsing error is equivalent to an empty manifest. | 62 // A parsing error is equivalent to an empty manifest. |
| 40 ASSERT_TRUE(manifest.IsEmpty()); | 63 ASSERT_TRUE(manifest.IsEmpty()); |
| 41 ASSERT_TRUE(manifest.name.is_null()); | 64 ASSERT_TRUE(manifest.name.is_null()); |
| 42 ASSERT_TRUE(manifest.short_name.is_null()); | 65 ASSERT_TRUE(manifest.short_name.is_null()); |
| 43 ASSERT_TRUE(manifest.start_url.is_empty()); | 66 ASSERT_TRUE(manifest.start_url.is_empty()); |
| 44 ASSERT_EQ(manifest.display, Manifest::DISPLAY_MODE_UNSPECIFIED); | 67 ASSERT_EQ(manifest.display, Manifest::DISPLAY_MODE_UNSPECIFIED); |
| 45 ASSERT_EQ(manifest.orientation, blink::WebScreenOrientationLockDefault); | 68 ASSERT_EQ(manifest.orientation, blink::WebScreenOrientationLockDefault); |
| 46 } | 69 } |
| 47 | 70 |
| 48 TEST_F(ManifestParserTest, ValidNoContentParses) { | 71 TEST_F(ManifestParserTest, ValidNoContentParses) { |
| 49 Manifest manifest = ParseManifest("{}"); | 72 Manifest manifest = ParseManifest("{}"); |
| 50 | 73 |
| 74 // Empty Manifest is not a parsing error. |
| 75 EXPECT_EQ(0u, GetErrorCount()); |
| 76 |
| 51 // Check that all the fields are null in that case. | 77 // Check that all the fields are null in that case. |
| 52 ASSERT_TRUE(manifest.IsEmpty()); | 78 ASSERT_TRUE(manifest.IsEmpty()); |
| 53 ASSERT_TRUE(manifest.name.is_null()); | 79 ASSERT_TRUE(manifest.name.is_null()); |
| 54 ASSERT_TRUE(manifest.short_name.is_null()); | 80 ASSERT_TRUE(manifest.short_name.is_null()); |
| 55 ASSERT_TRUE(manifest.start_url.is_empty()); | 81 ASSERT_TRUE(manifest.start_url.is_empty()); |
| 56 ASSERT_EQ(manifest.display, Manifest::DISPLAY_MODE_UNSPECIFIED); | 82 ASSERT_EQ(manifest.display, Manifest::DISPLAY_MODE_UNSPECIFIED); |
| 57 ASSERT_EQ(manifest.orientation, blink::WebScreenOrientationLockDefault); | 83 ASSERT_EQ(manifest.orientation, blink::WebScreenOrientationLockDefault); |
| 58 } | 84 } |
| 59 | 85 |
| 86 TEST_F(ManifestParserTest, MultipleErrorsReporting) { |
| 87 Manifest manifest = ParseManifest("{ \"name\": 42, \"short_name\": 4," |
| 88 "\"orientation\": {}, \"display\": \"foo\", \"start_url\": null," |
| 89 "\"icons\": {} }"); |
| 90 |
| 91 EXPECT_EQ(6u, GetErrorCount()); |
| 92 |
| 93 EXPECT_EQ("Manifest parsing error: property 'name' ignored," |
| 94 " type string expected.", |
| 95 errors()[0]); |
| 96 EXPECT_EQ("Manifest parsing error: property 'short_name' ignored," |
| 97 " type string expected.", |
| 98 errors()[1]); |
| 99 EXPECT_EQ("Manifest parsing error: property 'start_url' ignored," |
| 100 " type string expected.", |
| 101 errors()[2]); |
| 102 EXPECT_EQ("Manifest parsing error: unknown 'display' value ignored.", |
| 103 errors()[3]); |
| 104 EXPECT_EQ("Manifest parsing error: property 'orientation' ignored," |
| 105 " type string expected.", |
| 106 errors()[4]); |
| 107 EXPECT_EQ("Manifest parsing error: property 'icons' ignored, " |
| 108 "type array expected.", |
| 109 errors()[5]); |
| 110 } |
| 111 |
| 60 TEST_F(ManifestParserTest, NameParseRules) { | 112 TEST_F(ManifestParserTest, NameParseRules) { |
| 61 // Smoke test. | 113 // Smoke test. |
| 62 { | 114 { |
| 63 Manifest manifest = ParseManifest("{ \"name\": \"foo\" }"); | 115 Manifest manifest = ParseManifest("{ \"name\": \"foo\" }"); |
| 64 ASSERT_TRUE(EqualsASCII(manifest.name.string(), "foo")); | 116 ASSERT_TRUE(EqualsASCII(manifest.name.string(), "foo")); |
| 65 ASSERT_FALSE(manifest.IsEmpty()); | 117 ASSERT_FALSE(manifest.IsEmpty()); |
| 118 EXPECT_EQ(0u, GetErrorCount()); |
| 66 } | 119 } |
| 67 | 120 |
| 68 // Trim whitespaces. | 121 // Trim whitespaces. |
| 69 { | 122 { |
| 70 Manifest manifest = ParseManifest("{ \"name\": \" foo \" }"); | 123 Manifest manifest = ParseManifest("{ \"name\": \" foo \" }"); |
| 71 ASSERT_TRUE(EqualsASCII(manifest.name.string(), "foo")); | 124 ASSERT_TRUE(EqualsASCII(manifest.name.string(), "foo")); |
| 125 EXPECT_EQ(0u, GetErrorCount()); |
| 72 } | 126 } |
| 73 | 127 |
| 74 // Don't parse if name isn't a string. | 128 // Don't parse if name isn't a string. |
| 75 { | 129 { |
| 76 Manifest manifest = ParseManifest("{ \"name\": {} }"); | 130 Manifest manifest = ParseManifest("{ \"name\": {} }"); |
| 77 ASSERT_TRUE(manifest.name.is_null()); | 131 ASSERT_TRUE(manifest.name.is_null()); |
| 132 EXPECT_EQ(1u, GetErrorCount()); |
| 133 EXPECT_EQ("Manifest parsing error: property 'name' ignored," |
| 134 " type string expected.", |
| 135 errors()[0]); |
| 78 } | 136 } |
| 79 | 137 |
| 80 // Don't parse if name isn't a string. | 138 // Don't parse if name isn't a string. |
| 81 { | 139 { |
| 82 Manifest manifest = ParseManifest("{ \"name\": 42 }"); | 140 Manifest manifest = ParseManifest("{ \"name\": 42 }"); |
| 83 ASSERT_TRUE(manifest.name.is_null()); | 141 ASSERT_TRUE(manifest.name.is_null()); |
| 142 EXPECT_EQ(1u, GetErrorCount()); |
| 143 EXPECT_EQ("Manifest parsing error: property 'name' ignored," |
| 144 " type string expected.", |
| 145 errors()[0]); |
| 84 } | 146 } |
| 85 } | 147 } |
| 86 | 148 |
| 87 TEST_F(ManifestParserTest, ShortNameParseRules) { | 149 TEST_F(ManifestParserTest, ShortNameParseRules) { |
| 88 // Smoke test. | 150 // Smoke test. |
| 89 { | 151 { |
| 90 Manifest manifest = ParseManifest("{ \"short_name\": \"foo\" }"); | 152 Manifest manifest = ParseManifest("{ \"short_name\": \"foo\" }"); |
| 91 ASSERT_TRUE(EqualsASCII(manifest.short_name.string(), "foo")); | 153 ASSERT_TRUE(EqualsASCII(manifest.short_name.string(), "foo")); |
| 92 ASSERT_FALSE(manifest.IsEmpty()); | 154 ASSERT_FALSE(manifest.IsEmpty()); |
| 155 EXPECT_EQ(0u, GetErrorCount()); |
| 93 } | 156 } |
| 94 | 157 |
| 95 // Trim whitespaces. | 158 // Trim whitespaces. |
| 96 { | 159 { |
| 97 Manifest manifest = ParseManifest("{ \"short_name\": \" foo \" }"); | 160 Manifest manifest = ParseManifest("{ \"short_name\": \" foo \" }"); |
| 98 ASSERT_TRUE(EqualsASCII(manifest.short_name.string(), "foo")); | 161 ASSERT_TRUE(EqualsASCII(manifest.short_name.string(), "foo")); |
| 162 EXPECT_EQ(0u, GetErrorCount()); |
| 99 } | 163 } |
| 100 | 164 |
| 101 // Don't parse if name isn't a string. | 165 // Don't parse if name isn't a string. |
| 102 { | 166 { |
| 103 Manifest manifest = ParseManifest("{ \"short_name\": {} }"); | 167 Manifest manifest = ParseManifest("{ \"short_name\": {} }"); |
| 104 ASSERT_TRUE(manifest.short_name.is_null()); | 168 ASSERT_TRUE(manifest.short_name.is_null()); |
| 169 EXPECT_EQ(1u, GetErrorCount()); |
| 170 EXPECT_EQ("Manifest parsing error: property 'short_name' ignored," |
| 171 " type string expected.", |
| 172 errors()[0]); |
| 105 } | 173 } |
| 106 | 174 |
| 107 // Don't parse if name isn't a string. | 175 // Don't parse if name isn't a string. |
| 108 { | 176 { |
| 109 Manifest manifest = ParseManifest("{ \"short_name\": 42 }"); | 177 Manifest manifest = ParseManifest("{ \"short_name\": 42 }"); |
| 110 ASSERT_TRUE(manifest.short_name.is_null()); | 178 ASSERT_TRUE(manifest.short_name.is_null()); |
| 179 EXPECT_EQ(1u, GetErrorCount()); |
| 180 EXPECT_EQ("Manifest parsing error: property 'short_name' ignored," |
| 181 " type string expected.", |
| 182 errors()[0]); |
| 111 } | 183 } |
| 112 } | 184 } |
| 113 | 185 |
| 114 TEST_F(ManifestParserTest, StartURLParseRules) { | 186 TEST_F(ManifestParserTest, StartURLParseRules) { |
| 115 // Smoke test. | 187 // Smoke test. |
| 116 { | 188 { |
| 117 Manifest manifest = ParseManifest("{ \"start_url\": \"land.html\" }"); | 189 Manifest manifest = ParseManifest("{ \"start_url\": \"land.html\" }"); |
| 118 ASSERT_EQ(manifest.start_url.spec(), | 190 ASSERT_EQ(manifest.start_url.spec(), |
| 119 default_document_url.Resolve("land.html").spec()); | 191 default_document_url.Resolve("land.html").spec()); |
| 120 ASSERT_FALSE(manifest.IsEmpty()); | 192 ASSERT_FALSE(manifest.IsEmpty()); |
| 193 EXPECT_EQ(0u, GetErrorCount()); |
| 121 } | 194 } |
| 122 | 195 |
| 123 // Whitespaces. | 196 // Whitespaces. |
| 124 { | 197 { |
| 125 Manifest manifest = ParseManifest("{ \"start_url\": \" land.html \" }"); | 198 Manifest manifest = ParseManifest("{ \"start_url\": \" land.html \" }"); |
| 126 ASSERT_EQ(manifest.start_url.spec(), | 199 ASSERT_EQ(manifest.start_url.spec(), |
| 127 default_document_url.Resolve("land.html").spec()); | 200 default_document_url.Resolve("land.html").spec()); |
| 201 EXPECT_EQ(0u, GetErrorCount()); |
| 128 } | 202 } |
| 129 | 203 |
| 130 // Don't parse if property isn't a string. | 204 // Don't parse if property isn't a string. |
| 131 { | 205 { |
| 132 Manifest manifest = ParseManifest("{ \"start_url\": {} }"); | 206 Manifest manifest = ParseManifest("{ \"start_url\": {} }"); |
| 133 ASSERT_TRUE(manifest.start_url.is_empty()); | 207 ASSERT_TRUE(manifest.start_url.is_empty()); |
| 208 EXPECT_EQ(1u, GetErrorCount()); |
| 209 EXPECT_EQ("Manifest parsing error: property 'start_url' ignored," |
| 210 " type string expected.", |
| 211 errors()[0]); |
| 134 } | 212 } |
| 135 | 213 |
| 136 // Don't parse if property isn't a string. | 214 // Don't parse if property isn't a string. |
| 137 { | 215 { |
| 138 Manifest manifest = ParseManifest("{ \"start_url\": 42 }"); | 216 Manifest manifest = ParseManifest("{ \"start_url\": 42 }"); |
| 139 ASSERT_TRUE(manifest.start_url.is_empty()); | 217 ASSERT_TRUE(manifest.start_url.is_empty()); |
| 218 EXPECT_EQ(1u, GetErrorCount()); |
| 219 EXPECT_EQ("Manifest parsing error: property 'start_url' ignored," |
| 220 " type string expected.", |
| 221 errors()[0]); |
| 140 } | 222 } |
| 141 | 223 |
| 142 // Absolute start_url, same origin with document. | 224 // Absolute start_url, same origin with document. |
| 143 { | 225 { |
| 144 Manifest manifest = | 226 Manifest manifest = |
| 145 ParseManifest("{ \"start_url\": \"http://foo.com/land.html\" }", | 227 ParseManifestWithURLs("{ \"start_url\": \"http://foo.com/land.html\" }", |
| 146 GURL("http://foo.com/manifest.json"), | 228 GURL("http://foo.com/manifest.json"), |
| 147 GURL("http://foo.com/index.html")); | 229 GURL("http://foo.com/index.html")); |
| 148 ASSERT_EQ(manifest.start_url.spec(), "http://foo.com/land.html"); | 230 ASSERT_EQ(manifest.start_url.spec(), "http://foo.com/land.html"); |
| 231 EXPECT_EQ(0u, GetErrorCount()); |
| 149 } | 232 } |
| 150 | 233 |
| 151 // Absolute start_url, cross origin with document. | 234 // Absolute start_url, cross origin with document. |
| 152 { | 235 { |
| 153 Manifest manifest = | 236 Manifest manifest = |
| 154 ParseManifest("{ \"start_url\": \"http://bar.com/land.html\" }", | 237 ParseManifestWithURLs("{ \"start_url\": \"http://bar.com/land.html\" }", |
| 155 GURL("http://foo.com/manifest.json"), | 238 GURL("http://foo.com/manifest.json"), |
| 156 GURL("http://foo.com/index.html")); | 239 GURL("http://foo.com/index.html")); |
| 157 ASSERT_TRUE(manifest.start_url.is_empty()); | 240 ASSERT_TRUE(manifest.start_url.is_empty()); |
| 241 EXPECT_EQ(1u, GetErrorCount()); |
| 242 EXPECT_EQ("Manifest parsing error: property 'start_url' ignored, should " |
| 243 "be same origin as document.", |
| 244 errors()[0]); |
| 158 } | 245 } |
| 159 | 246 |
| 160 // Resolving has to happen based on the manifest_url. | 247 // Resolving has to happen based on the manifest_url. |
| 161 { | 248 { |
| 162 Manifest manifest = | 249 Manifest manifest = |
| 163 ParseManifest("{ \"start_url\": \"land.html\" }", | 250 ParseManifestWithURLs("{ \"start_url\": \"land.html\" }", |
| 164 GURL("http://foo.com/landing/manifest.json"), | 251 GURL("http://foo.com/landing/manifest.json"), |
| 165 GURL("http://foo.com/index.html")); | 252 GURL("http://foo.com/index.html")); |
| 166 ASSERT_EQ(manifest.start_url.spec(), "http://foo.com/landing/land.html"); | 253 ASSERT_EQ(manifest.start_url.spec(), "http://foo.com/landing/land.html"); |
| 254 EXPECT_EQ(0u, GetErrorCount()); |
| 167 } | 255 } |
| 168 } | 256 } |
| 169 | 257 |
| 170 TEST_F(ManifestParserTest, DisplayParserRules) { | 258 TEST_F(ManifestParserTest, DisplayParserRules) { |
| 171 // Smoke test. | 259 // Smoke test. |
| 172 { | 260 { |
| 173 Manifest manifest = ParseManifest("{ \"display\": \"browser\" }"); | 261 Manifest manifest = ParseManifest("{ \"display\": \"browser\" }"); |
| 174 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_BROWSER); | 262 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_BROWSER); |
| 175 EXPECT_FALSE(manifest.IsEmpty()); | 263 EXPECT_FALSE(manifest.IsEmpty()); |
| 264 EXPECT_EQ(0u, GetErrorCount()); |
| 176 } | 265 } |
| 177 | 266 |
| 178 // Trim whitespaces. | 267 // Trim whitespaces. |
| 179 { | 268 { |
| 180 Manifest manifest = ParseManifest("{ \"display\": \" browser \" }"); | 269 Manifest manifest = ParseManifest("{ \"display\": \" browser \" }"); |
| 181 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_BROWSER); | 270 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_BROWSER); |
| 271 EXPECT_EQ(0u, GetErrorCount()); |
| 182 } | 272 } |
| 183 | 273 |
| 184 // Don't parse if name isn't a string. | 274 // Don't parse if name isn't a string. |
| 185 { | 275 { |
| 186 Manifest manifest = ParseManifest("{ \"display\": {} }"); | 276 Manifest manifest = ParseManifest("{ \"display\": {} }"); |
| 187 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_UNSPECIFIED); | 277 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_UNSPECIFIED); |
| 278 EXPECT_EQ(1u, GetErrorCount()); |
| 279 EXPECT_EQ("Manifest parsing error: property 'display' ignored," |
| 280 " type string expected.", |
| 281 errors()[0]); |
| 188 } | 282 } |
| 189 | 283 |
| 190 // Don't parse if name isn't a string. | 284 // Don't parse if name isn't a string. |
| 191 { | 285 { |
| 192 Manifest manifest = ParseManifest("{ \"display\": 42 }"); | 286 Manifest manifest = ParseManifest("{ \"display\": 42 }"); |
| 193 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_UNSPECIFIED); | 287 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_UNSPECIFIED); |
| 288 EXPECT_EQ(1u, GetErrorCount()); |
| 289 EXPECT_EQ("Manifest parsing error: property 'display' ignored," |
| 290 " type string expected.", |
| 291 errors()[0]); |
| 194 } | 292 } |
| 195 | 293 |
| 196 // Parse fails if string isn't known. | 294 // Parse fails if string isn't known. |
| 197 { | 295 { |
| 198 Manifest manifest = ParseManifest("{ \"display\": \"browser_something\" }"); | 296 Manifest manifest = ParseManifest("{ \"display\": \"browser_something\" }"); |
| 199 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_UNSPECIFIED); | 297 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_UNSPECIFIED); |
| 298 EXPECT_EQ(1u, GetErrorCount()); |
| 299 EXPECT_EQ("Manifest parsing error: unknown 'display' value ignored.", |
| 300 errors()[0]); |
| 200 } | 301 } |
| 201 | 302 |
| 202 // Accept 'fullscreen'. | 303 // Accept 'fullscreen'. |
| 203 { | 304 { |
| 204 Manifest manifest = ParseManifest("{ \"display\": \"fullscreen\" }"); | 305 Manifest manifest = ParseManifest("{ \"display\": \"fullscreen\" }"); |
| 205 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_FULLSCREEN); | 306 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_FULLSCREEN); |
| 307 EXPECT_EQ(0u, GetErrorCount()); |
| 206 } | 308 } |
| 207 | 309 |
| 208 // Accept 'fullscreen'. | 310 // Accept 'fullscreen'. |
| 209 { | 311 { |
| 210 Manifest manifest = ParseManifest("{ \"display\": \"standalone\" }"); | 312 Manifest manifest = ParseManifest("{ \"display\": \"standalone\" }"); |
| 211 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_STANDALONE); | 313 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_STANDALONE); |
| 314 EXPECT_EQ(0u, GetErrorCount()); |
| 212 } | 315 } |
| 213 | 316 |
| 214 // Accept 'minimal-ui'. | 317 // Accept 'minimal-ui'. |
| 215 { | 318 { |
| 216 Manifest manifest = ParseManifest("{ \"display\": \"minimal-ui\" }"); | 319 Manifest manifest = ParseManifest("{ \"display\": \"minimal-ui\" }"); |
| 217 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_MINIMAL_UI); | 320 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_MINIMAL_UI); |
| 321 EXPECT_EQ(0u, GetErrorCount()); |
| 218 } | 322 } |
| 219 | 323 |
| 220 // Accept 'browser'. | 324 // Accept 'browser'. |
| 221 { | 325 { |
| 222 Manifest manifest = ParseManifest("{ \"display\": \"browser\" }"); | 326 Manifest manifest = ParseManifest("{ \"display\": \"browser\" }"); |
| 223 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_BROWSER); | 327 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_BROWSER); |
| 328 EXPECT_EQ(0u, GetErrorCount()); |
| 224 } | 329 } |
| 225 | 330 |
| 226 // Case insensitive. | 331 // Case insensitive. |
| 227 { | 332 { |
| 228 Manifest manifest = ParseManifest("{ \"display\": \"BROWSER\" }"); | 333 Manifest manifest = ParseManifest("{ \"display\": \"BROWSER\" }"); |
| 229 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_BROWSER); | 334 EXPECT_EQ(manifest.display, Manifest::DISPLAY_MODE_BROWSER); |
| 335 EXPECT_EQ(0u, GetErrorCount()); |
| 230 } | 336 } |
| 231 } | 337 } |
| 232 | 338 |
| 233 TEST_F(ManifestParserTest, OrientationParserRules) { | 339 TEST_F(ManifestParserTest, OrientationParserRules) { |
| 234 // Smoke test. | 340 // Smoke test. |
| 235 { | 341 { |
| 236 Manifest manifest = ParseManifest("{ \"orientation\": \"natural\" }"); | 342 Manifest manifest = ParseManifest("{ \"orientation\": \"natural\" }"); |
| 237 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockNatural); | 343 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockNatural); |
| 238 EXPECT_FALSE(manifest.IsEmpty()); | 344 EXPECT_FALSE(manifest.IsEmpty()); |
| 345 EXPECT_EQ(0u, GetErrorCount()); |
| 239 } | 346 } |
| 240 | 347 |
| 241 // Trim whitespaces. | 348 // Trim whitespaces. |
| 242 { | 349 { |
| 243 Manifest manifest = ParseManifest("{ \"orientation\": \"natural\" }"); | 350 Manifest manifest = ParseManifest("{ \"orientation\": \"natural\" }"); |
| 244 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockNatural); | 351 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockNatural); |
| 352 EXPECT_EQ(0u, GetErrorCount()); |
| 245 } | 353 } |
| 246 | 354 |
| 247 // Don't parse if name isn't a string. | 355 // Don't parse if name isn't a string. |
| 248 { | 356 { |
| 249 Manifest manifest = ParseManifest("{ \"orientation\": {} }"); | 357 Manifest manifest = ParseManifest("{ \"orientation\": {} }"); |
| 250 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockDefault); | 358 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockDefault); |
| 359 EXPECT_EQ(1u, GetErrorCount()); |
| 360 EXPECT_EQ("Manifest parsing error: property 'orientation' ignored," |
| 361 " type string expected.", |
| 362 errors()[0]); |
| 251 } | 363 } |
| 252 | 364 |
| 253 // Don't parse if name isn't a string. | 365 // Don't parse if name isn't a string. |
| 254 { | 366 { |
| 255 Manifest manifest = ParseManifest("{ \"orientation\": 42 }"); | 367 Manifest manifest = ParseManifest("{ \"orientation\": 42 }"); |
| 256 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockDefault); | 368 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockDefault); |
| 369 EXPECT_EQ(1u, GetErrorCount()); |
| 370 EXPECT_EQ("Manifest parsing error: property 'orientation' ignored," |
| 371 " type string expected.", |
| 372 errors()[0]); |
| 257 } | 373 } |
| 258 | 374 |
| 259 // Parse fails if string isn't known. | 375 // Parse fails if string isn't known. |
| 260 { | 376 { |
| 261 Manifest manifest = ParseManifest("{ \"orientation\": \"naturalish\" }"); | 377 Manifest manifest = ParseManifest("{ \"orientation\": \"naturalish\" }"); |
| 262 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockDefault); | 378 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockDefault); |
| 379 EXPECT_EQ(1u, GetErrorCount()); |
| 380 EXPECT_EQ("Manifest parsing error: unknown 'orientation' value ignored.", |
| 381 errors()[0]); |
| 263 } | 382 } |
| 264 | 383 |
| 265 // Accept 'any'. | 384 // Accept 'any'. |
| 266 { | 385 { |
| 267 Manifest manifest = ParseManifest("{ \"orientation\": \"any\" }"); | 386 Manifest manifest = ParseManifest("{ \"orientation\": \"any\" }"); |
| 268 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockAny); | 387 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockAny); |
| 388 EXPECT_EQ(0u, GetErrorCount()); |
| 269 } | 389 } |
| 270 | 390 |
| 271 // Accept 'natural'. | 391 // Accept 'natural'. |
| 272 { | 392 { |
| 273 Manifest manifest = ParseManifest("{ \"orientation\": \"natural\" }"); | 393 Manifest manifest = ParseManifest("{ \"orientation\": \"natural\" }"); |
| 274 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockNatural); | 394 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockNatural); |
| 395 EXPECT_EQ(0u, GetErrorCount()); |
| 275 } | 396 } |
| 276 | 397 |
| 277 // Accept 'landscape'. | 398 // Accept 'landscape'. |
| 278 { | 399 { |
| 279 Manifest manifest = ParseManifest("{ \"orientation\": \"landscape\" }"); | 400 Manifest manifest = ParseManifest("{ \"orientation\": \"landscape\" }"); |
| 280 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockLandscape); | 401 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockLandscape); |
| 402 EXPECT_EQ(0u, GetErrorCount()); |
| 281 } | 403 } |
| 282 | 404 |
| 283 // Accept 'landscape-primary'. | 405 // Accept 'landscape-primary'. |
| 284 { | 406 { |
| 285 Manifest manifest = | 407 Manifest manifest = |
| 286 ParseManifest("{ \"orientation\": \"landscape-primary\" }"); | 408 ParseManifest("{ \"orientation\": \"landscape-primary\" }"); |
| 287 EXPECT_EQ(manifest.orientation, | 409 EXPECT_EQ(manifest.orientation, |
| 288 blink::WebScreenOrientationLockLandscapePrimary); | 410 blink::WebScreenOrientationLockLandscapePrimary); |
| 411 EXPECT_EQ(0u, GetErrorCount()); |
| 289 } | 412 } |
| 290 | 413 |
| 291 // Accept 'landscape-secondary'. | 414 // Accept 'landscape-secondary'. |
| 292 { | 415 { |
| 293 Manifest manifest = | 416 Manifest manifest = |
| 294 ParseManifest("{ \"orientation\": \"landscape-secondary\" }"); | 417 ParseManifest("{ \"orientation\": \"landscape-secondary\" }"); |
| 295 EXPECT_EQ(manifest.orientation, | 418 EXPECT_EQ(manifest.orientation, |
| 296 blink::WebScreenOrientationLockLandscapeSecondary); | 419 blink::WebScreenOrientationLockLandscapeSecondary); |
| 420 EXPECT_EQ(0u, GetErrorCount()); |
| 297 } | 421 } |
| 298 | 422 |
| 299 // Accept 'portrait'. | 423 // Accept 'portrait'. |
| 300 { | 424 { |
| 301 Manifest manifest = ParseManifest("{ \"orientation\": \"portrait\" }"); | 425 Manifest manifest = ParseManifest("{ \"orientation\": \"portrait\" }"); |
| 302 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockPortrait); | 426 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockPortrait); |
| 427 EXPECT_EQ(0u, GetErrorCount()); |
| 303 } | 428 } |
| 304 | 429 |
| 305 // Accept 'portrait-primary'. | 430 // Accept 'portrait-primary'. |
| 306 { | 431 { |
| 307 Manifest manifest = | 432 Manifest manifest = |
| 308 ParseManifest("{ \"orientation\": \"portrait-primary\" }"); | 433 ParseManifest("{ \"orientation\": \"portrait-primary\" }"); |
| 309 EXPECT_EQ(manifest.orientation, | 434 EXPECT_EQ(manifest.orientation, |
| 310 blink::WebScreenOrientationLockPortraitPrimary); | 435 blink::WebScreenOrientationLockPortraitPrimary); |
| 436 EXPECT_EQ(0u, GetErrorCount()); |
| 311 } | 437 } |
| 312 | 438 |
| 313 // Accept 'portrait-secondary'. | 439 // Accept 'portrait-secondary'. |
| 314 { | 440 { |
| 315 Manifest manifest = | 441 Manifest manifest = |
| 316 ParseManifest("{ \"orientation\": \"portrait-secondary\" }"); | 442 ParseManifest("{ \"orientation\": \"portrait-secondary\" }"); |
| 317 EXPECT_EQ(manifest.orientation, | 443 EXPECT_EQ(manifest.orientation, |
| 318 blink::WebScreenOrientationLockPortraitSecondary); | 444 blink::WebScreenOrientationLockPortraitSecondary); |
| 445 EXPECT_EQ(0u, GetErrorCount()); |
| 319 } | 446 } |
| 320 | 447 |
| 321 // Case insensitive. | 448 // Case insensitive. |
| 322 { | 449 { |
| 323 Manifest manifest = ParseManifest("{ \"orientation\": \"LANDSCAPE\" }"); | 450 Manifest manifest = ParseManifest("{ \"orientation\": \"LANDSCAPE\" }"); |
| 324 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockLandscape); | 451 EXPECT_EQ(manifest.orientation, blink::WebScreenOrientationLockLandscape); |
| 452 EXPECT_EQ(0u, GetErrorCount()); |
| 325 } | 453 } |
| 326 } | 454 } |
| 327 | 455 |
| 328 TEST_F(ManifestParserTest, IconsParseRules) { | 456 TEST_F(ManifestParserTest, IconsParseRules) { |
| 329 // Smoke test: if no icon, empty list. | 457 // Smoke test: if no icon, empty list. |
| 330 { | 458 { |
| 331 Manifest manifest = ParseManifest("{ \"icons\": [] }"); | 459 Manifest manifest = ParseManifest("{ \"icons\": [] }"); |
| 332 EXPECT_EQ(manifest.icons.size(), 0u); | 460 EXPECT_EQ(manifest.icons.size(), 0u); |
| 333 EXPECT_TRUE(manifest.IsEmpty()); | 461 EXPECT_TRUE(manifest.IsEmpty()); |
| 462 EXPECT_EQ(0u, GetErrorCount()); |
| 334 } | 463 } |
| 335 | 464 |
| 336 // Smoke test: if empty icon, empty list. | 465 // Smoke test: if empty icon, empty list. |
| 337 { | 466 { |
| 338 Manifest manifest = ParseManifest("{ \"icons\": [ {} ] }"); | 467 Manifest manifest = ParseManifest("{ \"icons\": [ {} ] }"); |
| 339 EXPECT_EQ(manifest.icons.size(), 0u); | 468 EXPECT_EQ(manifest.icons.size(), 0u); |
| 340 EXPECT_TRUE(manifest.IsEmpty()); | 469 EXPECT_TRUE(manifest.IsEmpty()); |
| 470 EXPECT_EQ(0u, GetErrorCount()); |
| 341 } | 471 } |
| 342 | 472 |
| 343 // Smoke test: icon with invalid src, empty list. | 473 // Smoke test: icon with invalid src, empty list. |
| 344 { | 474 { |
| 345 Manifest manifest = ParseManifest("{ \"icons\": [ { \"icons\": [] } ] }"); | 475 Manifest manifest = ParseManifest("{ \"icons\": [ { \"icons\": [] } ] }"); |
| 346 EXPECT_EQ(manifest.icons.size(), 0u); | 476 EXPECT_EQ(manifest.icons.size(), 0u); |
| 347 EXPECT_TRUE(manifest.IsEmpty()); | 477 EXPECT_TRUE(manifest.IsEmpty()); |
| 478 EXPECT_EQ(0u, GetErrorCount()); |
| 348 } | 479 } |
| 349 | 480 |
| 350 // Smoke test: if icon with empty src, it will be present in the list. | 481 // Smoke test: if icon with empty src, it will be present in the list. |
| 351 { | 482 { |
| 352 Manifest manifest = ParseManifest("{ \"icons\": [ { \"src\": \"\" } ] }"); | 483 Manifest manifest = ParseManifest("{ \"icons\": [ { \"src\": \"\" } ] }"); |
| 353 EXPECT_EQ(manifest.icons.size(), 1u); | 484 EXPECT_EQ(manifest.icons.size(), 1u); |
| 354 EXPECT_EQ(manifest.icons[0].src.spec(), "http://foo.com/index.html"); | 485 EXPECT_EQ(manifest.icons[0].src.spec(), "http://foo.com/index.html"); |
| 355 EXPECT_FALSE(manifest.IsEmpty()); | 486 EXPECT_FALSE(manifest.IsEmpty()); |
| 487 EXPECT_EQ(0u, GetErrorCount()); |
| 356 } | 488 } |
| 357 | 489 |
| 358 // Smoke test: if one icons with valid src, it will be present in the list. | 490 // Smoke test: if one icons with valid src, it will be present in the list. |
| 359 { | 491 { |
| 360 Manifest manifest = | 492 Manifest manifest = |
| 361 ParseManifest("{ \"icons\": [{ \"src\": \"foo.jpg\" }] }"); | 493 ParseManifest("{ \"icons\": [{ \"src\": \"foo.jpg\" }] }"); |
| 362 EXPECT_EQ(manifest.icons.size(), 1u); | 494 EXPECT_EQ(manifest.icons.size(), 1u); |
| 363 EXPECT_EQ(manifest.icons[0].src.spec(), "http://foo.com/foo.jpg"); | 495 EXPECT_EQ(manifest.icons[0].src.spec(), "http://foo.com/foo.jpg"); |
| 364 EXPECT_FALSE(manifest.IsEmpty()); | 496 EXPECT_FALSE(manifest.IsEmpty()); |
| 497 EXPECT_EQ(0u, GetErrorCount()); |
| 365 } | 498 } |
| 366 } | 499 } |
| 367 | 500 |
| 368 TEST_F(ManifestParserTest, IconSrcParseRules) { | 501 TEST_F(ManifestParserTest, IconSrcParseRules) { |
| 369 // Smoke test. | 502 // Smoke test. |
| 370 { | 503 { |
| 371 Manifest manifest = | 504 Manifest manifest = |
| 372 ParseManifest("{ \"icons\": [ {\"src\": \"foo.png\" } ] }"); | 505 ParseManifest("{ \"icons\": [ {\"src\": \"foo.png\" } ] }"); |
| 373 EXPECT_EQ(manifest.icons[0].src.spec(), | 506 EXPECT_EQ(manifest.icons[0].src.spec(), |
| 374 default_document_url.Resolve("foo.png").spec()); | 507 default_document_url.Resolve("foo.png").spec()); |
| 508 EXPECT_EQ(0u, GetErrorCount()); |
| 375 } | 509 } |
| 376 | 510 |
| 377 // Whitespaces. | 511 // Whitespaces. |
| 378 { | 512 { |
| 379 Manifest manifest = | 513 Manifest manifest = |
| 380 ParseManifest("{ \"icons\": [ {\"src\": \" foo.png \" } ] }"); | 514 ParseManifest("{ \"icons\": [ {\"src\": \" foo.png \" } ] }"); |
| 381 EXPECT_EQ(manifest.icons[0].src.spec(), | 515 EXPECT_EQ(manifest.icons[0].src.spec(), |
| 382 default_document_url.Resolve("foo.png").spec()); | 516 default_document_url.Resolve("foo.png").spec()); |
| 517 EXPECT_EQ(0u, GetErrorCount()); |
| 383 } | 518 } |
| 384 | 519 |
| 385 // Don't parse if property isn't a string. | 520 // Don't parse if property isn't a string. |
| 386 { | 521 { |
| 387 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": {} } ] }"); | 522 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": {} } ] }"); |
| 388 EXPECT_TRUE(manifest.icons.empty()); | 523 EXPECT_TRUE(manifest.icons.empty()); |
| 524 EXPECT_EQ(1u, GetErrorCount()); |
| 525 EXPECT_EQ("Manifest parsing error: property 'src' ignored," |
| 526 " type string expected.", |
| 527 errors()[0]); |
| 389 } | 528 } |
| 390 | 529 |
| 391 // Don't parse if property isn't a string. | 530 // Don't parse if property isn't a string. |
| 392 { | 531 { |
| 393 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": 42 } ] }"); | 532 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": 42 } ] }"); |
| 394 EXPECT_TRUE(manifest.icons.empty()); | 533 EXPECT_TRUE(manifest.icons.empty()); |
| 534 EXPECT_EQ(1u, GetErrorCount()); |
| 535 EXPECT_EQ("Manifest parsing error: property 'src' ignored," |
| 536 " type string expected.", |
| 537 errors()[0]); |
| 395 } | 538 } |
| 396 | 539 |
| 397 // Resolving has to happen based on the document_url. | 540 // Resolving has to happen based on the document_url. |
| 398 { | 541 { |
| 399 Manifest manifest = | 542 Manifest manifest = ParseManifestWithURLs( |
| 400 ParseManifest("{ \"icons\": [ {\"src\": \"icons/foo.png\" } ] }", | 543 "{ \"icons\": [ {\"src\": \"icons/foo.png\" } ] }", |
| 401 GURL("http://foo.com/landing/index.html")); | 544 GURL("http://foo.com/landing/index.html"), |
| 545 default_manifest_url); |
| 402 EXPECT_EQ(manifest.icons[0].src.spec(), | 546 EXPECT_EQ(manifest.icons[0].src.spec(), |
| 403 "http://foo.com/landing/icons/foo.png"); | 547 "http://foo.com/landing/icons/foo.png"); |
| 548 EXPECT_EQ(0u, GetErrorCount()); |
| 404 } | 549 } |
| 405 } | 550 } |
| 406 | 551 |
| 407 TEST_F(ManifestParserTest, IconTypeParseRules) { | 552 TEST_F(ManifestParserTest, IconTypeParseRules) { |
| 408 // Smoke test. | 553 // Smoke test. |
| 409 { | 554 { |
| 410 Manifest manifest = | 555 Manifest manifest = |
| 411 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"type\": \"foo\" } ] }"); | 556 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"type\": \"foo\" } ] }"); |
| 412 EXPECT_TRUE(EqualsASCII(manifest.icons[0].type.string(), "foo")); | 557 EXPECT_TRUE(EqualsASCII(manifest.icons[0].type.string(), "foo")); |
| 558 EXPECT_EQ(0u, GetErrorCount()); |
| 413 } | 559 } |
| 414 | 560 |
| 415 // Trim whitespaces. | 561 // Trim whitespaces. |
| 416 { | 562 { |
| 417 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," | 563 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," |
| 418 " \"type\": \" foo \" } ] }"); | 564 " \"type\": \" foo \" } ] }"); |
| 419 EXPECT_TRUE(EqualsASCII(manifest.icons[0].type.string(), "foo")); | 565 EXPECT_TRUE(EqualsASCII(manifest.icons[0].type.string(), "foo")); |
| 566 EXPECT_EQ(0u, GetErrorCount()); |
| 420 } | 567 } |
| 421 | 568 |
| 422 // Don't parse if property isn't a string. | 569 // Don't parse if property isn't a string. |
| 423 { | 570 { |
| 424 Manifest manifest = | 571 Manifest manifest = |
| 425 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"type\": {} } ] }"); | 572 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"type\": {} } ] }"); |
| 426 EXPECT_TRUE(manifest.icons[0].type.is_null()); | 573 EXPECT_TRUE(manifest.icons[0].type.is_null()); |
| 574 EXPECT_EQ(1u, GetErrorCount()); |
| 575 EXPECT_EQ("Manifest parsing error: property 'type' ignored," |
| 576 " type string expected.", |
| 577 errors()[0]); |
| 427 } | 578 } |
| 428 | 579 |
| 429 // Don't parse if property isn't a string. | 580 // Don't parse if property isn't a string. |
| 430 { | 581 { |
| 431 Manifest manifest = | 582 Manifest manifest = |
| 432 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"type\": 42 } ] }"); | 583 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"type\": 42 } ] }"); |
| 433 EXPECT_TRUE(manifest.icons[0].type.is_null()); | 584 EXPECT_TRUE(manifest.icons[0].type.is_null()); |
| 585 EXPECT_EQ(1u, GetErrorCount()); |
| 586 EXPECT_EQ("Manifest parsing error: property 'type' ignored," |
| 587 " type string expected.", |
| 588 errors()[0]); |
| 434 } | 589 } |
| 435 } | 590 } |
| 436 | 591 |
| 437 TEST_F(ManifestParserTest, IconDensityParseRules) { | 592 TEST_F(ManifestParserTest, IconDensityParseRules) { |
| 438 // Smoke test. | 593 // Smoke test. |
| 439 { | 594 { |
| 440 Manifest manifest = | 595 Manifest manifest = |
| 441 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\": 42 } ] }"); | 596 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\": 42 } ] }"); |
| 442 EXPECT_EQ(manifest.icons[0].density, 42); | 597 EXPECT_EQ(manifest.icons[0].density, 42); |
| 598 EXPECT_EQ(0u, GetErrorCount()); |
| 443 } | 599 } |
| 444 | 600 |
| 445 // Decimal value. | 601 // Decimal value. |
| 446 { | 602 { |
| 447 Manifest manifest = | 603 Manifest manifest = |
| 448 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\": 2.5 } ] }"); | 604 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\": 2.5 } ] }"); |
| 449 EXPECT_EQ(manifest.icons[0].density, 2.5); | 605 EXPECT_EQ(manifest.icons[0].density, 2.5); |
| 606 EXPECT_EQ(0u, GetErrorCount()); |
| 450 } | 607 } |
| 451 | 608 |
| 452 // Parse fail if it isn't a float. | 609 // Parse fail if it isn't a float. |
| 453 { | 610 { |
| 454 Manifest manifest = | 611 Manifest manifest = |
| 455 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\": {} } ] }"); | 612 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\": {} } ] }"); |
| 456 EXPECT_EQ(manifest.icons[0].density, Manifest::Icon::kDefaultDensity); | 613 EXPECT_EQ(manifest.icons[0].density, Manifest::Icon::kDefaultDensity); |
| 614 EXPECT_EQ(1u, GetErrorCount()); |
| 615 EXPECT_EQ("Manifest parsing error: icon 'density' ignored, " |
| 616 "must be float greater than 0.", |
| 617 errors()[0]); |
| 457 } | 618 } |
| 458 | 619 |
| 459 // Parse fail if it isn't a float. | 620 // Parse fail if it isn't a float. |
| 460 { | 621 { |
| 461 Manifest manifest = | 622 Manifest manifest = |
| 462 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\":\"2\" } ] }"); | 623 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\":\"2\" } ] }"); |
| 463 EXPECT_EQ(manifest.icons[0].density, Manifest::Icon::kDefaultDensity); | 624 EXPECT_EQ(manifest.icons[0].density, Manifest::Icon::kDefaultDensity); |
| 625 EXPECT_EQ(1u, GetErrorCount()); |
| 626 EXPECT_EQ("Manifest parsing error: icon 'density' ignored, " |
| 627 "must be float greater than 0.", |
| 628 errors()[0]); |
| 464 } | 629 } |
| 465 | 630 |
| 466 // Edge case: 1.0. | 631 // Edge case: 1.0. |
| 467 { | 632 { |
| 468 Manifest manifest = | 633 Manifest manifest = |
| 469 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\": 1.00 } ] }"); | 634 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\": 1.00 } ] }"); |
| 470 EXPECT_EQ(manifest.icons[0].density, 1); | 635 EXPECT_EQ(manifest.icons[0].density, 1); |
| 636 EXPECT_EQ(0u, GetErrorCount()); |
| 471 } | 637 } |
| 472 | 638 |
| 473 // Edge case: values between 0.0 and 1.0 are allowed. | 639 // Edge case: values between 0.0 and 1.0 are allowed. |
| 474 { | 640 { |
| 475 Manifest manifest = | 641 Manifest manifest = |
| 476 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\": 0.42 } ] }"); | 642 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\": 0.42 } ] }"); |
| 477 EXPECT_EQ(manifest.icons[0].density, 0.42); | 643 EXPECT_EQ(manifest.icons[0].density, 0.42); |
| 644 EXPECT_EQ(0u, GetErrorCount()); |
| 478 } | 645 } |
| 479 | 646 |
| 480 // 0 is an invalid value. | 647 // 0 is an invalid value. |
| 481 { | 648 { |
| 482 Manifest manifest = | 649 Manifest manifest = |
| 483 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\": 0.0 } ] }"); | 650 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\": 0.0 } ] }"); |
| 484 EXPECT_EQ(manifest.icons[0].density, Manifest::Icon::kDefaultDensity); | 651 EXPECT_EQ(manifest.icons[0].density, Manifest::Icon::kDefaultDensity); |
| 652 EXPECT_EQ(1u, GetErrorCount()); |
| 653 EXPECT_EQ("Manifest parsing error: icon 'density' ignored, " |
| 654 "must be float greater than 0.", |
| 655 errors()[0]); |
| 485 } | 656 } |
| 486 | 657 |
| 487 // Negative values are invalid. | 658 // Negative values are invalid. |
| 488 { | 659 { |
| 489 Manifest manifest = | 660 Manifest manifest = |
| 490 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\": -2.5 } ] }"); | 661 ParseManifest("{ \"icons\": [ {\"src\": \"\", \"density\": -2.5 } ] }"); |
| 491 EXPECT_EQ(manifest.icons[0].density, Manifest::Icon::kDefaultDensity); | 662 EXPECT_EQ(manifest.icons[0].density, Manifest::Icon::kDefaultDensity); |
| 663 EXPECT_EQ(1u, GetErrorCount()); |
| 664 EXPECT_EQ("Manifest parsing error: icon 'density' ignored, " |
| 665 "must be float greater than 0.", |
| 666 errors()[0]); |
| 492 } | 667 } |
| 493 } | 668 } |
| 494 | 669 |
| 495 TEST_F(ManifestParserTest, IconSizesParseRules) { | 670 TEST_F(ManifestParserTest, IconSizesParseRules) { |
| 496 // Smoke test. | 671 // Smoke test. |
| 497 { | 672 { |
| 498 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," | 673 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," |
| 499 "\"sizes\": \"42x42\" } ] }"); | 674 "\"sizes\": \"42x42\" } ] }"); |
| 500 EXPECT_EQ(manifest.icons[0].sizes.size(), 1u); | 675 EXPECT_EQ(manifest.icons[0].sizes.size(), 1u); |
| 676 EXPECT_EQ(0u, GetErrorCount()); |
| 501 } | 677 } |
| 502 | 678 |
| 503 // Trim whitespaces. | 679 // Trim whitespaces. |
| 504 { | 680 { |
| 505 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," | 681 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," |
| 506 "\"sizes\": \" 42x42 \" } ] }"); | 682 "\"sizes\": \" 42x42 \" } ] }"); |
| 507 EXPECT_EQ(manifest.icons[0].sizes.size(), 1u); | 683 EXPECT_EQ(manifest.icons[0].sizes.size(), 1u); |
| 684 EXPECT_EQ(0u, GetErrorCount()); |
| 508 } | 685 } |
| 509 | 686 |
| 510 // Don't parse if name isn't a string. | 687 // Ignore sizes if property isn't a string. |
| 511 { | 688 { |
| 512 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," | 689 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," |
| 513 "\"sizes\": {} } ] }"); | 690 "\"sizes\": {} } ] }"); |
| 514 EXPECT_EQ(manifest.icons[0].sizes.size(), 0u); | 691 EXPECT_EQ(manifest.icons[0].sizes.size(), 0u); |
| 692 EXPECT_EQ(1u, GetErrorCount()); |
| 693 EXPECT_EQ("Manifest parsing error: property 'sizes' ignored," |
| 694 " type string expected.", |
| 695 errors()[0]); |
| 515 } | 696 } |
| 516 | 697 |
| 517 // Don't parse if name isn't a string. | 698 // Ignore sizes if property isn't a string. |
| 518 { | 699 { |
| 519 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," | 700 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," |
| 520 "\"sizes\": 42 } ] }"); | 701 "\"sizes\": 42 } ] }"); |
| 521 EXPECT_EQ(manifest.icons[0].sizes.size(), 0u); | 702 EXPECT_EQ(manifest.icons[0].sizes.size(), 0u); |
| 703 EXPECT_EQ(1u, GetErrorCount()); |
| 704 EXPECT_EQ("Manifest parsing error: property 'sizes' ignored," |
| 705 " type string expected.", |
| 706 errors()[0]); |
| 522 } | 707 } |
| 523 | 708 |
| 524 // Smoke test: value correctly parsed. | 709 // Smoke test: value correctly parsed. |
| 525 { | 710 { |
| 526 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," | 711 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," |
| 527 "\"sizes\": \"42x42 48x48\" } ] }"); | 712 "\"sizes\": \"42x42 48x48\" } ] }"); |
| 528 EXPECT_EQ(manifest.icons[0].sizes[0], gfx::Size(42, 42)); | 713 EXPECT_EQ(manifest.icons[0].sizes[0], gfx::Size(42, 42)); |
| 529 EXPECT_EQ(manifest.icons[0].sizes[1], gfx::Size(48, 48)); | 714 EXPECT_EQ(manifest.icons[0].sizes[1], gfx::Size(48, 48)); |
| 715 EXPECT_EQ(0u, GetErrorCount()); |
| 530 } | 716 } |
| 531 | 717 |
| 532 // <WIDTH>'x'<HEIGHT> and <WIDTH>'X'<HEIGHT> are equivalent. | 718 // <WIDTH>'x'<HEIGHT> and <WIDTH>'X'<HEIGHT> are equivalent. |
| 533 { | 719 { |
| 534 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," | 720 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," |
| 535 "\"sizes\": \"42X42 48X48\" } ] }"); | 721 "\"sizes\": \"42X42 48X48\" } ] }"); |
| 536 EXPECT_EQ(manifest.icons[0].sizes[0], gfx::Size(42, 42)); | 722 EXPECT_EQ(manifest.icons[0].sizes[0], gfx::Size(42, 42)); |
| 537 EXPECT_EQ(manifest.icons[0].sizes[1], gfx::Size(48, 48)); | 723 EXPECT_EQ(manifest.icons[0].sizes[1], gfx::Size(48, 48)); |
| 724 EXPECT_EQ(0u, GetErrorCount()); |
| 538 } | 725 } |
| 539 | 726 |
| 540 // Twice the same value is parsed twice. | 727 // Twice the same value is parsed twice. |
| 541 { | 728 { |
| 542 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," | 729 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," |
| 543 "\"sizes\": \"42X42 42x42\" } ] }"); | 730 "\"sizes\": \"42X42 42x42\" } ] }"); |
| 544 EXPECT_EQ(manifest.icons[0].sizes[0], gfx::Size(42, 42)); | 731 EXPECT_EQ(manifest.icons[0].sizes[0], gfx::Size(42, 42)); |
| 545 EXPECT_EQ(manifest.icons[0].sizes[1], gfx::Size(42, 42)); | 732 EXPECT_EQ(manifest.icons[0].sizes[1], gfx::Size(42, 42)); |
| 733 EXPECT_EQ(0u, GetErrorCount()); |
| 546 } | 734 } |
| 547 | 735 |
| 548 // Width or height can't start with 0. | 736 // Width or height can't start with 0. |
| 549 { | 737 { |
| 550 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," | 738 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," |
| 551 "\"sizes\": \"004X007 042x00\" } ] }"); | 739 "\"sizes\": \"004X007 042x00\" } ] }"); |
| 552 EXPECT_EQ(manifest.icons[0].sizes.size(), 0u); | 740 EXPECT_EQ(manifest.icons[0].sizes.size(), 0u); |
| 741 EXPECT_EQ(1u, GetErrorCount()); |
| 742 EXPECT_EQ("Manifest parsing error: found icon with no valid size.", |
| 743 errors()[0]); |
| 553 } | 744 } |
| 554 | 745 |
| 555 // Width and height MUST contain digits. | 746 // Width and height MUST contain digits. |
| 556 { | 747 { |
| 557 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," | 748 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," |
| 558 "\"sizes\": \"e4X1.0 55ax1e10\" } ] }"); | 749 "\"sizes\": \"e4X1.0 55ax1e10\" } ] }"); |
| 559 EXPECT_EQ(manifest.icons[0].sizes.size(), 0u); | 750 EXPECT_EQ(manifest.icons[0].sizes.size(), 0u); |
| 751 EXPECT_EQ(1u, GetErrorCount()); |
| 752 EXPECT_EQ("Manifest parsing error: found icon with no valid size.", |
| 753 errors()[0]); |
| 560 } | 754 } |
| 561 | 755 |
| 562 // 'any' is correctly parsed and transformed to gfx::Size(0,0). | 756 // 'any' is correctly parsed and transformed to gfx::Size(0,0). |
| 563 { | 757 { |
| 564 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," | 758 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," |
| 565 "\"sizes\": \"any AnY ANY aNy\" } ] }"); | 759 "\"sizes\": \"any AnY ANY aNy\" } ] }"); |
| 566 gfx::Size any = gfx::Size(0, 0); | 760 gfx::Size any = gfx::Size(0, 0); |
| 567 EXPECT_EQ(manifest.icons[0].sizes.size(), 4u); | 761 EXPECT_EQ(manifest.icons[0].sizes.size(), 4u); |
| 568 EXPECT_EQ(manifest.icons[0].sizes[0], any); | 762 EXPECT_EQ(manifest.icons[0].sizes[0], any); |
| 569 EXPECT_EQ(manifest.icons[0].sizes[1], any); | 763 EXPECT_EQ(manifest.icons[0].sizes[1], any); |
| 570 EXPECT_EQ(manifest.icons[0].sizes[2], any); | 764 EXPECT_EQ(manifest.icons[0].sizes[2], any); |
| 571 EXPECT_EQ(manifest.icons[0].sizes[3], any); | 765 EXPECT_EQ(manifest.icons[0].sizes[3], any); |
| 766 EXPECT_EQ(0u, GetErrorCount()); |
| 572 } | 767 } |
| 573 | 768 |
| 574 // Some invalid width/height combinations. | 769 // Some invalid width/height combinations. |
| 575 { | 770 { |
| 576 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," | 771 Manifest manifest = ParseManifest("{ \"icons\": [ {\"src\": \"\"," |
| 577 "\"sizes\": \"x 40xx 1x2x3 x42 42xx42\" } ] }"); | 772 "\"sizes\": \"x 40xx 1x2x3 x42 42xx42\" } ] }"); |
| 578 gfx::Size any = gfx::Size(0, 0); | 773 gfx::Size any = gfx::Size(0, 0); |
| 579 EXPECT_EQ(manifest.icons[0].sizes.size(), 0u); | 774 EXPECT_EQ(manifest.icons[0].sizes.size(), 0u); |
| 775 EXPECT_EQ(1u, GetErrorCount()); |
| 776 EXPECT_EQ("Manifest parsing error: found icon with no valid size.", |
| 777 errors()[0]); |
| 580 } | 778 } |
| 581 } | 779 } |
| 582 | 780 |
| 583 TEST_F(ManifestParserTest, GCMSenderIDParseRules) { | 781 TEST_F(ManifestParserTest, GCMSenderIDParseRules) { |
| 584 // Smoke test. | 782 // Smoke test. |
| 585 { | 783 { |
| 586 Manifest manifest = ParseManifest("{ \"gcm_sender_id\": \"foo\" }"); | 784 Manifest manifest = ParseManifest("{ \"gcm_sender_id\": \"foo\" }"); |
| 587 EXPECT_TRUE(EqualsASCII(manifest.gcm_sender_id.string(), "foo")); | 785 EXPECT_TRUE(EqualsASCII(manifest.gcm_sender_id.string(), "foo")); |
| 786 EXPECT_EQ(0u, GetErrorCount()); |
| 588 } | 787 } |
| 589 | 788 |
| 590 // Trim whitespaces. | 789 // Trim whitespaces. |
| 591 { | 790 { |
| 592 Manifest manifest = ParseManifest("{ \"gcm_sender_id\": \" foo \" }"); | 791 Manifest manifest = ParseManifest("{ \"gcm_sender_id\": \" foo \" }"); |
| 593 EXPECT_TRUE(EqualsASCII(manifest.gcm_sender_id.string(), "foo")); | 792 EXPECT_TRUE(EqualsASCII(manifest.gcm_sender_id.string(), "foo")); |
| 793 EXPECT_EQ(0u, GetErrorCount()); |
| 594 } | 794 } |
| 595 | 795 |
| 596 // Don't parse if property isn't a string. | 796 // Don't parse if property isn't a string. |
| 597 { | 797 { |
| 598 Manifest manifest = ParseManifest("{ \"gcm_sender_id\": {} }"); | 798 Manifest manifest = ParseManifest("{ \"gcm_sender_id\": {} }"); |
| 599 EXPECT_TRUE(manifest.gcm_sender_id.is_null()); | 799 EXPECT_TRUE(manifest.gcm_sender_id.is_null()); |
| 800 EXPECT_EQ(1u, GetErrorCount()); |
| 801 EXPECT_EQ("Manifest parsing error: property 'gcm_sender_id' ignored," |
| 802 " type string expected.", |
| 803 errors()[0]); |
| 600 } | 804 } |
| 601 { | 805 { |
| 602 Manifest manifest = ParseManifest("{ \"gcm_sender_id\": 42 }"); | 806 Manifest manifest = ParseManifest("{ \"gcm_sender_id\": 42 }"); |
| 603 EXPECT_TRUE(manifest.gcm_sender_id.is_null()); | 807 EXPECT_TRUE(manifest.gcm_sender_id.is_null()); |
| 808 EXPECT_EQ(1u, GetErrorCount()); |
| 809 EXPECT_EQ("Manifest parsing error: property 'gcm_sender_id' ignored," |
| 810 " type string expected.", |
| 811 errors()[0]); |
| 604 } | 812 } |
| 605 } | 813 } |
| 606 | 814 |
| 607 } // namespace content | 815 } // namespace content |
| OLD | NEW |