blob: d39cc460e5b1e30919265921d44bda8b3d9b21ec [file] [log] [blame]
<!doctype html>
<title>HTMLOptionsCollection</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="help" href="https://html.spec.whatwg.org/multipage/#htmloptionscollection-0">
<select id=a>
<option>1</option>
<option>2</option>
<option>3</option>
<!--Note whitespace is important-->
<option>4</option>
<option>5</option>
</select>
<select id=b>
<option id=b1>1</option>
<option name=b2>2</option>
<option id=b3>3</option>
<option id=b3>4</option>
<option name=b4>5</option>
<option name=b4>6</option>
<option id=b5>7</option>
<option name=b5>8</option>
<option id=b6 name=b7>9</option>
<option id=b6 name=b6>10</option>
<option id=b8 name=b9>11</option>
</select>
<script>
var a;
var a_opts;
var a_original_innerHTML;
var b;
var b_opts;
setup(function() {
a = document.getElementById("a");
a_opts = a.options;
a_original_innerHTML = a.innerHTML;
a.innerHTML = a_original_innerHTML;
b = document.getElementById("b");
b_opts = b.options;
b_original_innerHTML = b.innerHTML;
b.innerHTML = b_original_innerHTML;
})
function assert_values_equals(coll, expected_values, message) {
actual = [];
for (var i=0; i<coll.length; i++) {
actual.push(coll[i].value);
}
assert_array_equals(actual, expected_values, message);
}
test(function() {
assert_equals(5, a_opts.length);
}, "Original length");
test(function() {
a.innerHTML = a_original_innerHTML;
a_opts.value = "3";
a_opts.length = 5;
assert_equals(a_opts.length, 5);
assert_equals(a_opts.value, "3");
}, "Setting length to original value has no effect");
test(function() {
a.innerHTML = a_original_innerHTML;
a.value = 3;
a_opts.length = 3;
assert_equals(3, a_opts.length, "Correct length");
assert_values_equals(a_opts, ["1","2","3"], "Correct elements remain")
assert_equals(a_opts.value, "3", "Correct value set");
assert_equals(a.childNodes.length, 11, "Correct number of child nodes")
}, "Setting length to shorter value");
test(function() {
a.innerHTML = a_original_innerHTML;
a.value = 3;
a_opts.length = 7;
assert_equals(a_opts.length, 7, "Correct length");
assert_values_equals(a_opts, ["1","2","3","4","5","",""], "Correct elements inserted")
assert_equals(a.value, "3", "Correct value set");
assert_equals(a.childNodes.length, 15, "Correct number of child nodes")
}, "Setting length to longer value");
test(function() {
a.innerHTML = a_original_innerHTML;
var newChild = document.createElement("p");
var newOption = document.createElement("option");
newOption.textContent = "6";
newChild.appendChild(newOption);
a.appendChild(newChild);
a.value = 3;
assert_equals(a_opts.length, 5, "Correct length");
assert_values_equals(a_opts, ["1","2","3","4","5"], "Correct elements inserted")
assert_equals(a.value, "3", "Correct value set");
}, "Insert <p><option>6</option></p> into <select>");
test(function() {
a.innerHTML = a_original_innerHTML;
var newChild = document.createElement("select");
var newOption = document.createElement("option");
newOption.textContent = "6";
newChild.appendChild(newOption);
a.appendChild(newChild);
a.value = 3;
assert_equals(a_opts.length, 5, "Correct length");
assert_values_equals(a_opts, ["1","2","3","4","5"], "Correct elements inserted")
assert_equals(a.value, "3", "Correct value set");
}, "Insert <select><option>6</option></select> into <select>");
test(function() {
//This tests the spec but it is probably wrong here; see bug 12665
a.innerHTML = a_original_innerHTML;
var newChild = document.createElement("optgroup");
var newOption = document.createElement("option");
newOption.textContent = "6";
newChild.appendChild(newOption);
a.appendChild(newChild);
a.value = 3;
assert_equals(a_opts.length, 6, "Correct length");
assert_values_equals(a_opts, ["1","2","3","4","5", "6"], "Correct elements inserted")
assert_equals(a.value, "3", "Correct value set");
}, "Insert <optgroup><option>6</option></optgroup> into <select>");
test(function() {
a.innerHTML = a_original_innerHTML;
var newChild = document.createElement("optgroup");
var newChild1 = document.createElement("optgroup");
var newOption = document.createElement("option");
newOption.textContent = "6";
newChild.appendChild(newChild1);
newChild1.appendChild(newOption);
a.appendChild(newChild);
a.value = 3;
assert_equals(a_opts.length, 5, "Correct length");
assert_values_equals(a_opts, ["1","2","3","4","5"], "Correct elements inserted")
assert_equals(a.value, "3", "Correct value set");
}, "Insert <optgroup><optgroup><option>6</option></optgroup></optgroup> into <select>");
test(function() {
assert_equals(b_opts.namedItem("b1").value, "1");
}, "namedItem id attribute");
test(function() {
assert_equals(b_opts.namedItem("b2").value, "2");
}, "namedItem name attribute");
test(function() {
assert_equals(b_opts.namedItem("c"), null);
}, "namedItem doesn't match anything");
test(function() {
assert_equals(b_opts.namedItem("b3").value, "3");
}, "namedItem multiple IDs");
test(function() {
assert_equals(b_opts.namedItem("b4").value, "5");
}, "namedItem multiple names");
test(function() {
assert_equals(b_opts.namedItem("b5").value, "7");
}, "namedItem multiple name and ID");
test(function() {
assert_equals(b_opts.namedItem("b6").value, "9");
}, "namedItem multiple name and ID with multiple attributes");
test(function() {
assert_equals(b_opts.namedItem("b8").value, "11");
}, "namedItem id attribute multiple attributes one element");
test(function() {
assert_equals(b_opts.namedItem("b9").value, "11");
}, "namedItem name attribute multiple attributes one element");
test(function() {
assert_true(b_opts[0] instanceof HTMLOptionElement);
assert_equals(b_opts[0].innerHTML, "1");
}, "HTMLOptionsCollection [index] method return the item with index");
test(function() {
assert_true(b_opts["b2"] instanceof HTMLOptionElement);
assert_equals(b_opts["b2"].innerHTML, "2");
}, "HTMLOptionsCollection [name] method return the item with name");
test(function() {
assert_true(b_opts.item(0) instanceof HTMLOptionElement);
assert_equals(b_opts.item(0).innerHTML, "1");
}, "HTMLOptionsCollection.item(index) method return the item with index");
test(function() {
assert_true(b_opts.item("b2") instanceof HTMLOptionElement);
assert_equals(b_opts.item("b2").innerHTML, "1");
}, "HTMLOptionsCollection.item(name) method return the item with index 0");
test(function() {
var b_opts_length = b_opts.length;
b_opts.add(new Option("2", "2"));
assert_equals(b_opts[b_opts_length].value, "2");
}, "HTMLOptionsCollection.add method insert HTMLOptionElement Option element");
test(function() {
var b_opts_length = b_opts.length;
b_opts.remove(0);
assert_equals(b_opts.length, b_opts_length - 1);
}, "HTMLOptionsCollection.remove method remove Option element by index");
test(function() {
var add = document.createElement("p");
assert_throws(new TypeError(), function() {b_opts.add(add);});
}, "Add non-option to collection");
</script>
<div id=log></div>