From 24add5296b6d65c4bebed54910bebb882775caa3 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Wed, 3 Nov 2010 03:49:44 -0400 Subject: [PATCH] Use nsIDOMWindowUtils to fake key events rather than dispatch them manually. --HG-- extra : rebase_source : cc84bb65cc911520c376c92b728aeee30fcd9d76 --- common/content/events.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/common/content/events.js b/common/content/events.js index 38d5d9a2..f0cfa5ff 100644 --- a/common/content/events.js +++ b/common/content/events.js @@ -250,10 +250,9 @@ const Events = Module("events", { util.threadYield(1, true); for (let [, evt_obj] in Iterator(events.fromString(keys))) { - delete evt_obj.type; for (let type in values(["keydown", "keyup", "keypress"])) { let elem = dactyl.focus || buffer.focusedFrame; - let evt = events.create(doc, type, evt_obj); + let evt = this.feedingEvent = update({}, evt_obj, { type: type }); if (isObject(noremap)) update(evt, noremap); @@ -261,10 +260,10 @@ const Events = Module("events", { evt.noremap = !!noremap; evt.isMacro = true; - // A special hack for dactyl-specific key names. if (!evt_obj.dactylString && !evt_obj.dactylShift) - elem.dispatchEvent(evt); - else { + window.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils) + .sendKeyEvent(type, evt.keyCode, evt.charCode, evt.modifiers); + else { // A special hack for dactyl-specific key names. evt.dactylString = evt_obj.dactylString; // for key-less keypress events e.g. evt.dactylShift = evt_obj.dactylShift; // for untypeable shift keys e.g. events.onKeyPress(evt); @@ -281,6 +280,7 @@ const Events = Module("events", { } } finally { + this.feedingEvent = null; this.feedingKeys = wasFeeding; if (quiet) commandline.quiet = wasQuiet; @@ -437,6 +437,11 @@ const Events = Module("events", { if (evt_obj.keyCode == 60 || evt_obj.charCode == 60) evt_obj.charCode = evt_obj.keyCode = 60; // + evt_obj.modifiers = (evt_obj.ctrlKey && Ci.nsIDOMNSEvent.CONTROL_MASK) + | (evt_obj.altKey && Ci.nsIDOMNSEvent.ALT_MASK) + | (evt_obj.shiftKey && Ci.nsIDOMNSEvent.SHIFT_MASK) + | (evt_obj.metaKey && Ci.nsIDOMNSEvent.META_MASK); + out.push(evt_obj); } return out; @@ -753,6 +758,9 @@ const Events = Module("events", { event.stopPropagation(); } + if (this.feedingEvent && [!(k in event) || event[k] === v for ([k, v] in Iterator(this.feedingEvent))].every(util.identity)) + update(event, this.feedingEvent); + let key = events.toString(event); if (!key) return null;