16d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// found in the LICENSE file.
46d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/html_viewer/webmimeregistry_impl.h"
66d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
76d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/files/file_path.h"
86d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/strings/string_util.h"
96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/strings/sys_string_conversions.h"
106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "net/base/mime_util.h"
126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h"
136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace mojo {
156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace {
166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string ToASCIIOrEmpty(const blink::WebString& string) {
186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return base::IsStringASCII(string) ? base::UTF16ToASCII(string)
196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                     : std::string();
206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace
236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)blink::WebMimeRegistry::SupportsType WebMimeRegistryImpl::supportsMIMEType(
256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& mime_type) {
266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return net::IsSupportedMimeType(ToASCIIOrEmpty(mime_type)) ?
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      blink::WebMimeRegistry::IsSupported :
286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      blink::WebMimeRegistry::IsNotSupported;
296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)blink::WebMimeRegistry::SupportsType WebMimeRegistryImpl::supportsImageMIMEType(
326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& mime_type) {
336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return net::IsSupportedImageMimeType(ToASCIIOrEmpty(mime_type)) ?
346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      blink::WebMimeRegistry::IsSupported :
356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      blink::WebMimeRegistry::IsNotSupported;
366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)blink::WebMimeRegistry::SupportsType
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciWebMimeRegistryImpl::supportsImagePrefixedMIMEType(
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const blink::WebString& mime_type) {
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string ascii_mime_type = ToASCIIOrEmpty(mime_type);
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return (net::IsSupportedImageMimeType(ascii_mime_type) ||
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          (StartsWithASCII(ascii_mime_type, "image/", true) &&
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           net::IsSupportedNonImageMimeType(ascii_mime_type)))
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             ? WebMimeRegistry::IsSupported
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             : WebMimeRegistry::IsNotSupported;
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciblink::WebMimeRegistry::SupportsType
506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    WebMimeRegistryImpl::supportsJavaScriptMIMEType(
516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& mime_type) {
526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return net::IsSupportedJavascriptMimeType(ToASCIIOrEmpty(mime_type)) ?
536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      blink::WebMimeRegistry::IsSupported :
546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      blink::WebMimeRegistry::IsNotSupported;
556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)blink::WebMimeRegistry::SupportsType WebMimeRegistryImpl::supportsMediaMIMEType(
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& mime_type,
596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& codecs,
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& key_system) {
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string mime_type_ascii = ToASCIIOrEmpty(mime_type);
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Not supporting the container is a flat-out no.
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!net::IsSupportedMediaMimeType(mime_type_ascii))
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return IsNotSupported;
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Mojo does not currently support any key systems.
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!key_system.isEmpty())
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return IsNotSupported;
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Check list of strict codecs to see if it is supported.
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (net::IsStrictMediaMimeType(mime_type_ascii)) {
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Check if the codecs are a perfect match.
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    std::vector<std::string> strict_codecs;
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    net::ParseCodecString(ToASCIIOrEmpty(codecs), &strict_codecs, false);
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return static_cast<WebMimeRegistry::SupportsType>(
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        net::IsSupportedStrictMediaMimeType(mime_type_ascii, strict_codecs));
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If we don't recognize the codec, it's possible we support it.
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::string> parsed_codecs;
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::ParseCodecString(ToASCIIOrEmpty(codecs), &parsed_codecs, true);
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!net::AreSupportedMediaCodecs(parsed_codecs))
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return MayBeSupported;
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Otherwise we have a perfect match.
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return IsSupported;
876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool WebMimeRegistryImpl::supportsMediaSourceMIMEType(
906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& mime_type,
916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& codecs) {
926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  NOTIMPLEMENTED();
936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return false;
946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool WebMimeRegistryImpl::supportsEncryptedMediaMIMEType(
976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& key_system,
986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& mime_type,
996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& codecs) {
1006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  NOTIMPLEMENTED();
1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return false;
1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)blink::WebMimeRegistry::SupportsType
1056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    WebMimeRegistryImpl::supportsNonImageMIMEType(
1066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& mime_type) {
1076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return net::IsSupportedNonImageMimeType(ToASCIIOrEmpty(mime_type)) ?
1086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      blink::WebMimeRegistry::IsSupported :
1096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      blink::WebMimeRegistry::IsNotSupported;
1106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)blink::WebString WebMimeRegistryImpl::mimeTypeForExtension(
1136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& file_extension) {
1146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  NOTIMPLEMENTED();
1156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return blink::WebString();
1166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)blink::WebString WebMimeRegistryImpl::wellKnownMimeTypeForExtension(
1196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& file_extension) {
1206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  NOTIMPLEMENTED();
1216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return blink::WebString();
1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)blink::WebString WebMimeRegistryImpl::mimeTypeFromFile(
1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const blink::WebString& file_path) {
1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  NOTIMPLEMENTED();
1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return blink::WebString();
1286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace mojo
131