diff --git a/web/viewer.js b/web/viewer.js index 4fc521459..bd65b37b0 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -1063,8 +1063,43 @@ var PDFView = { } var url = this.url.split('#')[0]; //#if !(FIREFOX || MOZCENTRAL) + + 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'; - window.open(url, '_parent'); + if (a.click) { + // Use a.click() if available. Otherwise, Chrome might show + // "Unsafe JavaScript attempt to initiate a navigation change + // for frame with URL" and not open the PDF at all. + // Supported by (not mentioned = untested): + // - Firefox 6 - 19 (4- does not support a.click, 5 ignores a.click) + // - Chrome 19 - 26 (18- does not support a.click) + // - Opera 9 - 12.15 + // - Internet Explorer 6 - 10 + // - Safari 6 (5.1- does not support a.click) + a.href = url; + a.target = '_parent'; + // Use a.download if available. This increases the likelihood that + // the file is downloaded instead of opened by another PDF plugin. + if ('download' in a) { + var filename = url.match(/([^\/?#=]+\.pdf)/i); + a.download = filename ? filename[1] : 'file.pdf'; + } + // must be in the document for IE and recent Firefox versions. + // (otherwise .click() is ignored) + (document.body || document.documentElement).appendChild(a); + a.click(); + a.parentNode.removeChild(a); + } else { + window.open(url, '_parent'); + } //#else // // Document isn't ready just try to download with the url. // if (!this.pdfDocument) {