From d14856e3c545c06d4058fb2f55c6c24fed45d7c7 Mon Sep 17 00:00:00 2001 From: sideshowbarker Date: Tue, 4 Mar 2025 13:25:15 +0900 Subject: [PATCH] =?UTF-8?q?LibWeb:=20Implement=20=E2=80=9Csuffering=20from?= =?UTF-8?q?=20a=20step=20mismatch=E2=80=9D=20constraint=20validation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Libraries/LibWeb/HTML/HTMLInputElement.cpp | 18 +++++++-- .../form-validation-checkValidity.txt | 40 +++++++++---------- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/Libraries/LibWeb/HTML/HTMLInputElement.cpp b/Libraries/LibWeb/HTML/HTMLInputElement.cpp index 046c224d811..43b72e2cb16 100644 --- a/Libraries/LibWeb/HTML/HTMLInputElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLInputElement.cpp @@ -3098,10 +3098,20 @@ bool HTMLInputElement::suffering_from_an_overflow() const // https://html.spec.whatwg.org/multipage/input.html#the-step-attribute%3Asuffering-from-a-step-mismatch bool HTMLInputElement::suffering_from_a_step_mismatch() const { - // When the element has an allowed value step, and the result of applying the algorithm to convert a string to a number to the string given by the element's - // value is a number, and that number subtracted from the step base is not an integral multiple of the allowed value step, the element is suffering from a step mismatch. - // FIXME: Implement this. - return false; + // When the element has an allowed value step, + auto maybe_allowed_value_step = allowed_value_step(); + if (!maybe_allowed_value_step.has_value()) + return false; + double allowed_value_step = *maybe_allowed_value_step; + // and the result of applying the algorithm to convert a string to a number to the string given by the element's + // value is a number, + auto maybe_number = convert_string_to_number(value()); + if (!maybe_number.has_value()) + return false; + double number = maybe_number.value(); + // and that number subtracted from the step base is not an integral multiple of the allowed value step, the element + // is suffering from a step mismatch. + return fmod(step_base() - number, allowed_value_step) != 0; } // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#suffering-from-bad-input diff --git a/Tests/LibWeb/Text/expected/wpt-import/html/semantics/forms/constraints/form-validation-checkValidity.txt b/Tests/LibWeb/Text/expected/wpt-import/html/semantics/forms/constraints/form-validation-checkValidity.txt index ce83c6ac33b..a9d6ab0bf27 100644 --- a/Tests/LibWeb/Text/expected/wpt-import/html/semantics/forms/constraints/form-validation-checkValidity.txt +++ b/Tests/LibWeb/Text/expected/wpt-import/html/semantics/forms/constraints/form-validation-checkValidity.txt @@ -2,8 +2,8 @@ Harness status: OK Found 130 tests -90 Pass -40 Fail +108 Pass +22 Fail Pass [INPUT in TEXT status] no constraint Pass [INPUT in TEXT status] no constraint (in a form) Pass [INPUT in TEXT status] not suffering from being too long @@ -68,32 +68,32 @@ Pass [INPUT in DATETIME-LOCAL status] suffering from being missing Pass [INPUT in DATETIME-LOCAL status] suffering from being missing (in a form) Pass [INPUT in DATE status] no constraint Pass [INPUT in DATE status] no constraint (in a form) -Fail [INPUT in DATE status] suffering from an overflow -Fail [INPUT in DATE status] suffering from an overflow (in a form) -Fail [INPUT in DATE status] suffering from an underflow -Fail [INPUT in DATE status] suffering from an underflow (in a form) -Fail [INPUT in DATE status] suffering from a step mismatch -Fail [INPUT in DATE status] suffering from a step mismatch (in a form) +Pass [INPUT in DATE status] suffering from an overflow +Pass [INPUT in DATE status] suffering from an overflow (in a form) +Pass [INPUT in DATE status] suffering from an underflow +Pass [INPUT in DATE status] suffering from an underflow (in a form) +Pass [INPUT in DATE status] suffering from a step mismatch +Pass [INPUT in DATE status] suffering from a step mismatch (in a form) Pass [INPUT in DATE status] suffering from being missing Pass [INPUT in DATE status] suffering from being missing (in a form) Pass [INPUT in MONTH status] no constraint Pass [INPUT in MONTH status] no constraint (in a form) -Fail [INPUT in MONTH status] suffering from an overflow -Fail [INPUT in MONTH status] suffering from an overflow (in a form) -Fail [INPUT in MONTH status] suffering from an underflow -Fail [INPUT in MONTH status] suffering from an underflow (in a form) -Fail [INPUT in MONTH status] suffering from a step mismatch -Fail [INPUT in MONTH status] suffering from a step mismatch (in a form) +Pass [INPUT in MONTH status] suffering from an overflow +Pass [INPUT in MONTH status] suffering from an overflow (in a form) +Pass [INPUT in MONTH status] suffering from an underflow +Pass [INPUT in MONTH status] suffering from an underflow (in a form) +Pass [INPUT in MONTH status] suffering from a step mismatch +Pass [INPUT in MONTH status] suffering from a step mismatch (in a form) Pass [INPUT in MONTH status] suffering from being missing Pass [INPUT in MONTH status] suffering from being missing (in a form) Pass [INPUT in WEEK status] no constraint Pass [INPUT in WEEK status] no constraint (in a form) -Fail [INPUT in WEEK status] suffering from an overflow -Fail [INPUT in WEEK status] suffering from an overflow (in a form) -Fail [INPUT in WEEK status] suffering from an underflow -Fail [INPUT in WEEK status] suffering from an underflow (in a form) -Fail [INPUT in WEEK status] suffering from a step mismatch -Fail [INPUT in WEEK status] suffering from a step mismatch (in a form) +Pass [INPUT in WEEK status] suffering from an overflow +Pass [INPUT in WEEK status] suffering from an overflow (in a form) +Pass [INPUT in WEEK status] suffering from an underflow +Pass [INPUT in WEEK status] suffering from an underflow (in a form) +Pass [INPUT in WEEK status] suffering from a step mismatch +Pass [INPUT in WEEK status] suffering from a step mismatch (in a form) Pass [INPUT in WEEK status] suffering from being missing Pass [INPUT in WEEK status] suffering from being missing (in a form) Pass [INPUT in TIME status] no constraint