PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 4.2
MainWP Dashboard: Self-hosted WordPress Management for Agencies v4.2
6.2 6.1.8 6.1.7 6.1.6 6.1.5 6.1.4 6.1.3 6.1.2 6.1.1 6.1 6.0.12 6.0.11 4.6.0.1 5.0 5.0.1 5.0.2 5.0.3 5.0.3.1 5.0.3.2 5.1 5.1.1 5.2 5.2.1 5.2.2 5.3 All 153 releases
mainwp / assets / js / FileSaver.js

FileSaver.js in MainWP Dashboard: Self-hosted WordPress Management for Agencies 4.2, at assets/js/FileSaver.js

218 lines 6.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* FileSaver.js
2 * A saveAs() FileSaver implementation.
3 * 2013-01-23
4 *
5 * By Eli Grey, http://eligrey.com
6 * License: X11/MIT
7 * See LICENSE.md
8 */
9
10 /*global self */
11 /*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,
12 plusplus: true */
13
14 /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
15
16 var saveAs = saveAs
17 || (navigator.msSaveBlob && navigator.msSaveBlob.bind(navigator))
18 || (function(view) {
19 "use strict";
20 var
21 doc = view.document
22 // only get URL when necessary in case BlobBuilder.js hasn't overridden it yet
23 , get_URL = function() {
24 return view.URL || view.webkitURL || view;
25 }
26 , URL = view.URL || view.webkitURL || view
27 , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
28 , can_use_save_link = "download" in save_link
29 , click = function(node) {
30 var event = doc.createEvent("MouseEvents");
31 event.initMouseEvent(
32 "click", true, false, view, 0, 0, 0, 0, 0
33 , false, false, false, false, 0, null
34 );
35 return node.dispatchEvent(event); // false if event was cancelled
36 }
37 , webkit_req_fs = view.webkitRequestFileSystem
38 , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
39 , throw_outside = function (ex) {
40 (view.setImmediate || view.setTimeout)(function() {
41 throw ex;
42 }, 0);
43 }
44 , force_saveable_type = "application/octet-stream"
45 , fs_min_size = 0
46 , deletion_queue = []
47 , process_deletion_queue = function() {
48 var i = deletion_queue.length;
49 while (i--) {
50 var file = deletion_queue[i];
51 if (typeof file === "string") { // file is an object URL
52 URL.revokeObjectURL(file);
53 } else { // file is a File
54 file.remove();
55 }
56 }
57 deletion_queue.length = 0; // clear queue
58 }
59 , dispatch = function(filesaver, event_types, event) {
60 event_types = [].concat(event_types);
61 var i = event_types.length;
62 while (i--) {
63 var listener = filesaver["on" + event_types[i]];
64 if (typeof listener === "function") {
65 try {
66 listener.call(filesaver, event || filesaver);
67 } catch (ex) {
68 throw_outside(ex);
69 }
70 }
71 }
72 }
73 , FileSaver = function(blob, name) {
74 // First try a.download, then web filesystem, then object URLs
75 var
76 filesaver = this
77 , type = blob.type
78 , blob_changed = false
79 , object_url
80 , target_view
81 , get_object_url = function() {
82 var object_url = get_URL().createObjectURL(blob);
83 deletion_queue.push(object_url);
84 return object_url;
85 }
86 , dispatch_all = function() {
87 dispatch(filesaver, "writestart progress write writeend".split(" "));
88 }
89 // on any filesys errors revert to saving with object URLs
90 , fs_error = function() {
91 // don't create more object URLs than needed
92 if (blob_changed || !object_url) {
93 object_url = get_object_url(blob);
94 }
95 if (target_view) {
96 target_view.location.href = object_url;
97 }
98 filesaver.readyState = filesaver.DONE;
99 dispatch_all();
100 }
101 , abortable = function(func) {
102 return function() {
103 if (filesaver.readyState !== filesaver.DONE) {
104 return func.apply(this, arguments);
105 }
106 };
107 }
108 , create_if_not_found = {create: true, exclusive: false}
109 , slice
110 ;
111 filesaver.readyState = filesaver.INIT;
112 if (!name) {
113 name = "download";
114 }
115 if (can_use_save_link) {
116 object_url = get_object_url(blob);
117 save_link.href = object_url;
118 save_link.download = name;
119 if (click(save_link)) {
120 filesaver.readyState = filesaver.DONE;
121 dispatch_all();
122 return;
123 }
124 }
125 // Object and web filesystem URLs have a problem saving in Google Chrome when
126 // viewed in a tab, so I force save with application/octet-stream
127 // http://code.google.com/p/chromium/issues/detail?id=91158
128 if (view.chrome && type && type !== force_saveable_type) {
129 slice = blob.slice || blob.webkitSlice;
130 blob = slice.call(blob, 0, blob.size, force_saveable_type);
131 blob_changed = true;
132 }
133 // Since I can't be sure that the guessed media type will trigger a download
134 // in WebKit, I append .download to the filename.
135 // https://bugs.webkit.org/show_bug.cgi?id=65440
136 if (webkit_req_fs && name !== "download") {
137 name += ".download";
138 }
139 if (type === force_saveable_type || webkit_req_fs) {
140 target_view = view;
141 } else {
142 target_view = view.open();
143 }
144 if (!req_fs) {
145 fs_error();
146 return;
147 }
148 fs_min_size += blob.size;
149 req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
150 fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
151 var save = function() {
152 dir.getFile(name, create_if_not_found, abortable(function(file) {
153 file.createWriter(abortable(function(writer) {
154 writer.onwriteend = function(event) {
155 target_view.location.href = file.toURL();
156 deletion_queue.push(file);
157 filesaver.readyState = filesaver.DONE;
158 dispatch(filesaver, "writeend", event);
159 };
160 writer.onerror = function() {
161 var error = writer.error;
162 if (error.code !== error.ABORT_ERR) {
163 fs_error();
164 }
165 };
166 "writestart progress write abort".split(" ").forEach(function(event) {
167 writer["on" + event] = filesaver["on" + event];
168 });
169 writer.write(blob);
170 filesaver.abort = function() {
171 writer.abort();
172 filesaver.readyState = filesaver.DONE;
173 };
174 filesaver.readyState = filesaver.WRITING;
175 }), fs_error);
176 }), fs_error);
177 };
178 dir.getFile(name, {create: false}, abortable(function(file) {
179 // delete file if it already exists
180 file.remove();
181 save();
182 }), abortable(function(ex) {
183 if (ex.code === ex.NOT_FOUND_ERR) {
184 save();
185 } else {
186 fs_error();
187 }
188 }));
189 }), fs_error);
190 }), fs_error);
191 }
192 , FS_proto = FileSaver.prototype
193 , saveAs = function(blob, name) {
194 return new FileSaver(blob, name);
195 }
196 ;
197 FS_proto.abort = function() {
198 var filesaver = this;
199 filesaver.readyState = filesaver.DONE;
200 dispatch(filesaver, "abort");
201 };
202 FS_proto.readyState = FS_proto.INIT = 0;
203 FS_proto.WRITING = 1;
204 FS_proto.DONE = 2;
205
206 FS_proto.error =
207 FS_proto.onwritestart =
208 FS_proto.onprogress =
209 FS_proto.onwrite =
210 FS_proto.onabort =
211 FS_proto.onerror =
212 FS_proto.onwriteend =
213 null;
214
215 view.addEventListener("unload", process_deletion_queue, false);
216 return saveAs;
217 }(self));
218