example.js revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5function moduleDidLoad() { 6 common.hideModule(); 7} 8 9// Called by the common.js module. 10function domContentLoaded(name, tc, config, width, height) { 11 navigator.webkitPersistentStorage.requestQuota(1024 * 1024, 12 function(bytes) { 13 common.updateStatus( 14 'Allocated ' + bytes + ' bytes of persistant storage.'); 15 common.createNaClModule(name, tc, config, width, height); 16 common.attachDefaultListeners(); 17 }, 18 function(e) { alert('Failed to allocate space') }); 19} 20 21// Called by the common.js module. 22function attachListeners() { 23 var radioEls = document.querySelectorAll('input[type="radio"]'); 24 for (var i = 0; i < radioEls.length; ++i) { 25 radioEls[i].addEventListener('click', onRadioClicked); 26 } 27 28 // Wire up the 'click' event for each function's button. 29 var functionEls = document.querySelectorAll('.function'); 30 for (var i = 0; i < functionEls.length; ++i) { 31 var functionEl = functionEls[i]; 32 var id = functionEl.getAttribute('id'); 33 var buttonEl = functionEl.querySelector('button'); 34 35 // The function name matches the element id. 36 var func = window[id]; 37 buttonEl.addEventListener('click', func); 38 } 39} 40 41function onRadioClicked(e) { 42 var divId = this.id.slice(5); // skip "radio" 43 var functionEls = document.querySelectorAll('.function'); 44 for (var i = 0; i < functionEls.length; ++i) { 45 var visible = functionEls[i].id === divId; 46 if (functionEls[i].id === divId) 47 functionEls[i].removeAttribute('hidden'); 48 else 49 functionEls[i].setAttribute('hidden'); 50 } 51} 52 53function addNameToSelectElements(cssClass, handle, name) { 54 var text = '[' + handle + '] ' + name; 55 var selectEls = document.querySelectorAll(cssClass); 56 for (var i = 0; i < selectEls.length; ++i) { 57 var optionEl = document.createElement('option'); 58 optionEl.setAttribute('value', handle); 59 optionEl.appendChild(document.createTextNode(text)); 60 selectEls[i].appendChild(optionEl); 61 } 62} 63 64function removeNameFromSelectElements(cssClass, handle) { 65 var optionEls = document.querySelectorAll(cssClass + ' > option'); 66 for (var i = 0; i < optionEls.length; ++i) { 67 var optionEl = optionEls[i]; 68 if (optionEl.value == handle) { 69 var selectEl = optionEl.parentNode; 70 selectEl.removeChild(optionEl); 71 } 72 } 73} 74 75var filehandle_map = {}; 76var dirhandle_map = {}; 77 78function fopen(e) { 79 var filename = document.getElementById('fopenFilename').value; 80 var access = document.getElementById('fopenMode').value; 81 nacl_module.postMessage(makeCall('fopen', filename, access)); 82} 83 84function fopenResult(filename, filehandle) { 85 filehandle_map[filehandle] = filename; 86 87 addNameToSelectElements('.file-handle', filehandle, filename); 88 common.logMessage('File ' + filename + ' opened successfully.'); 89} 90 91function fclose(e) { 92 var filehandle = document.getElementById('fcloseHandle').value; 93 nacl_module.postMessage(makeCall('fclose', filehandle)); 94} 95 96function fcloseResult(filehandle) { 97 var filename = filehandle_map[filehandle]; 98 removeNameFromSelectElements('.file-handle', filehandle, filename); 99 common.logMessage('File ' + filename + ' closed successfully.'); 100} 101 102function fread(e) { 103 var filehandle = document.getElementById('freadHandle').value; 104 var numBytes = document.getElementById('freadBytes').value; 105 nacl_module.postMessage(makeCall('fread', filehandle, numBytes)); 106} 107 108function freadResult(filehandle, data) { 109 var filename = filehandle_map[filehandle]; 110 common.logMessage('Read "' + data + '" from file ' + filename + '.'); 111} 112 113function fwrite(e) { 114 var filehandle = document.getElementById('fwriteHandle').value; 115 var data = document.getElementById('fwriteData').value; 116 nacl_module.postMessage(makeCall('fwrite', filehandle, data)); 117} 118 119function fwriteResult(filehandle, bytes_written) { 120 var filename = filehandle_map[filehandle]; 121 common.logMessage('Wrote ' + bytes_written + ' bytes to file ' + filename + 122 '.'); 123} 124 125function fseek(e) { 126 var filehandle = document.getElementById('fseekHandle').value; 127 var offset = document.getElementById('fseekOffset').value; 128 var whence = document.getElementById('fseekWhence').value; 129 nacl_module.postMessage(makeCall('fseek', filehandle, offset, whence)); 130} 131 132function fseekResult(filehandle, filepos) { 133 var filename = filehandle_map[filehandle]; 134 common.logMessage('Seeked to location ' + filepos + ' in file ' + filename + 135 '.'); 136} 137 138function stat(e) { 139 var filename = document.getElementById('statFilename').value; 140 nacl_module.postMessage(makeCall('stat', filename)); 141} 142 143function statResult(filename, size) { 144 common.logMessage('File ' + filename + ' has size ' + size + '.'); 145} 146 147function opendir(e) { 148 var dirname = document.getElementById('opendirDirname').value; 149 nacl_module.postMessage(makeCall('opendir', dirname)); 150} 151 152function opendirResult(dirname, dirhandle) { 153 dirhandle_map[dirhandle] = dirname; 154 155 addNameToSelectElements('.dir-handle', dirhandle, dirname); 156 common.logMessage('Directory ' + dirname + ' opened successfully.'); 157} 158 159function readdir(e) { 160 var dirhandle = document.getElementById('readdirHandle').value; 161 nacl_module.postMessage(makeCall('readdir', dirhandle)); 162} 163 164function readdirResult(dirhandle, ino, name) { 165 var dirname = dirhandle_map[dirhandle]; 166 if (ino === '') { 167 common.logMessage('End of directory.'); 168 } else { 169 common.logMessage('Read entry ("' + name + '", ino = ' + ino + 170 ') from directory ' + dirname + '.'); 171 } 172} 173 174function closedir(e) { 175 var dirhandle = document.getElementById('closedirHandle').value; 176 nacl_module.postMessage(makeCall('closedir', dirhandle)); 177} 178 179function closedirResult(dirhandle) { 180 var dirname = dirhandle_map[dirhandle]; 181 delete dirhandle_map[dirhandle]; 182 183 removeNameFromSelectElements('.dir-handle', dirhandle, dirname); 184 common.logMessage('Directory ' + dirname + ' closed successfully.'); 185} 186 187function mkdir(e) { 188 var dirname = document.getElementById('mkdirDirname').value; 189 var mode = document.getElementById('mkdirMode').value; 190 nacl_module.postMessage(makeCall('mkdir', dirname, mode)); 191} 192 193function mkdirResult(dirname) { 194 common.logMessage('Directory ' + dirname + ' created successfully.'); 195} 196 197function rmdir(e) { 198 var dirname = document.getElementById('rmdirDirname').value; 199 nacl_module.postMessage(makeCall('rmdir', dirname)); 200} 201 202function rmdirResult(dirname) { 203 common.logMessage('Directory ' + dirname + ' removed successfully.'); 204} 205 206function chdir(e) { 207 var dirname = document.getElementById('chdirDirname').value; 208 nacl_module.postMessage(makeCall('chdir', dirname)); 209} 210 211function chdirResult(dirname) { 212 common.logMessage('Changed directory to: ' + dirname + '.'); 213} 214 215function getcwd(e) { 216 nacl_module.postMessage(makeCall('getcwd')); 217} 218 219function getcwdResult(dirname) { 220 common.logMessage('getcwd: ' + dirname + '.'); 221} 222 223function gethostbyname(e) { 224 var name = document.getElementById('gethostbynameName').value; 225 nacl_module.postMessage(makeCall('gethostbyname', name)); 226} 227 228function gethostbynameResult(name, addr_type) { 229 common.logMessage('gethostbyname returned successfully'); 230 common.logMessage('h_name = ' + name + '.'); 231 common.logMessage('h_addr_type = ' + addr_type + '.'); 232 for (var i = 2; i < arguments.length; i++) { 233 common.logMessage('Address number ' + (i-1) + ' = ' + arguments[i] + '.'); 234 } 235} 236 237function connect(e) { 238 var host = document.getElementById('connectHost').value; 239 var port = document.getElementById('connectPort').value; 240 nacl_module.postMessage(makeCall('connect', host, port)); 241} 242 243function connectResult(sockhandle) { 244 common.logMessage('connected'); 245 addNameToSelectElements('.sock-handle', sockhandle, '[socket]'); 246} 247 248function recv(e) { 249 var handle = document.getElementById('recvHandle').value; 250 var bufferSize = document.getElementById('recvBufferSize').value; 251 nacl_module.postMessage(makeCall('recv', handle, bufferSize)); 252} 253 254function recvResult(messageLen, message) { 255 common.logMessage("received " + messageLen + ' bytes: ' + message); 256} 257 258function send(e) { 259 var handle = document.getElementById('sendHandle').value; 260 var message = document.getElementById('sendMessage').value; 261 nacl_module.postMessage(makeCall('send', handle, message)); 262} 263 264function sendResult(sentBytes) { 265 common.logMessage("sent bytes: " + sentBytes); 266} 267 268function close(e) { 269 var handle = document.getElementById('closeHandle').value; 270 nacl_module.postMessage(makeCall('close', handle)); 271} 272 273function closeResult(sock) { 274 removeNameFromSelectElements('.sock-handle', sock, "[socket]"); 275 common.logMessage("closed socket: " + sock); 276} 277 278/** 279 * Return true when |s| starts with the string |prefix|. 280 * 281 * @param {string} s The string to search. 282 * @param {string} prefix The prefix to search for in |s|. 283 * @return {boolean} Whether |s| starts with |prefix|. 284 */ 285function startsWith(s, prefix) { 286 // indexOf would search the entire string, lastIndexOf(p, 0) only checks at 287 // the first index. See: http://stackoverflow.com/a/4579228 288 return s.lastIndexOf(prefix, 0) === 0; 289} 290 291function makeCall(func) { 292 var message = func; 293 for (var i = 1; i < arguments.length; ++i) { 294 message += '\1' + arguments[i]; 295 } 296 297 return message; 298} 299 300// Called by the common.js module. 301function handleMessage(message_event) { 302 var msg = message_event.data; 303 if (startsWith(msg, 'Error:')) { 304 common.logMessage(msg); 305 } else { 306 // Result from a function call. 307 var params = msg.split('\1'); 308 var funcName = params[0]; 309 var funcResultName = funcName + 'Result'; 310 var resultFunc = window[funcResultName]; 311 312 if (!resultFunc) { 313 common.logMessage('Error: Bad message ' + funcName + 314 ' received from NaCl module.'); 315 return; 316 } 317 318 resultFunc.apply(null, params.slice(1)); 319 } 320} 321