]>
git.wh0rd.org - chrome-ext/crftp.git/blob - pnacl/crftp.js
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
,