<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=395107
-->
<head>
  <title>Test for Bug 395107</title>
  <script type="text/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=395107">Mozilla Bug 395107</a>
<p id="display"></p>
<div id="content" style="display: none">
  
</div>
<pre id="test">
<script class="testbody" type="text/javascript">

/** Test for Bug 395107 **/
var testNumber = 0;

function assertSelected(aOption, aExpectDefaultSelected, aExpectSelected) {
  ++testNumber;
  is(aOption.defaultSelected, aExpectDefaultSelected,
     "Asserting default-selected state for option " + testNumber);
  is(aOption.selected, aExpectSelected,
     "Asserting selected state for option " + testNumber);
}

function assertSame(aSel1, aSel2Str, aTestNumber) {
  var div = document.createElement("div");
  div.innerHTML = aSel2Str;
  sel2 = div.firstChild;
  is(aSel1.options.length, sel2.options.length,
     "Length should be same in select test " + aTestNumber);
  is(aSel1.selectedIndex, sel2.selectedIndex,
     "Selected index should be same in select test " + aTestNumber);
  for (var i = 0; i < aSel1.options.length; ++i) {
    is(aSel1.options[i].selected, sel2.options[i].selected,
       "Options[" + i + "].selected should be the same in select test " +
       aTestNumber);
    is(aSel1.options[i].defaultSelected, sel2.options[i].defaultSelected,
       "Options[" + i +
       "].defaultSelected should be the same in select test " +
       aTestNumber);
  }
}

// In a single-select, setting an option selected should deselect an
// existing selected option.
var sel = document.createElement("select");
sel.appendChild(new Option());
is(sel.selectedIndex, 0, "First option should be selected");
assertSelected(sel.firstChild, false, true);
sel.appendChild(new Option());
is(sel.selectedIndex, 0, "First option should still be selected");
assertSelected(sel.firstChild, false, true);
assertSelected(sel.firstChild.nextSibling, false, false);

opt = new Option();
sel.appendChild(opt);
opt.defaultSelected = true;
assertSelected(sel.firstChild, false, false);
assertSelected(sel.firstChild.nextSibling, false, false);
assertSelected(opt, true, true);
is(opt, sel.firstChild.nextSibling.nextSibling, "What happened here?");
is(sel.options[0], sel.firstChild, "Unexpected option 0");
is(sel.options[1], sel.firstChild.nextSibling, "Unexpected option 1");
is(sel.options[2], opt, "Unexpected option 2");
is(sel.selectedIndex, 2, "Unexpected selectedIndex in select test 1");

assertSame(sel, "<select><option><option><option selected></select>", 1);

// Same, but with the option that gets set selected earlier in the select
sel = document.createElement("select");
sel.appendChild(new Option());
sel.appendChild(new Option());
opt = new Option();
opt.defaultSelected = true;
sel.appendChild(opt);
opt = new Option();
sel.options[0] = opt;
opt.defaultSelected = true;
assertSelected(sel.options[0], true, true);
assertSelected(sel.options[1], false, false);
assertSelected(sel.options[2], true, false);
is(sel.selectedIndex, 0, "Unexpected selectedIndex in select test 2");

// And now try unselecting options
sel = document.createElement("select");
sel.appendChild(new Option());
opt = new Option();
opt.defaultSelected = true;
sel.appendChild(opt);
sel.appendChild(new Option());
opt.defaultSelected = false;

assertSelected(sel.options[0], false, true);
assertSelected(sel.options[1], false, false);
assertSelected(sel.options[2], false, false);
is(sel.selectedIndex, 0, "Unexpected selectedIndex in select test 2");

</script>
</pre>
</body>
</html>