Home | History | Annotate | Download | only in glue
      1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.  Use of this
      2 // source code is governed by a BSD-style license that can be found in the
      3 // LICENSE file.
      4 
      5 #include "webkit/glue/simple_webmimeregistry_impl.h"
      6 
      7 #include "base/string_util.h"
      8 #include "base/sys_string_conversions.h"
      9 #include "base/utf_string_conversions.h"
     10 #include "net/base/mime_util.h"
     11 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
     12 #include "webkit/glue/webkit_glue.h"
     13 
     14 using WebKit::WebString;
     15 using WebKit::WebMimeRegistry;
     16 
     17 namespace {
     18 
     19 // Convert a WebString to ASCII, falling back on an empty string in the case
     20 // of a non-ASCII string.
     21 std::string ToASCIIOrEmpty(const WebString& string) {
     22   if (!IsStringASCII(string))
     23     return std::string();
     24   return UTF16ToASCII(string);
     25 }
     26 
     27 }  // namespace
     28 
     29 namespace webkit_glue {
     30 
     31 WebMimeRegistry::SupportsType SimpleWebMimeRegistryImpl::supportsMIMEType(
     32     const WebString& mime_type) {
     33   if (!net::IsSupportedMimeType(ToASCIIOrEmpty(mime_type).c_str()))
     34     return WebMimeRegistry::IsNotSupported;
     35   return WebMimeRegistry::IsSupported;
     36 }
     37 
     38 WebMimeRegistry::SupportsType SimpleWebMimeRegistryImpl::supportsImageMIMEType(
     39     const WebString& mime_type) {
     40   if (!net::IsSupportedImageMimeType(ToASCIIOrEmpty(mime_type).c_str()))
     41     return WebMimeRegistry::IsNotSupported;
     42   return WebMimeRegistry::IsSupported;
     43 }
     44 
     45 WebMimeRegistry::SupportsType SimpleWebMimeRegistryImpl::supportsJavaScriptMIMEType(
     46     const WebString& mime_type) {
     47   if (!net::IsSupportedJavascriptMimeType(ToASCIIOrEmpty(mime_type).c_str()))
     48     return WebMimeRegistry::IsNotSupported;
     49   return WebMimeRegistry::IsSupported;
     50 }
     51 
     52 WebMimeRegistry::SupportsType SimpleWebMimeRegistryImpl::supportsMediaMIMEType(
     53     const WebString& mime_type, const WebString& codecs) {
     54   // Not supporting the container is a flat-out no.
     55   if (!net::IsSupportedMediaMimeType(ToASCIIOrEmpty(mime_type).c_str()))
     56     return IsNotSupported;
     57 
     58   // Check list of strict codecs to see if it is supported.
     59   if (net::IsStrictMediaMimeType(ToASCIIOrEmpty(mime_type).c_str())) {
     60     // We support the container, but no codecs were specified.
     61     if (codecs.isNull())
     62       return MayBeSupported;
     63 
     64     // Check if the codecs are a perfect match.
     65     std::vector<std::string> strict_codecs;
     66     net::ParseCodecString(ToASCIIOrEmpty(codecs).c_str(),
     67                           &strict_codecs,
     68                           false);
     69     if (!net::IsSupportedStrictMediaMimeType(ToASCIIOrEmpty(mime_type).c_str(),
     70                                              strict_codecs))
     71       return IsNotSupported;
     72 
     73     // Good to go!
     74     return IsSupported;
     75   }
     76 
     77   // If we don't recognize the codec, it's possible we support it.
     78   std::vector<std::string> parsed_codecs;
     79   net::ParseCodecString(ToASCIIOrEmpty(codecs).c_str(), &parsed_codecs, true);
     80   if (!net::AreSupportedMediaCodecs(parsed_codecs))
     81     return MayBeSupported;
     82 
     83   // Otherwise we have a perfect match.
     84   return IsSupported;
     85 }
     86 
     87 WebMimeRegistry::SupportsType SimpleWebMimeRegistryImpl::supportsNonImageMIMEType(
     88     const WebString& mime_type) {
     89   if (!net::IsSupportedNonImageMimeType(ToASCIIOrEmpty(mime_type).c_str()))
     90     return WebMimeRegistry::IsNotSupported;
     91   return WebMimeRegistry::IsSupported;
     92 }
     93 
     94 WebString SimpleWebMimeRegistryImpl::mimeTypeForExtension(
     95     const WebString& file_extension) {
     96   std::string mime_type;
     97   net::GetMimeTypeFromExtension(
     98       WebStringToFilePathString(file_extension), &mime_type);
     99   return ASCIIToUTF16(mime_type);
    100 }
    101 
    102 WebString SimpleWebMimeRegistryImpl::mimeTypeFromFile(
    103     const WebString& file_path) {
    104   std::string mime_type;
    105   net::GetMimeTypeFromFile(
    106       FilePath(WebStringToFilePathString(file_path)), &mime_type);
    107   return ASCIIToUTF16(mime_type);
    108 }
    109 
    110 WebString SimpleWebMimeRegistryImpl::preferredExtensionForMIMEType(
    111     const WebString& mime_type) {
    112   FilePath::StringType file_extension;
    113   net::GetPreferredExtensionForMimeType(ToASCIIOrEmpty(mime_type),
    114                                         &file_extension);
    115   return FilePathStringToWebString(file_extension);
    116 }
    117 
    118 }  // namespace webkit_glue
    119