summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--browser/components/downloads/DownloadsCommon.jsm21
-rw-r--r--toolkit/components/jsdownloads/src/DownloadIntegration.jsm28
2 files changed, 26 insertions, 23 deletions
diff --git a/browser/components/downloads/DownloadsCommon.jsm b/browser/components/downloads/DownloadsCommon.jsm
index b90baaf9c..4bcdb1857 100644
--- a/browser/components/downloads/DownloadsCommon.jsm
+++ b/browser/components/downloads/DownloadsCommon.jsm
@@ -77,7 +77,6 @@ const nsIDM = Ci.nsIDownloadManager;
const kDownloadsStringBundleUrl =
"chrome://browser/locale/downloads/downloads.properties";
-const kPrefBdmScanWhenDone = "browser.download.manager.scanWhenDone";
const kPrefBdmAlertOnExeOpen = "browser.download.manager.alertOnEXEOpen";
const kDownloadsStringsRequiringFormatting = {
@@ -518,22 +517,22 @@ this.DownloadsCommon = {
if (!(aOwnerWindow instanceof Ci.nsIDOMWindow))
throw new Error("aOwnerWindow must be a dom-window object");
+#ifdef XP_WIN
+ // On Windows, the system will provide a native confirmation prompt
+ // for .exe files. Exclude this from our prompt, but prompt on other
+ // executable types.
+ let isWindowsExe = aFile.leafName.toLowerCase().endsWith(".exe");
+#else
+ let isWindowsExe = false;
+#endif
+
// Confirm opening executable files if required.
- if (aFile.isExecutable()) {
+ if (aFile.isExecutable() && !isWindowsExe) {
let showAlert = true;
try {
showAlert = Services.prefs.getBoolPref(kPrefBdmAlertOnExeOpen);
} catch (ex) { }
- // On Vista and above, we rely on native security prompting for
- // downloaded content unless it's disabled.
- if (DownloadsCommon.isWinVistaOrHigher) {
- try {
- if (Services.prefs.getBoolPref(kPrefBdmScanWhenDone)) {
- showAlert = false;
- }
- } catch (ex) { }
- }
if (showAlert) {
let name = aFile.leafName;
diff --git a/toolkit/components/jsdownloads/src/DownloadIntegration.jsm b/toolkit/components/jsdownloads/src/DownloadIntegration.jsm
index 2ed769371..58b3bcbcf 100644
--- a/toolkit/components/jsdownloads/src/DownloadIntegration.jsm
+++ b/toolkit/components/jsdownloads/src/DownloadIntegration.jsm
@@ -703,7 +703,21 @@ this.DownloadIntegration = {
let deferred = Task.spawn(function DI_launchDownload_task() {
let file = new FileUtils.File(aDownload.target.path);
-#ifndef XP_WIN
+ // In case of a double extension, like ".tar.gz", we only
+ // consider the last one, because the MIME service cannot
+ // handle multiple extensions.
+ let fileExtension = null, mimeInfo = null;
+ let match = file.leafName.match(/\.([^.]+)$/);
+ if (match) {
+ fileExtension = match[1];
+ }
+
+#ifdef XP_WIN
+ let isWindowsExe = fileExtension.toLowerCase() == "exe";
+#else
+ let isWindowsExe = false;
+#endif
+
// Ask for confirmation if the file is executable, except on Windows where
// the operating system will show the prompt based on the security zone.
// We do this here, instead of letting the caller handle the prompt
@@ -711,7 +725,7 @@ this.DownloadIntegration = {
// because of its security nature, so that add-ons cannot forget to do
// this check. The second is that the system-level security prompt would
// be displayed at launch time in any case.
- if (file.isExecutable() && !this.dontOpenFileAndFolder) {
+ if (file.isExecutable() && !isWindowsExe && !this.dontOpenFileAndFolder) {
// We don't anchor the prompt to a specific window intentionally, not
// only because this is the same behavior as the system-level prompt,
// but also because the most recently active window is the right choice
@@ -722,16 +736,6 @@ this.DownloadIntegration = {
return;
}
}
-#endif
-
- // In case of a double extension, like ".tar.gz", we only
- // consider the last one, because the MIME service cannot
- // handle multiple extensions.
- let fileExtension = null, mimeInfo = null;
- let match = file.leafName.match(/\.([^.]+)$/);
- if (match) {
- fileExtension = match[1];
- }
try {
// The MIME service might throw if contentType == "" and it can't find