From 09743751aade0cc6853c97a3bb781f903991d858 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Sat, 2 Apr 2016 20:55:17 -0400 Subject: [PATCH 1/2] readline: document emitKeypressEvents() This commit adds documentation to the already publicly available readline.emitKeypressEvents() method. --- doc/api/readline.markdown | 5 ++++ .../test-readline-emit-keypress-events.js | 30 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 test/parallel/test-readline-emit-keypress-events.js diff --git a/doc/api/readline.markdown b/doc/api/readline.markdown index c2b77c524533bf..db543d2306a591 100644 --- a/doc/api/readline.markdown +++ b/doc/api/readline.markdown @@ -354,6 +354,11 @@ a `'resize'` event on the `output` if/when the columns ever change Move cursor to the specified position in a given TTY stream. +## readline.emitKeypressEvents(stream) + +Causes `stream` to begin emitting `'keypress'` events corresponding to its +input. + ## readline.moveCursor(stream, dx, dy) Move cursor relative to it's current position in a given TTY stream. diff --git a/test/parallel/test-readline-emit-keypress-events.js b/test/parallel/test-readline-emit-keypress-events.js new file mode 100644 index 00000000000000..ddadf6d223feaf --- /dev/null +++ b/test/parallel/test-readline-emit-keypress-events.js @@ -0,0 +1,30 @@ +'use strict'; +// emitKeypressEvents is thoroughly tested in test-readline-keys.js. +// However, that test calls it implicitly. This is just a quick sanity check +// to verify that it works when called explicitly. + +require('../common'); +const assert = require('assert'); +const readline = require('readline'); +const PassThrough = require('stream').PassThrough; +const stream = new PassThrough(); +const sequence = []; +const keys = []; + +readline.emitKeypressEvents(stream); + +stream.on('keypress', (s, k) => { + sequence.push(s); + keys.push(k); +}); + +stream.write('foo'); + +process.on('exit', () => { + assert.deepStrictEqual(sequence, ['f', 'o', 'o']); + assert.deepStrictEqual(keys, [ + { sequence: 'f', name: 'f', ctrl: false, meta: false, shift: false }, + { sequence: 'o', name: 'o', ctrl: false, meta: false, shift: false }, + { sequence: 'o', name: 'o', ctrl: false, meta: false, shift: false } + ]); +}); From 9046fce4348a8ba1e5487e77bf407f1dbd8faf7f Mon Sep 17 00:00:00 2001 From: cjihrig Date: Sat, 2 Apr 2016 21:08:22 -0400 Subject: [PATCH 2/2] readline: emit key info unconditionally Currently, 'keypress' events include the sequence and key info for named keys, but only the sequence for unnamed keys. This commit causes the key info to be included in both cases. --- lib/internal/readline.js | 5 ++--- test/parallel/test-readline-keys.js | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/internal/readline.js b/lib/internal/readline.js index aad0794a682ba6..3248c7c50ae27e 100644 --- a/lib/internal/readline.js +++ b/lib/internal/readline.js @@ -384,9 +384,8 @@ function* emitKeys(stream) { stream.emit('keypress', escaped ? undefined : s, key); } else if (s.length === 1) { /* Single unnamed character, e.g. "." */ - stream.emit('keypress', s); - } else { - /* Unrecognized or broken escape sequence, don't emit anything */ + stream.emit('keypress', s, key); } + /* Unrecognized or broken escape sequence, don't emit anything */ } } diff --git a/test/parallel/test-readline-keys.js b/test/parallel/test-readline-keys.js index e026c0b583cd9e..ef9e2eba9090c9 100644 --- a/test/parallel/test-readline-keys.js +++ b/test/parallel/test-readline-keys.js @@ -48,7 +48,7 @@ function addTest(sequences, expectedKeys) { addTest('io.JS', [ { name: 'i', sequence: 'i' }, { name: 'o', sequence: 'o' }, - undefined, // emitted as `emit('keypress', '.', undefined)` + { name: undefined, sequence: '.' }, { name: 'j', sequence: 'J', shift: true }, { name: 's', sequence: 'S', shift: true }, ]);