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 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. 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 function addEventListenerToButton(parentId, func) { 29 document.querySelector('#' + parentId + ' button') 30 .addEventListener('click', func); 31 } 32 33 addEventListenerToButton('saveFile', saveFile); 34 addEventListenerToButton('loadFile', loadFile); 35 addEventListenerToButton('delete', deleteFileOrDirectory); 36 addEventListenerToButton('listDir', listDir); 37 addEventListenerToButton('makeDir', makeDir); 38 } 39 40 function onRadioClicked(e) { 41 var divId = this.id.slice(6); // skip "radio_" 42 var functionEls = document.querySelectorAll('.function'); 43 for (var i = 0; i < functionEls.length; ++i) { 44 var visible = functionEls[i].id === divId; 45 if (functionEls[i].id === divId) 46 functionEls[i].removeAttribute('hidden'); 47 else 48 functionEls[i].setAttribute('hidden'); 49 } 50 } 51 52 function makeMessage(command, path) { 53 // Package a message using a simple protocol containing: 54 // command <path length> <path> <space-separated extra args> 55 var msg = command; 56 msg += ' '; 57 msg += path.length; 58 msg += ' '; 59 msg += path; 60 // Maybe add extra args 61 for (var i = 2; i < arguments.length; ++i) { 62 msg += ' ' + arguments[i]; 63 } 64 return msg; 65 } 66 67 function saveFile() { 68 if (common.naclModule) { 69 var fileName = document.querySelector('#saveFile input').value; 70 var fileText = document.querySelector('#saveFile textarea').value; 71 common.naclModule.postMessage(makeMessage('sv', fileName, fileText)); 72 // clear the editor. 73 fileText.value = ''; 74 } 75 } 76 77 function loadFile() { 78 if (common.naclModule) { 79 var fileName = document.querySelector('#loadFile input').value; 80 // clear the editor first (in case there is an error and there is no 81 // output). 82 document.querySelector('#loadFile textarea').value = ''; 83 common.naclModule.postMessage(makeMessage('ld', fileName)); 84 } 85 } 86 87 function deleteFileOrDirectory() { 88 if (common.naclModule) { 89 var fileName = document.querySelector('#delete input').value; 90 common.naclModule.postMessage(makeMessage('de', fileName)); 91 } 92 } 93 94 function listDir() { 95 if (common.naclModule) { 96 var dirName = document.querySelector('#listDir input').value; 97 common.naclModule.postMessage(makeMessage('ls', dirName)); 98 } 99 } 100 101 function makeDir() { 102 if (common.naclModule) { 103 var dirName = document.querySelector('#makeDir input').value; 104 common.naclModule.postMessage(makeMessage('md', dirName)); 105 } 106 } 107 108 // Called by the common.js module. 109 function handleMessage(message_event) { 110 var msg = message_event.data; 111 var parts = msg.split('|'); 112 var command = parts[0]; 113 var args = parts.slice(1); 114 115 if (command == 'ERR') { 116 common.logMessage('Error: ' + args[0]); 117 } else if (command == 'STAT') { 118 common.logMessage(args[0]); 119 } else if (command == 'READY') { 120 common.logMessage('Filesystem ready!'); 121 } else if (command == 'DISP') { 122 // Find the file editor that is currently visible. 123 var fileEditorEl = 124 document.querySelector('.function:not([hidden]) > textarea'); 125 // Rejoin args with pipe (|) -- there is only one argument, and it can 126 // contain the pipe character. 127 fileEditorEl.value = args.join('|'); 128 } else if (command == 'LIST') { 129 var listDirOutputEl = document.getElementById('listDirOutput'); 130 131 // NOTE: files with | in their names will be incorrectly split. Fixing this 132 // is left as an exercise for the reader. 133 134 // Remove all children of this element... 135 while (listDirOutputEl.firstChild) { 136 listDirOutputEl.removeChild(listDirOutputEl.firstChild); 137 } 138 139 if (args.length) { 140 // Add new <li> elements for each file. 141 for (var i = 0; i < args.length; ++i) { 142 var itemEl = document.createElement('li'); 143 itemEl.textContent = args[i]; 144 listDirOutputEl.appendChild(itemEl); 145 } 146 } else { 147 var itemEl = document.createElement('li'); 148 itemEl.textContent = '<empty directory>'; 149 listDirOutputEl.appendChild(itemEl); 150 } 151 } 152 } 153