Index: net/base/mime_util.cc |
diff --git a/net/base/mime_util.cc b/net/base/mime_util.cc |
index 5d975e6b03acf0d892eefee2eee12413794b0ddb..976aab281751398cfe2f378e9a291e34225483e5 100644 |
--- a/net/base/mime_util.cc |
+++ b/net/base/mime_util.cc |
@@ -1,7 +1,8 @@ |
-// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2010 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 <map> |
#include <string> |
#include "net/base/mime_util.h" |
@@ -41,7 +42,12 @@ class MimeUtil : public PlatformMimeUtil { |
bool AreSupportedMediaCodecs(const std::vector<std::string>& codecs) const; |
void ParseCodecString(const std::string& codecs, |
- std::vector<std::string>* codecs_out); |
+ std::vector<std::string>* codecs_out, |
+ bool strip); |
+ |
+ bool IsStrictMediaMimeType(const std::string& mime_type) const; |
+ bool IsSupportedStrictMediaMimeType(const std::string& mime_type, |
+ const std::vector<std::string>& codecs) const; |
private: |
friend struct DefaultSingletonTraits<MimeUtil>; |
@@ -59,6 +65,9 @@ class MimeUtil : public PlatformMimeUtil { |
MimeMappings javascript_map_; |
MimeMappings view_source_map_; |
MimeMappings codecs_map_; |
+ |
+ typedef std::map<std::string, base::hash_set<std::string> > StrictMappings; |
+ StrictMappings strict_format_map_; |
}; // class MimeUtil |
struct MimeInfo { |
@@ -78,6 +87,8 @@ static const MimeInfo primary_mappings[] = { |
{ "audio/mp3", "mp3" }, |
{ "video/ogg", "ogv,ogm" }, |
{ "audio/ogg", "ogg,oga" }, |
+ { "video/webm", "webm" }, |
+ { "audio/webm", "webm" }, |
{ "application/xhtml+xml", "xhtml,xht" }, |
{ "application/x-chrome-extension", "crx" } |
}; |
@@ -188,6 +199,8 @@ static const char* const supported_media_types[] = { |
"video/ogg", |
"audio/ogg", |
"application/ogg", |
+ "video/webm", |
+ "audio/webm", |
#if defined(GOOGLE_CHROME_BUILD) || defined(USE_PROPRIETARY_CODECS) |
// MPEG-4. |
@@ -214,6 +227,7 @@ static const char* const supported_media_codecs[] = { |
#endif |
"theora", |
"vorbis", |
+ "vp8" |
}; |
// Note: does not include javascript types list (see supported_javascript_types) |
@@ -277,6 +291,16 @@ static const char* const view_source_types[] = { |
"image/svg+xml" |
}; |
+struct MediaFormatStrict { |
+ const char* mime_type; |
+ const char* codecs_list; |
+}; |
+ |
+static const MediaFormatStrict format_codec_mappings[] = { |
+ { "video/webm", "vorbis,vp8,vp8.0" }, |
+ { "audio/webm", "vorbis" } |
+}; |
+ |
void MimeUtil::InitializeMimeTypeMaps() { |
for (size_t i = 0; i < arraysize(supported_image_types); ++i) |
image_map_.insert(supported_image_types[i]); |
@@ -301,6 +325,19 @@ void MimeUtil::InitializeMimeTypeMaps() { |
for (size_t i = 0; i < arraysize(supported_media_codecs); ++i) |
codecs_map_.insert(supported_media_codecs[i]); |
+ |
+ // Initialize the strict supported media types. |
+ for (size_t i = 0; i < arraysize(format_codec_mappings); ++i) { |
+ std::vector<std::string> mime_type_codecs; |
+ ParseCodecString(format_codec_mappings[i].codecs_list, |
+ &mime_type_codecs, |
+ false); |
+ |
+ MimeMappings codecs; |
+ for (size_t j = 0; j < mime_type_codecs.size(); ++j) |
+ codecs.insert(mime_type_codecs[j]); |
+ strict_format_map_[format_codec_mappings[i].mime_type] = codecs; |
+ } |
} |
bool MimeUtil::IsSupportedImageMimeType(const char* mime_type) const { |
@@ -378,12 +415,16 @@ bool MimeUtil::AreSupportedMediaCodecs( |
} |
void MimeUtil::ParseCodecString(const std::string& codecs, |
- std::vector<std::string>* codecs_out) { |
+ std::vector<std::string>* codecs_out, |
+ bool strip) { |
std::string no_quote_codecs; |
TrimString(codecs, "\"", &no_quote_codecs); |
SplitString(no_quote_codecs, ',', codecs_out); |
- // Truncate each string at the '.' |
+ if (!strip) |
+ return; |
+ |
+ // Strip everything past the first '.' |
for (std::vector<std::string>::iterator it = codecs_out->begin(); |
it != codecs_out->end(); |
++it) { |
@@ -393,6 +434,28 @@ void MimeUtil::ParseCodecString(const std::string& codecs, |
} |
} |
+bool MimeUtil::IsStrictMediaMimeType(const std::string& mime_type) const { |
+ if (strict_format_map_.find(mime_type) == strict_format_map_.end()) |
+ return false; |
+ return true; |
+} |
+ |
+bool MimeUtil::IsSupportedStrictMediaMimeType(const std::string& mime_type, |
+ const std::vector<std::string>& codecs) const { |
+ StrictMappings::const_iterator it = strict_format_map_.find(mime_type); |
+ |
+ if (it == strict_format_map_.end()) |
+ return false; |
+ |
+ const MimeMappings strict_codecs_map = it->second; |
+ for (size_t i = 0; i < codecs.size(); ++i) { |
+ if (strict_codecs_map.find(codecs[i]) == strict_codecs_map.end()) { |
+ return false; |
+ } |
+ } |
+ return true; |
+} |
+ |
//---------------------------------------------------------------------------- |
// Wrappers for the singleton |
//---------------------------------------------------------------------------- |
@@ -448,9 +511,19 @@ bool AreSupportedMediaCodecs(const std::vector<std::string>& codecs) { |
return GetMimeUtil()->AreSupportedMediaCodecs(codecs); |
} |
+bool IsStrictMediaMimeType(const std::string& mime_type) { |
+ return GetMimeUtil()->IsStrictMediaMimeType(mime_type); |
+} |
+ |
+bool IsSupportedStrictMediaMimeType(const std::string& mime_type, |
+ const std::vector<std::string>& codecs) { |
+ return GetMimeUtil()->IsSupportedStrictMediaMimeType(mime_type, codecs); |
+} |
+ |
void ParseCodecString(const std::string& codecs, |
- std::vector<std::string>* codecs_out) { |
- GetMimeUtil()->ParseCodecString(codecs, codecs_out); |
+ std::vector<std::string>* codecs_out, |
+ const bool strip) { |
+ GetMimeUtil()->ParseCodecString(codecs, codecs_out, strip); |
} |
} // namespace net |