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 |