OLD | NEW |
1 /* Copyright (c) 2014 The Chromium Authors. All rights reserved. | 1 /* Copyright (c) 2014 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 | 5 |
| 6 /** |
| 7 * @param {string} eventName |
| 8 * @param {number=} opt_space |
| 9 * @return {string} |
| 10 */ |
| 11 function jsonifyJavascriptKeyEvent(event, eventName, opt_space) { |
| 12 return "JavaScript '" + eventName + "' event = " + JSON.stringify( |
| 13 event, |
| 14 ['type', 'alt', 'shift', 'control', 'meta', 'charCode', 'keyCode', |
| 15 'keyIdentifier', 'repeat'], |
| 16 opt_space); |
| 17 }; |
| 18 |
| 19 /** |
| 20 * @param {ChordTracker} jsChordTracker |
| 21 * @param {Event} event |
| 22 * @return {void} |
| 23 */ |
| 24 function handleJavascriptKeyDownEvent(jsChordTracker, event) { |
| 25 appendToTextLog(jsonifyJavascriptKeyEvent(event, 'keydown', undefined)); |
| 26 jsChordTracker.addKeyDownEvent( |
| 27 event.keyCode, jsonifyJavascriptKeyEvent(event, 'keydown', 2)); |
| 28 } |
| 29 |
| 30 /** |
| 31 * @param {ChordTracker} jsChordTracker |
| 32 * @param {Event} event |
| 33 * @return {void} |
| 34 */ |
| 35 function handleJavascriptKeyUpEvent(jsChordTracker, event) { |
| 36 appendToTextLog(jsonifyJavascriptKeyEvent(event, 'keyup', undefined)); |
| 37 jsChordTracker.addKeyUpEvent( |
| 38 event.keyCode, jsonifyJavascriptKeyEvent(event, 'keyup', 2)); |
| 39 } |
| 40 |
| 41 /** @constructor */ |
| 42 var PNaClEvent = function() { |
| 43 /** @type {string} */ |
| 44 this.type = ""; |
| 45 /** @type {number} */ |
| 46 this.modifiers = 0; |
| 47 /** @type {number} */ |
| 48 this.keyCode = 0; |
| 49 /** @type {string|undefined} */ |
| 50 this.characterText = undefined; |
| 51 /** @type {string} */ |
| 52 this.code = ""; |
| 53 }; |
| 54 |
| 55 /** |
| 56 * @param {PNaClEvent} event |
| 57 * @param {number|undefined} space |
| 58 * @return {string} |
| 59 */ |
| 60 function jsonifyPnaclKeyboardInputEvent(event, space) { |
| 61 return "PNaCl KeyboardInputEvent = " + JSON.stringify( |
| 62 event, |
| 63 ['type', 'modifiers', 'keyCode', 'characterText', 'code'], |
| 64 space); |
| 65 }; |
| 66 |
| 67 /** |
| 68 * @param {ChordTracker} pnaclChordTracker |
| 69 * @param {Event} event |
| 70 * @return {void} |
| 71 */ |
| 72 function handlePNaclMessage(pnaclChordTracker, event) { |
| 73 var pnaclEvent = /** @type {PNaClEvent} */ (event.data); |
| 74 |
| 75 appendToTextLog(jsonifyPnaclKeyboardInputEvent(pnaclEvent, undefined)); |
| 76 var title = jsonifyPnaclKeyboardInputEvent(pnaclEvent, 2); |
| 77 if (pnaclEvent.type == "KEYDOWN") { |
| 78 pnaclChordTracker.addKeyDownEvent(pnaclEvent.keyCode, title); |
| 79 } |
| 80 if (pnaclEvent.type == "KEYUP") { |
| 81 pnaclChordTracker.addKeyUpEvent(pnaclEvent.keyCode, title); |
| 82 } |
| 83 if (pnaclEvent.type == "CHAR") { |
| 84 pnaclChordTracker.addCharEvent(pnaclEvent.characterText, title); |
| 85 } |
| 86 } |
| 87 |
| 88 /** |
| 89 * @param {string} str |
| 90 * @return {void} |
| 91 */ |
| 92 function appendToTextLog(str) { |
| 93 var textLog = document.getElementById('text-log'); |
| 94 var div = document.createElement('div'); |
| 95 div.innerText = str; |
| 96 textLog.appendChild(div); |
| 97 } |
| 98 |
6 function onLoad() { | 99 function onLoad() { |
7 var parentDiv = document.getElementById('key-log'); | 100 // Start listening to Javascript keyup/keydown events. |
8 var chordTracker = new ChordTracker(parentDiv); | 101 var jsLog = document.getElementById('javascript-log'); |
| 102 var jsChordTracker = new ChordTracker(jsLog); |
9 document.body.addEventListener( | 103 document.body.addEventListener( |
10 'keydown', chordTracker.addKeyEvent.bind(chordTracker), false); | 104 'keydown', |
| 105 function (event) { |
| 106 handleJavascriptKeyDownEvent(jsChordTracker, event); |
| 107 }, |
| 108 false); |
11 document.body.addEventListener( | 109 document.body.addEventListener( |
12 'keyup', chordTracker.addKeyEvent.bind(chordTracker), false); | 110 'keyup', |
| 111 function (event) { |
| 112 handleJavascriptKeyUpEvent(jsChordTracker, event); |
| 113 }, |
| 114 false); |
| 115 |
| 116 // Start listening to PNaCl keyboard input events. |
| 117 var pnaclLog = document.getElementById('pnacl-log'); |
| 118 var pnaclChordTracker = new ChordTracker(pnaclLog); |
| 119 document.getElementById('pnacl-listener').addEventListener( |
| 120 'message', |
| 121 function (message) { |
| 122 handlePNaclMessage(pnaclChordTracker, message); |
| 123 }, |
| 124 true); |
| 125 |
| 126 // Start listening to generic, source-agnostic events. |
13 window.addEventListener( | 127 window.addEventListener( |
14 'blur', chordTracker.releaseAllKeys.bind(chordTracker), false); | 128 'blur', |
| 129 function () { |
| 130 jsChordTracker.releaseAllKeys(); |
| 131 pnaclChordTracker.releaseAllKeys(); |
| 132 }, |
| 133 false); |
15 document.getElementById('clear-log').addEventListener( | 134 document.getElementById('clear-log').addEventListener( |
16 'click', function() { parentDiv.innerText = ''; }, false); | 135 'click', |
| 136 function() { |
| 137 jsLog.innerText = ''; |
| 138 pnaclLog.innerText = ''; |
| 139 document.getElementById('text-log').innerText = ''; |
| 140 }, |
| 141 false); |
17 } | 142 } |
18 | 143 |
19 window.addEventListener('load', onLoad, false); | 144 window.addEventListener('load', onLoad, false); |
OLD | NEW |