xref: /aosp_15_r20/external/libwebsockets/plugins/deaddrop/assets/deaddrop.js (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker(function() {
2*1c60b9acSAndroid Build Coastguard Worker
3*1c60b9acSAndroid Build Coastguard Worker	var server_max_size = 0, ws;
4*1c60b9acSAndroid Build Coastguard Worker
5*1c60b9acSAndroid Build Coastguard Worker	function san(s)
6*1c60b9acSAndroid Build Coastguard Worker	{
7*1c60b9acSAndroid Build Coastguard Worker		if (!s)
8*1c60b9acSAndroid Build Coastguard Worker			return "";
9*1c60b9acSAndroid Build Coastguard Worker
10*1c60b9acSAndroid Build Coastguard Worker		return s.replace(/&/g, "&").
11*1c60b9acSAndroid Build Coastguard Worker		replace(/\</g, "&lt;").
12*1c60b9acSAndroid Build Coastguard Worker		replace(/\>/g, "&gt;").
13*1c60b9acSAndroid Build Coastguard Worker		replace(/\"/g, "&quot;").
14*1c60b9acSAndroid Build Coastguard Worker		replace(/%/g, "&#37;");
15*1c60b9acSAndroid Build Coastguard Worker	}
16*1c60b9acSAndroid Build Coastguard Worker
17*1c60b9acSAndroid Build Coastguard Worker	function lws_urlencode(s)
18*1c60b9acSAndroid Build Coastguard Worker	{
19*1c60b9acSAndroid Build Coastguard Worker		return encodeURI(s).replace(/@/g, "%40");
20*1c60b9acSAndroid Build Coastguard Worker	}
21*1c60b9acSAndroid Build Coastguard Worker
22*1c60b9acSAndroid Build Coastguard Worker	function trim(num)
23*1c60b9acSAndroid Build Coastguard Worker	{
24*1c60b9acSAndroid Build Coastguard Worker		var s = num.toString();
25*1c60b9acSAndroid Build Coastguard Worker
26*1c60b9acSAndroid Build Coastguard Worker		if (!s.indexOf("."))
27*1c60b9acSAndroid Build Coastguard Worker			return s;
28*1c60b9acSAndroid Build Coastguard Worker
29*1c60b9acSAndroid Build Coastguard Worker		while (s.length && s[s.length - 1] === "0")
30*1c60b9acSAndroid Build Coastguard Worker			s = s.substring(0, s.length - 1);
31*1c60b9acSAndroid Build Coastguard Worker
32*1c60b9acSAndroid Build Coastguard Worker		if (s[s.length - 1] === ".")
33*1c60b9acSAndroid Build Coastguard Worker			s = s.substring(0, s.length - 1);
34*1c60b9acSAndroid Build Coastguard Worker
35*1c60b9acSAndroid Build Coastguard Worker		return s;
36*1c60b9acSAndroid Build Coastguard Worker	}
37*1c60b9acSAndroid Build Coastguard Worker
38*1c60b9acSAndroid Build Coastguard Worker	function humanize(n)
39*1c60b9acSAndroid Build Coastguard Worker	{
40*1c60b9acSAndroid Build Coastguard Worker		if (n < 1024)
41*1c60b9acSAndroid Build Coastguard Worker			return n + "B";
42*1c60b9acSAndroid Build Coastguard Worker
43*1c60b9acSAndroid Build Coastguard Worker		if (n < 1024 * 1024)
44*1c60b9acSAndroid Build Coastguard Worker			return trim((n / 1024).toFixed(2)) + "KiB";
45*1c60b9acSAndroid Build Coastguard Worker
46*1c60b9acSAndroid Build Coastguard Worker		if (n < 1024 * 1024 * 1024)
47*1c60b9acSAndroid Build Coastguard Worker			return trim((n / (1024 * 1024)).toFixed(2)) + "MiB";
48*1c60b9acSAndroid Build Coastguard Worker
49*1c60b9acSAndroid Build Coastguard Worker		return trim((n / (1024 * 1024 * 1024)).toFixed(2)) + "GiB";
50*1c60b9acSAndroid Build Coastguard Worker	}
51*1c60b9acSAndroid Build Coastguard Worker
52*1c60b9acSAndroid Build Coastguard Worker	function da_enter(e)
53*1c60b9acSAndroid Build Coastguard Worker	{
54*1c60b9acSAndroid Build Coastguard Worker		var da = document.getElementById("da");
55*1c60b9acSAndroid Build Coastguard Worker
56*1c60b9acSAndroid Build Coastguard Worker		e.preventDefault();
57*1c60b9acSAndroid Build Coastguard Worker		da.classList.add("trot");
58*1c60b9acSAndroid Build Coastguard Worker	}
59*1c60b9acSAndroid Build Coastguard Worker
60*1c60b9acSAndroid Build Coastguard Worker	function da_leave(e)
61*1c60b9acSAndroid Build Coastguard Worker	{
62*1c60b9acSAndroid Build Coastguard Worker		var da = document.getElementById("da");
63*1c60b9acSAndroid Build Coastguard Worker
64*1c60b9acSAndroid Build Coastguard Worker		e.preventDefault();
65*1c60b9acSAndroid Build Coastguard Worker		da.classList.remove("trot");
66*1c60b9acSAndroid Build Coastguard Worker	}
67*1c60b9acSAndroid Build Coastguard Worker
68*1c60b9acSAndroid Build Coastguard Worker	function da_over(e)
69*1c60b9acSAndroid Build Coastguard Worker	{
70*1c60b9acSAndroid Build Coastguard Worker		var da = document.getElementById("da");
71*1c60b9acSAndroid Build Coastguard Worker
72*1c60b9acSAndroid Build Coastguard Worker		e.preventDefault();
73*1c60b9acSAndroid Build Coastguard Worker		da.classList.add("trot");
74*1c60b9acSAndroid Build Coastguard Worker	}
75*1c60b9acSAndroid Build Coastguard Worker
76*1c60b9acSAndroid Build Coastguard Worker	function clear_errors() {
77*1c60b9acSAndroid Build Coastguard Worker		var n, t = document.getElementById("ongoing");
78*1c60b9acSAndroid Build Coastguard Worker
79*1c60b9acSAndroid Build Coastguard Worker		for (n = 0; n < t.rows.length; n++)
80*1c60b9acSAndroid Build Coastguard Worker			if (t.rows[n].cells[0].classList.contains("err"))
81*1c60b9acSAndroid Build Coastguard Worker				t.deleteRow(n);
82*1c60b9acSAndroid Build Coastguard Worker	}
83*1c60b9acSAndroid Build Coastguard Worker
84*1c60b9acSAndroid Build Coastguard Worker	function do_upload(file) {
85*1c60b9acSAndroid Build Coastguard Worker		var formData = new FormData();
86*1c60b9acSAndroid Build Coastguard Worker		var t = document.getElementById("ongoing");
87*1c60b9acSAndroid Build Coastguard Worker
88*1c60b9acSAndroid Build Coastguard Worker		formData.append("file", file);
89*1c60b9acSAndroid Build Coastguard Worker
90*1c60b9acSAndroid Build Coastguard Worker		var row = t.insertRow(0), c1 = row.insertCell(0),
91*1c60b9acSAndroid Build Coastguard Worker		c2 = row.insertCell(1), c3 = row.insertCell(2);
92*1c60b9acSAndroid Build Coastguard Worker
93*1c60b9acSAndroid Build Coastguard Worker		c1.classList.add("ogn");
94*1c60b9acSAndroid Build Coastguard Worker		c1.classList.add("r");
95*1c60b9acSAndroid Build Coastguard Worker
96*1c60b9acSAndroid Build Coastguard Worker		if (file.size > server_max_size) {
97*1c60b9acSAndroid Build Coastguard Worker			c1.innerHTML = "Too Large";
98*1c60b9acSAndroid Build Coastguard Worker			c1.classList.add("err");
99*1c60b9acSAndroid Build Coastguard Worker		} else
100*1c60b9acSAndroid Build Coastguard Worker			c1.innerHTML = "<img class=\"working\">";
101*1c60b9acSAndroid Build Coastguard Worker
102*1c60b9acSAndroid Build Coastguard Worker		c2.classList.add("ogn");
103*1c60b9acSAndroid Build Coastguard Worker		c2.classList.add("r");
104*1c60b9acSAndroid Build Coastguard Worker		c2.innerHTML = humanize(file.size);
105*1c60b9acSAndroid Build Coastguard Worker
106*1c60b9acSAndroid Build Coastguard Worker		c3.classList.add("ogn");
107*1c60b9acSAndroid Build Coastguard Worker		c3.innerHTML = file.name;
108*1c60b9acSAndroid Build Coastguard Worker
109*1c60b9acSAndroid Build Coastguard Worker		if (file.size > server_max_size)
110*1c60b9acSAndroid Build Coastguard Worker			return;
111*1c60b9acSAndroid Build Coastguard Worker
112*1c60b9acSAndroid Build Coastguard Worker		fetch("upload/" + lws_urlencode(file.name), {
113*1c60b9acSAndroid Build Coastguard Worker			method: "POST",
114*1c60b9acSAndroid Build Coastguard Worker			body: formData
115*1c60b9acSAndroid Build Coastguard Worker		})
116*1c60b9acSAndroid Build Coastguard Worker		.then((e) => { /* this just means we got a response code */
117*1c60b9acSAndroid Build Coastguard Worker			var us = e.url.split("/"), ul = us[us.length - 1], n;
118*1c60b9acSAndroid Build Coastguard Worker
119*1c60b9acSAndroid Build Coastguard Worker			for (n = 0; n < t.rows.length; n++)
120*1c60b9acSAndroid Build Coastguard Worker				if (ul === lws_urlencode(
121*1c60b9acSAndroid Build Coastguard Worker					      t.rows[n].cells[2].textContent)) {
122*1c60b9acSAndroid Build Coastguard Worker					if (e.ok === true) {
123*1c60b9acSAndroid Build Coastguard Worker						t.deleteRow(n);
124*1c60b9acSAndroid Build Coastguard Worker					} else {
125*1c60b9acSAndroid Build Coastguard Worker						t.rows[n].cells[0].textContent =
126*1c60b9acSAndroid Build Coastguard Worker					"Failed " + san(e.status.toString());
127*1c60b9acSAndroid Build Coastguard Worker						t.rows[n].cells[0].
128*1c60b9acSAndroid Build Coastguard Worker							classList.add("err");
129*1c60b9acSAndroid Build Coastguard Worker					}
130*1c60b9acSAndroid Build Coastguard Worker					break;
131*1c60b9acSAndroid Build Coastguard Worker				}
132*1c60b9acSAndroid Build Coastguard Worker		})
133*1c60b9acSAndroid Build Coastguard Worker		.catch((e) => {
134*1c60b9acSAndroid Build Coastguard Worker			var us = e.url.split("/"), ul = us[us.length - 1], n;
135*1c60b9acSAndroid Build Coastguard Worker
136*1c60b9acSAndroid Build Coastguard Worker			for (n = 0; n < t.rows.length; n++)
137*1c60b9acSAndroid Build Coastguard Worker				if (ul === lws_urlencode(
138*1c60b9acSAndroid Build Coastguard Worker					  t.rows[n].cells[2].textContent)) {
139*1c60b9acSAndroid Build Coastguard Worker					t.rows[n].cells[0] = "FAIL";
140*1c60b9acSAndroid Build Coastguard Worker					break;
141*1c60b9acSAndroid Build Coastguard Worker				}
142*1c60b9acSAndroid Build Coastguard Worker		});
143*1c60b9acSAndroid Build Coastguard Worker	}
144*1c60b9acSAndroid Build Coastguard Worker
145*1c60b9acSAndroid Build Coastguard Worker	function da_drop(e) {
146*1c60b9acSAndroid Build Coastguard Worker		var da = document.getElementById("da");
147*1c60b9acSAndroid Build Coastguard Worker
148*1c60b9acSAndroid Build Coastguard Worker		e.preventDefault();
149*1c60b9acSAndroid Build Coastguard Worker		da.classList.remove("trot");
150*1c60b9acSAndroid Build Coastguard Worker
151*1c60b9acSAndroid Build Coastguard Worker		clear_errors();
152*1c60b9acSAndroid Build Coastguard Worker
153*1c60b9acSAndroid Build Coastguard Worker		([...e.dataTransfer.files]).forEach(do_upload);
154*1c60b9acSAndroid Build Coastguard Worker	}
155*1c60b9acSAndroid Build Coastguard Worker
156*1c60b9acSAndroid Build Coastguard Worker	function upl_button(e) {
157*1c60b9acSAndroid Build Coastguard Worker		var fi = document.getElementById("file");
158*1c60b9acSAndroid Build Coastguard Worker
159*1c60b9acSAndroid Build Coastguard Worker		clear_errors();
160*1c60b9acSAndroid Build Coastguard Worker		e.preventDefault();
161*1c60b9acSAndroid Build Coastguard Worker
162*1c60b9acSAndroid Build Coastguard Worker		([...fi.files]).forEach(do_upload);
163*1c60b9acSAndroid Build Coastguard Worker	}
164*1c60b9acSAndroid Build Coastguard Worker
165*1c60b9acSAndroid Build Coastguard Worker	function body_drop(e) {
166*1c60b9acSAndroid Build Coastguard Worker		e.preventDefault();
167*1c60b9acSAndroid Build Coastguard Worker	}
168*1c60b9acSAndroid Build Coastguard Worker
169*1c60b9acSAndroid Build Coastguard Worker	function inp() {
170*1c60b9acSAndroid Build Coastguard Worker		var fi = document.getElementById("file"),
171*1c60b9acSAndroid Build Coastguard Worker		upl = document.getElementById("upl");
172*1c60b9acSAndroid Build Coastguard Worker		console.log("inp");
173*1c60b9acSAndroid Build Coastguard Worker		upl.disabled = !fi.files.length;
174*1c60b9acSAndroid Build Coastguard Worker	}
175*1c60b9acSAndroid Build Coastguard Worker
176*1c60b9acSAndroid Build Coastguard Worker	function delfile(e)
177*1c60b9acSAndroid Build Coastguard Worker	{
178*1c60b9acSAndroid Build Coastguard Worker		e.stopPropagation();
179*1c60b9acSAndroid Build Coastguard Worker		e.preventDefault();
180*1c60b9acSAndroid Build Coastguard Worker
181*1c60b9acSAndroid Build Coastguard Worker		ws.send("{\"del\":\"" + decodeURI(e.target.getAttribute("file")) +
182*1c60b9acSAndroid Build Coastguard Worker		"\"}");
183*1c60b9acSAndroid Build Coastguard Worker	}
184*1c60b9acSAndroid Build Coastguard Worker
185*1c60b9acSAndroid Build Coastguard Worker	function get_appropriate_ws_url(extra_url)
186*1c60b9acSAndroid Build Coastguard Worker	{
187*1c60b9acSAndroid Build Coastguard Worker		var pcol;
188*1c60b9acSAndroid Build Coastguard Worker		var u = document.URL;
189*1c60b9acSAndroid Build Coastguard Worker
190*1c60b9acSAndroid Build Coastguard Worker		/*
191*1c60b9acSAndroid Build Coastguard Worker		 * We open the websocket encrypted if this page came on an
192*1c60b9acSAndroid Build Coastguard Worker		 * https:// url itself, otherwise unencrypted
193*1c60b9acSAndroid Build Coastguard Worker		 */
194*1c60b9acSAndroid Build Coastguard Worker
195*1c60b9acSAndroid Build Coastguard Worker		if (u.substring(0, 5) === "https") {
196*1c60b9acSAndroid Build Coastguard Worker			pcol = "wss://";
197*1c60b9acSAndroid Build Coastguard Worker			u = u.substr(8);
198*1c60b9acSAndroid Build Coastguard Worker		} else {
199*1c60b9acSAndroid Build Coastguard Worker			pcol = "ws://";
200*1c60b9acSAndroid Build Coastguard Worker			if (u.substring(0, 4) === "http")
201*1c60b9acSAndroid Build Coastguard Worker				u = u.substr(7);
202*1c60b9acSAndroid Build Coastguard Worker		}
203*1c60b9acSAndroid Build Coastguard Worker
204*1c60b9acSAndroid Build Coastguard Worker		u = u.split("/");
205*1c60b9acSAndroid Build Coastguard Worker
206*1c60b9acSAndroid Build Coastguard Worker		/* + "/xxx" bit is for IE10 workaround */
207*1c60b9acSAndroid Build Coastguard Worker
208*1c60b9acSAndroid Build Coastguard Worker		return pcol + u[0] + "/" + extra_url;
209*1c60b9acSAndroid Build Coastguard Worker	}
210*1c60b9acSAndroid Build Coastguard Worker
211*1c60b9acSAndroid Build Coastguard Worker	function new_ws(urlpath, protocol)
212*1c60b9acSAndroid Build Coastguard Worker	{
213*1c60b9acSAndroid Build Coastguard Worker		return new WebSocket(urlpath, protocol);
214*1c60b9acSAndroid Build Coastguard Worker	}
215*1c60b9acSAndroid Build Coastguard Worker
216*1c60b9acSAndroid Build Coastguard Worker	document.addEventListener("DOMContentLoaded", function() {
217*1c60b9acSAndroid Build Coastguard Worker		var da = document.getElementById("da"),
218*1c60b9acSAndroid Build Coastguard Worker		fi = document.getElementById("file"),
219*1c60b9acSAndroid Build Coastguard Worker		upl = document.getElementById("upl");
220*1c60b9acSAndroid Build Coastguard Worker
221*1c60b9acSAndroid Build Coastguard Worker		da.addEventListener("dragenter", da_enter, false);
222*1c60b9acSAndroid Build Coastguard Worker		da.addEventListener("dragleave", da_leave, false);
223*1c60b9acSAndroid Build Coastguard Worker		da.addEventListener("dragover", da_over, false);
224*1c60b9acSAndroid Build Coastguard Worker		da.addEventListener("drop", da_drop, false);
225*1c60b9acSAndroid Build Coastguard Worker
226*1c60b9acSAndroid Build Coastguard Worker		upl.addEventListener("click", upl_button, false);
227*1c60b9acSAndroid Build Coastguard Worker		fi.addEventListener("change", inp, false);
228*1c60b9acSAndroid Build Coastguard Worker
229*1c60b9acSAndroid Build Coastguard Worker		window.addEventListener("dragover", body_drop, false);
230*1c60b9acSAndroid Build Coastguard Worker		window.addEventListener("drop", body_drop, false);
231*1c60b9acSAndroid Build Coastguard Worker
232*1c60b9acSAndroid Build Coastguard Worker		ws = new_ws(get_appropriate_ws_url(""), "lws-deaddrop");
233*1c60b9acSAndroid Build Coastguard Worker		try {
234*1c60b9acSAndroid Build Coastguard Worker			ws.onopen = function() {
235*1c60b9acSAndroid Build Coastguard Worker				var dd = document.getElementById("ddrop"),
236*1c60b9acSAndroid Build Coastguard Worker				da = document.getElementById("da");
237*1c60b9acSAndroid Build Coastguard Worker
238*1c60b9acSAndroid Build Coastguard Worker				dd.classList.remove("noconn");
239*1c60b9acSAndroid Build Coastguard Worker				da.classList.remove("disa");
240*1c60b9acSAndroid Build Coastguard Worker			};
241*1c60b9acSAndroid Build Coastguard Worker
242*1c60b9acSAndroid Build Coastguard Worker			ws.onmessage = function got_packet(msg) {
243*1c60b9acSAndroid Build Coastguard Worker				var j = JSON.parse(msg.data), s = "", n,
244*1c60b9acSAndroid Build Coastguard Worker				t = document.getElementById("dd-list");
245*1c60b9acSAndroid Build Coastguard Worker
246*1c60b9acSAndroid Build Coastguard Worker				server_max_size = j.max_size;
247*1c60b9acSAndroid Build Coastguard Worker				document.getElementById("size").innerHTML =
248*1c60b9acSAndroid Build Coastguard Worker					"Server maximum file size " +
249*1c60b9acSAndroid Build Coastguard Worker					humanize(j.max_size);
250*1c60b9acSAndroid Build Coastguard Worker
251*1c60b9acSAndroid Build Coastguard Worker				s += "<table class=\"nb\">";
252*1c60b9acSAndroid Build Coastguard Worker				for (n = 0; n < j.files.length; n++) {
253*1c60b9acSAndroid Build Coastguard Worker					var date = new Date(j.files[n].mtime * 1000);
254*1c60b9acSAndroid Build Coastguard Worker					s += "<tr><td class=\"dow r\">" +
255*1c60b9acSAndroid Build Coastguard Worker					humanize(j.files[n].size) +
256*1c60b9acSAndroid Build Coastguard Worker					"</td><td class=\"dow\">" +
257*1c60b9acSAndroid Build Coastguard Worker					date.toDateString() + " " +
258*1c60b9acSAndroid Build Coastguard Worker					date.toLocaleTimeString() +
259*1c60b9acSAndroid Build Coastguard Worker					"</td><td>";
260*1c60b9acSAndroid Build Coastguard Worker					if (j.files[n].yours === 1)
261*1c60b9acSAndroid Build Coastguard Worker						s += "<img id=\"d" + n +
262*1c60b9acSAndroid Build Coastguard Worker					  "\" class=\"delbtn\" file=\"" +
263*1c60b9acSAndroid Build Coastguard Worker						lws_urlencode(san(j.files[n].name)) + "\">";
264*1c60b9acSAndroid Build Coastguard Worker					else
265*1c60b9acSAndroid Build Coastguard Worker						s += " ";
266*1c60b9acSAndroid Build Coastguard Worker
267*1c60b9acSAndroid Build Coastguard Worker					s += "</td><td class=\"ogn\"><a href=\"get/" +
268*1c60b9acSAndroid Build Coastguard Worker					lws_urlencode(san(j.files[n].name)) +
269*1c60b9acSAndroid Build Coastguard Worker					  "\" download>" +
270*1c60b9acSAndroid Build Coastguard Worker					san(j.files[n].name) + "</a></td></tr>";
271*1c60b9acSAndroid Build Coastguard Worker				}
272*1c60b9acSAndroid Build Coastguard Worker				s += "</table>";
273*1c60b9acSAndroid Build Coastguard Worker
274*1c60b9acSAndroid Build Coastguard Worker				t.innerHTML = s;
275*1c60b9acSAndroid Build Coastguard Worker
276*1c60b9acSAndroid Build Coastguard Worker				for (n = 0; n < j.files.length; n++) {
277*1c60b9acSAndroid Build Coastguard Worker					var d = document.getElementById("d" + n);
278*1c60b9acSAndroid Build Coastguard Worker					if (d)
279*1c60b9acSAndroid Build Coastguard Worker						d.addEventListener("click",
280*1c60b9acSAndroid Build Coastguard Worker								delfile, false);
281*1c60b9acSAndroid Build Coastguard Worker				}
282*1c60b9acSAndroid Build Coastguard Worker			};
283*1c60b9acSAndroid Build Coastguard Worker
284*1c60b9acSAndroid Build Coastguard Worker			ws.onclose = function() {
285*1c60b9acSAndroid Build Coastguard Worker				var dd = document.getElementById("ddrop"),
286*1c60b9acSAndroid Build Coastguard Worker				da = document.getElementById("da");
287*1c60b9acSAndroid Build Coastguard Worker
288*1c60b9acSAndroid Build Coastguard Worker				dd.classList.add("noconn");
289*1c60b9acSAndroid Build Coastguard Worker				da.classList.add("disa");
290*1c60b9acSAndroid Build Coastguard Worker			};
291*1c60b9acSAndroid Build Coastguard Worker		} catch(exception) {
292*1c60b9acSAndroid Build Coastguard Worker			alert("<p>Error " + exception);
293*1c60b9acSAndroid Build Coastguard Worker		}
294*1c60b9acSAndroid Build Coastguard Worker
295*1c60b9acSAndroid Build Coastguard Worker	});
296*1c60b9acSAndroid Build Coastguard Worker}());
297