Policy 1707 commit to LF
[policy/engine.git] / POLICY-SDK-APP / src / main / webapp / app / policyApp / CSS / bootstrap / docs / assets / js / vendor / FileSaver.js
1 /* FileSaver.js
2  * A saveAs() FileSaver implementation.
3  * 2015-01-04
4  *
5  * By Eli Grey, http://eligrey.com
6  * License: X11/MIT
7  *   See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
8  */
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/master/FileSaver.js */
14
15 var saveAs = saveAs
16   // IE 10+ (native saveAs)
17   || (typeof navigator !== "undefined" &&
18       navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
19   // Everyone else
20   || (function(view) {
21         "use strict";
22         // IE <10 is explicitly unsupported
23         if (typeof navigator !== "undefined" &&
24             /MSIE [1-9]\./.test(navigator.userAgent)) {
25                 return;
26         }
27         var
28                   doc = view.document
29                   // only get URL when necessary in case Blob.js hasn't overridden it yet
30                 , get_URL = function() {
31                         return view.URL || view.webkitURL || view;
32                 }
33                 , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
34                 , can_use_save_link = "download" in save_link
35                 , click = function(node) {
36                         var event = doc.createEvent("MouseEvents");
37                         event.initMouseEvent(
38                                 "click", true, false, view, 0, 0, 0, 0, 0
39                                 , false, false, false, false, 0, null
40                         );
41                         node.dispatchEvent(event);
42                 }
43                 , webkit_req_fs = view.webkitRequestFileSystem
44                 , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
45                 , throw_outside = function(ex) {
46                         (view.setImmediate || view.setTimeout)(function() {
47                                 throw ex;
48                         }, 0);
49                 }
50                 , force_saveable_type = "application/octet-stream"
51                 , fs_min_size = 0
52                 // See https://code.google.com/p/chromium/issues/detail?id=375297#c7 and
53                 // https://github.com/eligrey/FileSaver.js/commit/485930a#commitcomment-8768047
54                 // for the reasoning behind the timeout and revocation flow
55                 , arbitrary_revoke_timeout = 500 // in ms
56                 , revoke = function(file) {
57                         var revoker = function() {
58                                 if (typeof file === "string") { // file is an object URL
59                                         get_URL().revokeObjectURL(file);
60                                 } else { // file is a File
61                                         file.remove();
62                                 }
63                         };
64                         if (view.chrome) {
65                                 revoker();
66                         } else {
67                                 setTimeout(revoker, arbitrary_revoke_timeout);
68                         }
69                 }
70                 , dispatch = function(filesaver, event_types, event) {
71                         event_types = [].concat(event_types);
72                         var i = event_types.length;
73                         while (i--) {
74                                 var listener = filesaver["on" + event_types[i]];
75                                 if (typeof listener === "function") {
76                                         try {
77                                                 listener.call(filesaver, event || filesaver);
78                                         } catch (ex) {
79                                                 throw_outside(ex);
80                                         }
81                                 }
82                         }
83                 }
84                 , FileSaver = function(blob, name) {
85                         // First try a.download, then web filesystem, then object URLs
86                         var
87                                   filesaver = this
88                                 , type = blob.type
89                                 , blob_changed = false
90                                 , object_url
91                                 , target_view
92                                 , dispatch_all = function() {
93                                         dispatch(filesaver, "writestart progress write writeend".split(" "));
94                                 }
95                                 // on any filesys errors revert to saving with object URLs
96                                 , fs_error = function() {
97                                         // don't create more object URLs than needed
98                                         if (blob_changed || !object_url) {
99                                                 object_url = get_URL().createObjectURL(blob);
100                                         }
101                                         if (target_view) {
102                                                 target_view.location.href = object_url;
103                                         } else {
104                                                 var new_tab = view.open(object_url, "_blank");
105                                                 if (new_tab == undefined && typeof safari !== "undefined") {
106                                                         //Apple do not allow window.open, see http://bit.ly/1kZffRI
107                                                         view.location.href = object_url
108                                                 }
109                                         }
110                                         filesaver.readyState = filesaver.DONE;
111                                         dispatch_all();
112                                         revoke(object_url);
113                                 }
114                                 , abortable = function(func) {
115                                         return function() {
116                                                 if (filesaver.readyState !== filesaver.DONE) {
117                                                         return func.apply(this, arguments);
118                                                 }
119                                         };
120                                 }
121                                 , create_if_not_found = {create: true, exclusive: false}
122                                 , slice
123                         ;
124                         filesaver.readyState = filesaver.INIT;
125                         if (!name) {
126                                 name = "download";
127                         }
128                         if (can_use_save_link) {
129                                 object_url = get_URL().createObjectURL(blob);
130                                 save_link.href = object_url;
131                                 save_link.download = name;
132                                 click(save_link);
133                                 filesaver.readyState = filesaver.DONE;
134                                 dispatch_all();
135                                 revoke(object_url);
136                                 return;
137                         }
138                         // Object and web filesystem URLs have a problem saving in Google Chrome when
139                         // viewed in a tab, so I force save with application/octet-stream
140                         // http://code.google.com/p/chromium/issues/detail?id=91158
141                         // Update: Google errantly closed 91158, I submitted it again:
142                         // https://code.google.com/p/chromium/issues/detail?id=389642
143                         if (view.chrome && type && type !== force_saveable_type) {
144                                 slice = blob.slice || blob.webkitSlice;
145                                 blob = slice.call(blob, 0, blob.size, force_saveable_type);
146                                 blob_changed = true;
147                         }
148                         // Since I can't be sure that the guessed media type will trigger a download
149                         // in WebKit, I append .download to the filename.
150                         // https://bugs.webkit.org/show_bug.cgi?id=65440
151                         if (webkit_req_fs && name !== "download") {
152                                 name += ".download";
153                         }
154                         if (type === force_saveable_type || webkit_req_fs) {
155                                 target_view = view;
156                         }
157                         if (!req_fs) {
158                                 fs_error();
159                                 return;
160                         }
161                         fs_min_size += blob.size;
162                         req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
163                                 fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
164                                         var save = function() {
165                                                 dir.getFile(name, create_if_not_found, abortable(function(file) {
166                                                         file.createWriter(abortable(function(writer) {
167                                                                 writer.onwriteend = function(event) {
168                                                                         target_view.location.href = file.toURL();
169                                                                         filesaver.readyState = filesaver.DONE;
170                                                                         dispatch(filesaver, "writeend", event);
171                                                                         revoke(file);
172                                                                 };
173                                                                 writer.onerror = function() {
174                                                                         var error = writer.error;
175                                                                         if (error.code !== error.ABORT_ERR) {
176                                                                                 fs_error();
177                                                                         }
178                                                                 };
179                                                                 "writestart progress write abort".split(" ").forEach(function(event) {
180                                                                         writer["on" + event] = filesaver["on" + event];
181                                                                 });
182                                                                 writer.write(blob);
183                                                                 filesaver.abort = function() {
184                                                                         writer.abort();
185                                                                         filesaver.readyState = filesaver.DONE;
186                                                                 };
187                                                                 filesaver.readyState = filesaver.WRITING;
188                                                         }), fs_error);
189                                                 }), fs_error);
190                                         };
191                                         dir.getFile(name, {create: false}, abortable(function(file) {
192                                                 // delete file if it already exists
193                                                 file.remove();
194                                                 save();
195                                         }), abortable(function(ex) {
196                                                 if (ex.code === ex.NOT_FOUND_ERR) {
197                                                         save();
198                                                 } else {
199                                                         fs_error();
200                                                 }
201                                         }));
202                                 }), fs_error);
203                         }), fs_error);
204                 }
205                 , FS_proto = FileSaver.prototype
206                 , saveAs = function(blob, name) {
207                         return new FileSaver(blob, name);
208                 }
209         ;
210         FS_proto.abort = function() {
211                 var filesaver = this;
212                 filesaver.readyState = filesaver.DONE;
213                 dispatch(filesaver, "abort");
214         };
215         FS_proto.readyState = FS_proto.INIT = 0;
216         FS_proto.WRITING = 1;
217         FS_proto.DONE = 2;
218
219         FS_proto.error =
220         FS_proto.onwritestart =
221         FS_proto.onprogress =
222         FS_proto.onwrite =
223         FS_proto.onabort =
224         FS_proto.onerror =
225         FS_proto.onwriteend =
226                 null;
227
228         return saveAs;
229 }(
230            typeof self !== "undefined" && self
231         || typeof window !== "undefined" && window
232         || this.content
233 ));
234 // `self` is undefined in Firefox for Android content script context
235 // while `this` is nsIContentFrameMessageManager
236 // with an attribute `content` that corresponds to the window
237
238 if (typeof module !== "undefined" && module.exports) {
239   module.exports.saveAs = saveAs;
240 } else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) {
241   define([], function() {
242     return saveAs;
243   });
244 }