Index: chrome/browser/extensions/api/file_handlers/mime_util.cc |
diff --git a/chrome/browser/extensions/api/file_handlers/mime_util.cc b/chrome/browser/extensions/api/file_handlers/mime_util.cc |
index 47400563224d3af66749806d5b64343e1a78ff4b..6045d57f4206e5e1ead0be3dfb000ad1cd9b1da8 100644 |
--- a/chrome/browser/extensions/api/file_handlers/mime_util.cc |
+++ b/chrome/browser/extensions/api/file_handlers/mime_util.cc |
@@ -41,10 +41,18 @@ void SniffMimeType(const base::FilePath& local_path, std::string* result) { |
} |
#if defined(OS_CHROMEOS) |
+// Converts a result passed as a scoped pointer to a dereferenced value passed |
+// to |callback|. |
+void OnGetMimeTypeFromFileForNonNativeLocalPathCompleted( |
+ scoped_ptr<std::string> mime_type, |
+ const base::Callback<void(const std::string&)>& callback) { |
+ callback.Run(*mime_type); |
+} |
+ |
// Called when fetching MIME type for a non-native local path is completed. |
// If |success| is false, then tries to guess the MIME type by looking at the |
// file name. |
-void OnGetMimeTypeForNonNativeLocalPathCompleted( |
+void OnGetMimeTypeFromMetadataForNonNativeLocalPathCompleted( |
const base::FilePath& local_path, |
const base::Callback<void(const std::string&)>& callback, |
bool success, |
@@ -54,9 +62,19 @@ void OnGetMimeTypeForNonNativeLocalPathCompleted( |
return; |
} |
- std::string mime_type_from_extension; |
- net::GetMimeTypeFromFile(local_path, &mime_type_from_extension); |
- callback.Run(mime_type_from_extension); |
+ // MIME type not available with metadata, hence try to guess it from the |
+ // file's extension. |
+ scoped_ptr<std::string> mime_type_from_extension(new std::string); |
+ std::string* const mime_type_from_extension_ptr = |
+ mime_type_from_extension.get(); |
+ BrowserThread::PostBlockingPoolTaskAndReply( |
+ FROM_HERE, |
+ base::Bind(base::IgnoreResult(&net::GetMimeTypeFromFile), |
+ local_path, |
+ mime_type_from_extension_ptr), |
+ base::Bind(&OnGetMimeTypeFromFileForNonNativeLocalPathCompleted, |
+ base::Passed(&mime_type_from_extension), |
+ callback)); |
} |
#endif |
@@ -69,6 +87,29 @@ void OnSniffMimeTypeForNativeLocalPathCompleted( |
} // namespace |
+// Handles response of net::GetMimeTypeFromFile for native file systems. If |
+// MIME type is available, then forwards it to |callback|. Otherwise, fallbacks |
+// to sniffing. |
+void OnGetMimeTypeFromFileForNativeLocalPathCompleted( |
+ const base::FilePath& local_path, |
+ scoped_ptr<std::string> mime_type, |
+ const base::Callback<void(const std::string&)>& callback) { |
+ if (!mime_type->empty()) { |
+ callback.Run(*mime_type); |
+ return; |
+ } |
+ |
+ scoped_ptr<std::string> sniffed_mime_type(new std::string); |
+ std::string* const sniffed_mime_type_ptr = sniffed_mime_type.get(); |
+ BrowserThread::PostBlockingPoolTaskAndReply( |
+ FROM_HERE, |
+ base::Bind(&SniffMimeType, local_path, sniffed_mime_type_ptr), |
+ base::Bind(&OnSniffMimeTypeForNativeLocalPathCompleted, |
+ base::Passed(&sniffed_mime_type), |
+ callback)); |
+} |
+ |
+// Fetches MIME type for a local path and returns it with a |callback|. |
void GetMimeTypeForLocalPath( |
Profile* profile, |
const base::FilePath& local_path, |
@@ -81,7 +122,7 @@ void GetMimeTypeForLocalPath( |
file_manager::util::GetNonNativeLocalPathMimeType( |
profile, |
local_path, |
- base::Bind(&OnGetMimeTypeForNonNativeLocalPathCompleted, |
+ base::Bind(&OnGetMimeTypeFromMetadataForNonNativeLocalPathCompleted, |
local_path, |
callback)); |
return; |
@@ -89,20 +130,19 @@ void GetMimeTypeForLocalPath( |
#endif |
// For native local files, try to guess the mime from the extension. If |
- // not availble, then try to sniff if. |
- std::string mime_type_from_extension; |
- if (net::GetMimeTypeFromFile(local_path, &mime_type_from_extension)) { |
- callback.Run(mime_type_from_extension); |
- } else { |
- scoped_ptr<std::string> sniffed_mime_type(new std::string); |
- std::string* sniffed_mime_type_ptr = sniffed_mime_type.get(); |
- BrowserThread::PostBlockingPoolTaskAndReply( |
- FROM_HERE, |
- base::Bind(&SniffMimeType, local_path, sniffed_mime_type_ptr), |
- base::Bind(&OnSniffMimeTypeForNativeLocalPathCompleted, |
- base::Passed(&sniffed_mime_type), |
- callback)); |
- } |
+ // not available, then try to sniff if. |
+ scoped_ptr<std::string> mime_type_from_extension(new std::string); |
+ std::string* const mime_type_from_extension_ptr = |
+ mime_type_from_extension.get(); |
+ BrowserThread::PostBlockingPoolTaskAndReply( |
+ FROM_HERE, |
+ base::Bind(base::IgnoreResult(&net::GetMimeTypeFromFile), |
+ local_path, |
+ mime_type_from_extension_ptr), |
+ base::Bind(&OnGetMimeTypeFromFileForNativeLocalPathCompleted, |
+ local_path, |
+ base::Passed(&mime_type_from_extension), |
+ callback)); |
} |
MimeTypeCollector::MimeTypeCollector(Profile* profile) |