| Index: components/mime_util/mime_util.cc
|
| diff --git a/components/mime_util/mime_util.cc b/components/mime_util/mime_util.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7cb05b93deb5bbcd527abf9c01291bc017c810bf
|
| --- /dev/null
|
| +++ b/components/mime_util/mime_util.cc
|
| @@ -0,0 +1,227 @@
|
| +// Copyright (c) 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 "components/mime_util/mime_util.h"
|
| +
|
| +#include "base/containers/hash_tables.h"
|
| +#include "base/lazy_instance.h"
|
| +#include "base/strings/string_util.h"
|
| +#include "build/build_config.h"
|
| +
|
| +namespace mime_util {
|
| +
|
| +namespace {
|
| +
|
| +// Dictionary of cryptographic file mime types.
|
| +struct CertificateMimeTypeInfo {
|
| + const char* const mime_type;
|
| + net::CertificateMimeType cert_type;
|
| +};
|
| +
|
| +const CertificateMimeTypeInfo kSupportedCertificateTypes[] = {
|
| + {"application/x-x509-user-cert", net::CERTIFICATE_MIME_TYPE_X509_USER_CERT},
|
| +#if defined(OS_ANDROID)
|
| + {"application/x-x509-ca-cert", net::CERTIFICATE_MIME_TYPE_X509_CA_CERT},
|
| + {"application/x-pkcs12", net::CERTIFICATE_MIME_TYPE_PKCS12_ARCHIVE},
|
| +#endif
|
| +};
|
| +
|
| +// From WebKit's WebCore/platform/MIMETypeRegistry.cpp:
|
| +
|
| +const char* const kSupportedImageTypes[] = {"image/jpeg",
|
| + "image/pjpeg",
|
| + "image/jpg",
|
| + "image/webp",
|
| + "image/png",
|
| + "image/gif",
|
| + "image/bmp",
|
| + "image/vnd.microsoft.icon", // ico
|
| + "image/x-icon", // ico
|
| + "image/x-xbitmap", // xbm
|
| + "image/x-png"};
|
| +
|
| +// Mozilla 1.8 and WinIE 7 both accept text/javascript and text/ecmascript.
|
| +// Mozilla 1.8 accepts application/javascript, application/ecmascript, and
|
| +// application/x-javascript, but WinIE 7 doesn't.
|
| +// WinIE 7 accepts text/javascript1.1 - text/javascript1.3, text/jscript, and
|
| +// text/livescript, but Mozilla 1.8 doesn't.
|
| +// Mozilla 1.8 allows leading and trailing whitespace, but WinIE 7 doesn't.
|
| +// Mozilla 1.8 and WinIE 7 both accept the empty string, but neither accept a
|
| +// whitespace-only string.
|
| +// We want to accept all the values that either of these browsers accept, but
|
| +// not other values.
|
| +const char* const kSupportedJavascriptTypes[] = {"text/javascript",
|
| + "text/ecmascript",
|
| + "application/javascript",
|
| + "application/ecmascript",
|
| + "application/x-javascript",
|
| + "text/javascript1.1",
|
| + "text/javascript1.2",
|
| + "text/javascript1.3",
|
| + "text/jscript",
|
| + "text/livescript"};
|
| +
|
| +// These types are excluded from the logic that allows all text/ types because
|
| +// while they are technically text, it's very unlikely that a user expects to
|
| +// see them rendered in text form.
|
| +static const char* const kUnsupportedTextTypes[] = {
|
| + "text/calendar",
|
| + "text/x-calendar",
|
| + "text/x-vcalendar",
|
| + "text/vcalendar",
|
| + "text/vcard",
|
| + "text/x-vcard",
|
| + "text/directory",
|
| + "text/ldif",
|
| + "text/qif",
|
| + "text/x-qif",
|
| + "text/x-csv",
|
| + "text/x-vcf",
|
| + "text/rtf",
|
| + "text/comma-separated-values",
|
| + "text/csv",
|
| + "text/tab-separated-values",
|
| + "text/tsv",
|
| + "text/ofx", // http://crbug.com/162238
|
| + "text/vnd.sun.j2me.app-descriptor" // http://crbug.com/176450
|
| +};
|
| +
|
| +// Note:
|
| +// - does not include javascript types list (see supported_javascript_types)
|
| +// - does not include types starting with "text/" (see
|
| +// IsSupportedNonImageMimeType())
|
| +static const char* const kSupportedNonImageTypes[] = {
|
| + "image/svg+xml", // SVG is text-based XML, even though it has an image/
|
| + // type
|
| + "application/xml",
|
| + "application/atom+xml",
|
| + "application/rss+xml",
|
| + "application/xhtml+xml",
|
| + "application/json",
|
| + "multipart/related", // For MHTML support.
|
| + "multipart/x-mixed-replace"
|
| + // Note: ADDING a new type here will probably render it AS HTML. This can
|
| + // result in cross site scripting.
|
| +};
|
| +
|
| +// Singleton utility class for mime types
|
| +class MimeUtil {
|
| + public:
|
| + bool IsSupportedImageMimeType(const std::string& mime_type) const;
|
| + bool IsSupportedNonImageMimeType(const std::string& mime_type) const;
|
| + bool IsUnsupportedTextMimeType(const std::string& mime_type) const;
|
| + bool IsSupportedJavascriptMimeType(const std::string& mime_type) const;
|
| +
|
| + bool IsSupportedMimeType(const std::string& mime_type) const;
|
| +
|
| + private:
|
| + friend struct base::DefaultLazyInstanceTraits<MimeUtil>;
|
| +
|
| + using MimeMappings = base::hash_set<std::string>;
|
| +
|
| + MimeUtil();
|
| +
|
| + MimeMappings image_map_;
|
| + MimeMappings non_image_map_;
|
| + MimeMappings unsupported_text_map_;
|
| + MimeMappings javascript_map_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MimeUtil);
|
| +};
|
| +
|
| +MimeUtil::MimeUtil() {
|
| + // Initialize the supported non-image types.
|
| + for (size_t i = 0; i < arraysize(kSupportedNonImageTypes); ++i)
|
| + non_image_map_.insert(kSupportedNonImageTypes[i]);
|
| + for (size_t i = 0; i < arraysize(kSupportedImageTypes); ++i)
|
| + image_map_.insert(kSupportedImageTypes[i]);
|
| + for (size_t i = 0; i < arraysize(kUnsupportedTextTypes); ++i)
|
| + unsupported_text_map_.insert(kUnsupportedTextTypes[i]);
|
| + for (size_t i = 0; i < arraysize(kSupportedJavascriptTypes); ++i) {
|
| + javascript_map_.insert(kSupportedJavascriptTypes[i]);
|
| + non_image_map_.insert(kSupportedJavascriptTypes[i]);
|
| + }
|
| + for (size_t i = 0; i < arraysize(kSupportedCertificateTypes); ++i)
|
| + non_image_map_.insert(kSupportedCertificateTypes[i].mime_type);
|
| +}
|
| +
|
| +bool MimeUtil::IsSupportedImageMimeType(const std::string& mime_type) const {
|
| + return image_map_.find(base::StringToLowerASCII(mime_type)) !=
|
| + image_map_.end();
|
| +}
|
| +
|
| +bool MimeUtil::IsSupportedNonImageMimeType(const std::string& mime_type) const {
|
| + return non_image_map_.find(base::StringToLowerASCII(mime_type)) !=
|
| + non_image_map_.end() ||
|
| + (StartsWithASCII(mime_type, "text/", false /* case insensitive */) &&
|
| + !IsUnsupportedTextMimeType(mime_type)) ||
|
| + (StartsWithASCII(mime_type, "application/", false) &&
|
| + net::MatchesMimeType("application/*+json", mime_type)) ||
|
| + net::IsSupportedMediaMimeType(mime_type);
|
| +}
|
| +
|
| +bool MimeUtil::IsUnsupportedTextMimeType(const std::string& mime_type) const {
|
| + return unsupported_text_map_.find(base::StringToLowerASCII(mime_type)) !=
|
| + unsupported_text_map_.end();
|
| +}
|
| +
|
| +bool MimeUtil::IsSupportedJavascriptMimeType(
|
| + const std::string& mime_type) const {
|
| + return javascript_map_.find(mime_type) != javascript_map_.end();
|
| +}
|
| +
|
| +// Mirrors WebViewImpl::CanShowMIMEType()
|
| +bool MimeUtil::IsSupportedMimeType(const std::string& mime_type) const {
|
| + return (StartsWithASCII(mime_type, "image/", false) &&
|
| + IsSupportedImageMimeType(mime_type)) ||
|
| + IsSupportedNonImageMimeType(mime_type);
|
| +}
|
| +
|
| +// This variable is Leaky because it is accessed from WorkerPool threads.
|
| +static base::LazyInstance<MimeUtil>::Leaky g_mime_util =
|
| + LAZY_INSTANCE_INITIALIZER;
|
| +
|
| +} // namespace
|
| +
|
| +bool IsSupportedImageMimeType(const std::string& mime_type) {
|
| + return g_mime_util.Get().IsSupportedImageMimeType(mime_type);
|
| +}
|
| +
|
| +bool IsSupportedNonImageMimeType(const std::string& mime_type) {
|
| + return g_mime_util.Get().IsSupportedNonImageMimeType(mime_type);
|
| +}
|
| +
|
| +bool IsUnsupportedTextMimeType(const std::string& mime_type) {
|
| + return g_mime_util.Get().IsUnsupportedTextMimeType(mime_type);
|
| +}
|
| +
|
| +bool IsSupportedJavascriptMimeType(const std::string& mime_type) {
|
| + return g_mime_util.Get().IsSupportedJavascriptMimeType(mime_type);
|
| +}
|
| +
|
| +bool IsSupportedCertificateMimeType(const std::string& mime_type) {
|
| + net::CertificateMimeType file_type =
|
| + GetCertificateMimeTypeForMimeType(mime_type);
|
| + return file_type != net::CERTIFICATE_MIME_TYPE_UNKNOWN;
|
| +}
|
| +
|
| +bool IsSupportedMimeType(const std::string& mime_type) {
|
| + return g_mime_util.Get().IsSupportedMimeType(mime_type);
|
| +}
|
| +
|
| +net::CertificateMimeType GetCertificateMimeTypeForMimeType(
|
| + const std::string& mime_type) {
|
| + // Don't create a map, there is only one entry in the table,
|
| + // except on Android.
|
| + for (size_t i = 0; i < arraysize(kSupportedCertificateTypes); ++i) {
|
| + if (base::strcasecmp(mime_type.c_str(),
|
| + kSupportedCertificateTypes[i].mime_type) == 0) {
|
| + return kSupportedCertificateTypes[i].cert_type;
|
| + }
|
| + }
|
| +
|
| + return net::CERTIFICATE_MIME_TYPE_UNKNOWN;
|
| +}
|
| +
|
| +} // namespace mime_util
|
|
|