| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <algorithm> | 5 #include <algorithm> |
| 6 #include <iterator> | 6 #include <iterator> |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 bool* is_ambiguous) const; | 135 bool* is_ambiguous) const; |
| 136 | 136 |
| 137 // Returns true if |codec| is supported by the platform. | 137 // Returns true if |codec| is supported by the platform. |
| 138 // Note: This method will return false if the platform supports proprietary | 138 // Note: This method will return false if the platform supports proprietary |
| 139 // codecs but |allow_proprietary_codecs_| is set to false. | 139 // codecs but |allow_proprietary_codecs_| is set to false. |
| 140 bool IsCodecSupported(Codec codec) const; | 140 bool IsCodecSupported(Codec codec) const; |
| 141 | 141 |
| 142 // Returns true if |codec| refers to a proprietary codec. | 142 // Returns true if |codec| refers to a proprietary codec. |
| 143 bool IsCodecProprietary(Codec codec) const; | 143 bool IsCodecProprietary(Codec codec) const; |
| 144 | 144 |
| 145 // Returns true and sets |*default_codec| if |mime_type| has a | 145 // Returns true and sets |*default_codec| if |mime_type| has a default codec |
| 146 // default codec associated with it. | 146 // associated with it. Returns false otherwise and the value of |
| 147 // Returns false otherwise and the value of |*default_codec| is undefined. | 147 // |*default_codec| is undefined. |
| 148 bool GetDefaultCodec(const std::string& mime_type, | 148 bool GetDefaultCodecLowerCase(const std::string& mime_type_lower_case, |
| 149 Codec* default_codec) const; | 149 Codec* default_codec) const; |
| 150 | 150 |
| 151 // Returns true if |mime_type| has a default codec associated with it | 151 // Returns true if |mime_type_lower_case| has a default codec associated with |
| 152 // and IsCodecSupported() returns true for that particular codec. | 152 // it and IsCodecSupported() returns true for that particular codec. |
| 153 bool IsDefaultCodecSupported(const std::string& mime_type) const; | 153 bool IsDefaultCodecSupportedLowerCase( |
| 154 const std::string& mime_type_lower_case) const; |
| 154 | 155 |
| 155 MimeMappings image_map_; | 156 MimeMappings image_map_; |
| 156 MimeMappings media_map_; | 157 MimeMappings media_map_; |
| 157 MimeMappings non_image_map_; | 158 MimeMappings non_image_map_; |
| 158 MimeMappings unsupported_text_map_; | 159 MimeMappings unsupported_text_map_; |
| 159 MimeMappings javascript_map_; | 160 MimeMappings javascript_map_; |
| 160 | 161 |
| 161 // A map of mime_types and hash map of the supported codecs for the mime_type. | 162 // A map of mime_types and hash map of the supported codecs for the mime_type. |
| 162 StrictMappings strict_format_map_; | 163 StrictMappings strict_format_map_; |
| 163 | 164 |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 case MimeUtil::MPEG2_AAC_MAIN: | 470 case MimeUtil::MPEG2_AAC_MAIN: |
| 470 case MimeUtil::MPEG2_AAC_SSR: | 471 case MimeUtil::MPEG2_AAC_SSR: |
| 471 // MPEG-2 variants of AAC are not supported on Android. | 472 // MPEG-2 variants of AAC are not supported on Android. |
| 472 return false; | 473 return false; |
| 473 | 474 |
| 474 case MimeUtil::VP9: | 475 case MimeUtil::VP9: |
| 475 // VP9 is supported only in KitKat+ (API Level 19). | 476 // VP9 is supported only in KitKat+ (API Level 19). |
| 476 return base::android::BuildInfo::GetInstance()->sdk_int() >= 19; | 477 return base::android::BuildInfo::GetInstance()->sdk_int() >= 19; |
| 477 | 478 |
| 478 case MimeUtil::OPUS: | 479 case MimeUtil::OPUS: |
| 479 // TODO(vigneshv): Change this similar to the VP9 check once Opus is | 480 // Opus is supported only in Lollipop+ (API Level 21). |
| 480 // supported on Android (http://crbug.com/318436). | 481 return base::android::BuildInfo::GetInstance()->sdk_int() >= 21; |
| 481 return false; | |
| 482 | 482 |
| 483 case MimeUtil::THEORA: | 483 case MimeUtil::THEORA: |
| 484 return false; | 484 return false; |
| 485 } | 485 } |
| 486 | 486 |
| 487 return false; | 487 return false; |
| 488 } | 488 } |
| 489 | 489 |
| 490 static bool IsMimeTypeSupportedOnAndroid(const std::string& mimeType) { | 490 static bool IsMimeTypeSupportedOnAndroid(const std::string& mimeType) { |
| 491 // HLS codecs are supported in ICS and above (API level 14) | 491 // HLS codecs are supported in ICS and above (API level 14) |
| (...skipping 29 matching lines...) Expand all Loading... |
| 521 // avc1.6400xx - H.264 High | 521 // avc1.6400xx - H.264 High |
| 522 static const char kMP4AudioCodecsExpression[] = | 522 static const char kMP4AudioCodecsExpression[] = |
| 523 "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.02,mp4a.40.5," | 523 "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.02,mp4a.40.5," |
| 524 "mp4a.40.05,mp4a.40.29"; | 524 "mp4a.40.05,mp4a.40.29"; |
| 525 static const char kMP4VideoCodecsExpression[] = | 525 static const char kMP4VideoCodecsExpression[] = |
| 526 "avc1.42E00A,avc1.4D400A,avc1.64000A," | 526 "avc1.42E00A,avc1.4D400A,avc1.64000A," |
| 527 "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.02,mp4a.40.5," | 527 "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.02,mp4a.40.5," |
| 528 "mp4a.40.05,mp4a.40.29"; | 528 "mp4a.40.05,mp4a.40.29"; |
| 529 | 529 |
| 530 static const MediaFormatStrict format_codec_mappings[] = { | 530 static const MediaFormatStrict format_codec_mappings[] = { |
| 531 { "video/webm", "opus,vorbis,vp8,vp8.0,vp9,vp9.0" }, | 531 {"video/webm", "opus,vorbis,vp8,vp8.0,vp9,vp9.0"}, |
| 532 { "audio/webm", "opus,vorbis" }, | 532 {"audio/webm", "opus,vorbis"}, |
| 533 { "audio/wav", "1" }, | 533 {"audio/wav", "1"}, |
| 534 { "audio/x-wav", "1" }, | 534 {"audio/x-wav", "1"}, |
| 535 { "video/ogg", "opus,theora,vorbis" }, | 535 // Android does not support Opus in Ogg container. |
| 536 { "audio/ogg", "opus,vorbis" }, | 536 #if defined(OS_ANDROID) |
| 537 { "application/ogg", "opus,theora,vorbis" }, | 537 {"video/ogg", "theora,vorbis"}, |
| 538 { "audio/mpeg", "mp3" }, | 538 {"audio/ogg", "vorbis"}, |
| 539 { "audio/mp3", "" }, | 539 {"application/ogg", "theora,vorbis"}, |
| 540 { "audio/x-mp3", "" }, | 540 #else |
| 541 { "audio/mp4", kMP4AudioCodecsExpression }, | 541 {"video/ogg", "opus,theora,vorbis"}, |
| 542 { "audio/x-m4a", kMP4AudioCodecsExpression }, | 542 {"audio/ogg", "opus,vorbis"}, |
| 543 { "video/mp4", kMP4VideoCodecsExpression }, | 543 {"application/ogg", "opus,theora,vorbis"}, |
| 544 { "video/x-m4v", kMP4VideoCodecsExpression }, | 544 #endif |
| 545 { "application/x-mpegurl", kMP4VideoCodecsExpression }, | 545 {"audio/mpeg", "mp3"}, |
| 546 { "application/vnd.apple.mpegurl", kMP4VideoCodecsExpression } | 546 {"audio/mp3", ""}, |
| 547 }; | 547 {"audio/x-mp3", ""}, |
| 548 {"audio/mp4", kMP4AudioCodecsExpression}, |
| 549 {"audio/x-m4a", kMP4AudioCodecsExpression}, |
| 550 {"video/mp4", kMP4VideoCodecsExpression}, |
| 551 {"video/x-m4v", kMP4VideoCodecsExpression}, |
| 552 {"application/x-mpegurl", kMP4VideoCodecsExpression}, |
| 553 {"application/vnd.apple.mpegurl", kMP4VideoCodecsExpression}}; |
| 548 | 554 |
| 549 struct CodecIDMappings { | 555 struct CodecIDMappings { |
| 550 const char* const codec_id; | 556 const char* const codec_id; |
| 551 MimeUtil::Codec codec; | 557 MimeUtil::Codec codec; |
| 552 }; | 558 }; |
| 553 | 559 |
| 554 // List of codec IDs that provide enough information to determine the | 560 // List of codec IDs that provide enough information to determine the |
| 555 // codec and profile being requested. | 561 // codec and profile being requested. |
| 556 // | 562 // |
| 557 // The "mp4a" strings come from RFC 6381. | 563 // The "mp4a" strings come from RFC 6381. |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 682 CHECK(StringToCodec(mime_type_codecs[j], &codec, &is_ambiguous)); | 688 CHECK(StringToCodec(mime_type_codecs[j], &codec, &is_ambiguous)); |
| 683 DCHECK(!is_ambiguous); | 689 DCHECK(!is_ambiguous); |
| 684 codecs.insert(codec); | 690 codecs.insert(codec); |
| 685 } | 691 } |
| 686 | 692 |
| 687 strict_format_map_[format_codec_mappings[i].mime_type] = codecs; | 693 strict_format_map_[format_codec_mappings[i].mime_type] = codecs; |
| 688 } | 694 } |
| 689 } | 695 } |
| 690 | 696 |
| 691 bool MimeUtil::IsSupportedImageMimeType(const std::string& mime_type) const { | 697 bool MimeUtil::IsSupportedImageMimeType(const std::string& mime_type) const { |
| 692 return image_map_.find(mime_type) != image_map_.end(); | 698 return image_map_.find(base::StringToLowerASCII(mime_type)) != |
| 699 image_map_.end(); |
| 693 } | 700 } |
| 694 | 701 |
| 695 bool MimeUtil::IsSupportedMediaMimeType(const std::string& mime_type) const { | 702 bool MimeUtil::IsSupportedMediaMimeType(const std::string& mime_type) const { |
| 696 return media_map_.find(mime_type) != media_map_.end(); | 703 return media_map_.find(base::StringToLowerASCII(mime_type)) != |
| 704 media_map_.end(); |
| 697 } | 705 } |
| 698 | 706 |
| 699 bool MimeUtil::IsSupportedNonImageMimeType(const std::string& mime_type) const { | 707 bool MimeUtil::IsSupportedNonImageMimeType(const std::string& mime_type) const { |
| 700 return non_image_map_.find(mime_type) != non_image_map_.end() || | 708 return non_image_map_.find(base::StringToLowerASCII(mime_type)) != |
| 701 (mime_type.compare(0, 5, "text/") == 0 && | 709 non_image_map_.end() || |
| 702 !IsUnsupportedTextMimeType(mime_type)) || | 710 (StartsWithASCII(mime_type, "text/", false /* case insensitive */) && |
| 703 (mime_type.compare(0, 12, "application/") == 0 && | 711 !IsUnsupportedTextMimeType(mime_type)) || |
| 704 MatchesMimeType("application/*+json", mime_type)); | 712 (StartsWithASCII(mime_type, "application/", false) && |
| 713 MatchesMimeType("application/*+json", mime_type)); |
| 705 } | 714 } |
| 706 | 715 |
| 707 bool MimeUtil::IsUnsupportedTextMimeType(const std::string& mime_type) const { | 716 bool MimeUtil::IsUnsupportedTextMimeType(const std::string& mime_type) const { |
| 708 return unsupported_text_map_.find(mime_type) != unsupported_text_map_.end(); | 717 return unsupported_text_map_.find(base::StringToLowerASCII(mime_type)) != |
| 718 unsupported_text_map_.end(); |
| 709 } | 719 } |
| 710 | 720 |
| 711 bool MimeUtil::IsSupportedJavascriptMimeType( | 721 bool MimeUtil::IsSupportedJavascriptMimeType( |
| 712 const std::string& mime_type) const { | 722 const std::string& mime_type) const { |
| 713 return javascript_map_.find(mime_type) != javascript_map_.end(); | 723 return javascript_map_.find(mime_type) != javascript_map_.end(); |
| 714 } | 724 } |
| 715 | 725 |
| 716 // Mirrors WebViewImpl::CanShowMIMEType() | 726 // Mirrors WebViewImpl::CanShowMIMEType() |
| 717 bool MimeUtil::IsSupportedMimeType(const std::string& mime_type) const { | 727 bool MimeUtil::IsSupportedMimeType(const std::string& mime_type) const { |
| 718 return (mime_type.compare(0, 6, "image/") == 0 && | 728 return (StartsWithASCII(mime_type, "image/", false) && |
| 719 IsSupportedImageMimeType(mime_type)) || | 729 IsSupportedImageMimeType(mime_type)) || |
| 720 IsSupportedNonImageMimeType(mime_type); | 730 IsSupportedNonImageMimeType(mime_type); |
| 721 } | 731 } |
| 722 | 732 |
| 723 // Tests for MIME parameter equality. Each parameter in the |mime_type_pattern| | 733 // Tests for MIME parameter equality. Each parameter in the |mime_type_pattern| |
| 724 // must be matched by a parameter in the |mime_type|. If there are no | 734 // must be matched by a parameter in the |mime_type|. If there are no |
| 725 // parameters in the pattern, the match is a success. | 735 // parameters in the pattern, the match is a success. |
| 736 // |
| 737 // According rfc2045 keys of parameters are case-insensitive, while values may |
| 738 // or may not be case-sensitive, but they are usually case-sensitive. So, this |
| 739 // function matches values in *case-sensitive* manner, however note that this |
| 740 // may produce some false negatives. |
| 726 bool MatchesMimeTypeParameters(const std::string& mime_type_pattern, | 741 bool MatchesMimeTypeParameters(const std::string& mime_type_pattern, |
| 727 const std::string& mime_type) { | 742 const std::string& mime_type) { |
| 743 typedef std::map<std::string, std::string> StringPairMap; |
| 744 |
| 728 const std::string::size_type semicolon = mime_type_pattern.find(';'); | 745 const std::string::size_type semicolon = mime_type_pattern.find(';'); |
| 729 const std::string::size_type test_semicolon = mime_type.find(';'); | 746 const std::string::size_type test_semicolon = mime_type.find(';'); |
| 730 if (semicolon != std::string::npos) { | 747 if (semicolon != std::string::npos) { |
| 731 if (test_semicolon == std::string::npos) | 748 if (test_semicolon == std::string::npos) |
| 732 return false; | 749 return false; |
| 733 | 750 |
| 734 std::vector<std::string> pattern_parameters; | 751 base::StringPairs pattern_parameters; |
| 735 base::SplitString(mime_type_pattern.substr(semicolon + 1), | 752 base::SplitStringIntoKeyValuePairs(mime_type_pattern.substr(semicolon + 1), |
| 736 ';', &pattern_parameters); | 753 '=', ';', &pattern_parameters); |
| 754 base::StringPairs test_parameters; |
| 755 base::SplitStringIntoKeyValuePairs(mime_type.substr(test_semicolon + 1), |
| 756 '=', ';', &test_parameters); |
| 737 | 757 |
| 738 std::vector<std::string> test_parameters; | 758 // Put the parameters to maps with the keys converted to lower case. |
| 739 base::SplitString(mime_type.substr(test_semicolon + 1), | 759 StringPairMap pattern_parameter_map; |
| 740 ';', &test_parameters); | 760 for (const auto& pair : pattern_parameters) { |
| 761 pattern_parameter_map[base::StringToLowerASCII(pair.first)] = pair.second; |
| 762 } |
| 741 | 763 |
| 742 sort(pattern_parameters.begin(), pattern_parameters.end()); | 764 StringPairMap test_parameter_map; |
| 743 sort(test_parameters.begin(), test_parameters.end()); | 765 for (const auto& pair : test_parameters) { |
| 744 std::vector<std::string> difference = | 766 test_parameter_map[base::StringToLowerASCII(pair.first)] = pair.second; |
| 745 base::STLSetDifference<std::vector<std::string> >(pattern_parameters, | 767 } |
| 746 test_parameters); | 768 |
| 747 return difference.size() == 0; | 769 if (pattern_parameter_map.size() > test_parameter_map.size()) |
| 770 return false; |
| 771 |
| 772 for (const auto& parameter_pair : pattern_parameter_map) { |
| 773 const auto& test_parameter_pair_it = |
| 774 test_parameter_map.find(parameter_pair.first); |
| 775 if (test_parameter_pair_it == test_parameter_map.end()) |
| 776 return false; |
| 777 if (parameter_pair.second != test_parameter_pair_it->second) |
| 778 return false; |
| 779 } |
| 748 } | 780 } |
| 781 |
| 749 return true; | 782 return true; |
| 750 } | 783 } |
| 751 | 784 |
| 752 // This comparison handles absolute maching and also basic | 785 // This comparison handles absolute maching and also basic |
| 753 // wildcards. The plugin mime types could be: | 786 // wildcards. The plugin mime types could be: |
| 754 // application/x-foo | 787 // application/x-foo |
| 755 // application/* | 788 // application/* |
| 756 // application/*+xml | 789 // application/*+xml |
| 757 // * | 790 // * |
| 758 // Also tests mime parameters -- all parameters in the pattern must be present | 791 // Also tests mime parameters -- all parameters in the pattern must be present |
| 759 // in the tested type for a match to succeed. | 792 // in the tested type for a match to succeed. |
| 760 bool MimeUtil::MatchesMimeType(const std::string& mime_type_pattern, | 793 bool MimeUtil::MatchesMimeType(const std::string& mime_type_pattern, |
| 761 const std::string& mime_type) const { | 794 const std::string& mime_type) const { |
| 762 // Verify caller is passing lowercase strings. | |
| 763 DCHECK_EQ(base::StringToLowerASCII(mime_type_pattern), mime_type_pattern); | |
| 764 DCHECK_EQ(base::StringToLowerASCII(mime_type), mime_type); | |
| 765 | |
| 766 if (mime_type_pattern.empty()) | 795 if (mime_type_pattern.empty()) |
| 767 return false; | 796 return false; |
| 768 | 797 |
| 769 std::string::size_type semicolon = mime_type_pattern.find(';'); | 798 std::string::size_type semicolon = mime_type_pattern.find(';'); |
| 770 const std::string base_pattern(mime_type_pattern.substr(0, semicolon)); | 799 const std::string base_pattern(mime_type_pattern.substr(0, semicolon)); |
| 771 semicolon = mime_type.find(';'); | 800 semicolon = mime_type.find(';'); |
| 772 const std::string base_type(mime_type.substr(0, semicolon)); | 801 const std::string base_type(mime_type.substr(0, semicolon)); |
| 773 | 802 |
| 774 if (base_pattern == "*" || base_pattern == "*/*") | 803 if (base_pattern == "*" || base_pattern == "*/*") |
| 775 return MatchesMimeTypeParameters(mime_type_pattern, mime_type); | 804 return MatchesMimeTypeParameters(mime_type_pattern, mime_type); |
| 776 | 805 |
| 777 const std::string::size_type star = base_pattern.find('*'); | 806 const std::string::size_type star = base_pattern.find('*'); |
| 778 if (star == std::string::npos) { | 807 if (star == std::string::npos) { |
| 779 if (base_pattern == base_type) | 808 if (base_pattern.size() == base_type.size() && |
| 809 base::strncasecmp(base_pattern.c_str(), base_type.c_str(), |
| 810 base_pattern.size()) == 0) { |
| 780 return MatchesMimeTypeParameters(mime_type_pattern, mime_type); | 811 return MatchesMimeTypeParameters(mime_type_pattern, mime_type); |
| 781 else | 812 } else { |
| 782 return false; | 813 return false; |
| 814 } |
| 783 } | 815 } |
| 784 | 816 |
| 785 // Test length to prevent overlap between |left| and |right|. | 817 // Test length to prevent overlap between |left| and |right|. |
| 786 if (base_type.length() < base_pattern.length() - 1) | 818 if (base_type.length() < base_pattern.length() - 1) |
| 787 return false; | 819 return false; |
| 788 | 820 |
| 789 const std::string left(base_pattern.substr(0, star)); | 821 const std::string left(base_pattern.substr(0, star)); |
| 790 const std::string right(base_pattern.substr(star + 1)); | 822 const std::string right(base_pattern.substr(star + 1)); |
| 791 | 823 |
| 792 if (base_type.find(left) != 0) | 824 if (!StartsWithASCII(base_type, left, false)) |
| 793 return false; | 825 return false; |
| 794 | 826 |
| 795 if (!right.empty() && | 827 if (!right.empty() && !EndsWith(base_type, right, false)) |
| 796 base_type.rfind(right) != base_type.length() - right.length()) | |
| 797 return false; | 828 return false; |
| 798 | 829 |
| 799 return MatchesMimeTypeParameters(mime_type_pattern, mime_type); | 830 return MatchesMimeTypeParameters(mime_type_pattern, mime_type); |
| 800 } | 831 } |
| 801 | 832 |
| 802 // See http://www.iana.org/assignments/media-types/media-types.xhtml | 833 // See http://www.iana.org/assignments/media-types/media-types.xhtml |
| 803 static const char* const legal_top_level_types[] = { | 834 static const char* const legal_top_level_types[] = { |
| 804 "application", | 835 "application", |
| 805 "audio", | 836 "audio", |
| 806 "example", | 837 "example", |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 867 for (std::vector<std::string>::iterator it = codecs_out->begin(); | 898 for (std::vector<std::string>::iterator it = codecs_out->begin(); |
| 868 it != codecs_out->end(); | 899 it != codecs_out->end(); |
| 869 ++it) { | 900 ++it) { |
| 870 size_t found = it->find_first_of('.'); | 901 size_t found = it->find_first_of('.'); |
| 871 if (found != std::string::npos) | 902 if (found != std::string::npos) |
| 872 it->resize(found); | 903 it->resize(found); |
| 873 } | 904 } |
| 874 } | 905 } |
| 875 | 906 |
| 876 bool MimeUtil::IsStrictMediaMimeType(const std::string& mime_type) const { | 907 bool MimeUtil::IsStrictMediaMimeType(const std::string& mime_type) const { |
| 877 return strict_format_map_.find(mime_type) != strict_format_map_.end(); | 908 return strict_format_map_.find(base::StringToLowerASCII(mime_type)) != |
| 909 strict_format_map_.end(); |
| 878 } | 910 } |
| 879 | 911 |
| 880 SupportsType MimeUtil::IsSupportedStrictMediaMimeType( | 912 SupportsType MimeUtil::IsSupportedStrictMediaMimeType( |
| 881 const std::string& mime_type, | 913 const std::string& mime_type, |
| 882 const std::vector<std::string>& codecs) const { | 914 const std::vector<std::string>& codecs) const { |
| 915 const std::string mime_type_lower_case = base::StringToLowerASCII(mime_type); |
| 883 StrictMappings::const_iterator it_strict_map = | 916 StrictMappings::const_iterator it_strict_map = |
| 884 strict_format_map_.find(mime_type); | 917 strict_format_map_.find(mime_type_lower_case); |
| 885 if (it_strict_map == strict_format_map_.end()) | 918 if (it_strict_map == strict_format_map_.end()) |
| 886 return codecs.empty() ? MayBeSupported : IsNotSupported; | 919 return codecs.empty() ? MayBeSupported : IsNotSupported; |
| 887 | 920 |
| 888 if (it_strict_map->second.empty()) { | 921 if (it_strict_map->second.empty()) { |
| 889 // We get here if the mimetype does not expect a codecs parameter. | 922 // We get here if the mimetype does not expect a codecs parameter. |
| 890 return (codecs.empty() && IsDefaultCodecSupported(mime_type)) ? | 923 return (codecs.empty() && |
| 891 IsSupported : IsNotSupported; | 924 IsDefaultCodecSupportedLowerCase(mime_type_lower_case)) |
| 925 ? IsSupported |
| 926 : IsNotSupported; |
| 892 } | 927 } |
| 893 | 928 |
| 894 if (codecs.empty()) { | 929 if (codecs.empty()) { |
| 895 // We get here if the mimetype expects to get a codecs parameter, | 930 // We get here if the mimetype expects to get a codecs parameter, |
| 896 // but didn't get one. If |mime_type| does not have a default codec | 931 // but didn't get one. If |mime_type_lower_case| does not have a default |
| 897 // the best we can do is say "maybe" because we don't have enough | 932 // codec the best we can do is say "maybe" because we don't have enough |
| 898 // information. | 933 // information. |
| 899 Codec default_codec = INVALID_CODEC; | 934 Codec default_codec = INVALID_CODEC; |
| 900 if (!GetDefaultCodec(mime_type, &default_codec)) | 935 if (!GetDefaultCodecLowerCase(mime_type_lower_case, &default_codec)) |
| 901 return MayBeSupported; | 936 return MayBeSupported; |
| 902 | 937 |
| 903 return IsCodecSupported(default_codec) ? IsSupported : IsNotSupported; | 938 return IsCodecSupported(default_codec) ? IsSupported : IsNotSupported; |
| 904 } | 939 } |
| 905 | 940 |
| 906 return AreSupportedCodecs(it_strict_map->second, codecs); | 941 return AreSupportedCodecs(it_strict_map->second, codecs); |
| 907 } | 942 } |
| 908 | 943 |
| 909 void MimeUtil::RemoveProprietaryMediaTypesAndCodecsForTests() { | 944 void MimeUtil::RemoveProprietaryMediaTypesAndCodecsForTests() { |
| 910 for (size_t i = 0; i < arraysize(proprietary_media_types); ++i) { | 945 for (size_t i = 0; i < arraysize(proprietary_media_types); ++i) { |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1046 case OPUS: | 1081 case OPUS: |
| 1047 case VP8: | 1082 case VP8: |
| 1048 case VP9: | 1083 case VP9: |
| 1049 case THEORA: | 1084 case THEORA: |
| 1050 return false; | 1085 return false; |
| 1051 } | 1086 } |
| 1052 | 1087 |
| 1053 return true; | 1088 return true; |
| 1054 } | 1089 } |
| 1055 | 1090 |
| 1056 bool MimeUtil::GetDefaultCodec(const std::string& mime_type, | 1091 bool MimeUtil::GetDefaultCodecLowerCase(const std::string& mime_type_lower_case, |
| 1057 Codec* default_codec) const { | 1092 Codec* default_codec) const { |
| 1058 if (mime_type == "audio/mpeg" || | 1093 if (mime_type_lower_case == "audio/mpeg" || |
| 1059 mime_type == "audio/mp3" || | 1094 mime_type_lower_case == "audio/mp3" || |
| 1060 mime_type == "audio/x-mp3") { | 1095 mime_type_lower_case == "audio/x-mp3") { |
| 1061 *default_codec = MimeUtil::MP3; | 1096 *default_codec = MimeUtil::MP3; |
| 1062 return true; | 1097 return true; |
| 1063 } | 1098 } |
| 1064 | 1099 |
| 1065 return false; | 1100 return false; |
| 1066 } | 1101 } |
| 1067 | 1102 |
| 1068 | 1103 bool MimeUtil::IsDefaultCodecSupportedLowerCase( |
| 1069 bool MimeUtil::IsDefaultCodecSupported(const std::string& mime_type) const { | 1104 const std::string& mime_type_lower_case) const { |
| 1070 Codec default_codec = Codec::INVALID_CODEC; | 1105 Codec default_codec = Codec::INVALID_CODEC; |
| 1071 if (!GetDefaultCodec(mime_type, &default_codec)) | 1106 if (!GetDefaultCodecLowerCase(mime_type_lower_case, &default_codec)) |
| 1072 return false; | 1107 return false; |
| 1073 return IsCodecSupported(default_codec); | 1108 return IsCodecSupported(default_codec); |
| 1074 } | 1109 } |
| 1075 | 1110 |
| 1076 //---------------------------------------------------------------------------- | 1111 //---------------------------------------------------------------------------- |
| 1077 // Wrappers for the singleton | 1112 // Wrappers for the singleton |
| 1078 //---------------------------------------------------------------------------- | 1113 //---------------------------------------------------------------------------- |
| 1079 | 1114 |
| 1080 bool GetMimeTypeFromExtension(const base::FilePath::StringType& ext, | 1115 bool GetMimeTypeFromExtension(const base::FilePath::StringType& ext, |
| 1081 std::string* mime_type) { | 1116 std::string* mime_type) { |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1285 // vector. | 1320 // vector. |
| 1286 template<class T> | 1321 template<class T> |
| 1287 void HashSetToVector(base::hash_set<T>* source, std::vector<T>* target) { | 1322 void HashSetToVector(base::hash_set<T>* source, std::vector<T>* target) { |
| 1288 size_t old_target_size = target->size(); | 1323 size_t old_target_size = target->size(); |
| 1289 target->resize(old_target_size + source->size()); | 1324 target->resize(old_target_size + source->size()); |
| 1290 size_t i = 0; | 1325 size_t i = 0; |
| 1291 for (typename base::hash_set<T>::iterator iter = source->begin(); | 1326 for (typename base::hash_set<T>::iterator iter = source->begin(); |
| 1292 iter != source->end(); ++iter, ++i) | 1327 iter != source->end(); ++iter, ++i) |
| 1293 (*target)[old_target_size + i] = *iter; | 1328 (*target)[old_target_size + i] = *iter; |
| 1294 } | 1329 } |
| 1295 } | 1330 |
| 1331 } // namespace |
| 1296 | 1332 |
| 1297 void GetExtensionsForMimeType( | 1333 void GetExtensionsForMimeType( |
| 1298 const std::string& unsafe_mime_type, | 1334 const std::string& unsafe_mime_type, |
| 1299 std::vector<base::FilePath::StringType>* extensions) { | 1335 std::vector<base::FilePath::StringType>* extensions) { |
| 1300 if (unsafe_mime_type == "*/*" || unsafe_mime_type == "*") | 1336 if (unsafe_mime_type == "*/*" || unsafe_mime_type == "*") |
| 1301 return; | 1337 return; |
| 1302 | 1338 |
| 1303 const std::string mime_type = base::StringToLowerASCII(unsafe_mime_type); | 1339 const std::string mime_type = base::StringToLowerASCII(unsafe_mime_type); |
| 1304 base::hash_set<base::FilePath::StringType> unique_extensions; | 1340 base::hash_set<base::FilePath::StringType> unique_extensions; |
| 1305 | 1341 |
| 1306 if (EndsWith(mime_type, "/*", true)) { | 1342 if (EndsWith(mime_type, "/*", false)) { |
| 1307 std::string leading_mime_type = mime_type.substr(0, mime_type.length() - 1); | 1343 std::string leading_mime_type = mime_type.substr(0, mime_type.length() - 1); |
| 1308 | 1344 |
| 1309 // Find the matching StandardType from within kStandardTypes, or fall | 1345 // Find the matching StandardType from within kStandardTypes, or fall |
| 1310 // through to the last (default) StandardType. | 1346 // through to the last (default) StandardType. |
| 1311 const StandardType* type = NULL; | 1347 const StandardType* type = NULL; |
| 1312 for (size_t i = 0; i < arraysize(kStandardTypes); ++i) { | 1348 for (size_t i = 0; i < arraysize(kStandardTypes); ++i) { |
| 1313 type = &(kStandardTypes[i]); | 1349 type = &(kStandardTypes[i]); |
| 1314 if (type->leading_mime_type && | 1350 if (type->leading_mime_type && |
| 1315 leading_mime_type == type->leading_mime_type) | 1351 leading_mime_type == type->leading_mime_type) |
| 1316 break; | 1352 break; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1342 | 1378 |
| 1343 void RemoveProprietaryMediaTypesAndCodecsForTests() { | 1379 void RemoveProprietaryMediaTypesAndCodecsForTests() { |
| 1344 g_mime_util.Get().RemoveProprietaryMediaTypesAndCodecsForTests(); | 1380 g_mime_util.Get().RemoveProprietaryMediaTypesAndCodecsForTests(); |
| 1345 } | 1381 } |
| 1346 | 1382 |
| 1347 CertificateMimeType GetCertificateMimeTypeForMimeType( | 1383 CertificateMimeType GetCertificateMimeTypeForMimeType( |
| 1348 const std::string& mime_type) { | 1384 const std::string& mime_type) { |
| 1349 // Don't create a map, there is only one entry in the table, | 1385 // Don't create a map, there is only one entry in the table, |
| 1350 // except on Android. | 1386 // except on Android. |
| 1351 for (size_t i = 0; i < arraysize(supported_certificate_types); ++i) { | 1387 for (size_t i = 0; i < arraysize(supported_certificate_types); ++i) { |
| 1352 if (mime_type == net::supported_certificate_types[i].mime_type) | 1388 if (base::strcasecmp(mime_type.c_str(), |
| 1389 net::supported_certificate_types[i].mime_type) == 0) { |
| 1353 return net::supported_certificate_types[i].cert_type; | 1390 return net::supported_certificate_types[i].cert_type; |
| 1391 } |
| 1354 } | 1392 } |
| 1355 return CERTIFICATE_MIME_TYPE_UNKNOWN; | 1393 return CERTIFICATE_MIME_TYPE_UNKNOWN; |
| 1356 } | 1394 } |
| 1357 | 1395 |
| 1358 bool IsSupportedCertificateMimeType(const std::string& mime_type) { | 1396 bool IsSupportedCertificateMimeType(const std::string& mime_type) { |
| 1359 CertificateMimeType file_type = | 1397 CertificateMimeType file_type = |
| 1360 GetCertificateMimeTypeForMimeType(mime_type); | 1398 GetCertificateMimeTypeForMimeType(mime_type); |
| 1361 return file_type != CERTIFICATE_MIME_TYPE_UNKNOWN; | 1399 return file_type != CERTIFICATE_MIME_TYPE_UNKNOWN; |
| 1362 } | 1400 } |
| 1363 | 1401 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1380 post_data->append("\r\n" + value + "\r\n"); | 1418 post_data->append("\r\n" + value + "\r\n"); |
| 1381 } | 1419 } |
| 1382 | 1420 |
| 1383 void AddMultipartFinalDelimiterForUpload(const std::string& mime_boundary, | 1421 void AddMultipartFinalDelimiterForUpload(const std::string& mime_boundary, |
| 1384 std::string* post_data) { | 1422 std::string* post_data) { |
| 1385 DCHECK(post_data); | 1423 DCHECK(post_data); |
| 1386 post_data->append("--" + mime_boundary + "--\r\n"); | 1424 post_data->append("--" + mime_boundary + "--\r\n"); |
| 1387 } | 1425 } |
| 1388 | 1426 |
| 1389 } // namespace net | 1427 } // namespace net |
| OLD | NEW |