Bug 566064 (2/2) - Implement formtarget for <input> and <button> which override <form> target attribute. r=sicking a2.0=blocking

This commit is contained in:
Mounir Lamouri 2010-08-20 00:58:10 +02:00
Родитель 05be4a0ea1
Коммит 2928a08300
9 изменённых файлов: 211 добавлений и 7 удалений

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

@ -389,6 +389,7 @@ GK_ATOM(forEach, "for-each")
GK_ATOM(form, "form")
GK_ATOM(format, "format")
GK_ATOM(formatNumber, "format-number")
GK_ATOM(formtarget, "formtarget")
GK_ATOM(frame, "frame")
GK_ATOM(frameborder, "frameborder")
GK_ATOM(frameset, "frameset")

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

@ -208,6 +208,7 @@ nsHTMLButtonElement::GetForm(nsIDOMHTMLFormElement** aForm)
NS_IMPL_STRING_ATTR(nsHTMLButtonElement, AccessKey, accesskey)
NS_IMPL_BOOL_ATTR(nsHTMLButtonElement, Autofocus, autofocus)
NS_IMPL_BOOL_ATTR(nsHTMLButtonElement, Disabled, disabled)
NS_IMPL_STRING_ATTR(nsHTMLButtonElement, FormTarget, formtarget)
NS_IMPL_STRING_ATTR(nsHTMLButtonElement, Name, name)
NS_IMPL_INT_ATTR_DEFAULT_VALUE(nsHTMLButtonElement, TabIndex, tabindex, 0)
NS_IMPL_STRING_ATTR(nsHTMLButtonElement, Value, value)

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

@ -769,6 +769,8 @@ nsresult
nsHTMLFormElement::SubmitSubmission(nsFormSubmission* aFormSubmission)
{
nsresult rv;
nsIContent* originatingElement = aFormSubmission->GetOriginatingElement();
//
// Get the action and target
//
@ -807,8 +809,18 @@ nsHTMLFormElement::SubmitSubmission(nsFormSubmission* aFormSubmission)
mIsSubmitting = PR_FALSE;
}
// The target is the originating element formtarget attribute if the element
// is a submit control and has such an attribute.
// Otherwise, the target is the form owner's target attribute,
// if it has such an attribute.
// Finally, if one of the child nodes of the head element is a base element
// with a target attribute, then the value of the target attribute of the
// first such base element; or, if there is no such element, the empty string.
nsAutoString target;
if (!GetAttr(kNameSpaceID_None, nsGkAtoms::target, target)) {
if (!(originatingElement && originatingElement->GetAttr(kNameSpaceID_None,
nsGkAtoms::formtarget,
target)) &&
!GetAttr(kNameSpaceID_None, nsGkAtoms::target, target)) {
GetBaseTarget(target);
}

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

@ -551,6 +551,7 @@ NS_IMPL_STRING_ATTR(nsHTMLInputElement, Alt, alt)
NS_IMPL_BOOL_ATTR(nsHTMLInputElement, Autofocus, autofocus)
//NS_IMPL_BOOL_ATTR(nsHTMLInputElement, Checked, checked)
NS_IMPL_BOOL_ATTR(nsHTMLInputElement, Disabled, disabled)
NS_IMPL_STRING_ATTR(nsHTMLInputElement, FormTarget, formtarget)
NS_IMPL_BOOL_ATTR(nsHTMLInputElement, Multiple, multiple)
NS_IMPL_NON_NEGATIVE_INT_ATTR(nsHTMLInputElement, MaxLength, maxlength)
NS_IMPL_STRING_ATTR(nsHTMLInputElement, Name, name)

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

@ -198,6 +198,7 @@ _TEST_FILES = \
test_bug555559.html \
test_bug344615.html \
test_bug345512.html \
test_bug566064.html \
$(NULL)
libs:: $(_TEST_FILES)

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

@ -7,15 +7,29 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=566046
<title>Test for Bug 566046</title>
<script type="application/javascript" src="/MochiKit/packed.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<base>
<base target='frame2'>
<base target=''>
</head>
<body onload="runTests();">
<body onload="setTimeout(runTests);">
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=566046">Mozilla Bug 566046</a>
<p id="display"></p>
<style>
iframe { width: 130px; height: 100px;}
</style>
<iframe name='frame1' id='frame1'></iframe>
<iframe name='frame2' id='frame2'></iframe>
<div id="content" style="display: none">
<iframe name='frame3' id='frame3'></iframe>
<iframe name='frame4' id='frame4'></iframe>
<iframe name='frame5' id='frame5'></iframe>
<iframe name='frame5bis' id='frame5bis'></iframe>
<iframe name='frame6' id='frame6'></iframe>
<iframe name='frame7' id='frame7'></iframe>
<iframe name='frame8' id='frame8'></iframe>
<iframe name='frame9' id='frame9'></iframe>
<div id="content">
<form target='frame1' action="data:text/html," method="GET">
<input name='foo' value='foo'>
</form>
@ -24,7 +38,42 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=566046
</form>
<form target="">
</form>
<form target="tulip">
<!-- submit controls with formtarget that are validated with a CLICK -->
<form target="tulip" action="data:text/html," method="GET">
<input name='tulip' value='tulip'>
<input type='submit' id='is' formtarget='frame3'>
</form>
<form action="data:text/html," method="GET">
<input name='foobar' value='foobar'>
<input type='image' id='ii' formtarget='frame4'>
</form>
<form action="data:text/html," method="GET">
<input name='tulip2' value='tulip2'>
<button type='submit' id='bs' formtarget='frame5'>submit</button>
</form>
<form action="data:text/html," method="GET">
<input name='tulip3' value='tulip3'>
<button type='submit' id='bsbis' formtarget='frame5bis'>submit</button>
</form>
<!-- submit controls with formtarget that are validated with ENTER -->
<form target="tulip" action="data:text/html," method="GET">
<input name='footulip' value='footulip'>
<input type='submit' id='is2' formtarget='frame6'>
</form>
<form action="data:text/html," method="GET">
<input name='tulipfoobar' value='tulipfoobar'>
<input type='image' id='ii2' formtarget='frame7'>
</form>
<form action="data:text/html," method="GET">
<input name='tulipbar' value='tulipbar'>
<button type='submit' id='bs2' formtarget='frame8'>submit</button>
</form>
<!-- check that a which is not a submit control do not use @formtarget -->
<form target='frame9' action="data:text/html," method="GET">
<input id='enter' name='input' value='enter' formtarget='frame6'>
</form>
</div>
<pre id="test">
@ -37,6 +86,14 @@ SimpleTest.waitForExplicitFinish();
var gTestResults = {
frame1: "data:text/html,?foo=foo",
frame2: "data:text/html,?bar=bar",
frame3: "data:text/html,?tulip=tulip",
frame4: "data:text/html,?foobar=foobar&x=0&y=0",
frame5: "data:text/html,?tulip2=tulip2",
frame5bis: "data:text/html,?tulip3=tulip3",
frame6: "data:text/html,?footulip=footulip",
frame7: "data:text/html,?tulipfoobar=tulipfoobar&x=0&y=0",
frame8: "data:text/html,?tulipbar=tulipbar",
frame9: "data:text/html,?input=enter",
};
var gPendingLoad = 0; // Has to be set after depending on the frames number.
@ -53,7 +110,16 @@ function runTests()
// We add a load event for the frames which will be called when the forms
// will be submitted.
var frames = [ document.getElementById('frame1'),
document.getElementById('frame2') ];
document.getElementById('frame2'),
document.getElementById('frame3'),
document.getElementById('frame4'),
document.getElementById('frame5'),
document.getElementById('frame5bis'),
document.getElementById('frame6'),
document.getElementById('frame7'),
document.getElementById('frame8'),
document.getElementById('frame9'),
];
gPendingLoad = frames.length;
for (var i=0; i<frames.length; i++) {
@ -63,6 +129,63 @@ function runTests()
// Submitting only the forms with a valid target.
document.forms[0].submit();
document.forms[1].submit();
/**
* We are going to focus each element before interacting with either for
* simulating the ENTER key (synthesizeKey) or a click (synthesizeMouse) or
* using .click(). This because it may be needed (ENTER) and because we want
* to have the element visible in the iframe.
*
* Focusing the first element (id='is') is launching the tests.
*/
document.getElementById('is').addEventListener('focus', function(aEvent) {
aEvent.target.removeEventListener('focus', arguments.callee, false);
synthesizeMouse(document.getElementById('is'), 5, 5, {});
document.getElementById('ii').focus();
}, false);
document.getElementById('ii').addEventListener('focus', function(aEvent) {
aEvent.target.removeEventListener('focus', arguments.callee, false);
synthesizeMouse(document.getElementById('ii'), 5, 5, {});
document.getElementById('bs').focus();
}, false);
document.getElementById('bs').addEventListener('focus', function(aEvent) {
aEvent.target.removeEventListener('focus', arguments.callee, false);
synthesizeMouse(document.getElementById('bs'), 5, 5, {});
document.getElementById('bsbis').focus();
}, false);
document.getElementById('bsbis').addEventListener('focus', function(aEvent) {
aEvent.target.removeEventListener('focus', arguments.callee, false);
document.getElementById('bsbis').click();
document.getElementById('is2').focus();
}, false);
document.getElementById('is2').addEventListener('focus', function(aEvent) {
aEvent.target.removeEventListener('focus', arguments.callee, false);
synthesizeKey("VK_RETURN", {});
document.getElementById('ii2').focus();
}, false);
document.getElementById('ii2').addEventListener('focus', function(aEvent) {
aEvent.target.removeEventListener('focus', arguments.callee, false);
synthesizeKey("VK_RETURN", {});
document.getElementById('bs2').focus();
}, false);
document.getElementById('bs2').addEventListener('focus', function(aEvent) {
aEvent.target.removeEventListener('focus', arguments.callee, false);
synthesizeKey("VK_RETURN", {});
document.getElementById('enter').focus();
}, false);
document.getElementById('enter').addEventListener('focus', function(aEvent) {
aEvent.target.removeEventListener('focus', arguments.callee, false);
synthesizeKey("VK_RETURN", {});
}, false);
document.getElementById('is').focus();
}
function frameLoaded(aFrame) {

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

@ -0,0 +1,63 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=566064
-->
<head>
<title>Test for Bug 566064</title>
<script type="application/javascript" src="/MochiKit/packed.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=566064">Mozilla Bug 566064</a>
<p id="display"></p>
<pre id="test">
<script type="application/javascript">
/** Test for Bug 566064 **/
// This test is only checking the IDL/content attribute of 'formtarget'.
// The behavior is tested in test_bug566046.html.
function isFormTargetEquals(aElement, aValue, aShouldBeNull)
{
if (aShouldBeNull) {
contentAtttributeValue = null;
} else {
contentAtttributeValue = aValue;
}
is(aElement.formTarget, aValue,
"formTarget IDL attribute value should be " + aValue);
is(aElement.getAttribute('formtarget'), contentAtttributeValue,
"formTarget content attribute value should be " + contentAtttributeValue);
}
function checkFormTarget(aElement)
{
isFormTargetEquals(aElement, "", true);
aElement.formTarget = "foo";
isFormTargetEquals(aElement, "foo");
aElement.setAttribute("formtarget", "bar");
isFormTargetEquals(aElement, "bar");
aElement.removeAttribute("formtarget");
isFormTargetEquals(aElement, "", true);
}
var input = document.createElement('input');
var button = document.createElement('button');
ok('formTarget' in input, "formTarget is a HTMLInputElement property");
ok('formTarget' in button, "formTarget is a HTMLButtonElement property");
checkFormTarget(input);
checkFormTarget(button);
</script>
</pre>
</body>
</html>

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

@ -49,12 +49,13 @@
interface nsIDOMValidityState;
[scriptable, uuid(5a1ef9b1-6782-4bee-a59e-7db1c352eb7d)]
[scriptable, uuid(4a24ca8f-cc7b-43b2-aca1-4dae149c1ed3)]
interface nsIDOMHTMLButtonElement : nsIDOMHTMLElement
{
attribute boolean autofocus;
attribute boolean disabled;
readonly attribute nsIDOMHTMLFormElement form;
attribute DOMString formTarget;
attribute DOMString name;
attribute DOMString type;

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

@ -51,7 +51,7 @@ interface nsIDOMValidityState;
* http://www.w3.org/TR/DOM-Level-2-HTML/
*/
[scriptable, uuid(6f283298-168e-4787-bfe7-f207be2438df)]
[scriptable, uuid(de8ae81f-85fd-4e6d-a864-00b38029c727)]
interface nsIDOMHTMLInputElement : nsIDOMHTMLElement
{
attribute DOMString accept;
@ -62,6 +62,7 @@ interface nsIDOMHTMLInputElement : nsIDOMHTMLElement
attribute boolean checked;
attribute boolean disabled;
readonly attribute nsIDOMHTMLFormElement form;
attribute DOMString formTarget;
readonly attribute nsIDOMFileList files;