| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "net/base/platform_mime_util.h" | |
| 6 | |
| 7 #include <string> | |
| 8 | |
| 9 #include "base/logging.h" | |
| 10 #include "build/build_config.h" | |
| 11 | |
| 12 #if defined(OS_ANDROID) | |
| 13 #include "net/android/network_library.h" | |
| 14 #else | |
| 15 #include "base/nix/mime_util_xdg.h" | |
| 16 #endif | |
| 17 | |
| 18 namespace net { | |
| 19 | |
| 20 #if defined(OS_ANDROID) | |
| 21 bool PlatformMimeUtil::GetPlatformMimeTypeFromExtension( | |
| 22 const base::FilePath::StringType& ext, std::string* result) const { | |
| 23 return android::GetMimeTypeFromExtension(ext, result); | |
| 24 } | |
| 25 #else | |
| 26 bool PlatformMimeUtil::GetPlatformMimeTypeFromExtension( | |
| 27 const base::FilePath::StringType& ext, std::string* result) const { | |
| 28 // TODO(thestig): This is a temporary hack until we can fix this | |
| 29 // properly in test shell / webkit. | |
| 30 // We have to play dumb and not return application/x-perl here | |
| 31 // to make the reload-subframe-object layout test happy. | |
| 32 if (ext == "pl") | |
| 33 return false; | |
| 34 | |
| 35 base::FilePath dummy_path("foo." + ext); | |
| 36 std::string out = base::nix::GetFileMimeType(dummy_path); | |
| 37 | |
| 38 // GetFileMimeType likes to return application/octet-stream | |
| 39 // for everything it doesn't know - ignore that. | |
| 40 if (out == "application/octet-stream" || out.empty()) | |
| 41 return false; | |
| 42 | |
| 43 // GetFileMimeType returns image/x-ico because that's what's in the XDG | |
| 44 // mime database. That database is the merger of the Gnome and KDE mime | |
| 45 // databases. Apparently someone working on KDE in 2001 decided .ico | |
| 46 // resolves to image/x-ico, whereas the rest of the world uses image/x-icon. | |
| 47 // FWIW, image/vnd.microsoft.icon is the official IANA assignment. | |
| 48 if (out == "image/x-ico") | |
| 49 out = "image/x-icon"; | |
| 50 | |
| 51 *result = out; | |
| 52 return true; | |
| 53 } | |
| 54 | |
| 55 #endif // defined(OS_ANDROID) | |
| 56 | |
| 57 struct MimeToExt { | |
| 58 const char* mime_type; | |
| 59 const char* ext; | |
| 60 }; | |
| 61 | |
| 62 const struct MimeToExt mime_type_ext_map[] = { | |
| 63 {"application/pdf", "pdf"}, | |
| 64 {"application/x-tar", "tar"}, | |
| 65 {"application/zip", "zip"}, | |
| 66 {"audio/mpeg", "mp3"}, | |
| 67 {"image/gif", "gif"}, | |
| 68 {"image/jpeg", "jpg"}, | |
| 69 {"image/png", "png"}, | |
| 70 {"text/html", "html"}, | |
| 71 {"video/mp4", "mp4"}, | |
| 72 {"video/mpeg", "mpg"}, | |
| 73 {"text/plain", "txt"}, | |
| 74 {"text/x-sh", "sh"}, | |
| 75 }; | |
| 76 | |
| 77 bool PlatformMimeUtil::GetPreferredExtensionForMimeType( | |
| 78 const std::string& mime_type, base::FilePath::StringType* ext) const { | |
| 79 | |
| 80 for (size_t x = 0; | |
| 81 x < (sizeof(mime_type_ext_map) / sizeof(MimeToExt)); | |
| 82 x++) { | |
| 83 if (mime_type_ext_map[x].mime_type == mime_type) { | |
| 84 *ext = mime_type_ext_map[x].ext; | |
| 85 return true; | |
| 86 } | |
| 87 } | |
| 88 | |
| 89 // TODO(dhg): Fix this the right way by implementing what's said below. | |
| 90 // Unlike GetPlatformMimeTypeFromExtension, this method doesn't have a | |
| 91 // default list that it uses, but for now we are also returning false since | |
| 92 // this doesn't really matter as much under Linux. | |
| 93 // | |
| 94 // If we wanted to do this properly, we would read the mime.cache file which | |
| 95 // has a section where they assign a glob (*.gif) to a mimetype | |
| 96 // (image/gif). We look up the "heaviest" glob for a certain mime type and | |
| 97 // then then try to chop off "*.". | |
| 98 | |
| 99 return false; | |
| 100 } | |
| 101 | |
| 102 void PlatformMimeUtil::GetPlatformExtensionsForMimeType( | |
| 103 const std::string& mime_type, | |
| 104 base::hash_set<base::FilePath::StringType>* extensions) const { | |
| 105 base::FilePath::StringType ext; | |
| 106 if (GetPreferredExtensionForMimeType(mime_type, &ext)) | |
| 107 extensions->insert(ext); | |
| 108 } | |
| 109 | |
| 110 } // namespace net | |
| OLD | NEW |