diff -r ebdd1d769158 -r eb4f4eceada0 server/php/basic/public_html/static/lib/FileSaver/FileSaver.js --- a/server/php/basic/public_html/static/lib/FileSaver/FileSaver.js Fri Mar 18 14:15:23 2016 +0100 +++ b/server/php/basic/public_html/static/lib/FileSaver/FileSaver.js Thu Mar 31 17:12:38 2016 +0200 @@ -1,9 +1,9 @@ /* FileSaver.js * A saveAs() FileSaver implementation. - * 1.1.20150716 + * 1.1.20160328 * * By Eli Grey, http://eligrey.com - * License: X11/MIT + * License: MIT * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md */ @@ -30,6 +30,7 @@ var event = new MouseEvent("click"); node.dispatchEvent(event); } + , is_safari = /Version\/[\d\.]+.*Safari/.test(navigator.userAgent) , webkit_req_fs = view.webkitRequestFileSystem , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem , throw_outside = function(ex) { @@ -39,10 +40,8 @@ } , force_saveable_type = "application/octet-stream" , fs_min_size = 0 - // See https://code.google.com/p/chromium/issues/detail?id=375297#c7 and - // https://github.com/eligrey/FileSaver.js/commit/485930a#commitcomment-8768047 - // for the reasoning behind the timeout and revocation flow - , arbitrary_revoke_timeout = 500 // in ms + // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to + , arbitrary_revoke_timeout = 1000 * 40 // in ms , revoke = function(file) { var revoker = function() { if (typeof file === "string") { // file is an object URL @@ -51,11 +50,23 @@ file.remove(); } }; - if (view.chrome) { - revoker(); - } else { - setTimeout(revoker, arbitrary_revoke_timeout); + /* // Take note W3C: + var + uri = typeof file === "string" ? file : file.toURL() + , revoker = function(evt) { + // idealy DownloadFinishedEvent.data would be the URL requested + if (evt.data === uri) { + if (typeof file === "string") { // file is an object URL + get_URL().revokeObjectURL(file); + } else { // file is a File + file.remove(); + } + } } + ; + view.addEventListener("downloadfinished", revoker); + */ + setTimeout(revoker, arbitrary_revoke_timeout); } , dispatch = function(filesaver, event_types, event) { event_types = [].concat(event_types); @@ -94,6 +105,19 @@ } // on any filesys errors revert to saving with object URLs , fs_error = function() { + if (target_view && is_safari && typeof FileReader !== "undefined") { + // Safari doesn't allow downloading of blob urls + var reader = new FileReader(); + reader.onloadend = function() { + var base64Data = reader.result; + target_view.location.href = "data:attachment/file" + base64Data.slice(base64Data.search(/[,;]/)); + filesaver.readyState = filesaver.DONE; + dispatch_all(); + }; + reader.readAsDataURL(blob); + filesaver.readyState = filesaver.INIT; + return; + } // don't create more object URLs than needed if (blob_changed || !object_url) { object_url = get_URL().createObjectURL(blob); @@ -102,7 +126,7 @@ target_view.location.href = object_url; } else { var new_tab = view.open(object_url, "_blank"); - if (new_tab == undefined && typeof safari !== "undefined") { + if (new_tab === undefined && is_safari) { //Apple do not allow window.open, see http://bit.ly/1kZffRI view.location.href = object_url } @@ -127,9 +151,9 @@ } if (can_use_save_link) { object_url = get_URL().createObjectURL(blob); - save_link.href = object_url; - save_link.download = name; setTimeout(function() { + save_link.href = object_url; + save_link.download = name; click(save_link); dispatch_all(); revoke(object_url); @@ -249,7 +273,7 @@ if (typeof module !== "undefined" && module.exports) { module.exports.saveAs = saveAs; -} else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) { +} else if ((typeof define !== "undefined" && define !== null) && (define.amd !== null)) { define([], function() { return saveAs; });