зеркало из https://github.com/mozilla/pjs.git
Bug 571352 - <select multiple> does not reset the anchor <option> properly when the anchor is removed. r=bzbarsky
This commit is contained in:
Родитель
41d2a719f6
Коммит
50d4d2c2ea
|
@ -1510,28 +1510,42 @@ nsListControlFrame::AddOption(PRInt32 aIndex)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
static PRInt32
|
||||
DecrementAndClamp(PRInt32 aSelectionIndex, PRInt32 aLength)
|
||||
{
|
||||
return aLength == 0 ? kNothingSelected : NS_MAX(0, aSelectionIndex - 1);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsListControlFrame::RemoveOption(PRInt32 aIndex)
|
||||
{
|
||||
NS_PRECONDITION(aIndex >= 0, "negative <option> index");
|
||||
|
||||
// Need to reset if we're a dropdown
|
||||
if (IsInDropDownMode()) {
|
||||
mNeedToReset = PR_TRUE;
|
||||
mPostChildrenLoadedReset = mIsAllContentHere;
|
||||
}
|
||||
|
||||
if (mStartSelectionIndex >= aIndex) {
|
||||
--mStartSelectionIndex;
|
||||
if (mStartSelectionIndex < 0) {
|
||||
mStartSelectionIndex = kNothingSelected;
|
||||
}
|
||||
}
|
||||
if (mStartSelectionIndex != kNothingSelected) {
|
||||
NS_ASSERTION(mEndSelectionIndex != kNothingSelected, "");
|
||||
PRInt32 numOptions = GetNumberOfOptions();
|
||||
// NOTE: numOptions is the new number of options whereas aIndex is the
|
||||
// unadjusted index of the removed option (hence the <= below).
|
||||
NS_ASSERTION(aIndex <= numOptions, "out-of-bounds <option> index");
|
||||
|
||||
if (mEndSelectionIndex >= aIndex) {
|
||||
--mEndSelectionIndex;
|
||||
if (mEndSelectionIndex < 0) {
|
||||
mEndSelectionIndex = kNothingSelected;
|
||||
}
|
||||
PRInt32 forward = mEndSelectionIndex - mStartSelectionIndex;
|
||||
PRInt32* low = forward >= 0 ? &mStartSelectionIndex : &mEndSelectionIndex;
|
||||
PRInt32* high = forward >= 0 ? &mEndSelectionIndex : &mStartSelectionIndex;
|
||||
if (aIndex < *low)
|
||||
*low = ::DecrementAndClamp(*low, numOptions);
|
||||
if (aIndex <= *high)
|
||||
*high = ::DecrementAndClamp(*high, numOptions);
|
||||
if (forward == 0)
|
||||
*low = *high;
|
||||
}
|
||||
else
|
||||
NS_ASSERTION(mEndSelectionIndex == kNothingSelected, "");
|
||||
|
||||
InvalidateFocus();
|
||||
return NS_OK;
|
||||
|
|
|
@ -71,6 +71,7 @@ _TEST_FILES = test_bug231389.html \
|
|||
test_bug564115.html \
|
||||
bug564115_window.html \
|
||||
test_bug377624.html \
|
||||
test_bug571352.html \
|
||||
test_bug572406.html \
|
||||
$(NULL)
|
||||
|
||||
|
|
|
@ -0,0 +1,87 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=571352
|
||||
-->
|
||||
<head>
|
||||
<title>Test for Bug 571352</title>
|
||||
<script type="application/javascript" src="/MochiKit/packed.js"></script>
|
||||
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/EventUtils.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=571352">Mozilla Bug 571352</a>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none">
|
||||
|
||||
</div>
|
||||
<pre id="test">
|
||||
<script type="application/javascript">
|
||||
|
||||
/** Test for Bug 571352 **/
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
SimpleTest.waitForFocus(function test() {
|
||||
function createList() {
|
||||
$('display').innerHTML = '<select multiple><option>0<option>1<option>2<option>3<option>4<option>5</select>';
|
||||
$('display').firstChild.focus();
|
||||
}
|
||||
function option(index) {
|
||||
return $('display').firstChild.childNodes[index];
|
||||
}
|
||||
function remove(index) {
|
||||
var sel = $('display').firstChild;
|
||||
sel.removeChild(sel.childNodes[index]);
|
||||
}
|
||||
function up() { synthesizeKey("VK_UP", {}); }
|
||||
function shiftUp() { synthesizeKey("VK_UP", {shiftKey:true}); }
|
||||
function down() { synthesizeKey("VK_DOWN", {}); }
|
||||
function shiftDown() { synthesizeKey("VK_DOWN", {shiftKey:true}); }
|
||||
function mouseEvent(index,event) {
|
||||
synthesizeMouse(option(index), 5, 5, event);
|
||||
}
|
||||
|
||||
const click = {};
|
||||
const shiftClick = {shiftKey:true};
|
||||
const CtrlClick = {CtrlKey:true};
|
||||
createList();
|
||||
mouseEvent(0,click)
|
||||
is(document.activeElement,$('display').firstChild,"<select> is focused");
|
||||
mouseEvent(2,shiftClick)
|
||||
remove(0);
|
||||
ok(option(0).selected && option(1).selected,"first two options are selected");
|
||||
mouseEvent(2,shiftClick)
|
||||
ok(option(0).selected && option(1).selected && option(2).selected,"first three options are selected");
|
||||
shiftUp();
|
||||
ok(option(0).selected && option(1).selected,"first two options are selected");
|
||||
remove(1);
|
||||
ok(option(0).selected,"first option is selected");
|
||||
shiftDown();
|
||||
ok(option(0).selected && option(1).selected,"first two options are selected");
|
||||
down();
|
||||
ok(option(2).selected,"third option is selected");
|
||||
shiftDown();
|
||||
ok(option(2).selected && option(3).selected,"third & fourth option are selected");
|
||||
remove(2);
|
||||
shiftUp();
|
||||
ok(option(1).selected && option(2).selected,"2nd & third option are selected");
|
||||
remove(0);
|
||||
mouseEvent(0,shiftClick)
|
||||
ok(option(0).selected && option(1).selected,"all remaining 2 options are selected");
|
||||
shiftDown();
|
||||
remove(1);
|
||||
ok(!option(0).selected,"first option is unselected");
|
||||
remove(0); // select is now empty
|
||||
ok($('display').firstChild.firstChild==null,"all options were removed");
|
||||
|
||||
SimpleTest.finish();
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
Загрузка…
Ссылка в новой задаче