blob: dde3250dbf7c10a767e91c28c3b42078533e8748 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<div>
<form id="f1"></form>
<form id="f2">
<input id="i1" />
<input id="i2" form="f1" />
<input id="i3" />
</form>
<script>
test(function() {
var i1 = document.getElementById("i1");
var i2 = document.getElementById("i2");
var i3 = document.getElementById("i3");
var f1 = document.getElementById("f1");
var f2 = document.getElementById("f2");
assert_equals(i1.form, f2,
"i1 must be associated with f2 by the parser");
assert_equals(i2.form, f1,
"i2 is not associated with f2 by the parser " +
"since it has the form attribute set to f1");
f1.appendChild(i1);
i3.setAttribute("form", "f1");
assert_equals(i1.form, f1,
"i1's form owner must be reset when parent changes");
assert_equals(i3.form, f1,
"i3's form owner must be reset when the form" +
"attribute is set");
assert_equals(i2.form, f1);
}, "Tests for parser inserted controls");
</script>
</div>
<div id="placeholder">
</div>
<script>
var reassociateableElements = [
"button",
"fieldset",
"input",
"object",
"output",
"select",
"textarea",
];
var form1 = null;
var form2 = null;
var placeholder = document.getElementById("placeholder");
reassociateableElements.forEach(function(localName) {
function testControl(test_, desc) {
test(function() {
var control = document.createElement(localName);
while(placeholder.firstChild)
placeholder.removeChild(placeholder.firstChild);
form1 = document.createElement("form");
form2 = document.createElement("form");
form1.id = "form1";
form2.id = "form2";
placeholder.appendChild(form1);
placeholder.appendChild(form2);
test_.call(control);
}, "[" + localName.toUpperCase() + "] " + desc);
}
testControl(function() {
form1.appendChild(this);
assert_equals(this.form, form1);
}, "Basic form association - control with no form attribute is associated with ancestor");
testControl(function() {
this.setAttribute("form", "form1");
form1.appendChild(this);
assert_equals(this.form, form1);
form1.id = "form-one";
assert_equals(this.form, null);
}, "Form owner is reset to null when control's form attribute is set to an ID " +
"that does not exist in the document");
testControl(function() {
this.setAttribute("form", "");
form1.appendChild(this);
assert_equals(this.form, null);
}, "Control whose form attribute is an empty string has no form owner");
testControl(function() {
form1.id = "";
this.setAttribute("form", "");
form1.appendChild(this);
assert_equals(this.form, null);
}, "Control whose form attribute is an empty string has no form owner " +
"even when form with empty attribute is present");
testControl(function() {
form1.id = "FORM1";
this.setAttribute("form", "form1");
form1.appendChild(this);
assert_equals(this.form, null);
}, "Control's form attribute must be a case sensitive match for the form's id");
testControl(function() {
form1.appendChild(this);
assert_equals(this.form, form1);
this.setAttribute("form", "form2");
assert_equals(this.form, form2);
}, "Setting the form attribute of a control to the id of a non-ancestor form works");
testControl(function() {
this.setAttribute("form", "form1");
form2.appendChild(this);
assert_equals(this.form, form1);
this.removeAttribute("form");
assert_equals(this.form, form2);
}, "Removing form id from a control resets the form owner to ancestor");
testControl(function() {
this.setAttribute("form", "form1");
form2.appendChild(this);
assert_equals(this.form, form1);
placeholder.removeChild(form1);
assert_equals(this.form, null);
}, "Removing the form owner of a control with form attribute resets " +
"the form owner to null");
testControl(function() {
var form3 = document.createElement("form");
form3.id = "form3";
placeholder.appendChild(form3);
form3.appendChild(this);
assert_equals(this.form, form3);
this.setAttribute("form", "form2");
assert_equals(this.form, form2);
this.setAttribute("form", "form1");
assert_equals(this.form, form1);
}, "Changing form attibute of control resets form owner to correct form");
testControl(function() {
this.setAttribute("form", "form1");
var form3 = document.createElement("form");
form3.id = "form3";
placeholder.appendChild(form3);
placeholder.appendChild(this);
assert_equals(this.form, form1);
form1.appendChild(this);
assert_equals(this.form, form1);
form2.appendChild(this);
assert_equals(this.form, form1);
}, "Moving a control with form attribute within the document " +
"does not change the form owner");
testControl(function() {
form1.id = "form-one";
this.setAttribute("form", "form1");
form2.appendChild(this);
assert_equals(this.form, null);
form1.id = "form1";
assert_equals(this.form, form1);
}, "When the id of a non-ancestor form changes from not being a match for the " +
"form attribute to being a match, the control's form owner is reset");
testControl(function() {
this.setAttribute("form", "form1");
form1.appendChild(this);
assert_equals(this.form, form1);
form2.id = "form1";
form1.parentNode.insertBefore(form2, form1);
assert_equals(this.form, form2);
form2.parentNode.removeChild(form2);
assert_equals(this.form, form1);
form1.parentNode.appendChild(form2);
assert_equals(this.form, form1);
}, "When form element with same ID as the control's form attribute is inserted " +
"earlier in tree order, the form owner is changed to the inserted form");
testControl(function() {
this.setAttribute("form", "form1");
form2.appendChild(this);
assert_equals(this.form, form1);
var span = document.createElement("span");
span.id = "form1";
form1.parentNode.insertBefore(span, form1);
assert_equals(this.form, null);
form1.parentNode.appendChild(span);
assert_equals(this.form, form1);
}, "When non-form element with same ID as the control's form attribute is " +
"inserted earlier in tree order, the control does not have a form owner");
testControl(function() {
this.setAttribute("form", "form1");
form1.appendChild(this);
assert_equals(this.form, form1);
form1.parentNode.removeChild(form1);
assert_equals(this.form, form1);
}, "A control that is not in the document but has the form attribute set " +
"is associated with the nearest ancestor form if one exists");
});
</script>
</body>
</html>