From 9f1c6593b02dfcff22d5d08c3d2e1f820a3ca171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabrice=20Desr=C3=A9?= Date: Tue, 10 Feb 2015 09:32:48 -0800 Subject: [PATCH] Bug 1131573 - Add contextmenu support to input elements in forms. r=kanru --- .../BrowserElementChildPreload.js | 27 +++++++++++- .../browserElement_ContextmenuEvents.js | 41 ++++++++++++++++++- 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/dom/browser-element/BrowserElementChildPreload.js b/dom/browser-element/BrowserElementChildPreload.js index 4464dd8986c..8bd31ffb0bc 100644 --- a/dom/browser-element/BrowserElementChildPreload.js +++ b/dom/browser-element/BrowserElementChildPreload.js @@ -808,10 +808,10 @@ BrowserElementChild.prototype = { } } - // The value returned by the contextmenu sync call is true iff the embedder + // The value returned by the contextmenu sync call is true if the embedder // called preventDefault() on its contextmenu event. // - // We call preventDefault() on our contextmenu event iff the embedder called + // We call preventDefault() on our contextmenu event if the embedder called // preventDefault() on /its/ contextmenu event. This way, if the embedder // ignored the contextmenu event, TabChild will fire a click. if (sendSyncMsg('contextmenu', menuData)[0]) { @@ -838,6 +838,29 @@ BrowserElementChild.prototype = { (elem.videoWidth == 0 || elem.videoHeight == 0)); return {uri: elem.currentSrc || elem.src, hasVideo: hasVideo}; } + if (elem instanceof Ci.nsIDOMHTMLInputElement && + elem.hasAttribute("name")) { + // For input elements, we look for a parent
and if there is + // one we return the form's method and action uri. + let parent = elem.parentNode; + while (parent) { + if (parent instanceof Ci.nsIDOMHTMLFormElement && + parent.hasAttribute("action")) { + let actionHref = docShell.QueryInterface(Ci.nsIWebNavigation) + .currentURI + .resolve(parent.getAttribute("action")); + let method = parent.hasAttribute("method") + ? parent.getAttribute("method").toLowerCase() + : "get"; + return { + action: actionHref, + method: method, + name: elem.getAttribute("name"), + } + } + parent = parent.parentNode; + } + } return false; }, diff --git a/dom/browser-element/mochitest/browserElement_ContextmenuEvents.js b/dom/browser-element/mochitest/browserElement_ContextmenuEvents.js index 18669205a27..e1dbb35dbef 100644 --- a/dom/browser-element/mochitest/browserElement_ContextmenuEvents.js +++ b/dom/browser-element/mochitest/browserElement_ContextmenuEvents.js @@ -165,11 +165,47 @@ function checkAudioinVideoContextMenu() { is(target.data.uri, audioUrl, 'Reports uri correctly in data'); is(target.data.hasVideo, false, 'Audio data in video tag reports no "hasVideo"'); - SimpleTest.finish(); + checkFormNoMethod(); }, /* ignorePreventDefault */ true); }); } +function checkFormNoMethod() { + sendContextMenuTo('#menu7-trigger', function onContextMenu(detail) { + var target = detail.systemTargets[0]; + is(target.nodeName, 'INPUT', 'Reports correct nodeName'); + is(target.data.method, 'get', 'Reports correct method'); + is(target.data.action, 'no_method', 'Reports correct action url'); + is(target.data.name, 'input1', 'Reports correct input name'); + + checkFormGetMethod(); + }, /* ignorePreventDefault */ true); +} + +function checkFormGetMethod() { + sendContextMenuTo('#menu8-trigger', function onContextMenu(detail) { + var target = detail.systemTargets[0]; + is(target.nodeName, 'INPUT', 'Reports correct nodeName'); + is(target.data.method, 'get', 'Reports correct method'); + is(target.data.action, 'http://example.com/get_method', 'Reports correct action url'); + is(target.data.name, 'input2', 'Reports correct input name'); + + checkFormPostMethod(); + }, /* ignorePreventDefault */ true); +} + +function checkFormPostMethod() { + sendContextMenuTo('#menu9-trigger', function onContextMenu(detail) { + var target = detail.systemTargets[0]; + is(target.nodeName, 'INPUT', 'Reports correct nodeName'); + is(target.data.method, 'post', 'Reports correct method'); + is(target.data.action, 'post_method', 'Reports correct action url'); + is(target.data.name, 'input3', 'Reports correct input name'); + + SimpleTest.finish(); + }, /* ignorePreventDefault */ true); +} + /* Helpers */ var mm = null; var previousContextMenuDetail = null; @@ -240,6 +276,9 @@ function createIframe(callback) { '' + '' + '' + + '
' + + '
' + + '
' + ''; document.body.appendChild(iframe);