mirror of
https://github.com/vale981/tridactyl
synced 2025-03-10 20:56:37 -04:00
91 lines
2.3 KiB
TypeScript
91 lines
2.3 KiB
TypeScript
![]() |
/* Shim for the keyboard API because it won't hit in FF57. */
|
||
|
|
||
|
/* Interface:
|
||
|
|
||
|
All keyboard events will be sent to whatever listens to Port keydown-shim.
|
||
|
|
||
|
oldUse:
|
||
|
|
||
|
function setup_port(p) {
|
||
|
if (p.name === "keydown-shim") {
|
||
|
this.port = p
|
||
|
this.unlisten()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export var port: browser.runtime.Port = undefined
|
||
|
var unlisten = browser.runtime.onConnect.addListener(setup_port)
|
||
|
|
||
|
newUse:
|
||
|
|
||
|
function listen(msg) {
|
||
|
if (msg.name === "keydown") {
|
||
|
feed(msg.keydown)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
{
|
||
|
...
|
||
|
browser.tabs.sendMessage({command: "keydown-suppress", preventDefault: true})
|
||
|
...
|
||
|
}
|
||
|
|
||
|
browser.runtime.onMessage.addListener(listen);
|
||
|
|
||
|
*/
|
||
|
|
||
|
namespace keydown_content {
|
||
|
// {{{ Helper functions
|
||
|
|
||
|
function pick (o, ...props) {
|
||
|
return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]})))
|
||
|
}
|
||
|
|
||
|
// Shallow copy of keyevent.
|
||
|
function shallowKeyboardEvent (ke): Event {
|
||
|
let shallow = pick(
|
||
|
ke,
|
||
|
'shiftKey', 'metaKey', 'altKey', 'ctrlKey', 'repeat', 'key',
|
||
|
'bubbles', 'composed', 'defaultPrevented', 'eventPhase',
|
||
|
'timeStamp', 'type', 'isTrusted'
|
||
|
)
|
||
|
shallow.target = pick(ke.target, 'tagName')
|
||
|
shallow.target.ownerDocument = pick(ke.target.ownerDocument, 'URL')
|
||
|
return shallow
|
||
|
} // }}}
|
||
|
|
||
|
function keyeventHandler(ke: KeyboardEvent) {
|
||
|
// Suppress events, if requested
|
||
|
if (preventDefault) {
|
||
|
ke.preventDefault()
|
||
|
}
|
||
|
if (stopPropagation) {
|
||
|
ke.stopPropagation()
|
||
|
}
|
||
|
browser.runtime.sendMessage({command: "keydown", event: shallowKeyboardEvent(ke)})
|
||
|
}
|
||
|
|
||
|
// Listen for suppression messages from bg script.
|
||
|
function backgroundListener(message) {
|
||
|
if (message.command === "keydown-suppress") {
|
||
|
if ('preventDefault' in message.data) {
|
||
|
preventDefault = message.data.preventDefault
|
||
|
}
|
||
|
if ('stopPropagation' in message.data) {
|
||
|
stopPropagation = message.data.stopPropagation
|
||
|
}
|
||
|
}
|
||
|
// This is to shut up the type checker.
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
// State
|
||
|
let preventDefault = false
|
||
|
let stopPropagation = false
|
||
|
|
||
|
// Add listeners
|
||
|
window.addEventListener("keydown", keyeventHandler)
|
||
|
browser.runtime.onMessage.addListener(backgroundListener)
|
||
|
}
|
||
|
|