Merge pull request #3437 from Rob--W/download-from-cache
Download PDF from cache for non-Firefox add-on
This commit is contained in:
		
						commit
						9ac2584852
					
				| @ -206,6 +206,10 @@ ChromeActions.prototype = { | |||||||
|     // The data may not be downloaded so we need just retry getting the pdf with
 |     // The data may not be downloaded so we need just retry getting the pdf with
 | ||||||
|     // the original url.
 |     // the original url.
 | ||||||
|     var originalUri = NetUtil.newURI(data.originalUrl); |     var originalUri = NetUtil.newURI(data.originalUrl); | ||||||
|  |     var filename = data.filename; | ||||||
|  |     if (typeof filename !== 'string' || !/\.pdf$/i.test(filename)) { | ||||||
|  |       filename = 'document.pdf'; | ||||||
|  |     } | ||||||
|     var blobUri = data.blobUrl ? NetUtil.newURI(data.blobUrl) : originalUri; |     var blobUri = data.blobUrl ? NetUtil.newURI(data.blobUrl) : originalUri; | ||||||
|     var extHelperAppSvc = |     var extHelperAppSvc = | ||||||
|           Cc['@mozilla.org/uriloader/external-helper-app-service;1']. |           Cc['@mozilla.org/uriloader/external-helper-app-service;1']. | ||||||
| @ -235,6 +239,8 @@ ChromeActions.prototype = { | |||||||
|         channel.contentDisposition = Ci.nsIChannel.DISPOSITION_ATTACHMENT; |         channel.contentDisposition = Ci.nsIChannel.DISPOSITION_ATTACHMENT; | ||||||
|         if (self.contentDispositionFilename) { |         if (self.contentDispositionFilename) { | ||||||
|           channel.contentDispositionFilename = self.contentDispositionFilename; |           channel.contentDispositionFilename = self.contentDispositionFilename; | ||||||
|  |         } else { | ||||||
|  |           channel.contentDispositionFilename = filename; | ||||||
|         } |         } | ||||||
|       } catch (e) {} |       } catch (e) {} | ||||||
|       channel.setURI(originalUri); |       channel.setURI(originalUri); | ||||||
|  | |||||||
| @ -92,6 +92,13 @@ if (typeof PDFJS === 'undefined') { | |||||||
|   window.Float64Array = TypedArray; |   window.Float64Array = TypedArray; | ||||||
| })(); | })(); | ||||||
| 
 | 
 | ||||||
|  | // URL = URL || webkitURL
 | ||||||
|  | (function normalizeURLObject() { | ||||||
|  |   if (!window.URL && window.webkitURL) { | ||||||
|  |     window.URL = window.webkitURL; | ||||||
|  |   } | ||||||
|  | })(); | ||||||
|  | 
 | ||||||
| // Object.create() ?
 | // Object.create() ?
 | ||||||
| (function checkObjectCreateCompatibility() { | (function checkObjectCreateCompatibility() { | ||||||
|   if (typeof Object.create !== 'undefined') |   if (typeof Object.create !== 'undefined') | ||||||
|  | |||||||
							
								
								
									
										106
									
								
								web/viewer.js
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								web/viewer.js
									
									
									
									
									
								
							| @ -14,6 +14,7 @@ | |||||||
|  * See the License for the specific language governing permissions and |  * See the License for the specific language governing permissions and | ||||||
|  * limitations under the License. |  * limitations under the License. | ||||||
|  */ |  */ | ||||||
|  | /* globals URL*/ | ||||||
| /* globals PDFJS, PDFBug, FirefoxCom, Stats, Cache, PDFFindBar */ | /* globals PDFJS, PDFBug, FirefoxCom, Stats, Cache, PDFFindBar */ | ||||||
| /* globals PDFFindController, ProgressBar, getFileName, CustomStyle */ | /* globals PDFFindController, ProgressBar, getFileName, CustomStyle */ | ||||||
| /* globals getOutputScale, TextLayerBuilder */ | /* globals getOutputScale, TextLayerBuilder */ | ||||||
| @ -914,22 +915,40 @@ var PDFView = { | |||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|   download: function pdfViewDownload() { |   download: function pdfViewDownload() { | ||||||
|     function noData() { |  | ||||||
|       FirefoxCom.request('download', { originalUrl: url }); |  | ||||||
|     } |  | ||||||
|     var url = this.url.split('#')[0]; |     var url = this.url.split('#')[0]; | ||||||
|  |     function getPDFFileNameFromURL(url) { | ||||||
|  |       var reURI = /^(?:([^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; | ||||||
|  |       //            SCHEME      HOST         1.PATH  2.QUERY   3.REF
 | ||||||
|  |       // Pattern to get last matching NAME.pdf
 | ||||||
|  |       var reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i; | ||||||
|  |       var splitURI = reURI.exec(url); | ||||||
|  |       var suggestedFilename = reFilename.exec(splitURI[1]) || | ||||||
|  |                                reFilename.exec(splitURI[2]) || | ||||||
|  |                                reFilename.exec(splitURI[3]); | ||||||
|  |       if (suggestedFilename) { | ||||||
|  |         suggestedFilename = suggestedFilename[0]; | ||||||
|  |         if (suggestedFilename.indexOf('%') != -1) { | ||||||
|  |           // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf
 | ||||||
|  |           try { | ||||||
|  |             suggestedFilename = | ||||||
|  |               reFilename.exec(decodeURIComponent(suggestedFilename))[0]; | ||||||
|  |           } catch(e) { // Possible (extremely rare) errors:
 | ||||||
|  |             // URIError "Malformed URI", e.g. for "%AA.pdf"
 | ||||||
|  |             // TypeError "null has no properties", e.g. for "%2F.pdf"
 | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       return suggestedFilename || 'document.pdf'; | ||||||
|  |     } | ||||||
| //#if !(FIREFOX || MOZCENTRAL)
 | //#if !(FIREFOX || MOZCENTRAL)
 | ||||||
|  |     function noData() { | ||||||
|  |       triggerSaveAs(url + '#pdfjs.action=download'); | ||||||
|  |     } | ||||||
|  |     function triggerSaveAs(url, blobUrl) { | ||||||
|  |       // If blobUrl is not specified, fall back to non-blob url.
 | ||||||
|  |       if (!blobUrl) blobUrl = url; | ||||||
| 
 | 
 | ||||||
|       var a = document.createElement('a'); |       var a = document.createElement('a'); | ||||||
| 
 |  | ||||||
|     // If _parent == self, then opening an identical URL with different
 |  | ||||||
|     // location hash will only cause a navigation, not a download.
 |  | ||||||
|     if (window.top === window && !('download' in a) && |  | ||||||
|         url === window.location.href.split('#')[0]) { |  | ||||||
|       url += url.indexOf('?') === -1 ? '?' : '&'; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     url += '#pdfjs.action=download'; |  | ||||||
|       if (a.click) { |       if (a.click) { | ||||||
|         // Use a.click() if available. Otherwise, Chrome might show
 |         // Use a.click() if available. Otherwise, Chrome might show
 | ||||||
|         // "Unsafe JavaScript attempt to initiate a navigation change
 |         // "Unsafe JavaScript attempt to initiate a navigation change
 | ||||||
| @ -940,13 +959,12 @@ var PDFView = { | |||||||
|         // - Opera 9 - 12.15
 |         // - Opera 9 - 12.15
 | ||||||
|         // - Internet Explorer 6 - 10
 |         // - Internet Explorer 6 - 10
 | ||||||
|         // - Safari 6 (5.1- does not support a.click)
 |         // - Safari 6 (5.1- does not support a.click)
 | ||||||
|       a.href = url; |         a.href = blobUrl; | ||||||
|         a.target = '_parent'; |         a.target = '_parent'; | ||||||
|         // Use a.download if available. This increases the likelihood that
 |         // Use a.download if available. This increases the likelihood that
 | ||||||
|         // the file is downloaded instead of opened by another PDF plugin.
 |         // the file is downloaded instead of opened by another PDF plugin.
 | ||||||
|         if ('download' in a) { |         if ('download' in a) { | ||||||
|         var filename = url.match(/([^\/?#=]+\.pdf)/i); |           a.download = getPDFFileNameFromURL(url); | ||||||
|         a.download = filename ? filename[1] : 'file.pdf'; |  | ||||||
|         } |         } | ||||||
|         // <a> must be in the document for IE and recent Firefox versions.
 |         // <a> must be in the document for IE and recent Firefox versions.
 | ||||||
|         // (otherwise .click() is ignored)
 |         // (otherwise .click() is ignored)
 | ||||||
| @ -954,20 +972,29 @@ var PDFView = { | |||||||
|         a.click(); |         a.click(); | ||||||
|         a.parentNode.removeChild(a); |         a.parentNode.removeChild(a); | ||||||
|       } else { |       } else { | ||||||
|       window.open(url, '_parent'); |         if (window.top === window && | ||||||
|  |             blobUrl.split('#')[0] === window.location.href.split('#')[0]) { | ||||||
|  |           // If _parent == self, then opening an identical URL with different
 | ||||||
|  |           // location hash will only cause a navigation, not a download.
 | ||||||
|  |           var padCharacter = blobUrl.indexOf('?') === -1 ? '?' : '&'; | ||||||
|  |           blobUrl = blobUrl.replace(/#|$/, padCharacter + '$&'); | ||||||
|  |         } | ||||||
|  |         window.open(blobUrl, '_parent'); | ||||||
|  |       } | ||||||
|     } |     } | ||||||
| //#else
 | //#else
 | ||||||
| //  // Document isn't ready just try to download with the url.
 | //  function noData() {
 | ||||||
| //  if (!this.pdfDocument) {
 | //    FirefoxCom.request('download', {
 | ||||||
| //    noData();
 | //      originalUrl: url,
 | ||||||
| //    return;
 | //      filename: getPDFFileNameFromURL(url)
 | ||||||
|  | //    });
 | ||||||
| //  }
 | //  }
 | ||||||
| //  this.pdfDocument.getData().then(
 | //  function triggerSaveAs(url, blobUrl) {
 | ||||||
| //    function getDataSuccess(data) {
 | //      FirefoxCom.request('download', {
 | ||||||
| //      var blob = PDFJS.createBlob(data.buffer, 'application/pdf');
 | //        blobUrl: blobUrl,
 | ||||||
| //      var blobUrl = window.URL.createObjectURL(blob);
 | //        originalUrl: url,
 | ||||||
| //
 | //        filename: getPDFFileNameFromURL(url)
 | ||||||
| //      FirefoxCom.request('download', { blobUrl: blobUrl, originalUrl: url },
 | //      },
 | ||||||
| //        function response(err) {
 | //        function response(err) {
 | ||||||
| //          if (err) {
 | //          if (err) {
 | ||||||
| //            // This error won't really be helpful because it's likely the
 | //            // This error won't really be helpful because it's likely the
 | ||||||
| @ -977,10 +1004,31 @@ var PDFView = { | |||||||
| //          window.URL.revokeObjectURL(blobUrl);
 | //          window.URL.revokeObjectURL(blobUrl);
 | ||||||
| //        }
 | //        }
 | ||||||
| //      );
 | //      );
 | ||||||
| //    },
 | //  }
 | ||||||
| //    noData // Error occurred try downloading with just the url.
 |  | ||||||
| //  );
 |  | ||||||
| //#endif
 | //#endif
 | ||||||
|  |     // If the PDF is not ready yet, or if URL.createObjectURL is not supported,
 | ||||||
|  |     // just try to download with the url.
 | ||||||
|  |     if (!this.pdfDocument || !URL) { | ||||||
|  |         noData(); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |     this.pdfDocument.getData().then( | ||||||
|  |       function getDataSuccess(data) { | ||||||
|  |         var blob = PDFJS.createBlob(data.buffer, 'application/pdf'); | ||||||
|  | //#if GENERIC
 | ||||||
|  |         if (navigator.msSaveBlob) { | ||||||
|  |           // IE10 / IE11
 | ||||||
|  |           if (!navigator.msSaveBlob(blob, getPDFFileNameFromURL(url))) { | ||||||
|  |             noData(); | ||||||
|  |           } | ||||||
|  |           return; | ||||||
|  |         } | ||||||
|  | //#endif
 | ||||||
|  |         var blobUrl = URL.createObjectURL(blob); | ||||||
|  |         triggerSaveAs(url, blobUrl); | ||||||
|  |       }, | ||||||
|  |       noData // Error occurred try downloading with just the url.
 | ||||||
|  |     ).then(null, noData); | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|   fallback: function pdfViewFallback() { |   fallback: function pdfViewFallback() { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user