summaryrefslogtreecommitdiffstats
path: root/net/base/mime_util.cc
diff options
context:
space:
mode:
authorpkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-30 23:48:49 +0000
committerpkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-30 23:48:49 +0000
commit657cab96e02528adfe513c90c4f07a036d92bfe6 (patch)
tree20cb65a55e78e7e6183117b79dd2efe2a259ba6b /net/base/mime_util.cc
parent6d9246446121d198c76a0445122757a8dca6709f (diff)
downloadchromium_src-657cab96e02528adfe513c90c4f07a036d92bfe6.zip
chromium_src-657cab96e02528adfe513c90c4f07a036d92bfe6.tar.gz
chromium_src-657cab96e02528adfe513c90c4f07a036d92bfe6.tar.bz2
When input is "" (or " " with trim_whitespace true), SplitString() should return an empty vector, not a vector of one empty string.
Brett and I discussed this for a while and felt this would be wise, whereas dropping all empty segments entirely (e.g. converting "a,,b" to a vector of two elements instead of three) was probably unwise. This also simplifies the code some. Fixing this also required changing the code in mime_util.cc to handle empty vectors to "are codecs valid" oracle functions (in which case we return false). I also fixed some style issues there. It also required avoiding passing the empty string in a test in extension_api_unittest.cc; Aaron assures me that this code is not expected to be defensive against such inputs, but at his suggestion I also added some CHECK()s to the API. BUG=none TEST=none Review URL: https://chromiumcodereview.appspot.com/9960004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@129998 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/mime_util.cc')
-rw-r--r--net/base/mime_util.cc71
1 files changed, 39 insertions, 32 deletions
diff --git a/net/base/mime_util.cc b/net/base/mime_util.cc
index f9e72a4..6a5bf73 100644
--- a/net/base/mime_util.cc
+++ b/net/base/mime_util.cc
@@ -55,18 +55,24 @@ class MimeUtil : public PlatformMimeUtil {
private:
friend struct base::DefaultLazyInstanceTraits<MimeUtil>;
- MimeUtil() {
- InitializeMimeTypeMaps();
- }
+
+ typedef base::hash_set<std::string> MimeMappings;
+ typedef std::map<std::string, MimeMappings> StrictMappings;
+
+ MimeUtil();
+
+ // Returns true if |codecs| is nonempty and all the items in it are present in
+ // |supported_codecs|.
+ static bool AreSupportedCodecs(const MimeMappings& supported_codecs,
+ const std::vector<std::string>& codecs);
// For faster lookup, keep hash sets.
void InitializeMimeTypeMaps();
- bool GetMimeTypeFromExtensionHelper(
- const FilePath::StringType& ext, bool include_platform_types,
- std::string* mime_type) const;
+ bool GetMimeTypeFromExtensionHelper(const FilePath::StringType& ext,
+ bool include_platform_types,
+ std::string* mime_type) const;
- typedef base::hash_set<std::string> MimeMappings;
MimeMappings image_map_;
MimeMappings media_map_;
MimeMappings non_image_map_;
@@ -74,7 +80,6 @@ class MimeUtil : public PlatformMimeUtil {
MimeMappings view_source_map_;
MimeMappings codecs_map_;
- typedef std::map<std::string, base::hash_set<std::string> > StrictMappings;
StrictMappings strict_format_map_;
}; // class MimeUtil
@@ -158,7 +163,8 @@ bool MimeUtil::GetMimeTypeFromExtension(const FilePath::StringType& ext,
}
bool MimeUtil::GetWellKnownMimeTypeFromExtension(
- const FilePath::StringType& ext, string* result) const {
+ const FilePath::StringType& ext,
+ string* result) const {
return GetMimeTypeFromExtensionHelper(ext, false, result);
}
@@ -170,9 +176,9 @@ bool MimeUtil::GetMimeTypeFromFile(const FilePath& file_path,
return GetMimeTypeFromExtension(file_name_str.substr(1), result);
}
-bool MimeUtil::GetMimeTypeFromExtensionHelper(
- const FilePath::StringType& ext, bool include_platform_types,
- string* result) const {
+bool MimeUtil::GetMimeTypeFromExtensionHelper(const FilePath::StringType& ext,
+ bool include_platform_types,
+ string* result) const {
// Avoids crash when unable to handle a long file path. See crbug.com/48733.
const unsigned kMaxFilePathSize = 65536;
if (ext.length() > kMaxFilePathSize)
@@ -346,6 +352,20 @@ static const MediaFormatStrict format_codec_mappings[] = {
{ "audio/wav", "1" }
};
+MimeUtil::MimeUtil() {
+ InitializeMimeTypeMaps();
+}
+
+// static
+bool MimeUtil::AreSupportedCodecs(const MimeMappings& supported_codecs,
+ const std::vector<std::string>& codecs) {
+ for (size_t i = 0; i < codecs.size(); ++i) {
+ if (supported_codecs.find(codecs[i]) == supported_codecs.end())
+ return false;
+ }
+ return !codecs.empty();
+}
+
void MimeUtil::InitializeMimeTypeMaps() {
for (size_t i = 0; i < arraysize(supported_image_types); ++i)
image_map_.insert(supported_image_types[i]);
@@ -412,8 +432,8 @@ bool MimeUtil::IsSupportedMimeType(const std::string& mime_type) const {
IsSupportedNonImageMimeType(mime_type.c_str());
}
-bool MimeUtil::MatchesMimeType(const std::string &mime_type_pattern,
- const std::string &mime_type) const {
+bool MimeUtil::MatchesMimeType(const std::string& mime_type_pattern,
+ const std::string& mime_type) const {
// verify caller is passing lowercase
DCHECK_EQ(StringToLowerASCII(mime_type_pattern), mime_type_pattern);
DCHECK_EQ(StringToLowerASCII(mime_type), mime_type);
@@ -451,12 +471,7 @@ bool MimeUtil::MatchesMimeType(const std::string &mime_type_pattern,
bool MimeUtil::AreSupportedMediaCodecs(
const std::vector<std::string>& codecs) const {
- for (size_t i = 0; i < codecs.size(); ++i) {
- if (codecs_map_.find(codecs[i]) == codecs_map_.end()) {
- return false;
- }
- }
- return true;
+ return AreSupportedCodecs(codecs_map_, codecs);
}
void MimeUtil::ParseCodecString(const std::string& codecs,
@@ -485,20 +500,12 @@ bool MimeUtil::IsStrictMediaMimeType(const std::string& mime_type) const {
return true;
}
-bool MimeUtil::IsSupportedStrictMediaMimeType(const std::string& mime_type,
+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;
+ return (it != strict_format_map_.end()) &&
+ AreSupportedCodecs(it->second, codecs);
}
//----------------------------------------------------------------------------