HTMLOptionsCollection's namedItem and name getter should return the first item
[WebKit-https.git] / LayoutTests / fast / dom / html-collections-named-getter.html
1 <!DOCTYPE html>
2 <html>
3 <body>
4 <script src="../js/resources/js-test-pre.js"></script>
5 <div id="container"></div>
6 <form></form>
7 <script>
8
9 description("This tests verifies that namedItem and named getter returns the first matched item for all but all, options, and form controls collections.");
10
11 function createElementWithId(name, id, attributes) {
12     var element = document.createElement(name);
13     element.id = id;
14     for (var attr in attributes)
15         element.setAttribute(attr, attributes[attr]);
16     return element;
17 }
18
19 function insertElementWithId(name, id, attributes) {
20     var element = createElementWithId(name, id, attributes);
21     document.getElementById('container').appendChild(element);
22     return element;
23 }
24
25 function removeTestElements() {
26     document.getElementById('container').innerHTML = '';
27     document.querySelector('form').innerHTML = '';
28 }
29
30 var elements;
31 debug('document.all');
32 shouldBeTrue("document.all instanceof HTMLAllCollection");
33 shouldBeTrue("document.all instanceof HTMLCollection");
34 shouldBe("initialLength = document.all.length; elements = [insertElementWithId('b', 'foo'), insertElementWithId('q', 'foo')];\n"
35     + "     document.all.length", "initialLength + 2;");
36 shouldBe("document.all['foo'].length", "2");
37 shouldBe("document.all['foo'][0]", "elements[0]");
38 shouldBe("document.all['foo'][1]", "elements[1]");
39 shouldBe("elements[0].parentNode.removeChild(elements[0]); document.all['foo']", 'elements[1]');
40 debug("");
41
42 var form = document.querySelector('form');
43 debug("form.elements");
44 shouldBeTrue("form.elements instanceof HTMLFormControlsCollection");
45 shouldBeTrue("form.elements instanceof HTMLCollection");
46 shouldBe("form.elements.length", "0");
47 shouldBe("elements = [createElementWithId('input', 'foo'), createElementWithId('input', 'foo')];\n"
48     + "     form.appendChild(elements[0]); form.elements.length", "1");
49 shouldBe("form.elements['foo']", "elements[0]");
50 shouldBe("form.appendChild(elements[1]); form.elements.length", "2");
51 shouldBe("form.elements['foo'].toString()", "'[object RadioNodeList]'");
52 shouldBe("form.elements['foo'].length", "2");
53 shouldBe("form.elements['foo'][0]", "elements[0]");
54 shouldBe("form.elements['foo'][1]", "elements[1]");
55 shouldBe("form.removeChild(elements[0]); form.elements['foo']", "elements[1]");
56 shouldBe("removeTestElements(); form.elements.length", "0");
57 debug("");
58
59 debug("select.options");
60 shouldBe("form.appendChild(createElementWithId('select', 'bar')); form.elements.length", "1");
61 shouldBeTrue("select = form.elements[0]; select.options instanceof HTMLOptionsCollection");
62 shouldBeTrue("select.options instanceof HTMLCollection");
63 shouldBe("select.options.length", "0");
64 shouldBe("elements = [createElementWithId('option', 'foo'), createElementWithId('option', 'foo')];\n"
65     + "     select.appendChild(elements[0]); select.options.length", "1");
66 shouldBe("select.options['foo']", "elements[0]");
67 shouldBe("select.appendChild(elements[1]); select.options.length", "2");
68 shouldBe("select.options['foo']", "elements[0]");
69 shouldBe("select.removeChild(elements[0]); select.options['foo']", "elements[1]");
70 shouldBe("select.innerHTML = ''; select.options.length", "0");
71 shouldBe("removeTestElements(); form.elements.length", "0");
72 debug("");
73
74 function testFirstItemReturnsFirstMatch(collection, initialLength, elementNames, attributes) {
75     debug(collection);
76     shouldBe(collection + ".length", initialLength.toString());
77     elements = [];
78     for (var i = 0; i < elementNames.length; i++) {
79         var attrs = attributes ? ", " + JSON.stringify(attributes) : '';
80         shouldBe("elements[" + i + "] = insertElementWithId('" + elementNames[i] + "', 'foo'" + attrs + "); "
81             + collection + ".length", (initialLength + i + 1).toString());
82     }
83     shouldBe(collection + "['foo']", "elements[0]");
84     shouldBe("removeTestElements(); " + collection + ".length", initialLength.toString());
85     debug("");
86 }
87
88 testFirstItemReturnsFirstMatch('document.images', 0, ['img', 'img']);
89 testFirstItemReturnsFirstMatch('document.applets', 0, ['applet', 'applet']);
90 testFirstItemReturnsFirstMatch('document.embeds', 0, ['embed', 'embed']);
91 testFirstItemReturnsFirstMatch('document.forms', 1, ['form', 'form']);
92 testFirstItemReturnsFirstMatch('document.links', 0, ['a', 'a', 'area'], {'href': 'some url'});
93 testFirstItemReturnsFirstMatch('document.anchors', 0, ['a', 'a'], {'name': 'some name'});
94 testFirstItemReturnsFirstMatch('document.scripts', 2, ['script', 'script']);
95
96 var successfullyParsed = true;
97
98 </script>
99 <script src="../js/resources/js-test-post.js"></script>
100 </body>
101 </html>