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.
5 function moduleDidLoad() {
9 // Called by the common.js module.
10 function domContentLoaded(name, tc, config, width, height) {
11 navigator.webkitPersistentStorage.requestQuota(1024 * 1024,
14 'Allocated ' + bytes + ' bytes of persistant storage.');
15 common.attachDefaultListeners();
16 common.createNaClModule(name, tc, config, width, height);
18 function(e) { alert('Failed to allocate space') });
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);
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');
35 // The function name matches the element id.
36 var func = window[id];
37 buttonEl.addEventListener('click', func);
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');
49 functionEls[i].setAttribute('hidden', '');
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);
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);
75 var filehandle_map = {};
76 var dirhandle_map = {};
79 var filename = document.getElementById('fopenFilename').value;
80 var access = document.getElementById('fopenMode').value;
81 nacl_module.postMessage(makeCall('fopen', filename, access));
84 function fopenResult(filename, filehandle) {
85 filehandle_map[filehandle] = filename;
87 addNameToSelectElements('.file-handle', filehandle, filename);
88 common.logMessage('File ' + filename + ' opened successfully.');
92 var filehandle = document.getElementById('fcloseHandle').value;
93 nacl_module.postMessage(makeCall('fclose', filehandle));
96 function fcloseResult(filehandle) {
97 var filename = filehandle_map[filehandle];
98 removeNameFromSelectElements('.file-handle', filehandle, filename);
99 common.logMessage('File ' + filename + ' closed successfully.');
103 var filehandle = document.getElementById('freadHandle').value;
104 var numBytes = document.getElementById('freadBytes').value;
105 nacl_module.postMessage(makeCall('fread', filehandle, numBytes));
108 function freadResult(filehandle, data) {
109 var filename = filehandle_map[filehandle];
110 common.logMessage('Read "' + data + '" from file ' + filename + '.');
114 var filehandle = document.getElementById('fwriteHandle').value;
115 var data = document.getElementById('fwriteData').value;
116 nacl_module.postMessage(makeCall('fwrite', filehandle, data));
119 function fwriteResult(filehandle, bytes_written) {
120 var filename = filehandle_map[filehandle];
121 common.logMessage('Wrote ' + bytes_written + ' bytes to file ' + filename +
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));
132 function fseekResult(filehandle, filepos) {
133 var filename = filehandle_map[filehandle];
134 common.logMessage('Seeked to location ' + filepos + ' in file ' + filename +
139 var filehandle = document.getElementById('fflushHandle').value;
140 nacl_module.postMessage(makeCall('fflush', filehandle));
143 function fflushResult(filehandle, filepos) {
144 var filename = filehandle_map[filehandle];
145 common.logMessage('flushed ' + filename + '.');
149 var filename = document.getElementById('statFilename').value;
150 nacl_module.postMessage(makeCall('stat', filename));
153 function statResult(filename, size) {
154 common.logMessage('File ' + filename + ' has size ' + size + '.');
157 function opendir(e) {
158 var dirname = document.getElementById('opendirDirname').value;
159 nacl_module.postMessage(makeCall('opendir', dirname));
162 function opendirResult(dirname, dirhandle) {
163 dirhandle_map[dirhandle] = dirname;
165 addNameToSelectElements('.dir-handle', dirhandle, dirname);
166 common.logMessage('Directory ' + dirname + ' opened successfully.');
169 function readdir(e) {
170 var dirhandle = document.getElementById('readdirHandle').value;
171 nacl_module.postMessage(makeCall('readdir', dirhandle));
174 function readdirResult(dirhandle, ino, name) {
175 var dirname = dirhandle_map[dirhandle];
177 common.logMessage('End of directory.');
179 common.logMessage('Read entry ("' + name + '", ino = ' + ino +
180 ') from directory ' + dirname + '.');
184 function closedir(e) {
185 var dirhandle = document.getElementById('closedirHandle').value;
186 nacl_module.postMessage(makeCall('closedir', dirhandle));
189 function closedirResult(dirhandle) {
190 var dirname = dirhandle_map[dirhandle];
191 delete dirhandle_map[dirhandle];
193 removeNameFromSelectElements('.dir-handle', dirhandle, dirname);
194 common.logMessage('Directory ' + dirname + ' closed successfully.');
198 var dirname = document.getElementById('mkdirDirname').value;
199 var mode = document.getElementById('mkdirMode').value;
200 nacl_module.postMessage(makeCall('mkdir', dirname, mode));
203 function mkdirResult(dirname) {
204 common.logMessage('Directory ' + dirname + ' created successfully.');
208 var dirname = document.getElementById('rmdirDirname').value;
209 nacl_module.postMessage(makeCall('rmdir', dirname));
212 function rmdirResult(dirname) {
213 common.logMessage('Directory ' + dirname + ' removed successfully.');
217 var dirname = document.getElementById('chdirDirname').value;
218 nacl_module.postMessage(makeCall('chdir', dirname));
221 function chdirResult(dirname) {
222 common.logMessage('Changed directory to: ' + dirname + '.');
226 nacl_module.postMessage(makeCall('getcwd'));
229 function getcwdResult(dirname) {
230 common.logMessage('getcwd: ' + dirname + '.');
233 function gethostbyname(e) {
234 var name = document.getElementById('gethostbynameName').value;
235 nacl_module.postMessage(makeCall('gethostbyname', name));
238 function gethostbynameResult(name, addr_type) {
239 common.logMessage('gethostbyname returned successfully');
240 common.logMessage('h_name = ' + name + '.');
241 common.logMessage('h_addr_type = ' + addr_type + '.');
242 for (var i = 2; i < arguments.length; i++) {
243 common.logMessage('Address number ' + (i-1) + ' = ' + arguments[i] + '.');
247 function connect(e) {
248 var host = document.getElementById('connectHost').value;
249 var port = document.getElementById('connectPort').value;
250 nacl_module.postMessage(makeCall('connect', host, port));
253 function connectResult(sockhandle) {
254 common.logMessage('connected');
255 addNameToSelectElements('.sock-handle', sockhandle, '[socket]');
259 var handle = document.getElementById('recvHandle').value;
260 var bufferSize = document.getElementById('recvBufferSize').value;
261 nacl_module.postMessage(makeCall('recv', handle, bufferSize));
264 function recvResult(messageLen, message) {
265 common.logMessage("received " + messageLen + ' bytes: ' + message);
269 var handle = document.getElementById('sendHandle').value;
270 var message = document.getElementById('sendMessage').value;
271 nacl_module.postMessage(makeCall('send', handle, message));
274 function sendResult(sentBytes) {
275 common.logMessage("sent bytes: " + sentBytes);
279 var handle = document.getElementById('closeHandle').value;
280 nacl_module.postMessage(makeCall('close', handle));
283 function closeResult(sock) {
284 removeNameFromSelectElements('.sock-handle', sock, "[socket]");
285 common.logMessage("closed socket: " + sock);
289 * Return true when |s| starts with the string |prefix|.
291 * @param {string} s The string to search.
292 * @param {string} prefix The prefix to search for in |s|.
293 * @return {boolean} Whether |s| starts with |prefix|.
295 function startsWith(s, prefix) {
296 // indexOf would search the entire string, lastIndexOf(p, 0) only checks at
297 // the first index. See: http://stackoverflow.com/a/4579228
298 return s.lastIndexOf(prefix, 0) === 0;
301 function makeCall(func) {
303 for (var i = 1; i < arguments.length; ++i) {
304 message += '\1' + arguments[i];
310 // Called by the common.js module.
311 function handleMessage(message_event) {
312 var msg = message_event.data;
313 if (startsWith(msg, 'Error:')) {
314 common.logMessage(msg);
316 // Result from a function call.
317 var params = msg.split('\1');
318 var funcName = params[0];
319 var funcResultName = funcName + 'Result';
320 var resultFunc = window[funcResultName];
323 common.logMessage('Error: Bad message ' + funcName +
324 ' received from NaCl module.');
328 resultFunc.apply(null, params.slice(1));