Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
101 lines
3.1 KiB
JavaScript
Executable file
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));
|