Bug 1131573 - Add contextmenu support to input elements in forms. r=kanru

This commit is contained in:
Fabrice Desré 2015-02-10 09:32:48 -08:00
parent 2069e0c923
commit 9f1c6593b0
2 changed files with 65 additions and 3 deletions

View File

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

View File

@ -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) {
'<video id="menu4-trigger" src="' + videoUrl + '"></video>' +
'<video id="menu5-trigger" preload="metadata"></video>' +
'<audio id="menu6-trigger" src="' + audioUrl + '"></audio>' +
'<form action="no_method"><input id="menu7-trigger" name="input1"></input></form>' +
'<form action="http://example.com/get_method" method="get"><input id="menu8-trigger" name="input2"></input></form>' +
'<form action="post_method" method="post"><input id="menu9-trigger" name="input3"></input></form>' +
'</body></html>';
document.body.appendChild(iframe);