example.js revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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
197function rmdir(e) {
198  var dirname = document.getElementById('rmdirDirname').value;
199  nacl_module.postMessage(makeCall('rmdir', dirname));
200}
201
202function rmdirResult(dirname) {
203  common.logMessage('Directory ' + dirname + ' removed successfully.');
204}
205
206function chdir(e) {
207  var dirname = document.getElementById('chdirDirname').value;
208  nacl_module.postMessage(makeCall('chdir', dirname));
209}
210
211function chdirResult(dirname) {
212  common.logMessage('Changed directory to: ' + dirname + '.');
213}
214
215function getcwd(e) {
216  nacl_module.postMessage(makeCall('getcwd'));
217}
218
219function getcwdResult(dirname) {
220  common.logMessage('getcwd: ' + dirname + '.');
221}
222
223function gethostbyname(e) {
224  var name = document.getElementById('gethostbynameName').value;
225  nacl_module.postMessage(makeCall('gethostbyname', name));
226}
227
228function gethostbynameResult(name, addr_type) {
229  common.logMessage('gethostbyname returned successfully');
230  common.logMessage('h_name = ' + name + '.');
231  common.logMessage('h_addr_type = ' + addr_type + '.');
232  for (var i = 2; i < arguments.length; i++) {
233    common.logMessage('Address number ' + (i-1) + ' = ' + arguments[i] + '.');
234  }
235}
236
237function connect(e) {
238  var host = document.getElementById('connectHost').value;
239  var port = document.getElementById('connectPort').value;
240  nacl_module.postMessage(makeCall('connect', host, port));
241}
242
243function connectResult(sockhandle) {
244  common.logMessage('connected');
245  addNameToSelectElements('.sock-handle', sockhandle, '[socket]');
246}
247
248function recv(e) {
249  var handle = document.getElementById('recvHandle').value;
250  var bufferSize = document.getElementById('recvBufferSize').value;
251  nacl_module.postMessage(makeCall('recv', handle, bufferSize));
252}
253
254function recvResult(messageLen, message) {
255  common.logMessage("received " + messageLen + ' bytes: ' + message);
256}
257
258function send(e) {
259  var handle = document.getElementById('sendHandle').value;
260  var message = document.getElementById('sendMessage').value;
261  nacl_module.postMessage(makeCall('send', handle, message));
262}
263
264function sendResult(sentBytes) {
265  common.logMessage("sent bytes: " + sentBytes);
266}
267
268function close(e) {
269  var handle = document.getElementById('closeHandle').value;
270  nacl_module.postMessage(makeCall('close', handle));
271}
272
273function closeResult(sock) {
274  removeNameFromSelectElements('.sock-handle', sock, "[socket]");
275  common.logMessage("closed socket: " + sock);
276}
277
278/**
279 * Return true when |s| starts with the string |prefix|.
280 *
281 * @param {string} s The string to search.
282 * @param {string} prefix The prefix to search for in |s|.
283 * @return {boolean} Whether |s| starts with |prefix|.
284 */
285function startsWith(s, prefix) {
286  // indexOf would search the entire string, lastIndexOf(p, 0) only checks at
287  // the first index. See: http://stackoverflow.com/a/4579228
288  return s.lastIndexOf(prefix, 0) === 0;
289}
290
291function makeCall(func) {
292  var message = func;
293  for (var i = 1; i < arguments.length; ++i) {
294    message += '\1' + arguments[i];
295  }
296
297  return message;
298}
299
300// Called by the common.js module.
301function handleMessage(message_event) {
302  var msg = message_event.data;
303  if (startsWith(msg, 'Error:')) {
304    common.logMessage(msg);
305  } else {
306    // Result from a function call.
307    var params = msg.split('\1');
308    var funcName = params[0];
309    var funcResultName = funcName + 'Result';
310    var resultFunc = window[funcResultName];
311
312    if (!resultFunc) {
313      common.logMessage('Error: Bad message ' + funcName +
314                        ' received from NaCl module.');
315      return;
316    }
317
318    resultFunc.apply(null, params.slice(1));
319  }
320}
321