diff --git a/common/content/buffer.js b/common/content/buffer.js index 93ac0e42..8f6a6b2a 100644 --- a/common/content/buffer.js +++ b/common/content/buffer.js @@ -527,7 +527,7 @@ const Buffer = Module("buffer", { try { let [x, y] = elem.getAttribute("coords").split(",").map(parseFloat); - elem.dispatchEvent(events.create(elem.ownerDocument, "mouseover", { screenX: x, screenY: y })); + events.dispatch(elem, events.create(elem.ownerDocument, "mouseover", { screenX: x, screenY: y })); } catch (e) {} } @@ -608,8 +608,7 @@ const Buffer = Module("buffer", { followLink: function (elem, where) { let doc = elem.ownerDocument; let view = doc.defaultView; - let offsetX = 1; - let offsetY = 1; + let { left: offsetX, top: offsetY } = elem.getBoundingClientRect(); if (isinstance(elem, [HTMLFrameElement, HTMLIFrameElement])) return buffer.focusElement(elem); @@ -646,10 +645,10 @@ const Buffer = Module("buffer", { prefs.withContext(function () { prefs.set("browser.tabs.loadInBackground", true); - ["mousedown", "mouseup", "click"].forEach(function (event) { - elem.dispatchEvent(events.create(doc, event, { + ["mousedown", "mouseup"].forEach(function (event) { + events.dispatch(elem, events.create(doc, event, { screenX: offsetX, screenY: offsetY, - ctrlKey: ctrlKey, shiftKey: shiftKey, metaKey: ctrlKey + ctrlKey: ctrlKey, shiftKey: shiftKey, metaKey: false })); }); }); diff --git a/common/content/editor.js b/common/content/editor.js index 9d574c71..607ec239 100644 --- a/common/content/editor.js +++ b/common/content/editor.js @@ -56,7 +56,7 @@ const Editor = Module("editor", { elem.scrollLeft = curLeft; let event = elem.ownerDocument.createEvent("Event"); event.initEvent("input", true, false); - elem.dispatchEvent(event); + events.dispatch(elem, event); } }, diff --git a/common/content/events.js b/common/content/events.js index ea6aea50..16a496c1 100644 --- a/common/content/events.js +++ b/common/content/events.js @@ -289,7 +289,7 @@ const Events = Module("events", { let duringFeed = this.duringFeed; this.duringFeed = []; for (let [, evt] in Iterator(duringFeed)) - evt.target.dispatchEvent(evt); + events.dispatch(evt.target, evt); } } }, @@ -358,6 +358,18 @@ const Events = Module("events", { return events.fromString(keys).map(events.closure.toString).join(""); }, + /** + * Dispatches an event to an element as if it were a native event. + * + * @param {Node} target The DOM node to which to dispatch the event. + * @param {Event} event The event to dispatch. + */ + dispatch: function (target, event) { + return target.ownerDocument.defaultView + .QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils) + .dispatchDOMEventViaPresShell(target, event, true); + }, + /** * Converts an event string into an array of pseudo-event objects. * diff --git a/common/content/tabs.js b/common/content/tabs.js index 9109c07d..d56cdf10 100644 --- a/common/content/tabs.js +++ b/common/content/tabs.js @@ -1046,7 +1046,7 @@ const Tabs = Module("tabs", { "stringlist", "tab", { setter: function (values) { - let [open, restriction] = [1, 0]; + let open = 1, restriction = 0; for (let [, opt] in Iterator(values)) { if (opt == "tab") open = 3;