Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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) { |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 11 | navigator.webkitPersistentStorage.requestQuota(1024 * 1024, |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 12 | function(bytes) { |
| 13 | common.updateStatus( |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 14 | 'Allocated ' + bytes + ' bytes of persistant storage.'); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 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 | } |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 53 | function addNameToSelectElements(cssClass, handle, name) { |
| 54 | var text = '[' + handle + '] ' + name; |
| 55 | var selectEls = document.querySelectorAll(cssClass); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 56 | for (var i = 0; i < selectEls.length; ++i) { |
| 57 | var optionEl = document.createElement('option'); |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 58 | optionEl.setAttribute('value', handle); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 59 | optionEl.appendChild(document.createTextNode(text)); |
| 60 | selectEls[i].appendChild(optionEl); |
| 61 | } |
| 62 | } |
| 63 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 64 | function removeNameFromSelectElements(cssClass, handle) { |
| 65 | var optionEls = document.querySelectorAll(cssClass + ' > option'); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 66 | for (var i = 0; i < optionEls.length; ++i) { |
| 67 | var optionEl = optionEls[i]; |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 68 | if (optionEl.value == handle) { |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 69 | var selectEl = optionEl.parentNode; |
| 70 | selectEl.removeChild(optionEl); |
| 71 | } |
| 72 | } |
| 73 | } |
| 74 | |
| 75 | var filehandle_map = {}; |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 76 | var dirhandle_map = {}; |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 87 | addNameToSelectElements('.file-handle', filehandle, filename); |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 88 | common.logMessage('File ' + filename + ' opened successfully.'); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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]; |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 98 | removeNameFromSelectElements('.file-handle', filehandle, filename); |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 99 | common.logMessage('File ' + filename + ' closed successfully.'); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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]; |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 110 | common.logMessage('Read "' + data + '" from file ' + filename + '.'); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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 + |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 122 | '.'); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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 + |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 135 | '.'); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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) { |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 144 | common.logMessage('File ' + filename + ' has size ' + size + '.'); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 145 | } |
| 146 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 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); |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 156 | common.logMessage('Directory ' + dirname + ' opened successfully.'); |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 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 === '') { |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 167 | common.logMessage('End of directory.'); |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 168 | } else { |
| 169 | common.logMessage('Read entry ("' + name + '", ino = ' + ino + |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 170 | ') from directory ' + dirname + '.'); |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 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); |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 184 | common.logMessage('Directory ' + dirname + ' closed successfully.'); |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 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) { |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 194 | common.logMessage('Directory ' + dirname + ' created successfully.'); |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 195 | } |
| 196 | |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 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 | |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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|. |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 218 | * @return {boolean} Whether |s| starts with |prefix|. |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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:')) { |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 239 | common.logMessage(msg); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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) { |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 248 | common.logMessage('Error: Bad message ' + funcName + |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 249 | ' received from NaCl module.'); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 250 | return; |
| 251 | } |
| 252 | |
| 253 | resultFunc.apply(null, params.slice(1)); |
| 254 | } |
| 255 | } |