Index: chrome/browser/banners/webapp_manifest_validator.cc |
diff --git a/chrome/browser/banners/webapp_manifest_validator.cc b/chrome/browser/banners/webapp_manifest_validator.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..811b12084d492bc4889979ab49ebe4150d7cd964 |
--- /dev/null |
+++ b/chrome/browser/banners/webapp_manifest_validator.cc |
@@ -0,0 +1,88 @@ |
+// Copyright 2016 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/string_util.h" |
+#include "content/public/common/manifest.h" |
+#include "ui/gfx/geometry/size.h" |
+#include "url/gurl.h" |
+ |
+namespace banners { |
+namespace webapp_manifest_validator { |
+ |
+namespace { |
+ |
+const char kPngExtension[] = ".png"; |
+ |
+// The requirement for now is an image/png that is at least 144x144. |
+const int kIconMinimumSize = 144; |
+ |
+bool DoesManifestContainRequiredIcon(const content::Manifest& manifest) { |
+ for (const auto& icon : manifest.icons) { |
+ // The type field is optional. If it isn't present, fall back on checking |
+ // the src extension, and allow the icon if the extension ends with png. |
+ if (!base::EqualsASCII(icon.type.string(), "image/png") && |
+ !(icon.type.is_null() && |
+ base::EndsWith(icon.src.ExtractFileName(), kPngExtension, |
+ base::CompareCase::INSENSITIVE_ASCII))) |
+ continue; |
+ |
+ for (const auto& size : icon.sizes) { |
+ if (size.IsEmpty()) // "any" |
+ return true; |
+ if (size.width() >= kIconMinimumSize && size.height() >= kIconMinimumSize) |
+ return true; |
+ } |
+ } |
+ |
+ return false; |
+} |
+ |
+} // anonymous namespace |
+ |
+bool IsWebappCapable(const content::Manifest& manifest, |
+ OutputDeveloperMessageCode* code) { |
+ // TODO(dominickn,mlamouri): when Chrome supports "minimal-ui", it should be |
+ // accepted. If we accept it today, it would fallback to "browser" and make |
+ // this check moot. See https://crbug.com/604390 |
+ if (manifest.display == blink::WebDisplayModeStandalone || |
+ manifest.display == blink::WebDisplayModeFullscreen) { |
+ return true; |
+ } |
+ *code = OutputDeveloperMessageCode::kManifestDisplayStandaloneFullscreen; |
+ return false; |
+} |
+ |
+bool IsManifestGoodForWebapp( |
+ const content::Manifest& manifest, |
+ OutputDeveloperMessageCode* code) { |
+ if (manifest.IsEmpty()) { |
+ *code = OutputDeveloperMessageCode::kManifestEmpty; |
+ return false; |
+ } |
+ |
+ if (!IsWebappCapable(manifest, code)) { |
+ return false; |
+ } |
+ |
+ if (!manifest.start_url.is_valid()) { |
+ *code = OutputDeveloperMessageCode::kStartURLNotValid; |
+ return false; |
+ } |
+ if ((manifest.name.is_null() || manifest.name.string().empty()) && |
+ (manifest.short_name.is_null() || manifest.short_name.string().empty())) { |
+ *code = OutputDeveloperMessageCode::kManifestMissingNameOrShortName; |
+ return false; |
+ } |
+ |
+ if (!DoesManifestContainRequiredIcon(manifest)) { |
+ *code = OutputDeveloperMessageCode::kManifestMissingSuitableIcon; |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+} // namespace webapp_manifest_validator |
+} // namespace banners |