blob: 87eedd59f18447e0ac581e1ded50101eccf518fb [file] [log] [blame]
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +01001// 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) {
Ben Murdocheb525c52013-07-10 11:40:50 +010011 navigator.webkitPersistentStorage.requestQuota(1024 * 1024,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010012 function(bytes) {
13 common.updateStatus(
Ben Murdocheb525c52013-07-10 11:40:50 +010014 'Allocated ' + bytes + ' bytes of persistant storage.');
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010015 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
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010028 // 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)c2e0dbd2013-05-09 18:35:53 +010039}
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
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010053function addNameToSelectElements(cssClass, handle, name) {
54 var text = '[' + handle + '] ' + name;
55 var selectEls = document.querySelectorAll(cssClass);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010056 for (var i = 0; i < selectEls.length; ++i) {
57 var optionEl = document.createElement('option');
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010058 optionEl.setAttribute('value', handle);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010059 optionEl.appendChild(document.createTextNode(text));
60 selectEls[i].appendChild(optionEl);
61 }
62}
63
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010064function removeNameFromSelectElements(cssClass, handle) {
65 var optionEls = document.querySelectorAll(cssClass + ' > option');
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010066 for (var i = 0; i < optionEls.length; ++i) {
67 var optionEl = optionEls[i];
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010068 if (optionEl.value == handle) {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010069 var selectEl = optionEl.parentNode;
70 selectEl.removeChild(optionEl);
71 }
72 }
73}
74
75var filehandle_map = {};
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010076var dirhandle_map = {};
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010077
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
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010087 addNameToSelectElements('.file-handle', filehandle, filename);
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +010088 common.logMessage('File ' + filename + ' opened successfully.');
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010089}
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];
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010098 removeNameFromSelectElements('.file-handle', filehandle, filename);
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +010099 common.logMessage('File ' + filename + ' closed successfully.');
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100100}
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];
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100110 common.logMessage('Read "' + data + '" from file ' + filename + '.');
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100111}
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 +
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100122 '.');
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100123}
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 +
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100135 '.');
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100136}
137
138function stat(e) {
139 var filename = document.getElementById('statFilename').value;
140 nacl_module.postMessage(makeCall('stat', filename));
141}
142
143function statResult(filename, size) {
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100144 common.logMessage('File ' + filename + ' has size ' + size + '.');
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100145}
146
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100147function 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);
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100156 common.logMessage('Directory ' + dirname + ' opened successfully.');
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100157}
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 === '') {
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100167 common.logMessage('End of directory.');
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100168 } else {
169 common.logMessage('Read entry ("' + name + '", ino = ' + ino +
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100170 ') from directory ' + dirname + '.');
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100171 }
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);
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100184 common.logMessage('Directory ' + dirname + ' closed successfully.');
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100185}
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) {
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100194 common.logMessage('Directory ' + dirname + ' created successfully.');
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100195}
196
Ben Murdochbb1529c2013-08-08 10:24:53 +0100197function gethostbyname(e) {
198 var name = document.getElementById('gethostbynameName').value;
199 nacl_module.postMessage(makeCall('gethostbyname', name));
200}
201
202
203function 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)c2e0dbd2013-05-09 18:35:53 +0100213/**
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 Murdocheb525c52013-07-10 11:40:50 +0100218 * @return {boolean} Whether |s| starts with |prefix|.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100219 */
220function 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
226function 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.
236function handleMessage(message_event) {
237 var msg = message_event.data;
238 if (startsWith(msg, 'Error:')) {
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100239 common.logMessage(msg);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100240 } 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 Murdoch7dbb3d52013-07-17 14:55:54 +0100248 common.logMessage('Error: Bad message ' + funcName +
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100249 ' received from NaCl module.');
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100250 return;
251 }
252
253 resultFunc.apply(null, params.slice(1));
254 }
255}