diff options
author | pkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-30 23:48:49 +0000 |
---|---|---|
committer | pkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-30 23:48:49 +0000 |
commit | 657cab96e02528adfe513c90c4f07a036d92bfe6 (patch) | |
tree | 20cb65a55e78e7e6183117b79dd2efe2a259ba6b /net/base/mime_util.cc | |
parent | 6d9246446121d198c76a0445122757a8dca6709f (diff) | |
download | chromium_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.cc | 71 |
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); } //---------------------------------------------------------------------------- |