| 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 // Called by the common.js module. | |
| 10 function domContentLoaded(name, tc, config, width, height) { | |
| 11 window.webkitStorageInfo.requestQuota(window.PERSISTENT, 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 document.getElementById('fopenExecute').addEventListener('click', fopen); | |
| 29 document.getElementById('fcloseExecute').addEventListener('click', fclose); | |
| 30 document.getElementById('freadExecute').addEventListener('click', fread); | |
| 31 document.getElementById('fwriteExecute').addEventListener('click', fwrite); | |
| 32 document.getElementById('fseekExecute').addEventListener('click', fseek); | |
| 33 } | |
| 34 | |
| 35 function onRadioClicked(e) { | |
| 36 var divId = this.id.slice(5); // skip "radio" | |
| 37 var functionEls = document.querySelectorAll('.function'); | |
| 38 for (var i = 0; i < functionEls.length; ++i) { | |
| 39 var visible = functionEls[i].id === divId; | |
| 40 if (functionEls[i].id === divId) | |
| 41 functionEls[i].removeAttribute('hidden'); | |
| 42 else | |
| 43 functionEls[i].setAttribute('hidden'); | |
| 44 } | |
| 45 } | |
| 46 | |
| 47 function addFilenameToSelectElements(filehandle, filename) { | |
| 48 var text = '[' + filehandle + '] ' + filename; | |
| 49 var selectEls = document.querySelectorAll('select.file-handle'); | |
| 50 for (var i = 0; i < selectEls.length; ++i) { | |
| 51 var optionEl = document.createElement('option'); | |
| 52 optionEl.setAttribute('value', filehandle); | |
| 53 optionEl.appendChild(document.createTextNode(text)); | |
| 54 selectEls[i].appendChild(optionEl); | |
| 55 } | |
| 56 } | |
| 57 | |
| 58 function removeFilenameFromSelectElements(filehandle) { | |
| 59 var optionEls = document.querySelectorAll('select.file-handle > option'); | |
| 60 for (var i = 0; i < optionEls.length; ++i) { | |
| 61 var optionEl = optionEls[i]; | |
| 62 if (optionEl.value == filehandle) { | |
| 63 var selectEl = optionEl.parentNode; | |
| 64 selectEl.removeChild(optionEl); | |
| 65 } | |
| 66 } | |
| 67 } | |
| 68 | |
| 69 var filehandle_map = {}; | |
| 70 | |
| 71 function fopen(e) { | |
| 72 var filename = document.getElementById('fopenFilename').value; | |
| 73 var access = document.getElementById('fopenMode').value; | |
| 74 nacl_module.postMessage(makeCall('fopen', filename, access)); | |
| 75 } | |
| 76 | |
| 77 function fopen_result(filename, filehandle) { | |
| 78 filehandle_map[filehandle] = filename; | |
| 79 | |
| 80 addFilenameToSelectElements(filehandle, filename) | |
| 81 logMessage('File ' + filename + ' opened successfully.'); | |
| 82 } | |
| 83 | |
| 84 function fclose(e) { | |
| 85 var filehandle = document.getElementById('fcloseHandle').value; | |
| 86 nacl_module.postMessage(makeCall('fclose', filehandle)); | |
| 87 } | |
| 88 | |
| 89 function fclose_result(filehandle) { | |
| 90 var filename = filehandle_map[filehandle]; | |
| 91 removeFilenameFromSelectElements(filehandle, filename); | |
| 92 logMessage('File ' + filename + ' closed successfully.'); | |
| 93 } | |
| 94 | |
| 95 function fread(e) { | |
| 96 var filehandle = document.getElementById('freadHandle').value; | |
| 97 var numBytes = document.getElementById('freadBytes').value; | |
| 98 nacl_module.postMessage(makeCall('fread', filehandle, numBytes)); | |
| 99 } | |
| 100 | |
| 101 function fread_result(filehandle, data) { | |
| 102 var filename = filehandle_map[filehandle]; | |
| 103 logMessage('Read "' + data + '" from file ' + filename + '.'); | |
| 104 } | |
| 105 | |
| 106 function fwrite(e) { | |
| 107 var filehandle = document.getElementById('fwriteHandle').value; | |
| 108 var data = document.getElementById('fwriteData').value; | |
| 109 nacl_module.postMessage(makeCall('fwrite', filehandle, data)); | |
| 110 } | |
| 111 | |
| 112 function fwrite_result(filehandle, bytes_written) { | |
| 113 var filename = filehandle_map[filehandle]; | |
| 114 logMessage('Wrote ' + bytes_written + ' bytes to file ' + filename + '.'); | |
| 115 } | |
| 116 | |
| 117 function fseek(e) { | |
| 118 var filehandle = document.getElementById('fseekHandle').value; | |
| 119 var offset = document.getElementById('fseekOffset').value; | |
| 120 var whence = document.getElementById('fseekWhence').value; | |
| 121 nacl_module.postMessage(makeCall('fseek', filehandle, offset, whence)); | |
| 122 } | |
| 123 | |
| 124 function fseek_result(filehandle, filepos) { | |
| 125 var filename = filehandle_map[filehandle]; | |
| 126 logMessage('Seeked to location ' + filepos + ' in file ' + filename + '.'); | |
| 127 } | |
| 128 | |
| 129 /** | |
| 130 * Return true when |s| starts with the string |prefix|. | |
| 131 * | |
| 132 * @param {string} s The string to search. | |
| 133 * @param {string} prefix The prefix to search for in |s|. | |
| 134 */ | |
| 135 function startsWith(s, prefix) { | |
| 136 // indexOf would search the entire string, lastIndexOf(p, 0) only checks at | |
| 137 // the first index. See: http://stackoverflow.com/a/4579228 | |
| 138 return s.lastIndexOf(prefix, 0) === 0; | |
| 139 } | |
| 140 | |
| 141 function logMessage(msg) { | |
| 142 var logEl = document.getElementById('log'); | |
| 143 | |
| 144 // Perform some basic escaping. | |
| 145 msg = msg.replace(/&/g, '&') | |
| 146 .replace(/</g, '<') | |
| 147 .replace(/>/g, '>') | |
| 148 .replace(/"/g, '"') | |
| 149 .replace(/'/g, '''); | |
| 150 | |
| 151 logEl.innerHTML += msg + '<br>'; | |
| 152 } | |
| 153 | |
| 154 function makeCall(func) { | |
| 155 var message = func; | |
| 156 for (var i = 1; i < arguments.length; ++i) { | |
| 157 message += '\1' + arguments[i]; | |
| 158 } | |
| 159 | |
| 160 return message; | |
| 161 } | |
| 162 | |
| 163 // Called by the common.js module. | |
| 164 function handleMessage(message_event) { | |
| 165 var msg = message_event.data; | |
| 166 if (startsWith(msg, 'Error:')) { | |
| 167 logMessage(msg); | |
| 168 } else { | |
| 169 // Result from a function call. | |
| 170 var params = msg.split('\1'); | |
| 171 var func_name = params[0]; | |
| 172 var func_result_name = func_name + '_result'; | |
| 173 var result_func = window[func_result_name]; | |
| 174 | |
| 175 if (!result_func) { | |
| 176 logMessage('Error: Bad message received from NaCl module.'); | |
| 177 return; | |
| 178 } | |
| 179 | |
| 180 result_func.apply(null, params.slice(1)); | |
| 181 } | |
| 182 } | |
| OLD | NEW |