diff options
Diffstat (limited to 'uriloader/exthandler/nsExternalHelperAppService.cpp')
-rw-r--r-- | uriloader/exthandler/nsExternalHelperAppService.cpp | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/uriloader/exthandler/nsExternalHelperAppService.cpp b/uriloader/exthandler/nsExternalHelperAppService.cpp index dc7d200041..7d5592f948 100644 --- a/uriloader/exthandler/nsExternalHelperAppService.cpp +++ b/uriloader/exthandler/nsExternalHelperAppService.cpp @@ -63,6 +63,10 @@ #include "nsIObserverService.h" // so we can be a profile change observer #include "nsIPropertyBag2.h" // for the 64-bit content length +#ifdef XP_MACOSX +#include "nsILocalFileMac.h" +#endif + #include "nsIPluginHost.h" // XXX needed for ext->type mapping (bug 233289) #include "nsPluginHost.h" #include "nsEscape.h" @@ -271,7 +275,50 @@ static nsresult GetDownloadDirectory(nsIFile **_directory, bool aSkipChecks = false) { nsCOMPtr<nsIFile> dir; - // On all supported platforms, we default to the system's temporary directory. +#ifdef XP_MACOSX + // On OS X, we first try to get the users download location, if it's set. + switch (Preferences::GetInt(NS_PREF_DOWNLOAD_FOLDERLIST, -1)) { + case NS_FOLDER_VALUE_DESKTOP: + (void) NS_GetSpecialDirectory(NS_OS_DESKTOP_DIR, getter_AddRefs(dir)); + break; + case NS_FOLDER_VALUE_CUSTOM: + { + Preferences::GetComplex(NS_PREF_DOWNLOAD_DIR, + NS_GET_IID(nsIFile), + getter_AddRefs(dir)); + if (!dir) break; + + // If we're not checking for availability we're done. + if (aSkipChecks) { + dir.forget(_directory); + return NS_OK; + } + + // We have the directory, and now we need to make sure it exists + bool dirExists = false; + (void) dir->Exists(&dirExists); + if (dirExists) break; + + nsresult rv = dir->Create(nsIFile::DIRECTORY_TYPE, 0755); + if (NS_FAILED(rv)) { + dir = nullptr; + break; + } + } + break; + case NS_FOLDER_VALUE_DOWNLOADS: + // This is just the OS default location, so fall out + break; + } + + if (!dir) { + // If not, we default to the OS X default download location. + nsresult rv = NS_GetSpecialDirectory(NS_OSX_DEFAULT_DOWNLOAD_DIR, + getter_AddRefs(dir)); + NS_ENSURE_SUCCESS(rv, rv); + } +#else + // On all other platforms, we default to the systems temporary directory. nsresult rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(dir)); NS_ENSURE_SUCCESS(rv, rv); @@ -345,6 +392,7 @@ static nsresult GetDownloadDirectory(nsIFile **_directory, } #endif +#endif NS_ASSERTION(dir, "Somehow we didn't get a download directory!"); dir.forget(_directory); @@ -416,7 +464,11 @@ struct nsExtraMimeTypeEntry { const char* mDescription; }; +#ifdef XP_MACOSX +#define MAC_TYPE(x) x +#else #define MAC_TYPE(x) 0 +#endif /** * This table lists all of the 'extra' content types that we can deduce from particular @@ -427,7 +479,11 @@ struct nsExtraMimeTypeEntry { */ static const nsExtraMimeTypeEntry extraMimeEntries[] = { +#if defined(XP_MACOSX) // don't define .bin on the mac...use internet config to look that up... + { APPLICATION_OCTET_STREAM, "exe,com", "Binary File" }, +#else { APPLICATION_OCTET_STREAM, "exe,com,bin", "Binary File" }, +#endif { APPLICATION_GZIP2, "gz", "gzip" }, { "application/x-arj", "arj", "ARJ file" }, { "application/rtf", "rtf", "Rich Text Format File" }, |