diff --git a/browser/actors/ClickHandlerChild.jsm b/browser/actors/ClickHandlerChild.jsm index 8fe3c85948cb..12467200c372 100644 --- a/browser/actors/ClickHandlerChild.jsm +++ b/browser/actors/ClickHandlerChild.jsm @@ -19,7 +19,8 @@ ChromeUtils.defineModuleGetter(this, "E10SUtils", class ClickHandlerChild extends ActorChild { handleEvent(event) { - if (!event.isTrusted || event.defaultPrevented || event.button == 2) { + if (!event.isTrusted || event.defaultPrevented || event.button == 2 || + (event.type == "click" && event.button == 1)) { return; } diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 16a5ae88e025..cb98d9c88083 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -6281,7 +6281,7 @@ function hrefAndLinkNodeForClickEvent(event) { * @note default event is prevented if the click is handled. */ function contentAreaClick(event, isPanelClick) { - if (!event.isTrusted || event.defaultPrevented || event.button == 2) + if (!event.isTrusted || event.defaultPrevented || event.button != 0) return; let [href, linkNode] = hrefAndLinkNodeForClickEvent(event); diff --git a/browser/base/content/test/general/browser_contentAreaClick.js b/browser/base/content/test/general/browser_contentAreaClick.js index ed362d1e19f6..4c58aca4a182 100644 --- a/browser/base/content/test/general/browser_contentAreaClick.js +++ b/browser/base/content/test/general/browser_contentAreaClick.js @@ -123,6 +123,7 @@ var gTests = [ setup() {}, clean() {}, event: { button: 1 }, + wantedEvent: "auxclick", targets: [ "commonlink", "mathxlink", "svgxlink", "maplink" ], expectedInvokedMethods: [ "urlSecurityCheck", "openLinkIn" ], preventDefault: true, @@ -137,6 +138,7 @@ var gTests = [ Services.prefs.clearUserPref("browser.tabs.opentabfor.middleclick"); }, event: { button: 1 }, + wantedEvent: "auxclick", targets: [ "commonlink", "mathxlink", "svgxlink", "maplink" ], expectedInvokedMethods: [ "urlSecurityCheck", "openLinkIn" ], preventDefault: true, @@ -153,6 +155,7 @@ var gTests = [ Services.prefs.clearUserPref("general.autoScroll"); }, event: { button: 1 }, + wantedEvent: "auxclick", targets: [ "emptylink" ], expectedInvokedMethods: [ "middleMousePaste" ], preventDefault: true, @@ -208,9 +211,13 @@ function test() { // Click handler used to steal click events. var gClickHandler = { handleEvent(event) { + if (event.type == "click" && event.button != 0) { + return; + } let linkId = event.target.id || event.target.localName; - is(event.type, "click", - gCurrentTest.desc + ":Handler received a click event on " + linkId); + let wantedEvent = gCurrentTest.wantedEvent || "click"; + is(event.type, wantedEvent, + `${gCurrentTest.desc}:Handler received a ${wantedEvent} event on ${linkId}`); let isPanelClick = linkId == "panellink"; gTestWin.contentAreaClick(event, isPanelClick); @@ -241,6 +248,7 @@ var gClickHandler = { function setupTestBrowserWindow() { // Steal click events and don't propagate them. gTestWin.addEventListener("click", gClickHandler, true); + gTestWin.addEventListener("auxclick", gClickHandler, true); // Replace methods. gReplacedMethods.forEach(function(methodName) { @@ -286,7 +294,7 @@ function runNextTest() { info(gCurrentTest.desc + ": testing " + target); - // Fire click event. + // Fire (aux)click event. let targetElt = gTestWin.content.document.getElementById(target); ok(targetElt, gCurrentTest.desc + ": target is valid (" + targetElt.id + ")"); EventUtils.synthesizeMouseAtCenter(targetElt, gCurrentTest.event, gTestWin.content); @@ -295,6 +303,7 @@ function runNextTest() { function finishTest() { info("Restoring browser..."); gTestWin.removeEventListener("click", gClickHandler, true); + gTestWin.removeEventListener("auxclick", gClickHandler, true); gTestWin.close(); finish(); } diff --git a/browser/components/BrowserGlue.jsm b/browser/components/BrowserGlue.jsm index f0c695a600a4..57cc0d09fade 100644 --- a/browser/components/BrowserGlue.jsm +++ b/browser/components/BrowserGlue.jsm @@ -77,6 +77,7 @@ let ACTORS = { module: "resource:///actors/ClickHandlerChild.jsm", events: { "click": {capture: true, mozSystemGroup: true}, + "auxclick": {capture: true, mozSystemGroup: true}, }, }, },