diff --git a/common/content/buffer.js b/common/content/buffer.js index 6966db19..51659195 100644 --- a/common/content/buffer.js +++ b/common/content/buffer.js @@ -1069,14 +1069,13 @@ function Buffer() //{{{ elem.focus(); - let evt = doc.createEvent("MouseEvents"); let x = 0; let y = 0; // for imagemap if (elemTagName == "area") [x, y] = elem.getAttribute("coords").split(",").map(Number); - evt.initMouseEvent("mouseover", true, true, doc.defaultView, 1, x, y, 0, 0, 0, 0, 0, 0, 0, null); + let evt = events.create(doc, "mouseover", { screenX: x, screenY: y }); elem.dispatchEvent(evt); }, @@ -1159,19 +1158,18 @@ function Buffer() //{{{ let offsetX = 1; let offsetY = 1; - let localName = elem.localName.toLowerCase(); - if (localName == "frame" || localName == "iframe") // broken? + if (elem instanceof HTMLFrameElement || elem instanceof HTMLIFrameElement) { elem.contentWindow.focus(); return; } - else if (localName == "area") // for imagemap + else if (elem instanceof HTMLAreaElement) // for imagemap { let coords = elem.getAttribute("coords").split(","); offsetX = Number(coords[0]) + 1; offsetY = Number(coords[1]) + 1; } - else if (localName == "input" && elem.type.toLowerCase() == "file") + else if (elem instanceof HTMLInputElement && elem.type == "file") { openUploadPrompt(elem); return; @@ -1196,12 +1194,13 @@ function Buffer() //{{{ elem.focus(); - let evt = doc.createEvent("MouseEvents"); options.withContext(function () { options.setPref("browser.tabs.loadInBackground", true); ["mousedown", "mouseup", "click"].forEach(function (event) { - evt.initMouseEvent(event, true, true, view, 1, offsetX, offsetY, 0, 0, - ctrlKey, /*altKey*/0, shiftKey, /*metaKey*/ ctrlKey, 0, null); + let evt = events.create(doc, event, { + screenX: offsetX, screenY: offsetY, + ctrlKey: ctrlKey, shiftKey: shiftKey, metaKey: ctrlKey + }); elem.dispatchEvent(evt); }); }); diff --git a/common/content/events.js b/common/content/events.js index 0975c509..6b1467ab 100644 --- a/common/content/events.js +++ b/common/content/events.js @@ -970,8 +970,10 @@ function Events() //{{{ } let elem = liberator.focus || window.content; - let evt = doc.createEvent("KeyEvents"); - evt.initKeyEvent("keypress", true, true, view, ctrl, alt, shift, meta, keyCode, charCode); + let evt = events.create(doc, "keypress", { + ctrlKey: ctrl, altKey: alt, shiftKey: shift, metaKey: meta , + keyCode: keyCode, charCode: charCode + }); if (typeof noremap == "object") for (let [k, v] in Iterator(noremap)) evt[k] = v; @@ -1012,6 +1014,40 @@ function Events() //{{{ } }, + create: function (doc, type, opts) + { + var DEFAULTS = { + Key: { + type: type, + bubbles: true, cancelable: true, + view: doc.defaultView, + ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, + keyCode: 0, charCode: 0 + }, + Mouse: { + type: type, + bubbles: true, cancelable: true, + view: doc.defaultView, + detail: 1, + screenX: 0, screenY: 0, + clientX: 0, clientY: 0, + ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, + button: 0, + relatedTarget: null + } + }; + const TYPES = { + click: "Mouse", mousedown: "Mouse", mouseup: "Mouse", + mouseover: "Mouse", mouseout: "Mouse", + keypress: "Key", keyup: "Key", keydown: "Key" + }; + var t = TYPES[type]; + var evt = doc.createEvent(t + "Events"); + evt["init" + t + "Event"].apply(evt, + [v for ([k, v] in Iterator(util.extend(DEFAULTS[t], opts)))]); + return evt; + }, + /** * Converts the specified key event to a string in liberator key-code * notation. Returns null for an unknown key event.