| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| function moduleDidLoad() { |
| common.hideModule(); |
| } |
| |
| // Called by the common.js module. |
| function domContentLoaded(name, tc, config, width, height) { |
| navigator.webkitPersistentStorage.requestQuota(1024 * 1024, |
| function(bytes) { |
| common.updateStatus( |
| 'Allocated ' + bytes + ' bytes of persistant storage.'); |
| common.createNaClModule(name, tc, config, width, height); |
| common.attachDefaultListeners(); |
| }, |
| function(e) { alert('Failed to allocate space') }); |
| } |
| |
| // Called by the common.js module. |
| function attachListeners() { |
| var radioEls = document.querySelectorAll('input[type="radio"]'); |
| for (var i = 0; i < radioEls.length; ++i) { |
| radioEls[i].addEventListener('click', onRadioClicked); |
| } |
| |
| // Wire up the 'click' event for each function's button. |
| var functionEls = document.querySelectorAll('.function'); |
| for (var i = 0; i < functionEls.length; ++i) { |
| var functionEl = functionEls[i]; |
| var id = functionEl.getAttribute('id'); |
| var buttonEl = functionEl.querySelector('button'); |
| |
| // The function name matches the element id. |
| var func = window[id]; |
| buttonEl.addEventListener('click', func); |
| } |
| } |
| |
| function onRadioClicked(e) { |
| var divId = this.id.slice(5); // skip "radio" |
| var functionEls = document.querySelectorAll('.function'); |
| for (var i = 0; i < functionEls.length; ++i) { |
| var visible = functionEls[i].id === divId; |
| if (functionEls[i].id === divId) |
| functionEls[i].removeAttribute('hidden'); |
| else |
| functionEls[i].setAttribute('hidden'); |
| } |
| } |
| |
| function addNameToSelectElements(cssClass, handle, name) { |
| var text = '[' + handle + '] ' + name; |
| var selectEls = document.querySelectorAll(cssClass); |
| for (var i = 0; i < selectEls.length; ++i) { |
| var optionEl = document.createElement('option'); |
| optionEl.setAttribute('value', handle); |
| optionEl.appendChild(document.createTextNode(text)); |
| selectEls[i].appendChild(optionEl); |
| } |
| } |
| |
| function removeNameFromSelectElements(cssClass, handle) { |
| var optionEls = document.querySelectorAll(cssClass + ' > option'); |
| for (var i = 0; i < optionEls.length; ++i) { |
| var optionEl = optionEls[i]; |
| if (optionEl.value == handle) { |
| var selectEl = optionEl.parentNode; |
| selectEl.removeChild(optionEl); |
| } |
| } |
| } |
| |
| var filehandle_map = {}; |
| var dirhandle_map = {}; |
| |
| function fopen(e) { |
| var filename = document.getElementById('fopenFilename').value; |
| var access = document.getElementById('fopenMode').value; |
| nacl_module.postMessage(makeCall('fopen', filename, access)); |
| } |
| |
| function fopenResult(filename, filehandle) { |
| filehandle_map[filehandle] = filename; |
| |
| addNameToSelectElements('.file-handle', filehandle, filename); |
| common.logMessage('File ' + filename + ' opened successfully.'); |
| } |
| |
| function fclose(e) { |
| var filehandle = document.getElementById('fcloseHandle').value; |
| nacl_module.postMessage(makeCall('fclose', filehandle)); |
| } |
| |
| function fcloseResult(filehandle) { |
| var filename = filehandle_map[filehandle]; |
| removeNameFromSelectElements('.file-handle', filehandle, filename); |
| common.logMessage('File ' + filename + ' closed successfully.'); |
| } |
| |
| function fread(e) { |
| var filehandle = document.getElementById('freadHandle').value; |
| var numBytes = document.getElementById('freadBytes').value; |
| nacl_module.postMessage(makeCall('fread', filehandle, numBytes)); |
| } |
| |
| function freadResult(filehandle, data) { |
| var filename = filehandle_map[filehandle]; |
| common.logMessage('Read "' + data + '" from file ' + filename + '.'); |
| } |
| |
| function fwrite(e) { |
| var filehandle = document.getElementById('fwriteHandle').value; |
| var data = document.getElementById('fwriteData').value; |
| nacl_module.postMessage(makeCall('fwrite', filehandle, data)); |
| } |
| |
| function fwriteResult(filehandle, bytes_written) { |
| var filename = filehandle_map[filehandle]; |
| common.logMessage('Wrote ' + bytes_written + ' bytes to file ' + filename + |
| '.'); |
| } |
| |
| function fseek(e) { |
| var filehandle = document.getElementById('fseekHandle').value; |
| var offset = document.getElementById('fseekOffset').value; |
| var whence = document.getElementById('fseekWhence').value; |
| nacl_module.postMessage(makeCall('fseek', filehandle, offset, whence)); |
| } |
| |
| function fseekResult(filehandle, filepos) { |
| var filename = filehandle_map[filehandle]; |
| common.logMessage('Seeked to location ' + filepos + ' in file ' + filename + |
| '.'); |
| } |
| |
| function stat(e) { |
| var filename = document.getElementById('statFilename').value; |
| nacl_module.postMessage(makeCall('stat', filename)); |
| } |
| |
| function statResult(filename, size) { |
| common.logMessage('File ' + filename + ' has size ' + size + '.'); |
| } |
| |
| function opendir(e) { |
| var dirname = document.getElementById('opendirDirname').value; |
| nacl_module.postMessage(makeCall('opendir', dirname)); |
| } |
| |
| function opendirResult(dirname, dirhandle) { |
| dirhandle_map[dirhandle] = dirname; |
| |
| addNameToSelectElements('.dir-handle', dirhandle, dirname); |
| common.logMessage('Directory ' + dirname + ' opened successfully.'); |
| } |
| |
| function readdir(e) { |
| var dirhandle = document.getElementById('readdirHandle').value; |
| nacl_module.postMessage(makeCall('readdir', dirhandle)); |
| } |
| |
| function readdirResult(dirhandle, ino, name) { |
| var dirname = dirhandle_map[dirhandle]; |
| if (ino === '') { |
| common.logMessage('End of directory.'); |
| } else { |
| common.logMessage('Read entry ("' + name + '", ino = ' + ino + |
| ') from directory ' + dirname + '.'); |
| } |
| } |
| |
| function closedir(e) { |
| var dirhandle = document.getElementById('closedirHandle').value; |
| nacl_module.postMessage(makeCall('closedir', dirhandle)); |
| } |
| |
| function closedirResult(dirhandle) { |
| var dirname = dirhandle_map[dirhandle]; |
| delete dirhandle_map[dirhandle]; |
| |
| removeNameFromSelectElements('.dir-handle', dirhandle, dirname); |
| common.logMessage('Directory ' + dirname + ' closed successfully.'); |
| } |
| |
| function mkdir(e) { |
| var dirname = document.getElementById('mkdirDirname').value; |
| var mode = document.getElementById('mkdirMode').value; |
| nacl_module.postMessage(makeCall('mkdir', dirname, mode)); |
| } |
| |
| function mkdirResult(dirname) { |
| common.logMessage('Directory ' + dirname + ' created successfully.'); |
| } |
| |
| function gethostbyname(e) { |
| var name = document.getElementById('gethostbynameName').value; |
| nacl_module.postMessage(makeCall('gethostbyname', name)); |
| } |
| |
| |
| function gethostbynameResult(name, addr_type) { |
| common.logMessage('gethostbyname returned successfully\n'); |
| common.logMessage('h_name = ' + name + '.\n'); |
| common.logMessage('h_addr_type = ' + addr_type + '.\n'); |
| for (var i = 2; i < arguments.length; i++) { |
| common.logMessage('Address number ' + (i-1) + ' = ' + arguments[i] + '.\n'); |
| } |
| common.logMessage('\n'); |
| } |
| |
| /** |
| * Return true when |s| starts with the string |prefix|. |
| * |
| * @param {string} s The string to search. |
| * @param {string} prefix The prefix to search for in |s|. |
| * @return {boolean} Whether |s| starts with |prefix|. |
| */ |
| function startsWith(s, prefix) { |
| // indexOf would search the entire string, lastIndexOf(p, 0) only checks at |
| // the first index. See: http://stackoverflow.com/a/4579228 |
| return s.lastIndexOf(prefix, 0) === 0; |
| } |
| |
| function makeCall(func) { |
| var message = func; |
| for (var i = 1; i < arguments.length; ++i) { |
| message += '\1' + arguments[i]; |
| } |
| |
| return message; |
| } |
| |
| // Called by the common.js module. |
| function handleMessage(message_event) { |
| var msg = message_event.data; |
| if (startsWith(msg, 'Error:')) { |
| common.logMessage(msg); |
| } else { |
| // Result from a function call. |
| var params = msg.split('\1'); |
| var funcName = params[0]; |
| var funcResultName = funcName + 'Result'; |
| var resultFunc = window[funcResultName]; |
| |
| if (!resultFunc) { |
| common.logMessage('Error: Bad message ' + funcName + |
| ' received from NaCl module.'); |
| return; |
| } |
| |
| resultFunc.apply(null, params.slice(1)); |
| } |
| } |