tridactyl/src/keydown_content.ts

91 lines
2.3 KiB
TypeScript
Raw Normal View History

/* 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)
}