terminal: add custom key handler for xterm.js

Bug: b/236205389
Change-Id: I43f690614ccf98d265a29935533c1b39b38b8837
Reviewed-on: https://chromium-review.googlesource.com/c/apps/libapps/+/3864725
Reviewed-by: Joel Hockey <joelhockey@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
diff --git a/terminal/js/terminal_emulator_tests.js b/terminal/js/terminal_emulator_tests.js
index 04b1b8d..1ad1794 100644
--- a/terminal/js/terminal_emulator_tests.js
+++ b/terminal/js/terminal_emulator_tests.js
@@ -7,8 +7,9 @@
  */
 
 import {sleep} from './terminal_common.js';
-import {XtermTerminal, XtermTerminalTestParams} from './terminal_emulator.js';
-import {MockObject} from './terminal_test_mocks.js';
+import {encodeKeyCombo, Modifier, XtermTerminal, XtermTerminalTestParams}
+    from './terminal_emulator.js';
+import {MockFunction, MockObject} from './terminal_test_mocks.js';
 
 describe('terminal_emulator_tests.js', function() {
   describe('XtermTerminal', function() {
@@ -84,5 +85,36 @@
         assert.deepEqual(this.mocks.fitAddon.getMethodHistory('fit'), []);
       });
     });
+
+    it('customKeyEventHandler_', async function() {
+      const mockHandler = new MockFunction();
+      const fakeEvent = {
+        type: 'keydown',
+        keyCode: 65,
+        ctrlKey: true,
+      };
+      this.terminal.keyDownHandlers_.set(encodeKeyCombo(Modifier.Ctrl, 65),
+          mockHandler.proxy);
+      assert.isFalse(this.terminal.customKeyEventHandler_(fakeEvent));
+      const history = mockHandler.popHistory();
+      assert.equal(history.length, 1);
+      assert.equal(history[0][0], fakeEvent);
+
+      assert.isFalse(this.terminal.customKeyEventHandler_({...fakeEvent,
+        type: 'keypress'}));
+      assert.isEmpty(mockHandler.popHistory());
+
+      assert.isTrue(this.terminal.customKeyEventHandler_({...fakeEvent,
+        shiftKey: true}));
+      assert.isEmpty(mockHandler.popHistory());
+
+      assert.isTrue(this.terminal.customKeyEventHandler_({...fakeEvent,
+        keyCode: 66}));
+      assert.isEmpty(mockHandler.popHistory());
+
+      assert.isTrue(this.terminal.customKeyEventHandler_({...fakeEvent,
+        ctrlKey: false}));
+      assert.isEmpty(mockHandler.popHistory());
+    });
   });
 });