VulpesOS/gaia/shared/js/smart-screen/key_navigation_adapter.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

101 lines
3.1 KiB
JavaScript
Executable file

/* global KeyEvent, evt */
(function(exports) {
'use strict';
// KeyNavigationAdapter files event with '-keyup' as postfix. All behaviors
// which no need to have multple events while holding the key should use
// keyup.
// If we choose to listen to mozbrowser key events, before- and after- prefix
// will be attached on filed events.
function KeyNavigationAdapter() {
}
KeyNavigationAdapter.prototype = evt({
KEY_EVENTS: Object.freeze([
'keydown',
'keyup'
]),
MOZ_BROWSER_KEY_EVENTS: [
'mozbrowserbeforekeydown',
'mozbrowserbeforekeyup',
'mozbrowserafterkeydown',
'mozbrowserafterkeyup'
],
init: function kna_init(targetElement, options) {
this._targetElement = targetElement || window;
options = options || {};
// Pick required event listeners and add them
this._evtNames = [].concat(this.KEY_EVENTS);
if (options.useMozBrowserKeyEvents) {
this._evtNames = this._evtNames.concat(this.MOZ_BROWSER_KEY_EVENTS);
}
this._evtNames.forEach(
name => this._targetElement.addEventListener(name, this));
},
uninit: function kna_uninit() {
this._evtNames.foreach(
name => this._targetElement.removeEventListener(name, this));
},
handleEvent: function kna_handleEvent(evt) {
if(this._evtNames.indexOf(evt.type) !== -1) {
this.handleKeyEvent(this.convertKeyToString(evt.keyCode), evt.type);
}
},
handleKeyEvent: function kna_handleKeyEvent(key, eventType) {
// XXX : It's better to use KeyEvent.Key and use "ArrowUp", "ArrowDown",
// "ArrowLeft", "ArrowRight" for switching after Gecko synced with W3C
// KeyboardEvent.Key standard. Here we still use KeyCode and customized
// string of "up", "down", "left", "right" for the moment.
var evtPostfix = 'keyup' === eventType ? '-keyup' : '';
var prefixMatch = /mozbrowser(before|after)/.exec(eventType);
var evtPrefix = prefixMatch ? prefixMatch[1] + '-' : '';
switch (key) {
case 'up':
case 'down':
case 'left':
case 'right':
this.fire(evtPrefix + 'move' + evtPostfix, key);
break;
case 'enter':
this.fire(evtPrefix + 'enter' + evtPostfix);
break;
case 'back':
this.fire(evtPrefix + 'back' + evtPostfix);
break;
case 'esc':
this.fire(evtPrefix + 'esc' + evtPostfix);
break;
}
},
convertKeyToString: function kna_convertKeyToString(keyCode) {
switch (keyCode) {
case KeyEvent.DOM_VK_UP:
return 'up';
case KeyEvent.DOM_VK_RIGHT:
return 'right';
case KeyEvent.DOM_VK_DOWN:
return 'down';
case KeyEvent.DOM_VK_LEFT:
return 'left';
case KeyEvent.DOM_VK_RETURN:
return 'enter';
case KeyEvent.DOM_VK_ESCAPE:
return 'esc';
case KeyEvent.DOM_VK_BACK_SPACE:
return 'back';
default:// we don't consume other keys.
return null;
}
}
});
exports.KeyNavigationAdapter = KeyNavigationAdapter;
}(window));