example.js revision a36e5920737c6adbddd3e43b760e5de8431db6e0
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 197/** 198 * Return true when |s| starts with the string |prefix|. 199 * 200 * @param {string} s The string to search. 201 * @param {string} prefix The prefix to search for in |s|. 202 * @return {boolean} Whether |s| starts with |prefix|. 203 */ 204function startsWith(s, prefix) { 205 // indexOf would search the entire string, lastIndexOf(p, 0) only checks at 206 // the first index. See: http://stackoverflow.com/a/4579228 207 return s.lastIndexOf(prefix, 0) === 0; 208} 209 210function makeCall(func) { 211 var message = func; 212 for (var i = 1; i < arguments.length; ++i) { 213 message += '\1' + arguments[i]; 214 } 215 216 return message; 217} 218 219// Called by the common.js module. 220function handleMessage(message_event) { 221 var msg = message_event.data; 222 if (startsWith(msg, 'Error:')) { 223 common.logMessage(msg); 224 } else { 225 // Result from a function call. 226 var params = msg.split('\1'); 227 var funcName = params[0]; 228 var funcResultName = funcName + 'Result'; 229 var resultFunc = window[funcResultName]; 230 231 if (!resultFunc) { 232 common.logMessage('Error: Bad message ' + funcName + 233 ' received from NaCl module.'); 234 return; 235 } 236 237 resultFunc.apply(null, params.slice(1)); 238 } 239} 240