Chromium Code Reviews| 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 <map> | 5 #include <map> |
| 6 #include <string> | 6 #include <string> |
| 7 | 7 |
| 8 #include "net/base/mime_util.h" | 8 #include "net/base/mime_util.h" |
| 9 #include "net/base/platform_mime_util.h" | 9 #include "net/base/platform_mime_util.h" |
| 10 | 10 |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 330 // behavior - css files will be displayed: | 330 // behavior - css files will be displayed: |
| 331 "text/css", | 331 "text/css", |
| 332 "text/vnd.chromium.ftp-dir", | 332 "text/vnd.chromium.ftp-dir", |
| 333 "text/", | 333 "text/", |
| 334 "image/svg+xml", // SVG is text-based XML, even though it has an image/ type | 334 "image/svg+xml", // SVG is text-based XML, even though it has an image/ type |
| 335 "application/xml", | 335 "application/xml", |
| 336 "application/atom+xml", | 336 "application/atom+xml", |
| 337 "application/rss+xml", | 337 "application/rss+xml", |
| 338 "application/xhtml+xml", | 338 "application/xhtml+xml", |
| 339 "application/json", | 339 "application/json", |
| 340 "application/x-x509-user-cert", | |
| 341 "multipart/related", // For MHTML support. | 340 "multipart/related", // For MHTML support. |
| 342 "multipart/x-mixed-replace" | 341 "multipart/x-mixed-replace" |
| 343 // Note: ADDING a new type here will probably render it AS HTML. This can | 342 // Note: ADDING a new type here will probably render it AS HTML. This can |
| 344 // result in cross site scripting. | 343 // result in cross site scripting. |
| 345 }; | 344 }; |
| 346 | 345 |
| 346 // Dictionary of cryptographic file mime types. | |
| 347 struct CryptoFileTypeInfo { | |
| 348 const char* mime_type; | |
| 349 CryptoFileType file_type; | |
| 350 }; | |
| 351 | |
| 352 static const CryptoFileTypeInfo supported_crypto_types[] = { | |
| 353 { "application/x-x509-user-cert", CRYPTO_FILE_TYPE_X509_USER_CERT }, | |
| 354 #if defined(OS_ANDROID) | |
| 355 { "application/x-x509-ca-cert", CRYPTO_FILE_TYPE_X509_CA_CERT }, | |
|
Ryan Sleevi
2012/10/24 22:01:25
Does Android not also need to handle application/x
digit1
2012/10/25 13:57:38
I've asked the Android folks responsible for this.
| |
| 356 { "application/x-pkcs12", CRYPTO_FILE_TYPE_PKCS12_KEYCHAIN }, | |
| 357 #endif | |
| 358 }; | |
| 359 | |
| 347 // These types are excluded from the logic that allows all text/ types because | 360 // These types are excluded from the logic that allows all text/ types because |
| 348 // while they are technically text, it's very unlikely that a user expects to | 361 // while they are technically text, it's very unlikely that a user expects to |
| 349 // see them rendered in text form. | 362 // see them rendered in text form. |
| 350 static const char* const unsupported_text_types[] = { | 363 static const char* const unsupported_text_types[] = { |
| 351 "text/calendar", | 364 "text/calendar", |
| 352 "text/x-calendar", | 365 "text/x-calendar", |
| 353 "text/x-vcalendar", | 366 "text/x-vcalendar", |
| 354 "text/vcalendar", | 367 "text/vcalendar", |
| 355 "text/vcard", | 368 "text/vcard", |
| 356 "text/x-vcard", | 369 "text/x-vcard", |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 424 return !codecs.empty(); | 437 return !codecs.empty(); |
| 425 } | 438 } |
| 426 | 439 |
| 427 void MimeUtil::InitializeMimeTypeMaps() { | 440 void MimeUtil::InitializeMimeTypeMaps() { |
| 428 for (size_t i = 0; i < arraysize(supported_image_types); ++i) | 441 for (size_t i = 0; i < arraysize(supported_image_types); ++i) |
| 429 image_map_.insert(supported_image_types[i]); | 442 image_map_.insert(supported_image_types[i]); |
| 430 | 443 |
| 431 // Initialize the supported non-image types. | 444 // Initialize the supported non-image types. |
| 432 for (size_t i = 0; i < arraysize(supported_non_image_types); ++i) | 445 for (size_t i = 0; i < arraysize(supported_non_image_types); ++i) |
| 433 non_image_map_.insert(supported_non_image_types[i]); | 446 non_image_map_.insert(supported_non_image_types[i]); |
| 447 for (size_t i = 0; i < arraysize(supported_crypto_types); ++i) | |
| 448 non_image_map_.insert(supported_crypto_types[i].mime_type); | |
| 434 for (size_t i = 0; i < arraysize(unsupported_text_types); ++i) | 449 for (size_t i = 0; i < arraysize(unsupported_text_types); ++i) |
| 435 unsupported_text_map_.insert(unsupported_text_types[i]); | 450 unsupported_text_map_.insert(unsupported_text_types[i]); |
| 436 for (size_t i = 0; i < arraysize(supported_javascript_types); ++i) | 451 for (size_t i = 0; i < arraysize(supported_javascript_types); ++i) |
| 437 non_image_map_.insert(supported_javascript_types[i]); | 452 non_image_map_.insert(supported_javascript_types[i]); |
| 438 for (size_t i = 0; i < arraysize(common_media_types); ++i) | 453 for (size_t i = 0; i < arraysize(common_media_types); ++i) |
| 439 non_image_map_.insert(common_media_types[i]); | 454 non_image_map_.insert(common_media_types[i]); |
| 440 #if defined(GOOGLE_CHROME_BUILD) || defined(USE_PROPRIETARY_CODECS) | 455 #if defined(GOOGLE_CHROME_BUILD) || defined(USE_PROPRIETARY_CODECS) |
| 441 for (size_t i = 0; i < arraysize(proprietary_media_types); ++i) | 456 for (size_t i = 0; i < arraysize(proprietary_media_types); ++i) |
| 442 non_image_map_.insert(proprietary_media_types[i]); | 457 non_image_map_.insert(proprietary_media_types[i]); |
| 443 #endif | 458 #endif |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 542 return false; | 557 return false; |
| 543 | 558 |
| 544 if (!right.empty() && | 559 if (!right.empty() && |
| 545 mime_type.rfind(right) != mime_type.length() - right.length()) | 560 mime_type.rfind(right) != mime_type.length() - right.length()) |
| 546 return false; | 561 return false; |
| 547 | 562 |
| 548 return true; | 563 return true; |
| 549 } | 564 } |
| 550 | 565 |
| 551 // See http://www.iana.org/assignments/media-types/index.html | 566 // See http://www.iana.org/assignments/media-types/index.html |
| 552 static const char* legal_top_level_types[] = { | 567 static const char* const legal_top_level_types[] = { |
|
Ryan Sleevi
2012/10/24 22:01:25
unrelated change? (but good change none the less,
digit1
2012/10/25 13:57:38
Sure, I've moved this to https://codereview.chromi
| |
| 553 "application/", | 568 "application/", |
| 554 "audio/", | 569 "audio/", |
| 555 "example/", | 570 "example/", |
| 556 "image/", | 571 "image/", |
| 557 "message/", | 572 "message/", |
| 558 "model/", | 573 "model/", |
| 559 "multipart/", | 574 "multipart/", |
| 560 "text/", | 575 "text/", |
| 561 "video/", | 576 "video/", |
| 562 }; | 577 }; |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 707 void ParseCodecString(const std::string& codecs, | 722 void ParseCodecString(const std::string& codecs, |
| 708 std::vector<std::string>* codecs_out, | 723 std::vector<std::string>* codecs_out, |
| 709 const bool strip) { | 724 const bool strip) { |
| 710 g_mime_util.Get().ParseCodecString(codecs, codecs_out, strip); | 725 g_mime_util.Get().ParseCodecString(codecs, codecs_out, strip); |
| 711 } | 726 } |
| 712 | 727 |
| 713 namespace { | 728 namespace { |
| 714 | 729 |
| 715 // From http://www.w3schools.com/media/media_mimeref.asp and | 730 // From http://www.w3schools.com/media/media_mimeref.asp and |
| 716 // http://plugindoc.mozdev.org/winmime.php | 731 // http://plugindoc.mozdev.org/winmime.php |
| 717 static const char* kStandardImageTypes[] = { | 732 static const char* const kStandardImageTypes[] = { |
| 718 "image/bmp", | 733 "image/bmp", |
| 719 "image/cis-cod", | 734 "image/cis-cod", |
| 720 "image/gif", | 735 "image/gif", |
| 721 "image/ief", | 736 "image/ief", |
| 722 "image/jpeg", | 737 "image/jpeg", |
| 723 "image/webp", | 738 "image/webp", |
| 724 "image/pict", | 739 "image/pict", |
| 725 "image/pipeg", | 740 "image/pipeg", |
| 726 "image/png", | 741 "image/png", |
| 727 "image/svg+xml", | 742 "image/svg+xml", |
| 728 "image/tiff", | 743 "image/tiff", |
| 729 "image/x-cmu-raster", | 744 "image/x-cmu-raster", |
| 730 "image/x-cmx", | 745 "image/x-cmx", |
| 731 "image/x-icon", | 746 "image/x-icon", |
| 732 "image/x-portable-anymap", | 747 "image/x-portable-anymap", |
| 733 "image/x-portable-bitmap", | 748 "image/x-portable-bitmap", |
| 734 "image/x-portable-graymap", | 749 "image/x-portable-graymap", |
| 735 "image/x-portable-pixmap", | 750 "image/x-portable-pixmap", |
| 736 "image/x-rgb", | 751 "image/x-rgb", |
| 737 "image/x-xbitmap", | 752 "image/x-xbitmap", |
| 738 "image/x-xpixmap", | 753 "image/x-xpixmap", |
| 739 "image/x-xwindowdump" | 754 "image/x-xwindowdump" |
| 740 }; | 755 }; |
| 741 static const char* kStandardAudioTypes[] = { | 756 static const char* const kStandardAudioTypes[] = { |
| 742 "audio/aac", | 757 "audio/aac", |
| 743 "audio/aiff", | 758 "audio/aiff", |
| 744 "audio/amr", | 759 "audio/amr", |
| 745 "audio/basic", | 760 "audio/basic", |
| 746 "audio/midi", | 761 "audio/midi", |
| 747 "audio/mp3", | 762 "audio/mp3", |
| 748 "audio/mp4", | 763 "audio/mp4", |
| 749 "audio/mpeg", | 764 "audio/mpeg", |
| 750 "audio/mpeg3", | 765 "audio/mpeg3", |
| 751 "audio/ogg", | 766 "audio/ogg", |
| 752 "audio/vorbis", | 767 "audio/vorbis", |
| 753 "audio/wav", | 768 "audio/wav", |
| 754 "audio/webm", | 769 "audio/webm", |
| 755 "audio/x-m4a", | 770 "audio/x-m4a", |
| 756 "audio/x-ms-wma", | 771 "audio/x-ms-wma", |
| 757 "audio/vnd.rn-realaudio", | 772 "audio/vnd.rn-realaudio", |
| 758 "audio/vnd.wave" | 773 "audio/vnd.wave" |
| 759 }; | 774 }; |
| 760 static const char* kStandardVideoTypes[] = { | 775 static const char* const kStandardVideoTypes[] = { |
| 761 "video/avi", | 776 "video/avi", |
| 762 "video/divx", | 777 "video/divx", |
| 763 "video/flc", | 778 "video/flc", |
| 764 "video/mp4", | 779 "video/mp4", |
| 765 "video/mpeg", | 780 "video/mpeg", |
| 766 "video/ogg", | 781 "video/ogg", |
| 767 "video/quicktime", | 782 "video/quicktime", |
| 768 "video/sd-video", | 783 "video/sd-video", |
| 769 "video/webm", | 784 "video/webm", |
| 770 "video/x-dv", | 785 "video/x-dv", |
| 771 "video/x-m4v", | 786 "video/x-m4v", |
| 772 "video/x-mpeg", | 787 "video/x-mpeg", |
| 773 "video/x-ms-asf", | 788 "video/x-ms-asf", |
| 774 "video/x-ms-wmv" | 789 "video/x-ms-wmv" |
| 775 }; | 790 }; |
| 776 | 791 |
| 777 struct StandardType { | 792 struct StandardType { |
| 778 const char* leading_mime_type; | 793 const char* leading_mime_type; |
| 779 const char** standard_types; | 794 const char* const* standard_types; |
| 780 size_t standard_types_len; | 795 size_t standard_types_len; |
| 781 }; | 796 }; |
| 782 static const StandardType kStandardTypes[] = { | 797 static const StandardType kStandardTypes[] = { |
| 783 { "image/", kStandardImageTypes, arraysize(kStandardImageTypes) }, | 798 { "image/", kStandardImageTypes, arraysize(kStandardImageTypes) }, |
| 784 { "audio/", kStandardAudioTypes, arraysize(kStandardAudioTypes) }, | 799 { "audio/", kStandardAudioTypes, arraysize(kStandardAudioTypes) }, |
| 785 { "video/", kStandardVideoTypes, arraysize(kStandardVideoTypes) }, | 800 { "video/", kStandardVideoTypes, arraysize(kStandardVideoTypes) }, |
| 786 { NULL, NULL, 0 } | 801 { NULL, NULL, 0 } |
| 787 }; | 802 }; |
| 788 | 803 |
| 789 void GetExtensionsFromHardCodedMappings( | 804 void GetExtensionsFromHardCodedMappings( |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 802 FilePath::StringType extension(UTF8ToWide(this_extensions[j])); | 817 FilePath::StringType extension(UTF8ToWide(this_extensions[j])); |
| 803 #else | 818 #else |
| 804 FilePath::StringType extension(this_extensions[j]); | 819 FilePath::StringType extension(this_extensions[j]); |
| 805 #endif | 820 #endif |
| 806 extensions->insert(extension); | 821 extensions->insert(extension); |
| 807 } | 822 } |
| 808 } | 823 } |
| 809 } | 824 } |
| 810 } | 825 } |
| 811 | 826 |
| 812 void GetExtensionsHelper(const char** standard_types, | 827 void GetExtensionsHelper(const char* const* standard_types, |
| 813 size_t standard_types_len, | 828 size_t standard_types_len, |
| 814 const std::string& leading_mime_type, | 829 const std::string& leading_mime_type, |
| 815 base::hash_set<FilePath::StringType>* extensions) { | 830 base::hash_set<FilePath::StringType>* extensions) { |
| 816 for (size_t i = 0; i < standard_types_len; ++i) { | 831 for (size_t i = 0; i < standard_types_len; ++i) { |
| 817 g_mime_util.Get().GetPlatformExtensionsForMimeType(standard_types[i], | 832 g_mime_util.Get().GetPlatformExtensionsForMimeType(standard_types[i], |
| 818 extensions); | 833 extensions); |
| 819 } | 834 } |
| 820 | 835 |
| 821 // Also look up the extensions from hard-coded mappings in case that some | 836 // Also look up the extensions from hard-coded mappings in case that some |
| 822 // supported extensions are not registered in the system registry, like ogg. | 837 // supported extensions are not registered in the system registry, like ogg. |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 915 | 930 |
| 916 const std::string GetIANAMediaType(const std::string& mime_type) { | 931 const std::string GetIANAMediaType(const std::string& mime_type) { |
| 917 for (size_t i = 0; i < arraysize(kIanaMediaTypes); ++i) { | 932 for (size_t i = 0; i < arraysize(kIanaMediaTypes); ++i) { |
| 918 if (StartsWithASCII(mime_type, kIanaMediaTypes[i].matcher, true)) { | 933 if (StartsWithASCII(mime_type, kIanaMediaTypes[i].matcher, true)) { |
| 919 return kIanaMediaTypes[i].name; | 934 return kIanaMediaTypes[i].name; |
| 920 } | 935 } |
| 921 } | 936 } |
| 922 return ""; | 937 return ""; |
| 923 } | 938 } |
| 924 | 939 |
| 940 CryptoFileType GetCryptoFileTypeForMimeType( | |
| 941 const std::string& mime_type) { | |
| 942 // Don't create a map, there is only one entry in the table, | |
| 943 // except on Android. | |
| 944 for (size_t i = 0; i < arraysize(supported_crypto_types); ++i) { | |
| 945 if (mime_type == net::supported_crypto_types[i].mime_type) | |
| 946 return net::supported_crypto_types[i].file_type; | |
| 947 } | |
| 948 return CRYPTO_FILE_TYPE_UNKNOWN; | |
| 949 } | |
| 950 | |
| 951 bool IsSupportedCryptoMimeType(const std::string& mime_type) { | |
| 952 CryptoFileType file_type = GetCryptoFileTypeForMimeType(mime_type); | |
| 953 return file_type != CRYPTO_FILE_TYPE_UNKNOWN; | |
| 954 } | |
| 955 | |
| 925 } // namespace net | 956 } // namespace net |
| OLD | NEW |