Bug 1379466 - Use auxclick event to trigger new tab on middle click. r=smaug

So it is still preventDefault()able once non-primary clicks aren't web visible.

Don't let browser.js' contentAreaClick handle any non-primary clicks.
ClickHandlerChild.jsm handles them first anyway.  Can probably rip it out
entirely in another bug.

Differential Revision: https://phabricator.services.mozilla.com/D26791

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Ian Moody 2019-04-18 12:57:36 +00:00
Родитель 1b8f11bedf
Коммит 1cabd68a41
4 изменённых файлов: 16 добавлений и 5 удалений

Просмотреть файл

@ -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;
}

Просмотреть файл

@ -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);

Просмотреть файл

@ -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();
}

Просмотреть файл

@ -77,6 +77,7 @@ let ACTORS = {
module: "resource:///actors/ClickHandlerChild.jsm",
events: {
"click": {capture: true, mozSystemGroup: true},
"auxclick": {capture: true, mozSystemGroup: true},
},
},
},