diff --git a/extensions/firefox/components/PdfStreamConverter.js b/extensions/firefox/components/PdfStreamConverter.js index af9cf41b8..5d7ac69ea 100644 --- a/extensions/firefox/components/PdfStreamConverter.js +++ b/extensions/firefox/components/PdfStreamConverter.js @@ -16,6 +16,7 @@ const MAX_DATABASE_LENGTH = 4096; Cu.import('resource://gre/modules/XPCOMUtils.jsm'); Cu.import('resource://gre/modules/Services.jsm'); +Cu.import('resource://gre/modules/NetUtil.jsm'); let application = Cc['@mozilla.org/fuel/application;1'] .getService(Ci.fuelIApplication); @@ -45,6 +46,41 @@ ChromeActions.prototype = { download: function(data) { Services.wm.getMostRecentWindow('navigator:browser').saveURL(data); }, + fallback: function(data) { + let mimeService = Cc['@mozilla.org/mime;1'].getService(Ci.nsIMIMEService); + var handlerInfo = mimeService. + getFromTypeAndExtension('application/pdf', 'pdf'); + var uri = NetUtil.newURI(data); + var filename = Services.wm.getMostRecentWindow('navigator:browser'). + getDefaultFileName('document.pdf', uri); + // Create a temporary file to output to. + var file = Cc['@mozilla.org/file/directory_service;1']. + getService(Ci.nsIProperties). + get('TmpD', Ci.nsIFile); + file.append(filename); + file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, parseInt('0666', 8)); + + var ostream = Cc['@mozilla.org/network/file-output-stream;1']. + createInstance(Ci.nsIFileOutputStream); + ostream.init(file, -1, -1, 0); + + // Fetch the file and once it's ready attempt to open it with the system's + // default pdf handler. + NetUtil.asyncFetch(uri, function(istream, aResult) { + if (!Components.isSuccessCode(aResult)) { + log('Error: Fetching file failed with code ' + aResult); + return; + } + NetUtil.asyncCopy(istream, ostream, function(aResult) { + if (!Components.isSuccessCode(aResult)) { + log('Error: Copying file failed with code: ' + aResult); + return; + } + handlerInfo.preferredAction = Ci.nsIHandlerInfo.useSystemDefault; + handlerInfo.launchWithFile(file); + }); + }); + }, setDatabase: function(data) { if (this.inPrivateBrowswing) return; diff --git a/web/viewer.html b/web/viewer.html index 0ec05e031..fa836fdab 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -101,12 +101,14 @@ Print --> - - + - Current View + Current View
diff --git a/web/viewer.js b/web/viewer.js index e8eb9ad3b..b15b123a4 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -374,6 +374,13 @@ var PDFView = { } }, + fallback: function pdfViewDownload() { + if (!PDFJS.isFirefoxExtension) + return; // can't do this with regular viewer + var url = this.url.split('#')[0]; + FirefoxCom.request('fallback', url); + }, + navigateTo: function pdfViewNavigateTo(dest) { if (typeof dest === 'string') dest = this.destinations[dest]; @@ -1352,6 +1359,9 @@ window.addEventListener('load', function webViewerLoad(evt) { document.getElementById('fileInput').value = null; } + if (PDFJS.isFirefoxExtension) + document.getElementById('fallback').removeAttribute('hidden'); + // Special debugging flags in the hash section of the URL. var hash = document.location.hash.substring(1); var hashParams = PDFView.parseQueryString(hash);