diff --git a/toolkit/content/contentAreaUtils.js b/toolkit/content/contentAreaUtils.js index cff7abcf91bb..ca5ced37d61d 100644 --- a/toolkit/content/contentAreaUtils.js +++ b/toolkit/content/contentAreaUtils.js @@ -169,6 +169,49 @@ function saveDocument(aDocument, aSkipPrompt) aDocument.contentType, false, null, null, aSkipPrompt); } + +function DownloadListener(win, transfer) { + function makeClosure(name) { + return function() { + transfer[name].apply(transfer, arguments); + } + } + + this.window = win; + + // Now... we need to forward all calls to our transfer + for (var i in transfer) { + if (i != "QueryInterface") + this[i] = makeClosure(i); + } +} + +DownloadListener.prototype = { + QueryInterface: function dl_qi(aIID) + { + if (aIID.equals(Components.interfaces.nsIInterfaceRequestor) || + aIID.equals(Components.interfaces.nsIWebProgressListener) || + aIID.equals(Components.interfaces.nsIWebProgressListener2) || + aIID.equals(Components.interfaces.nsISupports)) { + return this; + } + throw Components.results.NS_ERROR_NO_INTERFACE; + }, + + getInterface: function dl_gi(aIID) + { + if (aIID.equals(Components.interfaces.nsIAuthPrompt) || + aIID.equals(Components.interfaces.nsIAuthPrompt2)) { + var ww = + Components.classes["@mozilla.org/embedcomp/window-watcher;1"] + .getService(Components.interfaces.nsIPromptFactory); + return ww.getPrompt(this.window, aIID); + } + + throw Components.results.NS_ERROR_NO_INTERFACE; + } +} + /** * internalSave: Used when saving a document or URL. This method: * - Determines a local target filename to use (unless parameter @@ -311,13 +354,13 @@ function internalSave(aURL, aDocument, aDefaultFileName, aContentDisposition, const kWrapColumn = 80; tr.init((aChosenData ? aChosenData.uri : fileInfo.uri), persistArgs.target, "", null, null, null, persist); - persist.progressListener = tr; + persist.progressListener = new DownloadListener(window, tr); persist.saveDocument(persistArgs.source, persistArgs.target, filesFolder, persistArgs.contentType, encodingFlags, kWrapColumn); } else { tr.init((aChosenData ? aChosenData.uri : source), persistArgs.target, "", null, null, null, persist); - persist.progressListener = tr; + persist.progressListener = new DownloadListener(window, tr); persist.saveURI((aChosenData ? aChosenData.uri : source), null, aReferrer, persistArgs.postData, null, persistArgs.target); diff --git a/xpfe/communicator/resources/content/contentAreaUtils.js b/xpfe/communicator/resources/content/contentAreaUtils.js index e3fbcbf12fd6..0b6f27bfce4f 100644 --- a/xpfe/communicator/resources/content/contentAreaUtils.js +++ b/xpfe/communicator/resources/content/contentAreaUtils.js @@ -264,6 +264,48 @@ function saveDocument(aDocument) aDocument.contentType, false, null, null); } +function DownloadListener(win, transfer) { + function makeClosure(name) { + return function() { + transfer[name].apply(transfer, arguments); + } + } + + this.window = win; + + // Now... we need to forward all calls to our transfer + for (var i in transfer) { + if (i != "QueryInterface") + this[i] = makeClosure(i); + } +} + +DownloadListener.prototype = { + QueryInterface: function dl_qi(aIID) + { + if (aIID.equals(Components.interfaces.nsIInterfaceRequestor) || + aIID.equals(Components.interfaces.nsIWebProgressListener) || + aIID.equals(Components.interfaces.nsIWebProgressListener2) || + aIID.equals(Components.interfaces.nsISupports)) { + return this; + } + throw Components.results.NS_ERROR_NO_INTERFACE; + }, + + getInterface: function dl_gi(aIID) + { + if (aIID.equals(Components.interfaces.nsIAuthPrompt) || + aIID.equals(Components.interfaces.nsIAuthPrompt2)) { + var ww = + Components.classes["@mozilla.org/embedcomp/window-watcher;1"] + .getService(Components.interfaces.nsIPromptFactory); + return ww.getPrompt(this.window, aIID); + } + + throw Components.results.NS_ERROR_NO_INTERFACE; + } +} + const SAVETYPE_COMPLETE_PAGE = 0x00; const SAVETYPE_TEXT_ONLY = 0x02; /** @@ -404,13 +446,13 @@ function internalSave(aURL, aDocument, aDefaultFileName, aContentDisposition, const kWrapColumn = 80; tr.init((aChosenData ? aChosenData.uri : fileInfo.uri), persistArgs.target, "", null, null, null, persist); - persist.progressListener = tr; + persist.progressListener = new DownloadListener(window, tr); persist.saveDocument(persistArgs.source, persistArgs.target, filesFolder, persistArgs.contentType, encodingFlags, kWrapColumn); } else { tr.init((aChosenData ? aChosenData.uri : source), persistArgs.target, "", null, null, null, persist); - persist.progressListener = tr; + persist.progressListener = new DownloadListener(window, tr); persist.saveURI((aChosenData ? aChosenData.uri : source), null, aReferrer, persistArgs.postData, null, persistArgs.target);