| OLD | NEW |
| (Empty) |
| 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 | |
| 5 function moduleDidLoad() { | |
| 6 common.hideModule(); | |
| 7 } | |
| 8 | |
| 9 function $(id) { | |
| 10 return document.getElementById(id); | |
| 11 } | |
| 12 | |
| 13 // Called by the common.js module. | |
| 14 function domContentLoaded(name, tc, config, width, height) { | |
| 15 navigator.webkitPersistentStorage.requestQuota(1024 * 1024, | |
| 16 function(bytes) { | |
| 17 common.updateStatus( | |
| 18 'Allocated ' + bytes + ' bytes of persistant storage.'); | |
| 19 common.attachDefaultListeners(); | |
| 20 common.createNaClModule(name, tc, config, width, height); | |
| 21 }, | |
| 22 function(e) { alert('Failed to allocate space') }); | |
| 23 } | |
| 24 | |
| 25 // Called by the common.js module. | |
| 26 function attachListeners() { | |
| 27 var radioEls = document.querySelectorAll('input[type="radio"]'); | |
| 28 for (var i = 0; i < radioEls.length; ++i) { | |
| 29 radioEls[i].addEventListener('click', onRadioClicked); | |
| 30 } | |
| 31 | |
| 32 // Wire up the 'click' event for each function's button. | |
| 33 var functionEls = document.querySelectorAll('.function'); | |
| 34 for (var i = 0; i < functionEls.length; ++i) { | |
| 35 var functionEl = functionEls[i]; | |
| 36 var id = functionEl.getAttribute('id'); | |
| 37 var buttonEl = functionEl.querySelector('button'); | |
| 38 | |
| 39 // The function name matches the element id. | |
| 40 var func = window[id]; | |
| 41 buttonEl.addEventListener('click', func); | |
| 42 } | |
| 43 | |
| 44 $('pipe_input_box').addEventListener('keypress', onPipeInput) | |
| 45 $('pipe_output').disabled = true; | |
| 46 | |
| 47 $('pipe_name').addEventListener('change', | |
| 48 function() { $('pipe_output').value = ''; }) | |
| 49 } | |
| 50 | |
| 51 // Called with keypress events on the pipe input box | |
| 52 function onPipeInput(e) { | |
| 53 // Create an arraybuffer containing the 16-bit char code | |
| 54 // from the keypress event. | |
| 55 var buffer = new ArrayBuffer(1*2); | |
| 56 var bufferView = new Uint16Array(buffer); | |
| 57 bufferView[0] = e.charCode; | |
| 58 | |
| 59 // Pass the buffer in a dictionary over the NaCl module | |
| 60 var pipeSelect = $('pipe_name'); | |
| 61 var pipeName = pipeSelect[pipeSelect.selectedIndex].value; | |
| 62 var message = { | |
| 63 pipe: pipeName, | |
| 64 operation: 'write', | |
| 65 payload: buffer, | |
| 66 }; | |
| 67 nacl_module.postMessage(message); | |
| 68 e.preventDefault(); | |
| 69 return false; | |
| 70 } | |
| 71 | |
| 72 function onRadioClicked(e) { | |
| 73 var divId = this.id.slice(5); // skip "radio" | |
| 74 var functionEls = document.querySelectorAll('.function'); | |
| 75 for (var i = 0; i < functionEls.length; ++i) { | |
| 76 var visible = functionEls[i].id === divId; | |
| 77 if (functionEls[i].id === divId) | |
| 78 functionEls[i].removeAttribute('hidden'); | |
| 79 else | |
| 80 functionEls[i].setAttribute('hidden', ''); | |
| 81 } | |
| 82 } | |
| 83 | |
| 84 function addNameToSelectElements(cssClass, handle, name) { | |
| 85 var text = '[' + handle + '] ' + name; | |
| 86 var selectEls = document.querySelectorAll(cssClass); | |
| 87 for (var i = 0; i < selectEls.length; ++i) { | |
| 88 var optionEl = document.createElement('option'); | |
| 89 optionEl.setAttribute('value', handle); | |
| 90 optionEl.appendChild(document.createTextNode(text)); | |
| 91 selectEls[i].appendChild(optionEl); | |
| 92 } | |
| 93 } | |
| 94 | |
| 95 function removeNameFromSelectElements(cssClass, handle) { | |
| 96 var optionEls = document.querySelectorAll(cssClass + ' > option'); | |
| 97 for (var i = 0; i < optionEls.length; ++i) { | |
| 98 var optionEl = optionEls[i]; | |
| 99 if (optionEl.value == handle) { | |
| 100 var selectEl = optionEl.parentNode; | |
| 101 selectEl.removeChild(optionEl); | |
| 102 } | |
| 103 } | |
| 104 } | |
| 105 | |
| 106 var filehandle_map = {}; | |
| 107 var dirhandle_map = {}; | |
| 108 | |
| 109 function fopen(e) { | |
| 110 var filename = $('fopenFilename').value; | |
| 111 var access = $('fopenMode').value; | |
| 112 postCall('fopen', filename, access, function(filename, filehandle) { | |
| 113 filehandle_map[filehandle] = filename; | |
| 114 | |
| 115 addNameToSelectElements('.file-handle', filehandle, filename); | |
| 116 common.logMessage('File ' + filename + ' opened successfully.'); | |
| 117 }); | |
| 118 } | |
| 119 | |
| 120 function fclose(e) { | |
| 121 var filehandle = parseInt($('fcloseHandle').value, 10); | |
| 122 postCall('fclose', filehandle, function(filehandle) { | |
| 123 var filename = filehandle_map[filehandle]; | |
| 124 removeNameFromSelectElements('.file-handle', filehandle, filename); | |
| 125 common.logMessage('File ' + filename + ' closed successfully.'); | |
| 126 }); | |
| 127 } | |
| 128 | |
| 129 function fread(e) { | |
| 130 var filehandle = parseInt($('freadHandle').value, 10); | |
| 131 var numBytes = parseInt($('freadBytes').value, 10); | |
| 132 postCall('fread', filehandle, numBytes, function(filehandle, data) { | |
| 133 var filename = filehandle_map[filehandle]; | |
| 134 common.logMessage('Read "' + data + '" from file ' + filename + '.'); | |
| 135 }); | |
| 136 } | |
| 137 | |
| 138 function fwrite(e) { | |
| 139 var filehandle = parseInt($('fwriteHandle').value, 10); | |
| 140 var data = $('fwriteData').value; | |
| 141 postCall('fwrite', filehandle, data, function(filehandle, bytesWritten) { | |
| 142 var filename = filehandle_map[filehandle]; | |
| 143 common.logMessage('Wrote ' + bytesWritten + ' bytes to file ' + filename + | |
| 144 '.'); | |
| 145 }); | |
| 146 } | |
| 147 | |
| 148 function fseek(e) { | |
| 149 var filehandle = parseInt($('fseekHandle').value, 10); | |
| 150 var offset = parseInt($('fseekOffset').value, 10); | |
| 151 var whence = parseInt($('fseekWhence').value, 10); | |
| 152 postCall('fseek', filehandle, offset, whence, function(filehandle, filepos) { | |
| 153 var filename = filehandle_map[filehandle]; | |
| 154 common.logMessage('Seeked to location ' + filepos + ' in file ' + filename + | |
| 155 '.'); | |
| 156 }); | |
| 157 } | |
| 158 | |
| 159 function fflush(e) { | |
| 160 var filehandle = parseInt($('fflushHandle').value, 10); | |
| 161 postCall('fflush', filehandle, function(filehandle, filepos) { | |
| 162 var filename = filehandle_map[filehandle]; | |
| 163 common.logMessage('flushed ' + filename + '.'); | |
| 164 }); | |
| 165 } | |
| 166 | |
| 167 function stat(e) { | |
| 168 var filename = $('statFilename').value; | |
| 169 postCall('stat', filename, function(filename, size) { | |
| 170 common.logMessage('File ' + filename + ' has size ' + size + '.'); | |
| 171 }); | |
| 172 } | |
| 173 | |
| 174 function opendir(e) { | |
| 175 var dirname = $('opendirDirname').value; | |
| 176 postCall('opendir', dirname, function(dirname, dirhandle) { | |
| 177 dirhandle_map[dirhandle] = dirname; | |
| 178 | |
| 179 addNameToSelectElements('.dir-handle', dirhandle, dirname); | |
| 180 common.logMessage('Directory ' + dirname + ' opened successfully.'); | |
| 181 }); | |
| 182 } | |
| 183 | |
| 184 function readdir(e) { | |
| 185 var dirhandle = parseInt($('readdirHandle').value, 10); | |
| 186 postCall('readdir', dirhandle, function(dirhandle, ino, name) { | |
| 187 var dirname = dirhandle_map[dirhandle]; | |
| 188 if (ino === undefined) { | |
| 189 common.logMessage('End of directory.'); | |
| 190 } else { | |
| 191 common.logMessage('Read entry ("' + name + '", ino = ' + ino + | |
| 192 ') from directory ' + dirname + '.'); | |
| 193 } | |
| 194 }); | |
| 195 } | |
| 196 | |
| 197 function closedir(e) { | |
| 198 var dirhandle = parseInt($('closedirHandle').value, 10); | |
| 199 postCall('closedir', dirhandle, function(dirhandle) { | |
| 200 var dirname = dirhandle_map[dirhandle]; | |
| 201 delete dirhandle_map[dirhandle]; | |
| 202 | |
| 203 removeNameFromSelectElements('.dir-handle', dirhandle, dirname); | |
| 204 common.logMessage('Directory ' + dirname + ' closed successfully.'); | |
| 205 }); | |
| 206 } | |
| 207 | |
| 208 function mkdir(e) { | |
| 209 var dirname = $('mkdirDirname').value; | |
| 210 var mode = parseInt($('mkdirMode').value, 10); | |
| 211 postCall('mkdir', dirname, mode, function(dirname) { | |
| 212 common.logMessage('Directory ' + dirname + ' created successfully.'); | |
| 213 }); | |
| 214 } | |
| 215 | |
| 216 function rmdir(e) { | |
| 217 var dirname = $('rmdirDirname').value; | |
| 218 postCall('rmdir', dirname, function(dirname) { | |
| 219 common.logMessage('Directory ' + dirname + ' removed successfully.'); | |
| 220 }); | |
| 221 } | |
| 222 | |
| 223 function chdir(e) { | |
| 224 var dirname = $('chdirDirname').value; | |
| 225 postCall('chdir', dirname, function(dirname) { | |
| 226 common.logMessage('Changed directory to: ' + dirname + '.'); | |
| 227 }); | |
| 228 } | |
| 229 | |
| 230 function getcwd(e) { | |
| 231 postCall('getcwd', function(dirname) { | |
| 232 common.logMessage('getcwd: ' + dirname + '.'); | |
| 233 }); | |
| 234 } | |
| 235 | |
| 236 function getaddrinfo(e) { | |
| 237 var name = $('getaddrinfoName').value; | |
| 238 var family = $('getaddrinfoFamily').value; | |
| 239 postCall('getaddrinfo', name, family, function(name, addrType) { | |
| 240 common.logMessage('getaddrinfo returned successfully'); | |
| 241 common.logMessage('ai_cannonname = ' + name + '.'); | |
| 242 var count = 1; | |
| 243 for (var i = 1; i < arguments.length; i+=2) { | |
| 244 var msg = 'Address number ' + count + ' = ' + arguments[i] + | |
| 245 ' (' + arguments[i+1] + ')'; | |
| 246 common.logMessage(msg); | |
| 247 count += 1; | |
| 248 } | |
| 249 }); | |
| 250 } | |
| 251 | |
| 252 function gethostbyname(e) { | |
| 253 var name = $('gethostbynameName').value; | |
| 254 postCall('gethostbyname', name, function(name, addrType) { | |
| 255 common.logMessage('gethostbyname returned successfully'); | |
| 256 common.logMessage('h_name = ' + name + '.'); | |
| 257 common.logMessage('h_addr_type = ' + addrType + '.'); | |
| 258 for (var i = 2; i < arguments.length; i++) { | |
| 259 common.logMessage('Address number ' + (i-1) + ' = ' + arguments[i] + '.'); | |
| 260 } | |
| 261 }); | |
| 262 } | |
| 263 | |
| 264 function connect(e) { | |
| 265 var host = $('connectHost').value; | |
| 266 var port = parseInt($('connectPort').value, 10); | |
| 267 postCall('connect', host, port, function(sockhandle) { | |
| 268 common.logMessage('connected'); | |
| 269 addNameToSelectElements('.sock-handle', sockhandle, '[socket]'); | |
| 270 }); | |
| 271 } | |
| 272 | |
| 273 function recv(e) { | |
| 274 var handle = parseInt($('recvHandle').value, 10); | |
| 275 var bufferSize = parseInt($('recvBufferSize').value, 10); | |
| 276 postCall('recv', handle, bufferSize, function(messageLen, message) { | |
| 277 common.logMessage("received " + messageLen + ' bytes: ' + message); | |
| 278 }); | |
| 279 } | |
| 280 | |
| 281 function send(e) { | |
| 282 var handle = parseInt($('sendHandle').value, 10); | |
| 283 var message = $('sendMessage').value; | |
| 284 postCall('send', handle, message, function(sentBytes) { | |
| 285 common.logMessage("sent bytes: " + sentBytes); | |
| 286 }); | |
| 287 } | |
| 288 | |
| 289 function close(e) { | |
| 290 var handle = parseInt($('closeHandle').value, 10); | |
| 291 postCall('close', handle, function(sock) { | |
| 292 removeNameFromSelectElements('.sock-handle', sock, "[socket]"); | |
| 293 common.logMessage("closed socket: " + sock); | |
| 294 }); | |
| 295 } | |
| 296 | |
| 297 var funcToCallback = {}; | |
| 298 | |
| 299 function postCall(func) { | |
| 300 var callback = arguments[arguments.length - 1]; | |
| 301 funcToCallback[func] = callback; | |
| 302 | |
| 303 nacl_module.postMessage({ | |
| 304 cmd: func, | |
| 305 args: Array.prototype.slice.call(arguments, 1, -1) | |
| 306 }); | |
| 307 } | |
| 308 | |
| 309 function ArrayBufferToString(buf) { | |
| 310 return String.fromCharCode.apply(null, new Uint16Array(buf)); | |
| 311 } | |
| 312 | |
| 313 // Called by the common.js module. | |
| 314 function handleMessage(message_event) { | |
| 315 var data = message_event.data; | |
| 316 if ((typeof(data) === 'string' || data instanceof String)) { | |
| 317 common.logMessage(data); | |
| 318 } else if (data instanceof Object) { | |
| 319 var pipeName = data['pipe'] | |
| 320 if (pipeName !== undefined) { | |
| 321 // Message for JavaScript I/O pipe | |
| 322 var operation = data['operation']; | |
| 323 if (operation == 'write') { | |
| 324 $('pipe_output').value += ArrayBufferToString(data['payload']); | |
| 325 } else if (operation == 'ack') { | |
| 326 common.logMessage(pipeName + ": ack:" + data['payload']); | |
| 327 } else { | |
| 328 common.logMessage('Got unexpected pipe operation: ' + operation); | |
| 329 } | |
| 330 } else { | |
| 331 // Result from a function call. | |
| 332 var params = data.args; | |
| 333 var funcName = data.cmd; | |
| 334 var callback = funcToCallback[funcName]; | |
| 335 | |
| 336 if (!callback) { | |
| 337 common.logMessage('Error: Bad message ' + funcName + | |
| 338 ' received from NaCl module.'); | |
| 339 return; | |
| 340 } | |
| 341 | |
| 342 delete funcToCallback[funcName]; | |
| 343 callback.apply(null, params); | |
| 344 } | |
| 345 } else { | |
| 346 common.logMessage('Error: Unknow message `' + data + | |
| 347 '` received from NaCl module.'); | |
| 348 } | |
| 349 } | |
| OLD | NEW |