jenkins-bot has submitted this change and it was merged. Change subject: Add event logger to collect IME functionality info ......................................................................
Add event logger to collect IME functionality info This will be used to collect event traces from various IME/browser/OS combinations that can then be used to drive unit tests. Change-Id: Id604161b568cd412b44fe9979aff45d1fe7f054a --- A demos/ve/eventLogger.html 1 file changed, 212 insertions(+), 0 deletions(-) Approvals: Catrope: Looks good to me, approved jenkins-bot: Verified diff --git a/demos/ve/eventLogger.html b/demos/ve/eventLogger.html new file mode 100644 index 0000000..56f27a4 --- /dev/null +++ b/demos/ve/eventLogger.html @@ -0,0 +1,212 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="UTF-8"> + <title>Keyboard Event Logger</title> + <style> + html { + margin: 0; + padding: 0; + height: 100%; + } + + body { + margin: 1em; + padding: 0; + height: 100%; + } + + #ve-demo-halo { + width: 100%; + min-height: 2em; + } + + #ve-demo-content { + border: 1px solid gray; + width: 100%; + min-height: 2em; + max-height: 15%; + overflow-y: auto; + } + + #ve-demo-log { + margin-top: 1em; + border: 1px solid gray; + width: 100%; + height: 80%; + white-space: pre; + font-family: monospace; + padding: 0; + overflow-y: auto; + } + </style> + </head> + <body> + <form id="ve-demo-halo"> + IME identifier (name and version): + <input type="text" name="identifier" autofocus> + <input type="submit" value="Start Logging Keyboard Events"> + </form> + <div id="ve-demo-content" contenteditable="true" style="display: none;"></div> + <textarea id="ve-demo-log"></textarea> + + <script src="../../modules/jquery/jquery.js"></script> + <script src="../../modules/jquery/jquery.client.js"></script> + <script src="../../modules/oojs/oo.js"></script> + <script src="../../modules/rangy/rangy-core-1.3.js"></script> + <script src="../../modules/rangy/rangy-position-1.3.js"></script> + <script src="../../modules/unicodejs/unicodejs.js"></script> + <script src="../../modules/unicodejs/unicodejs.graphemebreak.js"></script> + <script src="../../modules/unicodejs/unicodejs.wordbreak.js"></script> + <script src="../../modules/ve/ve.js"></script> + <script src="../../modules/ve/ve.EventSequencer.js"></script> + <script> + ( function () { + var haloElement, contentElement, logElement, startTime, timeoutId, + oldHtml = '', + oldStartOffset = 0, + oldEndOffset = 0, + comments, + log = []; + + function makeEventHandler( eventName ) { + return function ( e ) { + logEvent( 'sendEvent', eventName, e ); + }; + } + + function makeAfterLoopHandler () { + return function () { + logEvent( 'endLoop' ); + }; + } + + function eventToObject( e ) { + // TODO: flesh this out more + if ( !e || e.keyCode === undefined ) { + return {}; + } else { + return { 'keyCode': e.keyCode }; + } + } + + function logEvent( methodName, eventName, e ) { + var args = [], + msUtc = (new Date().getTime() - startTime) / 1000, + newHtml = contentElement.innerHTML, + rangyRange = rangy.getSelection( document ).getRangeAt(0), + newStartOffset = rangyRange.startOffset, + newEndOffset = rangyRange.endOffset; + + if ( oldHtml !== newHtml ) { + logWrite( { + 'seq': log.length, + 'time': msUtc, + 'action': 'changeText', + 'args': [ newHtml ] + } ); + oldHtml = newHtml; + } + if ( + oldStartOffset !== newStartOffset || + oldEndOffset !== newEndOffset + ) { + logWrite( { + 'seq': log.length, + 'time': msUtc, + 'action': 'changeSel', + 'args': [ + newStartOffset, + newEndOffset + ] + } ); + oldStartOffset = newStartOffset; + oldEndOffset = newEndOffset; + } + if ( eventName !== undefined ) { + args.push( eventName ); + args.push( eventToObject( e ) ); + } + + logWrite( { + 'seq': log.length, + 'time': msUtc, + 'action': methodName, + 'args': args + } ); + } + + function logWrite( val ) { + log.push( val ); + showLog(); + } + + function showLog() { + var i, len, jsons = []; + jsons.push( JSON.stringify( comments ) ); + for ( i = 0, len = log.length; i < len; i++ ) { + jsons.push( JSON.stringify( log[i] ) ); + } + logElement.value = '[\n\t' + + jsons.join(',\n\t') + '\n]'; + logElement.scrollTop = logElement.scrollHeight; + } + + /** @param {jQuery.Event} e Halo form submit event */ + function start( e ) { + e.preventDefault(); + + comments = { + 'imeIdentifier': haloElement.identifier.value, + 'userAgent': navigator.userAgent, + 'startDom': contentElement.innerHTML + }; + + haloElement.style.display = 'none'; + contentElement.style.display = 'block'; + contentElement.focus(); + } + + function init() { + var i, len, range, sel, eventSequencer, handlers = {}, + eventNames = [ + 'compositionstart', + 'compositionend', + 'keydown', + 'keyup', + 'keypress', + 'input' + ]; + + haloElement = document.getElementById( 've-demo-halo' ), + contentElement = document.getElementById( 've-demo-content' ), + logElement = document.getElementById( 've-demo-log' ); + logElement.value = ''; + + eventSequencer = new ve.EventSequencer( eventNames ); + eventSequencer.attach( $( contentElement ) ); + + for ( i = 0, len = eventNames.length; i < len; i++ ) { + handlers[ eventNames[i] ] = + makeEventHandler( eventNames[i] ); + } + eventSequencer.on( handlers ); + eventSequencer.afterLoop( [ makeAfterLoopHandler() ] ); + + startTime = new Date().getTime(); + + $( haloElement ).on( 'submit', start ); + + $( logElement ).on( 'click', function () { + if ( this.select ) { + this.select(); + } + } ); + } + + init(); + }() ); + + </script> + </body> +</html> -- To view, visit https://gerrit.wikimedia.org/r/95990 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Id604161b568cd412b44fe9979aff45d1fe7f054a Gerrit-PatchSet: 3 Gerrit-Project: mediawiki/extensions/VisualEditor Gerrit-Branch: master Gerrit-Owner: Catrope <roan.katt...@gmail.com> Gerrit-Reviewer: Catrope <roan.katt...@gmail.com> Gerrit-Reviewer: Divec <da...@sheetmusic.org.uk> Gerrit-Reviewer: jenkins-bot _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits