--- 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;
});