OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 // Obtain a client ID and client secret from Google Developers Console |
| 6 var CLIENT_ID = "TO FILL"; |
| 7 var CLIENT_SECRET = "TO FILL"; |
| 8 |
| 9 var REDIRECT_URI = "http://localhost:5103/index.html"; |
| 10 |
| 11 var currentURL = window.location.href; |
| 12 var tokenValue = "Set at domContentLoaded()"; |
| 13 |
| 14 function buttonOnClick() { |
| 15 var array = new Uint32Array(3); |
| 16 window.crypto.getRandomValues(array); |
| 17 var stateValue = array[0].toString() + |
| 18 array[1].toString() + |
| 19 array[2].toString(); |
| 20 |
| 21 var url = "http://accounts.google.com/o/oauth2/v2/auth?" + |
| 22 "scope=https://www.googleapis.com/auth/drive" |
| 23 + "+" + "https://www.googleapis.com/auth/drive.metadata" + "&" + |
| 24 "state=" + stateValue + "&" + |
| 25 "redirect_uri=http://localhost:5103/index.html" + "&" + |
| 26 "response_type=code" + "&" + |
| 27 "client_id=" + CLIENT_ID; |
| 28 |
| 29 window.open(url, "_self"); |
| 30 } |
| 31 |
| 32 function executeAfterGettingCode() { |
| 33 var codeKeyIndex = currentURL.search("code="); |
| 34 if (-1 == codeKeyIndex) { |
| 35 return -1; |
| 36 } |
| 37 var codeValue = currentURL.substring(codeKeyIndex + 5); |
| 38 |
| 39 var xHTTP = new XMLHttpRequest(); |
| 40 xHTTP.onreadystatechange = function() { |
| 41 if (xHTTP.readyState == 4 && xHTTP.status == 200) { |
| 42 var obj = JSON.parse(xHTTP.responseText); |
| 43 var url = REDIRECT_URI + "?token=" + obj.access_token; |
| 44 |
| 45 window.open(url, "_self"); |
| 46 } |
| 47 }; |
| 48 |
| 49 xHTTP.timeout = 4000; // Set timeout to 4 seconds (4000 milliseconds) |
| 50 xHTTP.ontimeout = function () { alert("Timed out"); } |
| 51 |
| 52 var params = "code=" + codeValue + "&" + |
| 53 "client_id=" + CLIENT_ID + "&" + |
| 54 "client_secret=" + CLIENT_SECRET + "&" + |
| 55 "redirect_uri=" + REDIRECT_URI + "&" + |
| 56 "grant_type=authorization_code"; |
| 57 |
| 58 xHTTP.open("POST", "https://www.googleapis.com/oauth2/v4/token", true); |
| 59 xHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); |
| 60 xHTTP.send(params); |
| 61 } |
| 62 |
5 function moduleDidLoad() { | 63 function moduleDidLoad() { |
6 common.hideModule(); | 64 common.hideModule(); |
7 } | 65 } |
8 | 66 |
9 function $(id) { | 67 function $(id) { |
10 return document.getElementById(id); | 68 return document.getElementById(id); |
11 } | 69 } |
12 | 70 |
13 // Called by the common.js module. | |
14 function domContentLoaded(name, tc, config, width, height) { | 71 function domContentLoaded(name, tc, config, width, height) { |
15 navigator.webkitPersistentStorage.requestQuota(5 * 1024 * 1024, | 72 common.attachDefaultListeners(); |
16 function(bytes) { | 73 |
17 common.updateStatus( | 74 var tokenKeyIndex = currentURL.search("token="); |
18 'Allocated ' + bytes + ' bytes of persistant storage.'); | 75 if (-1 == tokenKeyIndex) { |
19 common.attachDefaultListeners(); | 76 common.createNaClModule(name, tc, config, width, height); |
20 common.createNaClModule(name, tc, config, width, height); | 77 } else { |
21 }, | 78 tokenValue = currentURL.substring(tokenKeyIndex + 6); |
22 function(e) { alert('Failed to allocate space') }); | 79 var tokenMap = { 'token' : tokenValue }; |
| 80 |
| 81 common.createNaClModule(name, tc, config, width, height, tokenMap); |
| 82 |
| 83 document.getElementById("buttonid").disabled = true; |
| 84 } |
23 } | 85 } |
24 | 86 |
25 // Called by the common.js module. | |
26 function attachListeners() { | 87 function attachListeners() { |
27 var radioEls = document.querySelectorAll('input[type="radio"]'); | 88 var radioEls = document.querySelectorAll('input[type="radio"]'); |
28 for (var i = 0; i < radioEls.length; ++i) { | 89 for (var i = 0; i < radioEls.length; ++i) { |
29 radioEls[i].addEventListener('click', onRadioClicked); | 90 radioEls[i].addEventListener('click', onRadioClicked); |
30 } | 91 } |
31 | 92 |
32 // Wire up the 'click' event for each function's button. | 93 // Wire up the 'click' event for each function's button. |
33 var functionEls = document.querySelectorAll('.function'); | 94 var functionEls = document.querySelectorAll('.function'); |
34 for (var i = 0; i < functionEls.length; ++i) { | 95 for (var i = 0; i < functionEls.length; ++i) { |
35 var functionEl = functionEls[i]; | 96 var functionEl = functionEls[i]; |
36 var id = functionEl.getAttribute('id'); | 97 var id = functionEl.getAttribute('id'); |
37 var buttonEl = functionEl.querySelector('button'); | 98 var buttonEl = functionEl.querySelector('button'); |
38 | 99 |
39 // The function name matches the element id. | 100 // The function name matches the element id. |
40 var func = window[id]; | 101 var func = window[id]; |
41 buttonEl.addEventListener('click', func); | 102 buttonEl.addEventListener('click', func); |
42 } | 103 } |
43 | |
44 $('pipe_input_box').addEventListener('keypress', onPipeInput) | |
45 $('pipe_output').disabled = true; | |
46 | |
47 $('pipe_name').addEventListener('change', | |
48 function() { $('pipe_output').value = ''; }) | |
49 } | |
50 | |
51 // Called with keypress events on the pipe input box | |
52 function onPipeInput(e) { | |
53 // Create an arraybuffer containing the 16-bit char code | |
54 // from the keypress event. | |
55 var buffer = new ArrayBuffer(1*2); | |
56 var bufferView = new Uint16Array(buffer); | |
57 bufferView[0] = e.charCode; | |
58 | |
59 // Pass the buffer in a dictionary over the NaCl module | |
60 var pipeSelect = $('pipe_name'); | |
61 var pipeName = pipeSelect[pipeSelect.selectedIndex].value; | |
62 var message = { | |
63 pipe: pipeName, | |
64 operation: 'write', | |
65 payload: buffer, | |
66 }; | |
67 nacl_module.postMessage(message); | |
68 e.preventDefault(); | |
69 return false; | |
70 } | 104 } |
71 | 105 |
72 function onRadioClicked(e) { | 106 function onRadioClicked(e) { |
73 var divId = this.id.slice(5); // skip "radio" | 107 var divId = this.id.slice(5); // skip "radio" |
74 var functionEls = document.querySelectorAll('.function'); | 108 var functionEls = document.querySelectorAll('.function'); |
75 for (var i = 0; i < functionEls.length; ++i) { | 109 for (var i = 0; i < functionEls.length; ++i) { |
76 var visible = functionEls[i].id === divId; | 110 var visible = functionEls[i].id === divId; |
77 if (functionEls[i].id === divId) | 111 if (functionEls[i].id === divId) |
78 functionEls[i].removeAttribute('hidden'); | 112 functionEls[i].removeAttribute('hidden'); |
79 else | 113 else |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 common.logMessage('Changed directory to: ' + dirname + '.'); | 260 common.logMessage('Changed directory to: ' + dirname + '.'); |
227 }); | 261 }); |
228 } | 262 } |
229 | 263 |
230 function getcwd(e) { | 264 function getcwd(e) { |
231 postCall('getcwd', function(dirname) { | 265 postCall('getcwd', function(dirname) { |
232 common.logMessage('getcwd: ' + dirname + '.'); | 266 common.logMessage('getcwd: ' + dirname + '.'); |
233 }); | 267 }); |
234 } | 268 } |
235 | 269 |
236 function getaddrinfo(e) { | |
237 var name = $('getaddrinfoName').value; | |
238 var family = $('getaddrinfoFamily').value; | |
239 postCall('getaddrinfo', name, family, function(name, addrType) { | |
240 common.logMessage('getaddrinfo returned successfully'); | |
241 common.logMessage('ai_cannonname = ' + name + '.'); | |
242 var count = 1; | |
243 for (var i = 1; i < arguments.length; i+=2) { | |
244 var msg = 'Address number ' + count + ' = ' + arguments[i] + | |
245 ' (' + arguments[i+1] + ')'; | |
246 common.logMessage(msg); | |
247 count += 1; | |
248 } | |
249 }); | |
250 } | |
251 | |
252 function gethostbyname(e) { | |
253 var name = $('gethostbynameName').value; | |
254 postCall('gethostbyname', name, function(name, addrType) { | |
255 common.logMessage('gethostbyname returned successfully'); | |
256 common.logMessage('h_name = ' + name + '.'); | |
257 common.logMessage('h_addr_type = ' + addrType + '.'); | |
258 for (var i = 2; i < arguments.length; i++) { | |
259 common.logMessage('Address number ' + (i-1) + ' = ' + arguments[i] + '.'); | |
260 } | |
261 }); | |
262 } | |
263 | |
264 function connect(e) { | |
265 var host = $('connectHost').value; | |
266 var port = parseInt($('connectPort').value, 10); | |
267 postCall('connect', host, port, function(sockhandle) { | |
268 common.logMessage('connected'); | |
269 addNameToSelectElements('.sock-handle', sockhandle, '[socket]'); | |
270 }); | |
271 } | |
272 | |
273 function recv(e) { | |
274 var handle = parseInt($('recvHandle').value, 10); | |
275 var bufferSize = parseInt($('recvBufferSize').value, 10); | |
276 postCall('recv', handle, bufferSize, function(messageLen, message) { | |
277 common.logMessage("received " + messageLen + ' bytes: ' + message); | |
278 }); | |
279 } | |
280 | |
281 function send(e) { | |
282 var handle = parseInt($('sendHandle').value, 10); | |
283 var message = $('sendMessage').value; | |
284 postCall('send', handle, message, function(sentBytes) { | |
285 common.logMessage("sent bytes: " + sentBytes); | |
286 }); | |
287 } | |
288 | |
289 function close(e) { | |
290 var handle = parseInt($('closeHandle').value, 10); | |
291 postCall('close', handle, function(sock) { | |
292 removeNameFromSelectElements('.sock-handle', sock, "[socket]"); | |
293 common.logMessage("closed socket: " + sock); | |
294 }); | |
295 } | |
296 | |
297 var funcToCallback = {}; | 270 var funcToCallback = {}; |
298 | 271 |
299 function postCall(func) { | 272 function postCall(func) { |
300 var callback = arguments[arguments.length - 1]; | 273 var callback = arguments[arguments.length - 1]; |
301 funcToCallback[func] = callback; | 274 funcToCallback[func] = callback; |
302 | 275 |
303 nacl_module.postMessage({ | 276 nacl_module.postMessage({ |
304 cmd: func, | 277 cmd: func, |
305 args: Array.prototype.slice.call(arguments, 1, -1) | 278 args: Array.prototype.slice.call(arguments, 1, -1) |
306 }); | 279 }); |
307 } | 280 } |
308 | 281 |
309 function ArrayBufferToString(buf) { | 282 function ArrayBufferToString(buf) { |
310 return String.fromCharCode.apply(null, new Uint16Array(buf)); | 283 return String.fromCharCode.apply(null, new Uint16Array(buf)); |
311 } | 284 } |
312 | 285 |
313 // Called by the common.js module. | |
314 function handleMessage(message_event) { | 286 function handleMessage(message_event) { |
315 var data = message_event.data; | 287 var data = message_event.data; |
316 if ((typeof(data) === 'string' || data instanceof String)) { | 288 if ((typeof(data) === 'string' || data instanceof String)) { |
317 common.logMessage(data); | 289 common.logMessage(data); |
318 } else if (data instanceof Object) { | 290 } else if (data instanceof Object) { |
319 var pipeName = data['pipe'] | 291 // Result from a function call. |
320 if (pipeName !== undefined) { | 292 var params = data.args; |
321 // Message for JavaScript I/O pipe | 293 var funcName = data.cmd; |
322 var operation = data['operation']; | 294 var callback = funcToCallback[funcName]; |
323 if (operation == 'write') { | |
324 $('pipe_output').value += ArrayBufferToString(data['payload']); | |
325 } else if (operation == 'ack') { | |
326 common.logMessage(pipeName + ": ack:" + data['payload']); | |
327 } else { | |
328 common.logMessage('Got unexpected pipe operation: ' + operation); | |
329 } | |
330 } else { | |
331 // Result from a function call. | |
332 var params = data.args; | |
333 var funcName = data.cmd; | |
334 var callback = funcToCallback[funcName]; | |
335 | 295 |
336 if (!callback) { | 296 if (!callback) { |
337 common.logMessage('Error: Bad message ' + funcName + | 297 common.logMessage('Error: Bad message ' + funcName + |
338 ' received from NaCl module.'); | 298 ' received from NaCl module.'); |
339 return; | 299 return; |
340 } | 300 } |
341 | 301 |
342 delete funcToCallback[funcName]; | 302 delete funcToCallback[funcName]; |
343 callback.apply(null, params); | 303 callback.apply(null, params); |
344 } | |
345 } else { | 304 } else { |
346 common.logMessage('Error: Unknow message `' + data + | 305 common.logMessage('Error: Unknown message `' + data + |
347 '` received from NaCl module.'); | 306 '` received from NaCl module.'); |
348 } | 307 } |
349 } | 308 } |
OLD | NEW |