| Index: Source/core/html/HTMLFormElement.cpp
|
| diff --git a/Source/core/html/HTMLFormElement.cpp b/Source/core/html/HTMLFormElement.cpp
|
| index a550d52fb7174b3c6dc971f13869d085e5d554f8..93d6536137a0722b681a0d70637f82bcf915b121 100644
|
| --- a/Source/core/html/HTMLFormElement.cpp
|
| +++ b/Source/core/html/HTMLFormElement.cpp
|
| @@ -78,6 +78,7 @@ HTMLFormElement::HTMLFormElement(Document& document)
|
| , m_shouldSubmit(false)
|
| , m_isInResetFunction(false)
|
| , m_wasDemoted(false)
|
| + , m_invalidControlsCount(0)
|
| , m_pendingAutocompleteEventsQueue(GenericEventQueue::create(this))
|
| {
|
| }
|
| @@ -717,13 +718,29 @@ HTMLFormControlElement* HTMLFormElement::defaultButton() const
|
| return 0;
|
| }
|
|
|
| -void HTMLFormElement::setNeedsValidityCheck()
|
| -{
|
| - // For now unconditionally order style recalculation, which triggers
|
| - // validity recalculation. In the near future, implement validity cache and
|
| - // recalculate style only if it changed.
|
| - pseudoStateChanged(CSSSelector::PseudoValid);
|
| - pseudoStateChanged(CSSSelector::PseudoInvalid);
|
| +void HTMLFormElement::setNeedsValidityCheck(ValidityRecalcReason reason, bool isValid)
|
| +{
|
| + bool formWasInvalid = m_invalidControlsCount > 0;
|
| + switch (reason) {
|
| + case ElementRemoval:
|
| + if (!isValid)
|
| + --m_invalidControlsCount;
|
| + break;
|
| + case ElementAddition:
|
| + if (!isValid)
|
| + ++m_invalidControlsCount;
|
| + break;
|
| + case ElementModification:
|
| + if (isValid)
|
| + --m_invalidControlsCount;
|
| + else
|
| + ++m_invalidControlsCount;
|
| + break;
|
| + }
|
| + if (formWasInvalid && !m_invalidControlsCount)
|
| + pseudoStateChanged(CSSSelector::PseudoValid);
|
| + if (!formWasInvalid && m_invalidControlsCount)
|
| + pseudoStateChanged(CSSSelector::PseudoInvalid);
|
| }
|
|
|
| bool HTMLFormElement::checkValidity()
|
| @@ -733,6 +750,9 @@ bool HTMLFormElement::checkValidity()
|
|
|
| bool HTMLFormElement::checkInvalidControlsAndCollectUnhandled(WillBeHeapVector<RefPtrWillBeMember<HTMLFormControlElement> >* unhandledInvalidControls, CheckValidityEventBehavior eventBehavior)
|
| {
|
| + if (!unhandledInvalidControls && eventBehavior == CheckValidityDispatchNoEvent)
|
| + return m_invalidControlsCount;
|
| +
|
| RefPtrWillBeRawPtr<HTMLFormElement> protector(this);
|
| // Copy associatedElements because event handlers called from
|
| // HTMLFormControlElement::checkValidity() might change associatedElements.
|
| @@ -741,15 +761,17 @@ bool HTMLFormElement::checkInvalidControlsAndCollectUnhandled(WillBeHeapVector<R
|
| elements.reserveCapacity(associatedElements.size());
|
| for (unsigned i = 0; i < associatedElements.size(); ++i)
|
| elements.append(associatedElements[i]);
|
| - bool hasInvalidControls = false;
|
| + int invalidControlsCount = 0;
|
| for (unsigned i = 0; i < elements.size(); ++i) {
|
| if (elements[i]->form() == this && elements[i]->isFormControlElement()) {
|
| HTMLFormControlElement* control = toHTMLFormControlElement(elements[i].get());
|
| if (!control->checkValidity(unhandledInvalidControls, eventBehavior) && control->formOwner() == this)
|
| - hasInvalidControls = true;
|
| + ++invalidControlsCount;
|
| }
|
| }
|
| - return hasInvalidControls;
|
| + if (eventBehavior == CheckValidityDispatchNoEvent)
|
| + ASSERT(invalidControlsCount == m_invalidControlsCount);
|
| + return invalidControlsCount;
|
| }
|
|
|
| bool HTMLFormElement::reportValidity()
|
|
|