Bug 1203668 - Setting the value of a <select> to a non-matching option should deselect all options and set selectedIndex to -1. r=bz
☠☠ backed out by 3de175bd4e83 ☠ ☠
authorMats Palmgren <mats@mozilla.com>
Sat, 12 Sep 2015 12:34:37 +0200
changeset 294765 574a93c36fd8ac5bc9f803f622b30f472b8be0b0
parent 294764 f3c4899a67e48acc764993a368402b21f2745192
child 294766 f760a0088a813ae91c79f6df83f0caf25b71c9b4
push id5245
push userraliiev@mozilla.com
push dateThu, 29 Oct 2015 11:30:51 +0000
treeherdermozilla-beta@dac831dc1bd0 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbz
bugs1203668
milestone43.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1203668 - Setting the value of a <select> to a non-matching option should deselect all options and set selectedIndex to -1. r=bz
dom/html/HTMLSelectElement.cpp
dom/html/test/mochitest.ini
dom/html/test/test_bug1203668.html
--- a/dom/html/HTMLSelectElement.cpp
+++ b/dom/html/HTMLSelectElement.cpp
@@ -1196,19 +1196,21 @@ HTMLSelectElement::SetValue(const nsAStr
     if (!option) {
       continue;
     }
 
     nsAutoString optionVal;
     option->GetValue(optionVal);
     if (optionVal.Equals(aValue)) {
       SetSelectedIndexInternal(int32_t(i), true);
-      break;
+      return NS_OK;
     }
   }
+  // No matching option was found.
+  SetSelectedIndexInternal(-1, true);
   return NS_OK;
 }
 
 
 NS_IMPL_BOOL_ATTR(HTMLSelectElement, Autofocus, autofocus)
 NS_IMPL_BOOL_ATTR(HTMLSelectElement, Disabled, disabled)
 NS_IMPL_BOOL_ATTR(HTMLSelectElement, Multiple, multiple)
 NS_IMPL_STRING_ATTR(HTMLSelectElement, Name, name)
--- a/dom/html/test/mochitest.ini
+++ b/dom/html/test/mochitest.ini
@@ -588,8 +588,9 @@ support-files = file_bug871161-1.html fi
 [test_hash_encoded.html]
 [test_bug1081037.html]
 [test_window_open_close.html]
 skip-if = buildapp == 'b2g' # bug 1129014
 [test_img_complete.html]
 [test_viewport_resize.html]
 [test_extapp.html]
 [test_image_clone_load.html]
+[test_bug1203668.html]
new file mode 100644
--- /dev/null
+++ b/dom/html/test/test_bug1203668.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1203668
+-->
+<head>
+  <title>Test for Bug 1203668</title>
+  <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=1203668">Mozilla Bug 1203668</a>
+<p id="display"></p>
+<div id="content">
+  <select class="select" multiple>
+    <option value="foo" selected>foo</option>
+    <option value="bar" selected>bar</option>
+  </select>
+  <select class="select" multiple>
+    <option value="foo">foo</option>
+    <option value="bar" selected>bar</option>
+  </select>
+  <select class="select" multiple>
+    <option value="foo">foo</option>
+    <option value="bar">bar</option>
+  </select>
+  <select class="select" size=1>
+    <option value="foo">foo</option>
+    <option value="bar" selected>bar</option>
+  </select>
+  <select class="select" size=1>
+    <option value="foo">foo</option>
+    <option value="bar">bar</option>
+  </select>
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 1203668 **/
+
+SimpleTest.waitForExplicitFinish();
+
+function runTest()
+{
+  var selects = document.querySelectorAll('.select');
+  for (i=0; i < selects.length; i++) {
+    var select = selects[i];
+    select.value = "bogus"
+    is(select.selectedIndex, -1, "no option is selected");
+    is(select.children[0].selected, false, "first option is not selected");
+    is(select.children[1].selected, false, "second option is not selected");
+  }
+
+  SimpleTest.finish();
+}
+
+SimpleTest.waitForFocus(runTest);
+
+</script>
+</pre>
+</body>
+</html>