Index: chrome/browser/banners/webapp_manifest_validator_unittest.cc |
diff --git a/chrome/browser/banners/webapp_manifest_validator_unittest.cc b/chrome/browser/banners/webapp_manifest_validator_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bf597b23959fc32175acc52bf3d69ba407bd0868 |
--- /dev/null |
+++ b/chrome/browser/banners/webapp_manifest_validator_unittest.cc |
@@ -0,0 +1,150 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/banners/webapp_manifest_validator.h" |
+ |
+#include "base/strings/utf_string_conversions.h" |
+#include "content/public/common/manifest.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "third_party/WebKit/public/platform/WebDisplayMode.h" |
+ |
+namespace banners { |
+ |
+class WebappManifestValidatorUnitTest : public testing::Test { |
+ public: |
+ WebappManifestValidatorUnitTest() { } |
+ |
+ protected: |
+ static base::NullableString16 ToNullableUTF16(const std::string& str) { |
+ return base::NullableString16(base::UTF8ToUTF16(str), false); |
+ } |
+ |
+ static content::Manifest GetValidManifest() { |
+ content::Manifest manifest; |
+ manifest.name = ToNullableUTF16("foo"); |
+ manifest.short_name = ToNullableUTF16("bar"); |
+ manifest.start_url = GURL("http://example.com"); |
+ manifest.display = blink::WebDisplayModeStandalone; |
+ |
+ content::Manifest::Icon icon; |
+ icon.type = ToNullableUTF16("image/png"); |
+ icon.sizes.push_back(gfx::Size(144, 144)); |
+ manifest.icons.push_back(icon); |
+ |
+ return manifest; |
+ } |
+ |
+ static bool IsManifestGood(const content::Manifest& manifest) { |
+ // The second argument is the web_contents pointer, which is used for |
+ // developer debug logging to the console. The logging is skipped inside the |
+ // method if a null web_contents pointer is provided, so this is safe. |
+ // The third argument is the is_debug_mode boolean value, which is true only |
+ // when it is triggered by the developer's action in DevTools. |
+ OutputDeveloperMessageCode code = OutputDeveloperMessageCode::kNone; |
+ return webapp_manifest_validator::IsManifestGoodForWebapp(manifest, &code); |
+ } |
+}; |
+ |
+TEST_F(WebappManifestValidatorUnitTest, EmptyManifestIsInvalid) { |
+ content::Manifest manifest; |
+ EXPECT_FALSE(IsManifestGood(manifest)); |
+} |
+ |
+TEST_F(WebappManifestValidatorUnitTest, CheckMinimalValidManifest) { |
+ content::Manifest manifest = GetValidManifest(); |
+ EXPECT_TRUE(IsManifestGood(manifest)); |
+} |
+ |
+TEST_F(WebappManifestValidatorUnitTest, ManifestRequiresNameORShortName) { |
+ content::Manifest manifest = GetValidManifest(); |
+ |
+ manifest.name = base::NullableString16(); |
+ EXPECT_TRUE(IsManifestGood(manifest)); |
+ |
+ manifest.name = ToNullableUTF16("foo"); |
+ manifest.short_name = base::NullableString16(); |
+ EXPECT_TRUE(IsManifestGood(manifest)); |
+ |
+ manifest.name = base::NullableString16(); |
+ EXPECT_FALSE(IsManifestGood(manifest)); |
+} |
+ |
+TEST_F(WebappManifestValidatorUnitTest, |
+ ManifestRequiresNonEmptyNameORShortName) { |
+ content::Manifest manifest = GetValidManifest(); |
+ |
+ manifest.name = ToNullableUTF16(""); |
+ EXPECT_TRUE(IsManifestGood(manifest)); |
+ |
+ manifest.name = ToNullableUTF16("foo"); |
+ manifest.short_name = ToNullableUTF16(""); |
+ EXPECT_TRUE(IsManifestGood(manifest)); |
+ |
+ manifest.name = ToNullableUTF16(""); |
+ EXPECT_FALSE(IsManifestGood(manifest)); |
+} |
+ |
+TEST_F(WebappManifestValidatorUnitTest, ManifestRequiresValidStartURL) { |
+ content::Manifest manifest = GetValidManifest(); |
+ |
+ manifest.start_url = GURL(); |
+ EXPECT_FALSE(IsManifestGood(manifest)); |
+ |
+ manifest.start_url = GURL("/"); |
+ EXPECT_FALSE(IsManifestGood(manifest)); |
+} |
+ |
+TEST_F(WebappManifestValidatorUnitTest, ManifestRequiresImagePNG) { |
+ content::Manifest manifest = GetValidManifest(); |
+ |
+ manifest.icons[0].type = ToNullableUTF16("image/gif"); |
+ EXPECT_FALSE(IsManifestGood(manifest)); |
+ manifest.icons[0].type = base::NullableString16(); |
+ EXPECT_FALSE(IsManifestGood(manifest)); |
+} |
+ |
+TEST_F(WebappManifestValidatorUnitTest, ManifestRequiresMinimalSize) { |
+ content::Manifest manifest = GetValidManifest(); |
+ |
+ // The icon MUST be 144x144 size at least. |
+ manifest.icons[0].sizes[0] = gfx::Size(1, 1); |
+ EXPECT_FALSE(IsManifestGood(manifest)); |
+ |
+ // If one of the sizes match the requirement, it should be accepted. |
+ manifest.icons[0].sizes.push_back(gfx::Size(144, 144)); |
+ EXPECT_TRUE(IsManifestGood(manifest)); |
+ |
+ // Higher than the required size is okay. |
+ manifest.icons[0].sizes[1] = gfx::Size(200, 200); |
+ EXPECT_TRUE(IsManifestGood(manifest)); |
+ |
+ // Non-square is okay. |
+ manifest.icons[0].sizes[1] = gfx::Size(144, 200); |
+ EXPECT_TRUE(IsManifestGood(manifest)); |
+ |
+ // The representation of the keyword 'any' should be recognized. |
+ manifest.icons[0].sizes[1] = gfx::Size(0, 0); |
+ EXPECT_TRUE(IsManifestGood(manifest)); |
+} |
+ |
+TEST_F(WebappManifestValidatorUnitTest, ManifestDisplayStandaloneFullscreen) { |
+ content::Manifest manifest = GetValidManifest(); |
+ |
+ manifest.display = blink::WebDisplayModeUndefined; |
+ EXPECT_FALSE(IsManifestGood(manifest)); |
+ |
+ manifest.display = blink::WebDisplayModeBrowser; |
+ EXPECT_FALSE(IsManifestGood(manifest)); |
+ |
+ manifest.display = blink::WebDisplayModeMinimalUi; |
+ EXPECT_FALSE(IsManifestGood(manifest)); |
+ |
+ manifest.display = blink::WebDisplayModeStandalone; |
+ EXPECT_TRUE(IsManifestGood(manifest)); |
+ |
+ manifest.display = blink::WebDisplayModeFullscreen; |
+ EXPECT_TRUE(IsManifestGood(manifest)); |
+} |
+ |
+} // namespace banners |