Commit 5dea9d09 authored by Kent Tamura's avatar Kent Tamura Committed by Commit Bot

Remove CheckValidityEventBehavior.

The behavior of ListedElement::checkValidity() with
kCheckValidityDispatchNoEvent was very simple. This CL introduces
IsNotCandidateOrValid() for that behavior, and removes
CheckValidityEventBehavior argument of checkValidity().

Change-Id: Ieff28ada30cc47d8617e73306d874cdfa9dee43c
Reviewed-on: https://chromium-review.googlesource.com/c/1364990
Commit-Queue: Kent Tamura <tkent@chromium.org>
Reviewed-by: default avatarKeishi Hattori <keishi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#614296}
parent 31c1d53e
...@@ -54,13 +54,11 @@ bool HTMLFieldSetElement::MatchesValidityPseudoClasses() const { ...@@ -54,13 +54,11 @@ bool HTMLFieldSetElement::MatchesValidityPseudoClasses() const {
bool HTMLFieldSetElement::IsValidElement() { bool HTMLFieldSetElement::IsValidElement() {
for (Element* element : *elements()) { for (Element* element : *elements()) {
if (element->IsFormControlElement()) { if (element->IsFormControlElement()) {
if (!ToHTMLFormControlElement(element)->checkValidity( if (!ToHTMLFormControlElement(element)->IsNotCandidateOrValid())
nullptr, kCheckValidityDispatchNoEvent))
return false; return false;
} else if (element->IsHTMLElement() && } else if (element->IsHTMLElement() &&
ToHTMLElement(element)->IsFormAssociatedCustomElement()) { ToHTMLElement(element)->IsFormAssociatedCustomElement()) {
if (!element->EnsureElementInternals().ListedElement::checkValidity( if (!element->EnsureElementInternals().IsNotCandidateOrValid())
nullptr, kCheckValidityDispatchNoEvent))
return false; return false;
} }
} }
......
...@@ -101,8 +101,11 @@ bool HTMLFormElement::MatchesValidityPseudoClasses() const { ...@@ -101,8 +101,11 @@ bool HTMLFormElement::MatchesValidityPseudoClasses() const {
} }
bool HTMLFormElement::IsValidElement() { bool HTMLFormElement::IsValidElement() {
return !CheckInvalidControlsAndCollectUnhandled( for (const auto& element : ListedElements()) {
nullptr, kCheckValidityDispatchNoEvent); if (!element->IsNotCandidateOrValid())
return false;
}
return true;
} }
Node::InsertionNotificationRequest HTMLFormElement::InsertedInto( Node::InsertionNotificationRequest HTMLFormElement::InsertedInto(
...@@ -211,8 +214,7 @@ bool HTMLFormElement::ValidateInteractively() { ...@@ -211,8 +214,7 @@ bool HTMLFormElement::ValidateInteractively() {
element->HideVisibleValidationMessage(); element->HideVisibleValidationMessage();
ListedElement::List unhandled_invalid_controls; ListedElement::List unhandled_invalid_controls;
if (!CheckInvalidControlsAndCollectUnhandled( if (!CheckInvalidControlsAndCollectUnhandled(&unhandled_invalid_controls))
&unhandled_invalid_controls, kCheckValidityDispatchInvalidEvent))
return true; return true;
UseCounter::Count(GetDocument(), UseCounter::Count(GetDocument(),
WebFeature::kFormValidationAbortedSubmission); WebFeature::kFormValidationAbortedSubmission);
...@@ -718,15 +720,13 @@ HTMLFormControlElement* HTMLFormElement::FindDefaultButton() const { ...@@ -718,15 +720,13 @@ HTMLFormControlElement* HTMLFormElement::FindDefaultButton() const {
} }
bool HTMLFormElement::checkValidity() { bool HTMLFormElement::checkValidity() {
return !CheckInvalidControlsAndCollectUnhandled( return !CheckInvalidControlsAndCollectUnhandled(nullptr);
nullptr, kCheckValidityDispatchInvalidEvent);
} }
bool HTMLFormElement::CheckInvalidControlsAndCollectUnhandled( bool HTMLFormElement::CheckInvalidControlsAndCollectUnhandled(
ListedElement::List* unhandled_invalid_controls, ListedElement::List* unhandled_invalid_controls) {
CheckValidityEventBehavior event_behavior) {
// Copy listedElements because event handlers called from // Copy listedElements because event handlers called from
// HTMLFormControlElement::checkValidity() might change listedElements. // ListedElement::checkValidity() might change listed_elements.
const ListedElement::List& listed_elements = ListedElements(); const ListedElement::List& listed_elements = ListedElements();
HeapVector<Member<ListedElement>> elements; HeapVector<Member<ListedElement>> elements;
elements.ReserveCapacity(listed_elements.size()); elements.ReserveCapacity(listed_elements.size());
...@@ -745,12 +745,9 @@ bool HTMLFormElement::CheckInvalidControlsAndCollectUnhandled( ...@@ -745,12 +745,9 @@ bool HTMLFormElement::CheckInvalidControlsAndCollectUnhandled(
should_check_validity = true; should_check_validity = true;
} }
if (should_check_validity && if (should_check_validity &&
!element->checkValidity(unhandled_invalid_controls, event_behavior) && !element->checkValidity(unhandled_invalid_controls) &&
element->Form() == this) { element->Form() == this) {
++invalid_controls_count; ++invalid_controls_count;
if (!unhandled_invalid_controls &&
event_behavior == kCheckValidityDispatchNoEvent)
return true;
} }
} }
return invalid_controls_count; return invalid_controls_count;
......
...@@ -144,8 +144,7 @@ class CORE_EXPORT HTMLFormElement final : public HTMLElement { ...@@ -144,8 +144,7 @@ class CORE_EXPORT HTMLFormElement final : public HTMLElement {
// Validates each of the controls, and stores controls of which 'invalid' // Validates each of the controls, and stores controls of which 'invalid'
// event was not canceled to the specified vector. Returns true if there // event was not canceled to the specified vector. Returns true if there
// are any invalid controls in this form. // are any invalid controls in this form.
bool CheckInvalidControlsAndCollectUnhandled(ListedElement::List*, bool CheckInvalidControlsAndCollectUnhandled(ListedElement::List*);
CheckValidityEventBehavior);
Element* ElementFromPastNamesMap(const AtomicString&); Element* ElementFromPastNamesMap(const AtomicString&);
void AddToPastNamesMap(Element*, const AtomicString& past_name); void AddToPastNamesMap(Element*, const AtomicString& past_name);
......
...@@ -429,14 +429,9 @@ ValidationMessageClient* ListedElement::GetValidationMessageClient() const { ...@@ -429,14 +429,9 @@ ValidationMessageClient* ListedElement::GetValidationMessageClient() const {
return nullptr; return nullptr;
} }
bool ListedElement::checkValidity(List* unhandled_invalid_controls, bool ListedElement::checkValidity(List* unhandled_invalid_controls) {
CheckValidityEventBehavior event_behavior) { if (IsNotCandidateOrValid())
if (!WillValidate())
return true; return true;
if (IsValidElement())
return true;
if (event_behavior != kCheckValidityDispatchInvalidEvent)
return false;
HTMLElement& element = ToHTMLElement(*this); HTMLElement& element = ToHTMLElement(*this);
Document* original_document = &element.GetDocument(); Document* original_document = &element.GetDocument();
DispatchEventResult dispatch_result = element.DispatchEvent( DispatchEventResult dispatch_result = element.DispatchEvent(
...@@ -457,8 +452,7 @@ void ListedElement::ShowValidationMessage() { ...@@ -457,8 +452,7 @@ void ListedElement::ShowValidationMessage() {
bool ListedElement::reportValidity() { bool ListedElement::reportValidity() {
List unhandled_invalid_controls; List unhandled_invalid_controls;
bool is_valid = checkValidity(&unhandled_invalid_controls, bool is_valid = checkValidity(&unhandled_invalid_controls);
kCheckValidityDispatchInvalidEvent);
if (is_valid || unhandled_invalid_controls.IsEmpty()) if (is_valid || unhandled_invalid_controls.IsEmpty())
return is_valid; return is_valid;
DCHECK_EQ(unhandled_invalid_controls.size(), 1u); DCHECK_EQ(unhandled_invalid_controls.size(), 1u);
...@@ -493,6 +487,12 @@ bool ListedElement::IsValidElement() { ...@@ -493,6 +487,12 @@ bool ListedElement::IsValidElement() {
return is_valid_; return is_valid_;
} }
bool ListedElement::IsNotCandidateOrValid() {
// Apply Element::willValidate(), not ListedElement::WillValidate(), because
// some elements override willValidate().
return !ToHTMLElement(this)->willValidate() || IsValidElement();
}
void ListedElement::SetNeedsValidityCheck() { void ListedElement::SetNeedsValidityCheck() {
HTMLElement& element = ToHTMLElement(*this); HTMLElement& element = ToHTMLElement(*this);
if (!validity_is_dirty_) { if (!validity_is_dirty_) {
......
...@@ -42,11 +42,6 @@ class Node; ...@@ -42,11 +42,6 @@ class Node;
class ValidationMessageClient; class ValidationMessageClient;
class ValidityState; class ValidityState;
enum CheckValidityEventBehavior {
kCheckValidityDispatchNoEvent,
kCheckValidityDispatchInvalidEvent
};
// https://html.spec.whatwg.org/multipage/forms.html#category-listed // https://html.spec.whatwg.org/multipage/forms.html#category-listed
class CORE_EXPORT ListedElement : public GarbageCollectedMixin { class CORE_EXPORT ListedElement : public GarbageCollectedMixin {
public: public:
...@@ -103,9 +98,7 @@ class CORE_EXPORT ListedElement : public GarbageCollectedMixin { ...@@ -103,9 +98,7 @@ class CORE_EXPORT ListedElement : public GarbageCollectedMixin {
virtual void setCustomValidity(const String&); virtual void setCustomValidity(const String&);
void UpdateVisibleValidationMessage(); void UpdateVisibleValidationMessage();
void HideVisibleValidationMessage(); void HideVisibleValidationMessage();
bool checkValidity( bool checkValidity(List* unhandled_invalid_controls = nullptr);
List* unhandled_invalid_controls = nullptr,
CheckValidityEventBehavior = kCheckValidityDispatchInvalidEvent);
bool reportValidity(); bool reportValidity();
// This must be called only after the caller check the element is focusable. // This must be called only after the caller check the element is focusable.
void ShowValidationMessage(); void ShowValidationMessage();
...@@ -117,6 +110,12 @@ class CORE_EXPORT ListedElement : public GarbageCollectedMixin { ...@@ -117,6 +110,12 @@ class CORE_EXPORT ListedElement : public GarbageCollectedMixin {
// For Element::IsValidElement(), which is for :valid :invalid selectors. // For Element::IsValidElement(), which is for :valid :invalid selectors.
bool IsValidElement(); bool IsValidElement();
// Returns true if
// - this is not a candidate for constraint validation, or
// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#candidate-for-constraint-validation
// - this satisfies its constraints
// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#concept-fv-valid
bool IsNotCandidateOrValid();
// This must be called when a validation constraint or control value is // This must be called when a validation constraint or control value is
// changed. // changed.
......
...@@ -1516,6 +1516,12 @@ bool HTMLElement::MatchesValidityPseudoClasses() const { ...@@ -1516,6 +1516,12 @@ bool HTMLElement::MatchesValidityPseudoClasses() const {
return IsFormAssociatedCustomElement(); return IsFormAssociatedCustomElement();
} }
bool HTMLElement::willValidate() const {
return IsFormAssociatedCustomElement() && const_cast<HTMLElement*>(this)
->EnsureElementInternals()
.WillValidate();
}
bool HTMLElement::IsValidElement() { bool HTMLElement::IsValidElement() {
return IsFormAssociatedCustomElement() && return IsFormAssociatedCustomElement() &&
EnsureElementInternals().IsValidElement(); EnsureElementInternals().IsValidElement();
......
...@@ -127,6 +127,7 @@ class CORE_EXPORT HTMLElement : public Element { ...@@ -127,6 +127,7 @@ class CORE_EXPORT HTMLElement : public Element {
bool MatchesReadOnlyPseudoClass() const override; bool MatchesReadOnlyPseudoClass() const override;
bool MatchesReadWritePseudoClass() const override; bool MatchesReadWritePseudoClass() const override;
bool MatchesValidityPseudoClasses() const override; bool MatchesValidityPseudoClasses() const override;
bool willValidate() const override;
bool IsValidElement() override; bool IsValidElement() override;
static const AtomicString& EventParameterName(); static const AtomicString& EventParameterName();
......
...@@ -1422,11 +1422,8 @@ ax::mojom::InvalidState AXNodeObject::GetInvalidState() const { ...@@ -1422,11 +1422,8 @@ ax::mojom::InvalidState AXNodeObject::GetInvalidState() const {
if (GetNode() && GetNode()->IsElementNode() && if (GetNode() && GetNode()->IsElementNode() &&
ToElement(GetNode())->IsFormControlElement()) { ToElement(GetNode())->IsFormControlElement()) {
HTMLFormControlElement* element = ToHTMLFormControlElement(GetNode()); HTMLFormControlElement* element = ToHTMLFormControlElement(GetNode());
ListedElement::List invalid_controls; return element->IsNotCandidateOrValid() ? ax::mojom::InvalidState::kFalse
bool is_invalid = !element->checkValidity(&invalid_controls, : ax::mojom::InvalidState::kTrue;
kCheckValidityDispatchNoEvent);
return is_invalid ? ax::mojom::InvalidState::kTrue
: ax::mojom::InvalidState::kFalse;
} }
return AXObject::GetInvalidState(); return AXObject::GetInvalidState();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment