1 // Written by Mike Frysinger <vapier@gmail.com>. Released into the public domain. Suck it.
3 function $(s) { return document.querySelector(s); }
5 var crftp = (function() {
7 var nacl_module = null;
9 var mimeType = 'application/x-pnacl';
11 // Generate the NaCl module. We do this on the fly so we can attach to events
12 // in the parent element in case loading the NaCl module crashed.
15 // Attach listeners early.
16 var listener = document.getElementById('listener');
17 listener.addEventListener('load', moduleDidLoad, true);
18 listener.addEventListener('message', handleMessage, true);
19 listener.addEventListener('error', handleError, true);
20 listener.addEventListener('crash', handleCrash, true);
22 // Create the NaCl module.
23 var embed = nacl_module = document.createElement('embed');
24 embed.name = embed.id = 'nacl_module';
25 // Don't hide it in case there is a plugin/load error.
26 embed.width = embed.height = 200;
28 embed.type = mimeType;
30 // Attach it to the DOM so it'll start running.
31 listener.appendChild(embed);
33 crftp.module = nacl_module;
36 function handleError(event)
38 set_status('ERROR [' + nacl_module.lastError + ']');
41 function handleCrash(event)
43 if (nacl_module.exitStatus == -1)
44 set_status('CRASHED');
46 set_status('EXITED [' + nacl_module.exitStatus + ']');
50 function moduleDidLoad()
52 set_status('RUNNING');
53 nacl_module.style.height = '0';
56 $('#connect').focus();
59 // Callback from the NaCl module (PPB_Messaging.PostMessage).
60 var levels = Array('status', 'response', 'cmd', 'error', 'release');
61 function handleMessage(message_event)
63 if (typeof message_event.data == "string") {
64 log(message_event.data, levels[0]);
66 var event = message_event.data[0];
67 var data = message_event.data[1];
69 URL.revokeObjectURL(data);
71 log(data, levels[event]);
75 // Unload the NaCl module.
78 nacl_module.parentNode.removeChild(nacl_module);
79 crftp.module = nacl_module = null;
82 var log_ele = undefined;
83 function log(message, opt_class)
85 var span = document.createElement('span');
86 span.className = opt_class || 'status';
87 if (message.substr(-1) != '\n')
89 span.textContent = message;
90 log_ele.appendChild(span);
91 log_ele.scrollTop = log_ele.scrollHeight;
94 var status_ele = undefined;
95 function set_status(status)
97 status_ele.innerHTML = status;
100 function initialize(nmf)
104 log_ele = document.getElementById('log');
105 status_ele = document.getElementById('status');
107 set_status('Page loaded');
109 // See if NaCl is even supported. Makes debugging easier.
110 if (navigator.mimeTypes[mimeType] === undefined) {
111 set_status('Browser does not support ' + mimeType + ' or is disabled');
113 // We're good, so try loading the module if needed.
114 } else if (nacl_module == null) {
115 set_status('Loading NaCl module');
118 set_status('Waiting');
122 function postMessage()
124 var args = Array.prototype.slice.call(arguments);
125 nacl_module.postMessage(args);
128 function connect(host, opt_port, opt_user, opt_pass)
130 if (opt_port === undefined) {
131 if (host.indexOf(':') == -1)
136 postMessage('connect', host);
138 if (opt_user !== undefined)
139 login(opt_user, opt_pass);
142 function login(user, opt_pass)
144 var pass = opt_pass || 'luser@crftp';
145 postMessage('login', user, pass);
148 function disconnect()
150 postMessage('disconnect');
155 postMessage('chdir', path);
159 postMessage('dir', path);
163 postMessage('list', path);
167 files.forEach(function(file) {
168 var url = file[0], name = file[1];
169 postMessage('put', url, name);
174 files.forEach(function(file) {
175 var url = file[0], name = file[1];
176 postMessage('get', url, name);
185 initialize: initialize,
188 disconnect: disconnect,