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 // Called by the common.js module. 10 function 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. 22 function 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 41 function 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 53 function 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 64 function 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 75 var filehandle_map = {}; 76 var dirhandle_map = {}; 77 78 function 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 84 function fopenResult(filename, filehandle) { 85 filehandle_map[filehandle] = filename; 86 87 addNameToSelectElements('.file-handle', filehandle, filename); 88 common.logMessage('File ' + filename + ' opened successfully.'); 89 } 90 91 function fclose(e) { 92 var filehandle = document.getElementById('fcloseHandle').value; 93 nacl_module.postMessage(makeCall('fclose', filehandle)); 94 } 95 96 function fcloseResult(filehandle) { 97 var filename = filehandle_map[filehandle]; 98 removeNameFromSelectElements('.file-handle', filehandle, filename); 99 common.logMessage('File ' + filename + ' closed successfully.'); 100 } 101 102 function 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 108 function freadResult(filehandle, data) { 109 var filename = filehandle_map[filehandle]; 110 common.logMessage('Read "' + data + '" from file ' + filename + '.'); 111 } 112 113 function 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 119 function fwriteResult(filehandle, bytes_written) { 120 var filename = filehandle_map[filehandle]; 121 common.logMessage('Wrote ' + bytes_written + ' bytes to file ' + filename + 122 '.'); 123 } 124 125 function 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 132 function fseekResult(filehandle, filepos) { 133 var filename = filehandle_map[filehandle]; 134 common.logMessage('Seeked to location ' + filepos + ' in file ' + filename + 135 '.'); 136 } 137 138 function stat(e) { 139 var filename = document.getElementById('statFilename').value; 140 nacl_module.postMessage(makeCall('stat', filename)); 141 } 142 143 function statResult(filename, size) { 144 common.logMessage('File ' + filename + ' has size ' + size + '.'); 145 } 146 147 function opendir(e) { 148 var dirname = document.getElementById('opendirDirname').value; 149 nacl_module.postMessage(makeCall('opendir', dirname)); 150 } 151 152 function opendirResult(dirname, dirhandle) { 153 dirhandle_map[dirhandle] = dirname; 154 155 addNameToSelectElements('.dir-handle', dirhandle, dirname); 156 common.logMessage('Directory ' + dirname + ' opened successfully.'); 157 } 158 159 function readdir(e) { 160 var dirhandle = document.getElementById('readdirHandle').value; 161 nacl_module.postMessage(makeCall('readdir', dirhandle)); 162 } 163 164 function 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 174 function closedir(e) { 175 var dirhandle = document.getElementById('closedirHandle').value; 176 nacl_module.postMessage(makeCall('closedir', dirhandle)); 177 } 178 179 function 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 187 function 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 193 function mkdirResult(dirname) { 194 common.logMessage('Directory ' + dirname + ' created successfully.'); 195 } 196 197 function gethostbyname(e) { 198 var name = document.getElementById('gethostbynameName').value; 199 nacl_module.postMessage(makeCall('gethostbyname', name)); 200 } 201 202 203 function gethostbynameResult(name, addr_type) { 204 common.logMessage('gethostbyname returned successfully\n'); 205 common.logMessage('h_name = ' + name + '.\n'); 206 common.logMessage('h_addr_type = ' + addr_type + '.\n'); 207 for (var i = 2; i < arguments.length; i++) { 208 common.logMessage('Address number ' + (i-1) + ' = ' + arguments[i] + '.\n'); 209 } 210 common.logMessage('\n'); 211 } 212 213 /** 214 * Return true when |s| starts with the string |prefix|. 215 * 216 * @param {string} s The string to search. 217 * @param {string} prefix The prefix to search for in |s|. 218 * @return {boolean} Whether |s| starts with |prefix|. 219 */ 220 function startsWith(s, prefix) { 221 // indexOf would search the entire string, lastIndexOf(p, 0) only checks at 222 // the first index. See: http://stackoverflow.com/a/4579228 223 return s.lastIndexOf(prefix, 0) === 0; 224 } 225 226 function makeCall(func) { 227 var message = func; 228 for (var i = 1; i < arguments.length; ++i) { 229 message += '\1' + arguments[i]; 230 } 231 232 return message; 233 } 234 235 // Called by the common.js module. 236 function handleMessage(message_event) { 237 var msg = message_event.data; 238 if (startsWith(msg, 'Error:')) { 239 common.logMessage(msg); 240 } else { 241 // Result from a function call. 242 var params = msg.split('\1'); 243 var funcName = params[0]; 244 var funcResultName = funcName + 'Result'; 245 var resultFunc = window[funcResultName]; 246 247 if (!resultFunc) { 248 common.logMessage('Error: Bad message ' + funcName + 249 ' received from NaCl module.'); 250 return; 251 } 252 253 resultFunc.apply(null, params.slice(1)); 254 } 255 } 256