TrinetraLabs/Placebo_AI
0
1/*! FileSaver.js2 * A saveAs() FileSaver implementation.3 * 2014-01-244 *5 * By Eli Grey, http://eligrey.com6 * License: X11/MIT7 * See LICENSE.md8 */9 10/*global self */11/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */12 13/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/main/FileSaver.js */14 15var saveAs = saveAs16 // IE 10+ (native saveAs)17 || (typeof navigator !== "undefined" &&18 navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))19 // Everyone else20 || (function(view) {21 "use strict";22 // IE <10 is explicitly unsupported23 if (typeof navigator !== "undefined" &&24 /MSIE [1-9]\./.test(navigator.userAgent)) {25 return;26 }27 var28 doc = view.document29 // only get URL when necessary in case BlobBuilder.js hasn't overridden it yet30 , get_URL = function() {31 return view.URL || view.webkitURL || view;32 }33 , URL = view.URL || view.webkitURL || view34 , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")35 , can_use_save_link = !view.externalHost && "download" in save_link36 , click = function(node) {37 var event = doc.createEvent("MouseEvents");38 event.initMouseEvent(39 "click", true, false, view, 0, 0, 0, 0, 040 , false, false, false, false, 0, null41 );42 node.dispatchEvent(event);43 }44 , webkit_req_fs = view.webkitRequestFileSystem45 , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem46 , throw_outside = function(ex) {47 (view.setImmediate || view.setTimeout)(function() {48 throw ex;49 }, 0);50 }51 , force_saveable_type = "application/octet-stream"52 , fs_min_size = 053 , deletion_queue = []54 , process_deletion_queue = function() {55 var i = deletion_queue.length;56 while (i--) {57 var file = deletion_queue[i];58 if (typeof file === "string") { // file is an object URL59 URL.revokeObjectURL(file);60 } else { // file is a File61 file.remove();62 }63 }64 deletion_queue.length = 0; // clear queue65 }66 , dispatch = function(filesaver, event_types, event) {67 event_types = [].concat(event_types);68 var i = event_types.length;69 while (i--) {70 var listener = filesaver["on" + event_types[i]];71 if (typeof listener === "function") {72 try {73 listener.call(filesaver, event || filesaver);74 } catch (ex) {75 throw_outside(ex);76 }77 }78 }79 }80 , FileSaver = function(blob, name) {81 // First try a.download, then web filesystem, then object URLs82 var83 filesaver = this84 , type = blob.type85 , blob_changed = false86 , object_url87 , target_view88 , get_object_url = function() {89 var object_url = get_URL().createObjectURL(blob);90 deletion_queue.push(object_url);91 return object_url;92 }93 , dispatch_all = function() {94 dispatch(filesaver, "writestart progress write writeend".split(" "));95 }96 // on any filesys errors revert to saving with object URLs97 , fs_error = function() {98 // don't create more object URLs than needed99 if (blob_changed || !object_url) {100 object_url = get_object_url(blob);101 }102 if (target_view) {103 target_view.location.href = object_url;104 } else {105 window.open(object_url, "_blank");106 }107 filesaver.readyState = filesaver.DONE;108 dispatch_all();109 }110 , abortable = function(func) {111 return function() {112 if (filesaver.readyState !== filesaver.DONE) {113 return func.apply(this, arguments);114 }115 };116 }117 , create_if_not_found = {create: true, exclusive: false}118 , slice119 ;120 filesaver.readyState = filesaver.INIT;121 if (!name) {122 name = "download";123 }124 if (can_use_save_link) {125 object_url = get_object_url(blob);126 // FF for Android has a nasty garbage collection mechanism127 // that turns all objects that are not pure javascript into 'deadObject'128 // this means `doc` and `save_link` are unusable and need to be recreated129 // `view` is usable though:130 doc = view.document;131 save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a");132 save_link.href = object_url;133 save_link.download = name;134 var event = doc.createEvent("MouseEvents");135 event.initMouseEvent(136 "click", true, false, view, 0, 0, 0, 0, 0137 , false, false, false, false, 0, null138 );139 save_link.dispatchEvent(event);140 filesaver.readyState = filesaver.DONE;141 dispatch_all();142 return;143 }144 // Object and web filesystem URLs have a problem saving in Google Chrome when145 // viewed in a tab, so I force save with application/octet-stream146 // http://code.google.com/p/chromium/issues/detail?id=91158147 if (view.chrome && type && type !== force_saveable_type) {148 slice = blob.slice || blob.webkitSlice;149 blob = slice.call(blob, 0, blob.size, force_saveable_type);150 blob_changed = true;151 }152 // Since I can't be sure that the guessed media type will trigger a download153 // in WebKit, I append .download to the filename.154 // https://bugs.webkit.org/show_bug.cgi?id=65440155 if (webkit_req_fs && name !== "download") {156 name += ".download";157 }158 if (type === force_saveable_type || webkit_req_fs) {159 target_view = view;160 }161 if (!req_fs) {162 fs_error();163 return;164 }165 fs_min_size += blob.size;166 req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {167 fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {168 var save = function() {169 dir.getFile(name, create_if_not_found, abortable(function(file) {170 file.createWriter(abortable(function(writer) {171 writer.onwriteend = function(event) {172 target_view.location.href = file.toURL();173 deletion_queue.push(file);174 filesaver.readyState = filesaver.DONE;175 dispatch(filesaver, "writeend", event);176 };177 writer.onerror = function() {178 var error = writer.error;179 if (error.code !== error.ABORT_ERR) {180 fs_error();181 }182 };183 "writestart progress write abort".split(" ").forEach(function(event) {184 writer["on" + event] = filesaver["on" + event];185 });186 writer.write(blob);187 filesaver.abort = function() {188 writer.abort();189 filesaver.readyState = filesaver.DONE;190 };191 filesaver.readyState = filesaver.WRITING;192 }), fs_error);193 }), fs_error);194 };195 dir.getFile(name, {create: false}, abortable(function(file) {196 // delete file if it already exists197 file.remove();198 save();199 }), abortable(function(ex) {200 if (ex.code === ex.NOT_FOUND_ERR) {201 save();202 } else {203 fs_error();204 }205 }));206 }), fs_error);207 }), fs_error);208 }209 , FS_proto = FileSaver.prototype210 , saveAs = function(blob, name) {211 return new FileSaver(blob, name);212 }213 ;214 FS_proto.abort = function() {215 var filesaver = this;216 filesaver.readyState = filesaver.DONE;217 dispatch(filesaver, "abort");218 };219 FS_proto.readyState = FS_proto.INIT = 0;220 FS_proto.WRITING = 1;221 FS_proto.DONE = 2;222 223 FS_proto.error =224 FS_proto.onwritestart =225 FS_proto.onprogress =226 FS_proto.onwrite =227 FS_proto.onabort =228 FS_proto.onerror =229 FS_proto.onwriteend =230 null;231 232 view.addEventListener("unload", process_deletion_queue, false);233 saveAs.unload = function() {234 process_deletion_queue();235 view.removeEventListener("unload", process_deletion_queue, false);236 };237 return saveAs;238}(239 typeof self !== "undefined" && self240 || typeof window !== "undefined" && window241 || this.content242));243// `self` is undefined in Firefox for Android content script context244// while `this` is nsIContentFrameMessageManager245// with an attribute `content` that corresponds to the window246 247if (typeof module !== "undefined") module.exports = saveAs;248 