1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
diff --git a/uriloader/exthandler/nsExternalHelperAppService.cpp b/uriloader/exthandler/nsExternalHelperAppService.cpp
--- a/uriloader/exthandler/nsExternalHelperAppService.cpp
+++ b/uriloader/exthandler/nsExternalHelperAppService.cpp
@@ -2590,26 +2590,21 @@ NS_IMETHODIMP nsExternalHelperAppService
}
}
}
}
// (3) No match yet. Ask extras.
if (!found) {
rv = NS_ERROR_FAILURE;
-#ifdef XP_WIN
- /* XXX Gross hack to wallpaper over the most common Win32
- * extension issues caused by the fix for bug 116938. See bug
- * 120327, comment 271 for why this is needed. Not even sure we
- * want to remove this once we have fixed all this stuff to work
- * right; any info we get from extras on this type is pretty much
- * useless....
- */
+ // Getting info for application/octet-stream content-type from extras
+ // does not make a sense because this tends to open all octet-streams
+ // as Binary file with exe, com or bin extension regardless the real
+ // extension.
if (!typeToUse.Equals(APPLICATION_OCTET_STREAM, nsCaseInsensitiveCStringComparator()))
-#endif
rv = FillMIMEInfoForMimeTypeFromExtras(typeToUse, *_retval);
LOG(("Searched extras (by type), rv 0x%08" PRIX32 "\n", static_cast<uint32_t>(rv)));
// If that didn't work out, try file extension from extras
if (NS_FAILED(rv) && !aFileExt.IsEmpty()) {
rv = FillMIMEInfoForExtensionFromExtras(aFileExt, *_retval);
LOG(("Searched extras (by ext), rv 0x%08" PRIX32 "\n", static_cast<uint32_t>(rv)));
}
// If that still didn't work, set the file description to "ext File"
diff --git a/uriloader/exthandler/unix/nsOSHelperAppService.cpp b/uriloader/exthandler/unix/nsOSHelperAppService.cpp
--- a/uriloader/exthandler/unix/nsOSHelperAppService.cpp
+++ b/uriloader/exthandler/unix/nsOSHelperAppService.cpp
@@ -26,16 +26,17 @@
#include "nsISupportsPrimitives.h"
#include "nsCRT.h"
#include "nsDirectoryServiceDefs.h"
#include "nsDirectoryServiceUtils.h"
#include "ContentHandlerService.h"
#include "prenv.h" // for PR_GetEnv()
#include "nsAutoPtr.h"
#include "mozilla/Preferences.h"
+#include "nsMimeTypes.h"
using namespace mozilla;
#define LOG(args) MOZ_LOG(mLog, mozilla::LogLevel::Debug, args)
#define LOG_ENABLED() MOZ_LOG_TEST(mLog, mozilla::LogLevel::Debug)
static nsresult
FindSemicolon(nsAString::const_iterator& aSemicolon_iter,
@@ -1445,17 +1446,22 @@ nsOSHelperAppService::GetFromType(const
}
already_AddRefed<nsIMIMEInfo>
nsOSHelperAppService::GetMIMEInfoFromOS(const nsACString& aType,
const nsACString& aFileExt,
bool *aFound) {
*aFound = true;
- RefPtr<nsMIMEInfoBase> retval = GetFromType(PromiseFlatCString(aType));
+ RefPtr<nsMIMEInfoBase> retval;
+ // Fallback to lookup by extension when generic 'application/octet-stream'
+ // content type is received.
+ if (!aType.EqualsLiteral(APPLICATION_OCTET_STREAM)) {
+ retval = GetFromType(PromiseFlatCString(aType));
+ }
bool hasDefault = false;
if (retval)
retval->GetHasDefaultHandler(&hasDefault);
if (!retval || !hasDefault) {
RefPtr<nsMIMEInfoBase> miByExt = GetFromExtension(PromiseFlatCString(aFileExt));
// If we had no extension match, but a type match, use that
if (!miByExt && retval)
return retval.forget();
|