HTMLSelectElement and HTMLOptionsCollection add() method should support index as...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 8 Jan 2015 04:55:45 +0000 (04:55 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 8 Jan 2015 04:55:45 +0000 (04:55 +0000)
https://bugs.webkit.org/show_bug.cgi?id=139179

Patch by Shivakumar JM <shiva.jm@samsung.com> on 2015-01-07
Reviewed by Darin Adler.

Source/WebCore:

HTMLSelectElement and HTMLOptionsCollection add() method should support index as second argument as per specification
http://www.w3.org/html/wg/drafts/html/master/forms.html#the-select-element.
Also this matches the behavior of Chrome and FireFox.

Tests: fast/dom/HTMLSelectElement/add.html
       fast/dom/HTMLSelectElement/options-collection-add.html

* bindings/js/JSHTMLOptionsCollectionCustom.cpp:
(WebCore::JSHTMLOptionsCollection::add): Deleted.
* html/HTMLOptionsCollection.cpp:
(WebCore::HTMLOptionsCollection::add):
* html/HTMLOptionsCollection.h:
* html/HTMLOptionsCollection.idl:
* html/HTMLSelectElement.cpp:
(WebCore::HTMLSelectElement::add):
* html/HTMLSelectElement.h:
* html/HTMLSelectElement.idl:

LayoutTests:

* fast/dom/HTMLSelectElement/add-expected.txt: Added.
* fast/dom/HTMLSelectElement/add.html: Added.
* fast/dom/HTMLSelectElement/options-collection-add-expected.txt: Added.
* fast/dom/HTMLSelectElement/options-collection-add.html: Added.
* fast/dom/HTMLSelectElement/select-add-optgroup-expected.txt:
* fast/dom/HTMLSelectElement/select-add-optgroup.html:
* fast/dom/incompatible-operations-expected.txt:
* fast/dom/incompatible-operations.html:
* js/dom/script-tests/select-options-add.js:
* js/dom/select-options-add-expected.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@178097 268f45cc-cd09-0410-ab3c-d52691b4dbfc

19 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/dom/HTMLSelectElement/add-expected.txt [new file with mode: 0644]
LayoutTests/fast/dom/HTMLSelectElement/add.html [new file with mode: 0644]
LayoutTests/fast/dom/HTMLSelectElement/options-collection-add-expected.txt [new file with mode: 0644]
LayoutTests/fast/dom/HTMLSelectElement/options-collection-add.html [new file with mode: 0644]
LayoutTests/fast/dom/HTMLSelectElement/select-add-optgroup-expected.txt
LayoutTests/fast/dom/HTMLSelectElement/select-add-optgroup.html
LayoutTests/fast/dom/incompatible-operations-expected.txt
LayoutTests/fast/dom/incompatible-operations.html
LayoutTests/js/dom/script-tests/select-options-add.js
LayoutTests/js/dom/select-options-add-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSHTMLOptionsCollectionCustom.cpp
Source/WebCore/html/HTMLOptionsCollection.cpp
Source/WebCore/html/HTMLOptionsCollection.h
Source/WebCore/html/HTMLOptionsCollection.idl
Source/WebCore/html/HTMLSelectElement.cpp
Source/WebCore/html/HTMLSelectElement.h
Source/WebCore/html/HTMLSelectElement.idl

index 73e86c9..17bb8c1 100644 (file)
@@ -1,3 +1,21 @@
+2015-01-07  Shivakumar JM  <shiva.jm@samsung.com>
+
+        HTMLSelectElement and HTMLOptionsCollection add() method should support index as second argument.
+        https://bugs.webkit.org/show_bug.cgi?id=139179
+
+        Reviewed by Darin Adler.
+
+        * fast/dom/HTMLSelectElement/add-expected.txt: Added.
+        * fast/dom/HTMLSelectElement/add.html: Added.
+        * fast/dom/HTMLSelectElement/options-collection-add-expected.txt: Added.
+        * fast/dom/HTMLSelectElement/options-collection-add.html: Added.
+        * fast/dom/HTMLSelectElement/select-add-optgroup-expected.txt:
+        * fast/dom/HTMLSelectElement/select-add-optgroup.html:
+        * fast/dom/incompatible-operations-expected.txt:
+        * fast/dom/incompatible-operations.html:
+        * js/dom/script-tests/select-options-add.js:
+        * js/dom/select-options-add-expected.txt:
+
 2015-01-07  Said Abou-Hallawa  <sabouhallawa@apple.com>
 
         Two tests, which include data uri images, need to be changed and rebaselined since the expected results are incorrect.
diff --git a/LayoutTests/fast/dom/HTMLSelectElement/add-expected.txt b/LayoutTests/fast/dom/HTMLSelectElement/add-expected.txt
new file mode 100644 (file)
index 0000000..690945f
--- /dev/null
@@ -0,0 +1,44 @@
+Test select.add() with index parameter
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+list elements are = 0,1,2
+PASS testAdd1(createOption("Y1")) is "0,1,2,Y1"
+PASS testAdd3(createOption("Y2"), null) is "0,1,2,Y2"
+PASS testAdd3(createOption("Y3"), 0) is "Y3,0,1,2"
+PASS testAdd3(createOption("Y4"), 1) is "0,Y4,1,2"
+PASS testAdd3(createOption("Y5"), 2) is "0,1,Y5,2"
+PASS testAdd3(createOption("Y6"), 3) is "0,1,2,Y6"
+PASS testAdd3(createOption("Y7"), 100) is "0,1,2,Y7"
+PASS testAdd3(createOption("Y8"), -100) is "0,1,2,Y8"
+PASS testAdd3(createOption("Y9"), "0") is "Y9,0,1,2"
+PASS testAdd3(createOption("Y10"), "1") is "0,Y10,1,2"
+PASS testAdd3(createOption("Y11"), "2") is "0,1,Y11,2"
+PASS testAdd3(createOption("Y12"), true) is "0,Y12,1,2"
+PASS testAdd3(createOption("Y13"), false) is "Y13,0,1,2"
+PASS testAdd3(createOption("Y14"), 2147483647) is "0,1,2,Y14"
+PASS testAdd3(createOption("Y15"), 2147483648) is "0,1,2,Y15"
+PASS testAdd3(createOption("Y16"), -2147483647) is "0,1,2,Y16"
+PASS testAdd3(createOption("Y17"), -2147483648) is "0,1,2,Y17"
+PASS testAdd3(createOption("Y18"), -2147483649) is "0,1,2,Y18"
+PASS testAdd3(createOption("Y19"), Infinity) is "Y19,0,1,2"
+PASS testAdd3(createOption("Y20"), -Infinity) is "Y20,0,1,2"
+PASS testAdd3(createOption("Y21"), "foo") is "Y21,0,1,2"
+PASS testAdd3(createOption("Y22"), NaN) is "Y22,0,1,2"
+PASS testAdd3(createOption("Y23"), undefined) is "Y23,0,1,2"
+PASS testAdd3(createOption("Y24"), -2) is "0,1,2,Y24"
+PASS testAdd4(createOption("Y25"), 0, 1) threw exception TypeError: Type error.
+PASS testAdd4(createOption("Y25"), mySelect.options[0], 1) threw exception TypeError: Type error.
+list elements are = 0,1,2
+PASS mySelect.add("foo") threw exception TypeError: Type error.
+PASS mySelect.add("foo", 0) threw exception TypeError: Type error.
+PASS mySelect.add(undefined) threw exception TypeError: Type error.
+PASS mySelect.add(undefined, 0) threw exception TypeError: Type error.
+PASS mySelect.add(null, 0) threw exception TypeError: Type error.
+PASS mySelect.add(null) threw exception TypeError: Type error.
+PASS mySelect.add() threw exception TypeError: Not enough arguments.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/dom/HTMLSelectElement/add.html b/LayoutTests/fast/dom/HTMLSelectElement/add.html
new file mode 100644 (file)
index 0000000..3fb27a4
--- /dev/null
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../../resources/js-test.js"></script>
+</head>
+<body>
+<script>
+description('Test select.add() with index parameter');
+       
+var mySelect;
+
+function resetSelection() {
+    mySelect = document.createElement('select');
+    mySelect.appendChild(new Option("0", "0", false, false));
+    mySelect.appendChild(new Option("1", "1", false, false));
+    mySelect.appendChild(new Option("2", "2", false, false));
+}
+
+function deepCopy() {
+    var copy = [];
+    for(var i = 0; i < mySelect.options.length; ++i)
+        copy.push(mySelect.options[i].value);
+    return copy.join(",");
+}
+       
+function createOption(value) {
+    return new Option(value + "X", value, false, false);
+}
+
+function testAdd1(element) {
+    resetSelection();
+    mySelect.add(element);
+    return deepCopy();
+}
+
+function testAdd3(newelement, index) {
+    resetSelection();
+    mySelect.add(newelement, index);
+    return deepCopy();
+}
+
+function testAdd4(newelement, element, index) {
+    resetSelection();
+    mySelect.add(newelement, element, index);
+    return deepCopy();
+}
+
+resetSelection();
+debug('list elements are = ' + deepCopy());
+shouldBeEqualToString('testAdd1(createOption("Y1"))', '0,1,2,Y1');
+shouldBeEqualToString('testAdd3(createOption("Y2"), null)', '0,1,2,Y2');
+shouldBeEqualToString('testAdd3(createOption("Y3"), 0)', 'Y3,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y4"), 1)', '0,Y4,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y5"), 2)', '0,1,Y5,2');
+shouldBeEqualToString('testAdd3(createOption("Y6"), 3)', '0,1,2,Y6');
+shouldBeEqualToString('testAdd3(createOption("Y7"), 100)', '0,1,2,Y7');
+shouldBeEqualToString('testAdd3(createOption("Y8"), -100)', '0,1,2,Y8');
+shouldBeEqualToString('testAdd3(createOption("Y9"), "0")', 'Y9,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y10"), "1")', '0,Y10,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y11"), "2")', '0,1,Y11,2');
+shouldBeEqualToString('testAdd3(createOption("Y12"), true)', '0,Y12,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y13"), false)', 'Y13,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y14"), 2147483647)', '0,1,2,Y14');
+shouldBeEqualToString('testAdd3(createOption("Y15"), 2147483648)', '0,1,2,Y15');
+shouldBeEqualToString('testAdd3(createOption("Y16"), -2147483647)', '0,1,2,Y16');
+shouldBeEqualToString('testAdd3(createOption("Y17"), -2147483648)', '0,1,2,Y17');
+shouldBeEqualToString('testAdd3(createOption("Y18"), -2147483649)', '0,1,2,Y18');
+shouldBeEqualToString('testAdd3(createOption("Y19"), Infinity)', 'Y19,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y20"), -Infinity)', 'Y20,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y21"), "foo")', 'Y21,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y22"), NaN)', 'Y22,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y23"), undefined)', 'Y23,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y24"), -2)','0,1,2,Y24');
+shouldThrow('testAdd4(createOption("Y25"), 0, 1)');
+shouldThrow('testAdd4(createOption("Y25"), mySelect.options[0], 1)');
+resetSelection();
+debug('list elements are = ' + deepCopy());
+shouldThrow('mySelect.add("foo")');
+shouldThrow('mySelect.add("foo", 0)');
+shouldThrow('mySelect.add(undefined)');
+shouldThrow('mySelect.add(undefined, 0)');
+shouldThrow('mySelect.add(null, 0)');
+shouldThrow('mySelect.add(null)');
+shouldThrow('mySelect.add()');
+       
+</script>
+</body>
+</html>
diff --git a/LayoutTests/fast/dom/HTMLSelectElement/options-collection-add-expected.txt b/LayoutTests/fast/dom/HTMLSelectElement/options-collection-add-expected.txt
new file mode 100644 (file)
index 0000000..04625c8
--- /dev/null
@@ -0,0 +1,58 @@
+Test select.options.add() with optgroup and with index parameter
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+list elements are = 0,1,2
+PASS testAdd3(createGroup("Y1", "Y2"), null) is "0,1,2,Y1,Y2"
+PASS testAdd3(createGroup("Y3", "Y4"), 0) is "Y3,Y4,0,1,2"
+PASS testAdd3(createGroup("Y5", "Y6"), 2) is "0,1,Y5,Y6,2"
+PASS testAdd1(createGroup("Y7", "Y8")) is "0,1,2,Y7,Y8"
+PASS testAdd1(createOption("Y9")) is "0,1,2,Y9"
+list elements are = 0,1,2
+PASS testAdd2(createOption("Y10"), mySelect.options[2]) is "0,1,Y10,2"
+PASS testAdd2(createOption("Y11"), mySelect.options[1]) is "0,Y11,1,Y10,2"
+list elements are = 0,1,2
+PASS testAdd2(createGroup("Y12", "Y13"), mySelect.options[1]) is "0,Y12,Y13,1,2"
+PASS testAdd2(createGroup("Y14", "Y15"), mySelect.options[3]) is "0,Y12,Y13,Y14,Y15,1,2"
+list elements are = 0,1,2
+PASS testAdd2(createOption("Y16"), createOption("Y17")) threw exception Error: NotFoundError: DOM Exception 8.
+list elements are = 0,1,2
+PASS testAdd1(createOption("Y1")) is "0,1,2,Y1"
+PASS testAdd3(createOption("Y2"), null) is "0,1,2,Y2"
+PASS testAdd3(createOption("Y3"), 0) is "Y3,0,1,2"
+PASS testAdd3(createOption("Y4"), 1) is "0,Y4,1,2"
+PASS testAdd3(createOption("Y5"), 2) is "0,1,Y5,2"
+PASS testAdd3(createOption("Y6"), 3) is "0,1,2,Y6"
+PASS testAdd3(createOption("Y7"), 100) is "0,1,2,Y7"
+PASS testAdd3(createOption("Y8"), -100) is "0,1,2,Y8"
+PASS testAdd3(createOption("Y9"), "0") is "Y9,0,1,2"
+PASS testAdd3(createOption("Y10"), "1") is "0,Y10,1,2"
+PASS testAdd3(createOption("Y11"), "2") is "0,1,Y11,2"
+PASS testAdd3(createOption("Y12"), true) is "0,Y12,1,2"
+PASS testAdd3(createOption("Y13"), false) is "Y13,0,1,2"
+PASS testAdd3(createOption("Y14"), 2147483647) is "0,1,2,Y14"
+PASS testAdd3(createOption("Y15"), 2147483648) is "0,1,2,Y15"
+PASS testAdd3(createOption("Y16"), -2147483647) is "0,1,2,Y16"
+PASS testAdd3(createOption("Y17"), -2147483648) is "0,1,2,Y17"
+PASS testAdd3(createOption("Y18"), -2147483649) is "0,1,2,Y18"
+PASS testAdd3(createOption("Y19"), Infinity) is "Y19,0,1,2"
+PASS testAdd3(createOption("Y20"), -Infinity) is "Y20,0,1,2"
+PASS testAdd3(createOption("Y21"), "foo") is "Y21,0,1,2"
+PASS testAdd3(createOption("Y22"), NaN) is "Y22,0,1,2"
+PASS testAdd3(createOption("Y23"), undefined) is "Y23,0,1,2"
+PASS testAdd3(createOption("Y24"), -2) is "0,1,2,Y24"
+PASS testAdd4(createOption("Y25"), 0, 1) threw exception TypeError: Type error.
+PASS testAdd4(createOption("Y25"), mySelect.options[0], 1) threw exception TypeError: Type error.
+list elements are = 0,1,2
+PASS mySelect.options.add("foo") threw exception TypeError: Type error.
+PASS mySelect.options.add("foo", 0) threw exception TypeError: Type error.
+PASS mySelect.options.add(undefined) threw exception TypeError: Type error.
+PASS mySelect.options.add(undefined, 0) threw exception TypeError: Type error.
+PASS mySelect.options.add(null, 0) threw exception TypeError: Type error.
+PASS mySelect.options.add(null) threw exception TypeError: Type error.
+PASS mySelect.options.add() threw exception TypeError: Not enough arguments.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/dom/HTMLSelectElement/options-collection-add.html b/LayoutTests/fast/dom/HTMLSelectElement/options-collection-add.html
new file mode 100644 (file)
index 0000000..1dc48e1
--- /dev/null
@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../../resources/js-test.js"></script>
+</head>
+<body>
+<script>
+description('Test select.options.add() with optgroup and with index parameter');
+       
+var mySelect;
+
+function resetSelection() {
+    mySelect = document.createElement('select');
+    mySelect.appendChild(new Option("0", "0", false, false));
+    mySelect.appendChild(new Option("1", "1", false, false));
+    mySelect.appendChild(new Option("2", "2", false, false));
+}
+
+function deepCopy() {
+    var copy = [];
+    for(var i = 0; i < mySelect.options.length; ++i)
+        copy.push(mySelect.options[i].value);
+    return copy.join(",");
+}
+       
+function createOption(value) {
+    return new Option(value + "X", value, false, false);
+}
+
+function createGroup(value1, value2) {
+    var group = document.createElement('optgroup');
+    group.appendChild(new Option(value1 + "X", value1, false, false));
+    group.appendChild(new Option(value2 + "Y", value2, false, false));
+    return group;
+}
+
+function testAdd1(element) {
+    resetSelection();
+    mySelect.options.add(element);
+    return deepCopy();
+}
+
+function testAdd2(newelement, element) {
+    mySelect.options.add(newelement, element);
+    return deepCopy();
+}
+
+function testAdd3(newelement, index) {
+    resetSelection();
+    mySelect.options.add(newelement, index);
+    return deepCopy();
+}
+
+function testAdd4(newelement, element, index) {
+    resetSelection();
+    mySelect.options.add(newelement, element, index);
+    return deepCopy();
+}
+
+resetSelection();
+debug('list elements are = ' + deepCopy());
+shouldBeEqualToString('testAdd3(createGroup("Y1", "Y2"), null)', '0,1,2,Y1,Y2');
+shouldBeEqualToString('testAdd3(createGroup("Y3", "Y4"), 0)', 'Y3,Y4,0,1,2');
+shouldBeEqualToString('testAdd3(createGroup("Y5", "Y6"), 2)', '0,1,Y5,Y6,2');
+shouldBeEqualToString('testAdd1(createGroup("Y7", "Y8"))', '0,1,2,Y7,Y8');
+shouldBeEqualToString('testAdd1(createOption("Y9"))', '0,1,2,Y9');
+resetSelection();
+debug('list elements are = ' + deepCopy());
+shouldBeEqualToString('testAdd2(createOption("Y10"), mySelect.options[2])', '0,1,Y10,2');
+shouldBeEqualToString('testAdd2(createOption("Y11"), mySelect.options[1])', '0,Y11,1,Y10,2');
+resetSelection();
+debug('list elements are = ' + deepCopy());
+shouldBeEqualToString('testAdd2(createGroup("Y12", "Y13"), mySelect.options[1])', '0,Y12,Y13,1,2');
+shouldBeEqualToString('testAdd2(createGroup("Y14", "Y15"), mySelect.options[3])', '0,Y12,Y13,Y14,Y15,1,2');
+resetSelection();
+debug('list elements are = ' + deepCopy());
+shouldThrow('testAdd2(createOption("Y16"), createOption("Y17"))');
+resetSelection();
+debug('list elements are = ' + deepCopy());
+shouldBeEqualToString('testAdd1(createOption("Y1"))', '0,1,2,Y1');
+shouldBeEqualToString('testAdd3(createOption("Y2"), null)', '0,1,2,Y2');
+shouldBeEqualToString('testAdd3(createOption("Y3"), 0)', 'Y3,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y4"), 1)', '0,Y4,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y5"), 2)', '0,1,Y5,2');
+shouldBeEqualToString('testAdd3(createOption("Y6"), 3)', '0,1,2,Y6');
+shouldBeEqualToString('testAdd3(createOption("Y7"), 100)', '0,1,2,Y7');
+shouldBeEqualToString('testAdd3(createOption("Y8"), -100)', '0,1,2,Y8');
+shouldBeEqualToString('testAdd3(createOption("Y9"), "0")', 'Y9,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y10"), "1")', '0,Y10,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y11"), "2")', '0,1,Y11,2');
+shouldBeEqualToString('testAdd3(createOption("Y12"), true)', '0,Y12,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y13"), false)', 'Y13,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y14"), 2147483647)', '0,1,2,Y14');
+shouldBeEqualToString('testAdd3(createOption("Y15"), 2147483648)', '0,1,2,Y15');
+shouldBeEqualToString('testAdd3(createOption("Y16"), -2147483647)', '0,1,2,Y16');
+shouldBeEqualToString('testAdd3(createOption("Y17"), -2147483648)', '0,1,2,Y17');
+shouldBeEqualToString('testAdd3(createOption("Y18"), -2147483649)', '0,1,2,Y18');
+shouldBeEqualToString('testAdd3(createOption("Y19"), Infinity)', 'Y19,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y20"), -Infinity)', 'Y20,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y21"), "foo")', 'Y21,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y22"), NaN)', 'Y22,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y23"), undefined)', 'Y23,0,1,2');
+shouldBeEqualToString('testAdd3(createOption("Y24"), -2)','0,1,2,Y24');
+shouldThrow('testAdd4(createOption("Y25"), 0, 1)');
+shouldThrow('testAdd4(createOption("Y25"), mySelect.options[0], 1)');
+resetSelection();
+debug('list elements are = ' + deepCopy());
+shouldThrow('mySelect.options.add("foo")');
+shouldThrow('mySelect.options.add("foo", 0)');
+shouldThrow('mySelect.options.add(undefined)');
+shouldThrow('mySelect.options.add(undefined, 0)');
+shouldThrow('mySelect.options.add(null, 0)');
+shouldThrow('mySelect.options.add(null)');
+shouldThrow('mySelect.options.add()');
+       
+</script>
+</body>
+</html>
index 7e6621d..5403f40 100644 (file)
@@ -3,41 +3,20 @@ Test select.add() with optgroup
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS deepCopy() is "0,1,2,Y1"
-PASS deepCopy() is "0,1,2,Y2,Y1"
-PASS deepCopy() is "0,1,2,Y3,Y2,Y1"
-PASS deepCopy() is "0,1,2,Y4,Y3,Y2,Y1"
-PASS deepCopy() is "0,1,2,X,Y"
-PASS deepCopy() is "0,1,X,Y,2"
-PASS deepCopy() is "0,1,X,Y,X,Y,2"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS deepCopy() is "0,1,2,Y"
-PASS mySelect.add("foo") is undefined.
-PASS mySelect.add("foo", 0) is undefined.
-PASS mySelect.add(undefined) is undefined.
-PASS mySelect.add(undefined, 0) is undefined.
-PASS mySelect.add(null) is undefined.
-PASS mySelect.add(null, 0) is undefined.
+list elements are = 0,1,2
+PASS testAdd3(createGroup("Y1", "Y2"), null) is "0,1,2,Y1,Y2"
+PASS testAdd3(createGroup("Y3", "Y4"), 0) is "Y3,Y4,0,1,2"
+PASS testAdd3(createGroup("Y5", "Y6"), 2) is "0,1,Y5,Y6,2"
+PASS testAdd1(createGroup("Y7", "Y8")) is "0,1,2,Y7,Y8"
+PASS testAdd1(createOption("Y9")) is "0,1,2,Y9"
+list elements are = 0,1,2
+PASS testAdd2(createOption("Y10"), mySelect.options[2]) is "0,1,Y10,2"
+PASS testAdd2(createOption("Y11"), mySelect.options[1]) is "0,Y11,1,Y10,2"
+list elements are = 0,1,2
+PASS testAdd2(createGroup("Y12", "Y13"), mySelect.options[1]) is "0,Y12,Y13,1,2"
+PASS testAdd2(createGroup("Y14", "Y15"), mySelect.options[3]) is "0,Y12,Y13,Y14,Y15,1,2"
+list elements are = 0,1,2
+PASS testAdd2(createOption("Y16"), createOption("Y17")) threw exception Error: NotFoundError: DOM Exception 8.
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 62bc7ed..3d8cb54 100644 (file)
@@ -8,7 +8,6 @@
 description('Test select.add() with optgroup');
        
 var mySelect;
-var selectedOptions;
        
 function resetSelection() {
     mySelect = document.createElement('select');
@@ -18,153 +17,59 @@ function resetSelection() {
 }
 
 function deepCopy() {
-    var copy=[];
-    for(var i=0;i<mySelect.options.length; ++i)
+    var copy = [];
+    for(var i = 0; i < mySelect.options.length; ++i)
         copy.push(mySelect.options[i].value);
     return copy.join(",");
 }
 
-resetSelection();
-var option1 = document.createElement("option");
-option1.text = "X1";
-option1.value = "Y1";
-mySelect.add(option1);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y1');
-
-var option2 = document.createElement("option");
-option2.text = "X2";
-option2.value = "Y2";
-mySelect.add(option2, option1);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y2,Y1');
-
-var option3 = document.createElement("option");
-option3.text = "X3";
-option3.value = "Y3";
-mySelect.add(option3, option2);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y3,Y2,Y1');
-
-var option4 = document.createElement("option");
-option4.text = "X4";
-option4.value = "Y4";
-mySelect.add(option4, mySelect.options[3]);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y4,Y3,Y2,Y1');
-
-resetSelection();      
-var group1 = document.createElement('optgroup');
-group1.appendChild(new Option('X', 'X', false, false));
-group1.appendChild(new Option('Y', 'Y', false, false));
-mySelect.add(group1);
-shouldBeEqualToString('deepCopy()', '0,1,2,X,Y');
-
-resetSelection();      
-var group2 = document.createElement('optgroup');
-group2.appendChild(new Option('X', 'X', false, false));
-group2.appendChild(new Option('Y', 'Y', false, false));
-mySelect.add(group2,mySelect.options[2]);
-shouldBeEqualToString('deepCopy()', '0,1,X,Y,2');
-
-var group3 = document.createElement('optgroup');
-group3.appendChild(new Option('X', 'X', false, false));
-group3.appendChild(new Option('Y', 'Y', false, false));
-mySelect.add(group3,group2);
-shouldBeEqualToString('deepCopy()', '0,1,X,Y,X,Y,2');
-
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), null);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false));
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), 0);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), 1);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), 2);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), 100);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), -100);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), "2");
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), "1");
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), "0");
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), 2147483647);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), 2147483648);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), -2147483647);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), -2147483648);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
+function createOption(value) {
+    return new Option(value + "X", value, false, false);
+}
 
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), -2147483649);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
+function createGroup(value1, value2) {
+    var group = document.createElement('optgroup');
+    group.appendChild(new Option(value1 + "X", value1, false, false));
+    group.appendChild(new Option(value2 + "Y", value2, false, false));
+    return group;
+}
 
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), true);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
+function testAdd1(element) {
+    resetSelection();
+    mySelect.add(element);
+    return deepCopy();
+}
 
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), false);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
+function testAdd2(newelement, element) {
+    mySelect.add(newelement, element);
+    return deepCopy();
+}
 
-resetSelection();
-mySelect.add(new Option("X", "Y", false, false), undefined);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
+function testAdd3(newelement, index) { 
+    resetSelection();
+    mySelect.add(newelement, index);
+    return deepCopy();
+}
 
 resetSelection();
-mySelect.add(new Option("X", "Y", false, false), Infinity);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
+debug('list elements are = ' + deepCopy());
+shouldBeEqualToString('testAdd3(createGroup("Y1", "Y2"), null)', '0,1,2,Y1,Y2');
+shouldBeEqualToString('testAdd3(createGroup("Y3", "Y4"), 0)', 'Y3,Y4,0,1,2');
+shouldBeEqualToString('testAdd3(createGroup("Y5", "Y6"), 2)', '0,1,Y5,Y6,2');
+shouldBeEqualToString('testAdd1(createGroup("Y7", "Y8"))', '0,1,2,Y7,Y8');
+shouldBeEqualToString('testAdd1(createOption("Y9"))', '0,1,2,Y9');
 resetSelection();
-mySelect.add(new Option("X", "Y", false, false), -Infinity);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
+debug('list elements are = ' + deepCopy());
+shouldBeEqualToString('testAdd2(createOption("Y10"), mySelect.options[2])', '0,1,Y10,2');
+shouldBeEqualToString('testAdd2(createOption("Y11"), mySelect.options[1])', '0,Y11,1,Y10,2');
 resetSelection();
-mySelect.add(new Option("X", "Y", false, false), "foo");
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
-
+debug('list elements are = ' + deepCopy());
+shouldBeEqualToString('testAdd2(createGroup("Y12", "Y13"), mySelect.options[1])', '0,Y12,Y13,1,2');
+shouldBeEqualToString('testAdd2(createGroup("Y14", "Y15"), mySelect.options[3])', '0,Y12,Y13,Y14,Y15,1,2');
 resetSelection();
-mySelect.add(new Option("X", "Y", false, false), NaN);
-shouldBeEqualToString('deepCopy()', '0,1,2,Y');
+debug('list elements are = ' + deepCopy());
+shouldThrow('testAdd2(createOption("Y16"), createOption("Y17"))');
 
-resetSelection();
-shouldBeUndefined('mySelect.add("foo")');
-shouldBeUndefined('mySelect.add("foo", 0)');
-shouldBeUndefined('mySelect.add(undefined)');
-shouldBeUndefined('mySelect.add(undefined, 0)');
-shouldBeUndefined('mySelect.add(null)');
-shouldBeUndefined('mySelect.add(null, 0)');
-       
 </script>
 </body>
 </html>
index 4653ca9..d5764c1 100644 (file)
@@ -12,11 +12,11 @@ PASS aNode.isSameNode(void 0) is false
 PASS aNode.lookupPrefix(aDOMImplementation) is null
 PASS aNode.lookupPrefix(void 0) is null
 PASS aNode.cloneNode(aDOMImplementation) instanceof HTMLDivElement is true
-PASS aSelect.add(aDOMImplementation, aDOMImplementation) is undefined.
-PASS aSelect.add(aDOMImplementation, anOption) is undefined.
+PASS aSelect.add(aDOMImplementation, aDOMImplementation) threw exception TypeError: Type error.
+PASS aSelect.add(aDOMImplementation, anOption) threw exception TypeError: Type error.
 PASS aSelect.add(anOption, aDOMImplementation) is undefined.
-PASS aSelect.add(void 0, void 0) is undefined.
-PASS aSelect.add(void 0, anOption) is undefined.
+PASS aSelect.add(void 0, void 0) threw exception TypeError: Type error.
+PASS aSelect.add(void 0, anOption) threw exception TypeError: Type error.
 PASS aSelect.add(anOption, void 0) is undefined.
 PASS successfullyParsed is true
 
index 5cdf08e..21aa71a 100644 (file)
@@ -40,11 +40,11 @@ shouldBeFalse("aNode.isSameNode(void 0)");
 shouldBe("aNode.lookupPrefix(aDOMImplementation)", "null");
 shouldBe("aNode.lookupPrefix(void 0)", "null");
 shouldBeTrue("aNode.cloneNode(aDOMImplementation) instanceof HTMLDivElement");
-shouldBeUndefined("aSelect.add(aDOMImplementation, aDOMImplementation)");
-shouldBeUndefined("aSelect.add(aDOMImplementation, anOption)");
+shouldThrow("aSelect.add(aDOMImplementation, aDOMImplementation)");
+shouldThrow("aSelect.add(aDOMImplementation, anOption)");
 shouldBeUndefined("aSelect.add(anOption, aDOMImplementation)");
-shouldBeUndefined("aSelect.add(void 0, void 0)");
-shouldBeUndefined("aSelect.add(void 0, anOption)");
+shouldThrow("aSelect.add(void 0, void 0)");
+shouldThrow("aSelect.add(void 0, anOption)");
 shouldBeUndefined("aSelect.add(anOption, void 0)");
 </script>
 <script src="../../resources/js-test-post.js"></script>
index aacf94d..760b744 100644 (file)
@@ -54,7 +54,7 @@ debug("");
 
 debug("1.4 Add a non-Option element");
 option1 = document.createElement("DIV");
-shouldThrow("select1.options.add(option1)");
+shouldBeUndefined("select1.options.add(option1)");
 shouldBe("select1.options.length", "3");
 shouldBe("select1.selectedIndex", "0");
 debug("");
@@ -237,91 +237,91 @@ debug("");
 
 debug("2.8 Add an Option at index -2");
 option2 = document.createElement("OPTION");
-shouldThrow("select2.options.add(option2, -2)");
-shouldBe("select2.options.length", "7");
+shouldNotThrow("select2.options.add(option2, -2)");
+shouldBe("select2.options.length", "8");
 shouldBe("select2.selectedIndex", "1");
 debug("");
 
 debug("2.9 Add an Option at index -Infinity");
 option2 = document.createElement("OPTION");
 shouldNotThrow("select2.options.add(option2, -1/0)");
-shouldBe("select2.options.length", "8");
+shouldBe("select2.options.length", "9");
 shouldBe("select2.selectedIndex", "2");
 debug("");
 
 debug("2.10 Add an Option at index NaN");
 option2 = document.createElement("OPTION");
 shouldNotThrow("select2.options.add(option2, 0/0)");
-shouldBe("select2.options.length", "9");
+shouldBe("select2.options.length", "10");
 shouldBe("select2.selectedIndex", "3");
 debug("");
 
 debug("2.11 Add an Option at index Infinity");
 option2 = document.createElement("OPTION");
 shouldNotThrow("select2.options.add(option2, 1/0)");
-shouldBe("select2.options.length", "10");
+shouldBe("select2.options.length", "11");
 shouldBe("select2.selectedIndex", "4");
 debug("");
 
 debug("2.12 Add a non-Option element");
 option2 = document.createElement("DIV");
-shouldThrow("select2.options.add(option2, 1)");
-shouldBe("select2.options.length", "10");
+shouldBeUndefined("select2.options.add(option2, 1)");
+shouldBe("select2.options.length", "11");
 shouldBe("select2.selectedIndex", "4");
 debug("");
 
 debug("2.13 Add a non-element (string)");
 option2 = "o";
 shouldThrow("select2.options.add(option2, 1)");
-shouldBe("select2.options.length", "10");
+shouldBe("select2.options.length", "11");
 shouldBe("select2.selectedIndex", "4");
 debug("");
 
 debug("2.14 Add a non-element (number)");
 option2 = 3.14;
 shouldThrow("select2.options.add(option2, 1)");
-shouldBe("select2.options.length", "10");
+shouldBe("select2.options.length", "11");
 shouldBe("select2.selectedIndex", "4");
 debug("");
 
 debug("2.15 Add a non-element (boolean)");
 option2 = true;
 shouldThrow("select2.options.add(option2, 1)");
-shouldBe("select2.options.length", "10");
+shouldBe("select2.options.length", "11");
 shouldBe("select2.selectedIndex", "4");
 debug("");
 
 debug("2.16 Add undefined");
 option2 = undefined;
 shouldThrow("select2.options.add(option2, 1)");
-shouldBe("select2.options.length", "10");
+shouldBe("select2.options.length", "11");
 shouldBe("select2.selectedIndex", "4");
 debug("");
 
 debug("2.17 Add null");
 option2 = null;
 shouldThrow("select2.options.add(option2, 1)");
-shouldBe("select2.options.length", "10");
+shouldBe("select2.options.length", "11");
 shouldBe("select2.selectedIndex", "4");
 debug("");
 
 debug("2.18 Add negative infinity");
 option2 = -1/0;
 shouldThrow("select2.options.add(option2, 1)");
-shouldBe("select2.options.length", "10");
+shouldBe("select2.options.length", "11");
 shouldBe("select2.selectedIndex", "4");
 debug("");
 
 debug("2.19 Add NaN");
 option2 = 0/0;
 shouldThrow("select2.options.add(option2, 1)");
-shouldBe("select2.options.length", "10");
+shouldBe("select2.options.length", "11");
 shouldBe("select2.selectedIndex", "4");
 debug("");
 
 debug("2.20 Add positive infinity");
 option2 = 1/0;
 shouldThrow("select2.options.add(option2, 1)");
-shouldBe("select2.options.length", "10");
+shouldBe("select2.options.length", "11");
 shouldBe("select2.selectedIndex", "4");
 debug("");
index 86f1e26..a705ccf 100644 (file)
@@ -29,47 +29,47 @@ PASS select1.options[2].value is '3'
 PASS select1.options[2].textContent is 'C'
 
 1.4 Add a non-Option element
-PASS select1.options.add(option1) threw exception Error: TypeMismatchError: DOM Exception 17.
+PASS select1.options.add(option1) is undefined.
 PASS select1.options.length is 3
 PASS select1.selectedIndex is 0
 
 1.5 Add a non-element (string)
-PASS select1.options.add(option1) threw exception Error: TypeMismatchError: DOM Exception 17.
+PASS select1.options.add(option1) threw exception TypeError: Type error.
 PASS select1.options.length is 3
 PASS select1.selectedIndex is 0
 
 1.6 Add a non-element (number)
-PASS select1.options.add(option1) threw exception Error: TypeMismatchError: DOM Exception 17.
+PASS select1.options.add(option1) threw exception TypeError: Type error.
 PASS select1.options.length is 3
 PASS select1.selectedIndex is 0
 
 1.7 Add a non-element (boolean)
-PASS select1.options.add(option1) threw exception Error: TypeMismatchError: DOM Exception 17.
+PASS select1.options.add(option1) threw exception TypeError: Type error.
 PASS select1.options.length is 3
 PASS select1.selectedIndex is 0
 
 1.8 Add undefined
-PASS select1.options.add(option1) threw exception Error: TypeMismatchError: DOM Exception 17.
+PASS select1.options.add(option1) threw exception TypeError: Type error.
 PASS select1.options.length is 3
 PASS select1.selectedIndex is 0
 
 1.9 Add null
-PASS select1.options.add(option1) threw exception Error: TypeMismatchError: DOM Exception 17.
+PASS select1.options.add(option1) threw exception TypeError: Type error.
 PASS select1.options.length is 3
 PASS select1.selectedIndex is 0
 
 1.10 Add negative infinity
-PASS select1.options.add(option1) threw exception Error: TypeMismatchError: DOM Exception 17.
+PASS select1.options.add(option1) threw exception TypeError: Type error.
 PASS select1.options.length is 3
 PASS select1.selectedIndex is 0
 
 1.11 Add NaN
-PASS select1.options.add(option1) threw exception Error: TypeMismatchError: DOM Exception 17.
+PASS select1.options.add(option1) threw exception TypeError: Type error.
 PASS select1.options.length is 3
 PASS select1.selectedIndex is 0
 
 1.12 Add positive infinity
-PASS select1.options.add(option1) threw exception Error: TypeMismatchError: DOM Exception 17.
+PASS select1.options.add(option1) threw exception TypeError: Type error.
 PASS select1.options.length is 3
 PASS select1.selectedIndex is 0
 
@@ -158,68 +158,68 @@ PASS select2.options[6].value is '5'
 PASS select2.options[6].textContent is 'E'
 
 2.8 Add an Option at index -2
-PASS select2.options.add(option2, -2) threw exception Error: IndexSizeError: DOM Exception 1.
-PASS select2.options.length is 7
+PASS select2.options.add(option2, -2) did not throw exception.
+PASS select2.options.length is 8
 PASS select2.selectedIndex is 1
 
 2.9 Add an Option at index -Infinity
 PASS select2.options.add(option2, -1/0) did not throw exception.
-PASS select2.options.length is 8
+PASS select2.options.length is 9
 PASS select2.selectedIndex is 2
 
 2.10 Add an Option at index NaN
 PASS select2.options.add(option2, 0/0) did not throw exception.
-PASS select2.options.length is 9
+PASS select2.options.length is 10
 PASS select2.selectedIndex is 3
 
 2.11 Add an Option at index Infinity
 PASS select2.options.add(option2, 1/0) did not throw exception.
-PASS select2.options.length is 10
+PASS select2.options.length is 11
 PASS select2.selectedIndex is 4
 
 2.12 Add a non-Option element
-PASS select2.options.add(option2, 1) threw exception Error: TypeMismatchError: DOM Exception 17.
-PASS select2.options.length is 10
+PASS select2.options.add(option2, 1) is undefined.
+PASS select2.options.length is 11
 PASS select2.selectedIndex is 4
 
 2.13 Add a non-element (string)
-PASS select2.options.add(option2, 1) threw exception Error: TypeMismatchError: DOM Exception 17.
-PASS select2.options.length is 10
+PASS select2.options.add(option2, 1) threw exception TypeError: Type error.
+PASS select2.options.length is 11
 PASS select2.selectedIndex is 4
 
 2.14 Add a non-element (number)
-PASS select2.options.add(option2, 1) threw exception Error: TypeMismatchError: DOM Exception 17.
-PASS select2.options.length is 10
+PASS select2.options.add(option2, 1) threw exception TypeError: Type error.
+PASS select2.options.length is 11
 PASS select2.selectedIndex is 4
 
 2.15 Add a non-element (boolean)
-PASS select2.options.add(option2, 1) threw exception Error: TypeMismatchError: DOM Exception 17.
-PASS select2.options.length is 10
+PASS select2.options.add(option2, 1) threw exception TypeError: Type error.
+PASS select2.options.length is 11
 PASS select2.selectedIndex is 4
 
 2.16 Add undefined
-PASS select2.options.add(option2, 1) threw exception Error: TypeMismatchError: DOM Exception 17.
-PASS select2.options.length is 10
+PASS select2.options.add(option2, 1) threw exception TypeError: Type error.
+PASS select2.options.length is 11
 PASS select2.selectedIndex is 4
 
 2.17 Add null
-PASS select2.options.add(option2, 1) threw exception Error: TypeMismatchError: DOM Exception 17.
-PASS select2.options.length is 10
+PASS select2.options.add(option2, 1) threw exception TypeError: Type error.
+PASS select2.options.length is 11
 PASS select2.selectedIndex is 4
 
 2.18 Add negative infinity
-PASS select2.options.add(option2, 1) threw exception Error: TypeMismatchError: DOM Exception 17.
-PASS select2.options.length is 10
+PASS select2.options.add(option2, 1) threw exception TypeError: Type error.
+PASS select2.options.length is 11
 PASS select2.selectedIndex is 4
 
 2.19 Add NaN
-PASS select2.options.add(option2, 1) threw exception Error: TypeMismatchError: DOM Exception 17.
-PASS select2.options.length is 10
+PASS select2.options.add(option2, 1) threw exception TypeError: Type error.
+PASS select2.options.length is 11
 PASS select2.selectedIndex is 4
 
 2.20 Add positive infinity
-PASS select2.options.add(option2, 1) threw exception Error: TypeMismatchError: DOM Exception 17.
-PASS select2.options.length is 10
+PASS select2.options.add(option2, 1) threw exception TypeError: Type error.
+PASS select2.options.length is 11
 PASS select2.selectedIndex is 4
 
 PASS successfullyParsed is true
index 3f61f58..0885d0a 100644 (file)
@@ -1,3 +1,28 @@
+2015-01-07  Shivakumar JM  <shiva.jm@samsung.com>
+
+        HTMLSelectElement and HTMLOptionsCollection add() method should support index as second argument.
+        https://bugs.webkit.org/show_bug.cgi?id=139179
+
+        Reviewed by Darin Adler.
+
+        HTMLSelectElement and HTMLOptionsCollection add() method should support index as second argument as per specification
+        http://www.w3.org/html/wg/drafts/html/master/forms.html#the-select-element.
+        Also this matches the behavior of Chrome and FireFox.
+
+        Tests: fast/dom/HTMLSelectElement/add.html
+               fast/dom/HTMLSelectElement/options-collection-add.html
+
+        * bindings/js/JSHTMLOptionsCollectionCustom.cpp:
+        (WebCore::JSHTMLOptionsCollection::add): Deleted.
+        * html/HTMLOptionsCollection.cpp:
+        (WebCore::HTMLOptionsCollection::add):
+        * html/HTMLOptionsCollection.h:
+        * html/HTMLOptionsCollection.idl:
+        * html/HTMLSelectElement.cpp:
+        (WebCore::HTMLSelectElement::add):
+        * html/HTMLSelectElement.h:
+        * html/HTMLSelectElement.idl:
+
 2015-01-07  Gwang Yoon Hwang  <yoon@igalia.com>
 
         [GTK][ThreadedCompositor] Add support for threaded compositor.
index 069022b..3e3d94a 100644 (file)
@@ -60,23 +60,6 @@ void JSHTMLOptionsCollection::indexSetter(ExecState* exec, unsigned index, JSVal
     selectIndexSetter(&impl().selectElement(), exec, index, value);
 }
 
-JSValue JSHTMLOptionsCollection::add(ExecState* exec)
-{
-    HTMLOptionsCollection& imp = impl();
-    HTMLOptionElement* option = JSHTMLOptionElement::toWrapped(exec->argument(0));
-    ExceptionCode ec = 0;
-    if (exec->argumentCount() < 2)
-        imp.add(option, ec);
-    else {
-        int index = exec->argument(1).toInt32(exec);
-        if (exec->hadException())
-            return jsUndefined();
-        imp.add(option, index, ec);
-    }
-    setDOMException(exec, ec);
-    return jsUndefined();
-}
-
 JSValue JSHTMLOptionsCollection::remove(ExecState* exec)
 {
     // The argument can be an HTMLOptionElement or an index.
index fb3379d..1508b41 100644 (file)
@@ -36,33 +36,14 @@ Ref<HTMLOptionsCollection> HTMLOptionsCollection::create(HTMLSelectElement& sele
     return adoptRef(*new HTMLOptionsCollection(select));
 }
 
-void HTMLOptionsCollection::add(PassRefPtr<HTMLOptionElement> element, ExceptionCode& ec)
+void HTMLOptionsCollection::add(HTMLElement* element, HTMLElement* beforeElement, ExceptionCode& ec)
 {
-    add(element, length(), ec);
+    selectElement().add(element, beforeElement, ec);
 }
 
-void HTMLOptionsCollection::add(PassRefPtr<HTMLOptionElement> element, int index, ExceptionCode& ec)
+void HTMLOptionsCollection::add(HTMLElement* element, int beforeIndex, ExceptionCode& ec)
 {
-    HTMLOptionElement* newOption = element.get();
-
-    if (!newOption) {
-        ec = TYPE_MISMATCH_ERR;
-        return;
-    }
-
-    if (index < -1) {
-        ec = INDEX_SIZE_ERR;
-        return;
-    }
-
-    ec = 0;
-
-    if (index == -1 || unsigned(index) >= length())
-        selectElement().add(newOption, nullptr, ec);
-    else
-        selectElement().add(newOption, downcast<HTMLOptionElement>(item(index)), ec);
-
-    ASSERT(!ec);
+    add(element, downcast<HTMLElement>(item(beforeIndex)), ec);
 }
 
 void HTMLOptionsCollection::remove(int index)
index 340da1e..6366865 100644 (file)
@@ -40,8 +40,8 @@ public:
     HTMLSelectElement& selectElement() { return downcast<HTMLSelectElement>(ownerNode()); }
     const HTMLSelectElement& selectElement() const { return downcast<HTMLSelectElement>(ownerNode()); }
 
-    void add(PassRefPtr<HTMLOptionElement>, ExceptionCode&);
-    void add(PassRefPtr<HTMLOptionElement>, int index, ExceptionCode&);
+    void add(HTMLElement*, HTMLElement* beforeElement, ExceptionCode&);
+    void add(HTMLElement*, int beforeIndex, ExceptionCode&);
     void remove(int index);
     void remove(HTMLOptionElement*);
 
index a33209b..1dba443 100644 (file)
 
     Node namedItem([Default=Undefined] optional DOMString name);
 
-    [Custom, RaisesException] void add([Default=Undefined] optional HTMLOptionElement option, 
-                      optional unsigned long index);
+#if (!defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C) && (!defined(LANGUAGE_GOBJECT) || !LANGUAGE_GOBJECT)
+    [RaisesException] void add(HTMLElement element, [Default=Undefined] optional HTMLElement? before);
+    [RaisesException] void add(HTMLElement element, [Default=Undefined] optional long index);
+#else
+    [RaisesException] void add(HTMLOptionElement option, unsigned long index);
+#endif
     [Custom] void remove([Default=Undefined] optional unsigned long index);
 
 #if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
index 6157b5c..4d0290a 100644 (file)
@@ -218,7 +218,7 @@ int HTMLSelectElement::activeSelectionEndListIndex() const
     return lastSelectedListIndex();
 }
 
-void HTMLSelectElement::add(HTMLElement* element, HTMLElement* before, ExceptionCode& ec)
+void HTMLSelectElement::add(HTMLElement* element, HTMLElement* beforeElement, ExceptionCode& ec)
 {
     if (!element || !(is<HTMLOptionElement>(*element) || element->hasTagName(hrTag) || is<HTMLOptGroupElement>(*element)))
         return;
@@ -226,10 +226,15 @@ void HTMLSelectElement::add(HTMLElement* element, HTMLElement* before, Exception
     // Make sure the element is ref'd and deref'd so we don't leak it.
     Ref<HTMLElement> protectNewChild(*element);
 
-    insertBefore(element, before, ec);
+    insertBefore(element, beforeElement, ec);
     updateValidity();
 }
 
+void HTMLSelectElement::add(HTMLElement* element, int beforeIndex, ExceptionCode& ec)
+{
+    add(element, item(beforeIndex), ec);
+}
+
 void HTMLSelectElement::removeByIndex(int optionIndex)
 {
     int listIndex = optionToListIndex(optionIndex);
index da1d662..1ae212b 100644 (file)
@@ -57,6 +57,7 @@ public:
     bool usesMenuList() const;
 
     void add(HTMLElement*, HTMLElement* beforeElement, ExceptionCode&);
+    void add(HTMLElement*, int beforeIndex, ExceptionCode&);
 
     using Node::remove;
     // Should be remove(int) but it conflicts with Node::remove(ExceptionCode&).
index 92a96a3..bacc656 100644 (file)
@@ -41,9 +41,9 @@
 #endif
     getter Node item(unsigned long index);
     Node namedItem([Default=Undefined] optional DOMString name);
-    [ObjCLegacyUnnamedParameters, RaisesException] void add([Default=Undefined] optional HTMLElement element,
-                            [Default=Undefined] optional HTMLElement before);
+    [ObjCLegacyUnnamedParameters, RaisesException] void add(HTMLElement element, [Default=Undefined] optional HTMLElement? before);
 #if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+    [RaisesException] void add(HTMLElement element, [Default=Undefined] optional long index);
     // In JavaScript, we support both option index and option object parameters.
     // As of this writing this cannot be auto-generated.
     [Custom] void remove(/* indexOrOption */);