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