Bug 1725293 - checkValidity() on <select required> returns true when <option value=> is moved in the dom, r=edgar

The new check should be still fast, since accessing selected index is trivial and Item() call is just accessing the element from an
nsTArray.

Differential Revision: https://phabricator.services.mozilla.com/D123371
This commit is contained in:
Olli Pettay
2021-08-24 08:46:00 +00:00
parent 3eca08d325
commit 9b6f30989e
3 changed files with 22 additions and 6 deletions

View File

@@ -52,10 +52,9 @@ SafeOptionListMutation::SafeOptionListMutation(nsIContent* aSelect,
: mSelect(HTMLSelectElement::FromNodeOrNull(aSelect)),
mTopLevelMutation(false),
mNeedsRebuild(false),
mNotify(aNotify),
mInitialSelectedIndex(-1) {
mNotify(aNotify) {
if (mSelect) {
mInitialSelectedIndex = mSelect->SelectedIndex();
mInitialSelectedOption = mSelect->Item(mSelect->SelectedIndex());
mTopLevelMutation = !mSelect->mMutating;
if (mTopLevelMutation) {
mSelect->mMutating = true;
@@ -84,7 +83,7 @@ SafeOptionListMutation::~SafeOptionListMutation() {
if (mTopLevelMutation) {
mSelect->mMutating = false;
}
if (mSelect->SelectedIndex() != mInitialSelectedIndex) {
if (mSelect->Item(mSelect->SelectedIndex()) != mInitialSelectedOption) {
// We must have triggered the SelectSomething() codepath, which can cause
// our validity to change. Unfortunately, our attempt to update validity
// in that case may not have worked correctly, because we actually call it