| Index: Source/core/html/HTMLFormControlElement.cpp
|
| diff --git a/Source/core/html/HTMLFormControlElement.cpp b/Source/core/html/HTMLFormControlElement.cpp
|
| index bd58b9eb3ba07f2537c0ae34b21a82aa198ce43f..e68ef591c249e14d48f2e2c46acd21bf7c96fe0b 100644
|
| --- a/Source/core/html/HTMLFormControlElement.cpp
|
| +++ b/Source/core/html/HTMLFormControlElement.cpp
|
| @@ -253,11 +253,13 @@ Node::InsertionNotificationRequest HTMLFormControlElement::insertedInto(Containe
|
| setNeedsWillValidateCheck();
|
| HTMLElement::insertedInto(insertionPoint);
|
| FormAssociatedElement::insertedInto(insertionPoint);
|
| + fieldSetAncestorsSetNeedsValidityCheck(insertionPoint);
|
| return InsertionDone;
|
| }
|
|
|
| void HTMLFormControlElement::removedFrom(ContainerNode* insertionPoint)
|
| {
|
| + fieldSetAncestorsSetNeedsValidityCheck(insertionPoint);
|
| hideVisibleValidationMessage();
|
| m_hasValidationMessage = false;
|
| m_ancestorDisabledState = AncestorDisabledStateUnknown;
|
| @@ -285,6 +287,20 @@ void HTMLFormControlElement::formOwnerSetNeedsValidityCheck()
|
| form->setNeedsValidityCheck();
|
| }
|
|
|
| +void HTMLFormControlElement::fieldSetAncestorsSetNeedsValidityCheck(Node* node)
|
| +{
|
| + if (!node)
|
| + return;
|
| + HTMLFieldSetElement* fieldSet = Traversal<HTMLFieldSetElement>::firstAncestorOrSelf(*node);
|
| + HTMLFieldSetElement* lastFieldSet = 0;
|
| + while (fieldSet) {
|
| + lastFieldSet = fieldSet;
|
| + fieldSet = Traversal<HTMLFieldSetElement>::firstAncestor(*fieldSet);
|
| + }
|
| + if (lastFieldSet)
|
| + lastFieldSet->setNeedsValidityCheck();
|
| +}
|
| +
|
| void HTMLFormControlElement::setChangedSinceLastFormControlChangeEvent(bool changed)
|
| {
|
| m_wasChangedSinceLastFormControlChangeEvent = changed;
|
| @@ -519,6 +535,7 @@ void HTMLFormControlElement::setNeedsValidityCheck()
|
| bool newIsValid = valid();
|
| if (willValidate() && newIsValid != m_isValid) {
|
| formOwnerSetNeedsValidityCheck();
|
| + fieldSetAncestorsSetNeedsValidityCheck(parentNode());
|
| // Update style for pseudo classes such as :valid :invalid.
|
| setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::createWithExtraData(StyleChangeReason::PseudoClass, StyleChangeExtraData::Invalid));
|
| }
|
|
|