diff --git a/Libraries/LibWeb/HTML/HTMLInputElement.cpp b/Libraries/LibWeb/HTML/HTMLInputElement.cpp
index 43b72e2cb16..d55be7b28d4 100644
--- a/Libraries/LibWeb/HTML/HTMLInputElement.cpp
+++ b/Libraries/LibWeb/HTML/HTMLInputElement.cpp
@@ -2137,6 +2137,18 @@ static Optional convert_date_string_to_number(StringView input)
return date_time.milliseconds_since_epoch();
}
+// https://html.spec.whatwg.org/multipage/input.html#time-state-(type=time):concept-input-value-string-number
+Optional HTMLInputElement::convert_time_string_to_number(StringView input) const
+{
+ // The algorithm to convert a string to a number, given a string input, is as follows: If parsing a time from input
+ // results in an error, then return an error; otherwise, return the number of milliseconds elapsed from midnight to
+ // the parsed time on a day with no time changes.
+ auto maybe_time = parse_time_string(realm(), input);
+ if (maybe_time.is_exception())
+ return {};
+ return maybe_time.value()->date_value();
+}
+
// https://html.spec.whatwg.org/multipage/input.html#concept-input-value-string-number
Optional HTMLInputElement::convert_string_to_number(StringView input) const
{
@@ -2157,6 +2169,9 @@ Optional HTMLInputElement::convert_string_to_number(StringView input) co
if (type_state() == TypeAttributeState::Date)
return convert_date_string_to_number(input);
+ if (type_state() == TypeAttributeState::Time)
+ return convert_time_string_to_number(input);
+
dbgln("HTMLInputElement::convert_string_to_number() not implemented for input type {}", type());
return {};
}
@@ -2341,6 +2356,10 @@ double HTMLInputElement::default_step() const
if (type_state() == TypeAttributeState::Range)
return 1;
+ // https://html.spec.whatwg.org/multipage/input.html#time-state-(type=time):concept-input-step-default
+ if (type_state() == TypeAttributeState::Time)
+ return 60;
+
dbgln("HTMLInputElement::default_step() not implemented for input type {}", type());
return 0;
}
@@ -2356,6 +2375,10 @@ double HTMLInputElement::step_scale_factor() const
if (type_state() == TypeAttributeState::Range)
return 1;
+ // https://html.spec.whatwg.org/multipage/input.html#time-state-(type=time):concept-input-step-scale
+ if (type_state() == TypeAttributeState::Time)
+ return 1000;
+
dbgln("HTMLInputElement::step_scale_factor() not implemented for input type {}", type());
return 0;
}
@@ -2398,8 +2421,10 @@ double HTMLInputElement::step_base() const
// 2. If the element has a value content attribute, and the result of applying the algorithm to convert a string to a number to the value of
// the value content attribute is not an error, then return that result.
- if (auto value = convert_string_to_number(this->value()); value.has_value())
- return *value;
+ // AD-HOC: https://github.com/whatwg/html/issues/11097 Skipping this step seems to be necessary in order to get the
+ // behavior that's actually expected — and necessary in order get the tests to pass (they otherwise fail).
+ // if (auto value = convert_string_to_number(this->value()); value.has_value())
+ // return *value;
// 3. If a default step base is defined for this element given its type attribute's state, then return it.
if (type_state() == TypeAttributeState::Week) {
diff --git a/Libraries/LibWeb/HTML/HTMLInputElement.h b/Libraries/LibWeb/HTML/HTMLInputElement.h
index 2fad8b4d2f1..30b8bb1e483 100644
--- a/Libraries/LibWeb/HTML/HTMLInputElement.h
+++ b/Libraries/LibWeb/HTML/HTMLInputElement.h
@@ -278,6 +278,7 @@ private:
virtual void initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
+ Optional convert_time_string_to_number(StringView input) const;
Optional convert_string_to_number(StringView input) const;
String convert_number_to_string(double input) const;
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 a9d6ab0bf27..949fb7e1097 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
-108 Pass
-22 Fail
+112 Pass
+18 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
@@ -102,16 +102,16 @@ Fail [INPUT in TIME status] suffering from an overflow
Fail [INPUT in TIME status] suffering from an overflow (in a form)
Fail [INPUT in TIME status] suffering from an underflow
Fail [INPUT in TIME status] suffering from an underflow (in a form)
-Fail [INPUT in TIME status] suffering from a step mismatch
-Fail [INPUT in TIME status] suffering from a step mismatch (in a form)
+Pass [INPUT in TIME status] suffering from a step mismatch
+Pass [INPUT in TIME status] suffering from a step mismatch (in a form)
Pass [INPUT in TIME status] suffering from being missing
Pass [INPUT in TIME status] suffering from being missing (in a form)
Fail [INPUT in NUMBER status] suffering from an overflow
Fail [INPUT in NUMBER status] suffering from an overflow (in a form)
Fail [INPUT in NUMBER status] suffering from an underflow
Fail [INPUT in NUMBER status] suffering from an underflow (in a form)
-Fail [INPUT in NUMBER status] suffering from a step mismatch
-Fail [INPUT in NUMBER status] suffering from a step mismatch (in a form)
+Pass [INPUT in NUMBER status] suffering from a step mismatch
+Pass [INPUT in NUMBER status] suffering from a step mismatch (in a form)
Pass [INPUT in NUMBER status] suffering from being missing
Pass [INPUT in NUMBER status] suffering from being missing (in a form)
Pass [INPUT in CHECKBOX status] no constraint
diff --git a/Tests/LibWeb/Text/expected/wpt-import/html/semantics/forms/the-input-element/input-valueasnumber.txt b/Tests/LibWeb/Text/expected/wpt-import/html/semantics/forms/the-input-element/input-valueasnumber.txt
index d5156985ced..81166e18c7f 100644
--- a/Tests/LibWeb/Text/expected/wpt-import/html/semantics/forms/the-input-element/input-valueasnumber.txt
+++ b/Tests/LibWeb/Text/expected/wpt-import/html/semantics/forms/the-input-element/input-valueasnumber.txt
@@ -2,8 +2,8 @@ Harness status: OK
Found 60 tests
-48 Pass
-12 Fail
+51 Pass
+9 Fail
Pass valueAsNumber getter on type date (actual value: , expected valueAsNumber: NaN)
Pass valueAsNumber getter on type date (actual value: 0000-12-10, expected valueAsNumber: NaN)
Pass valueAsNumber getter on type date (actual value: 2019-00-12, expected valueAsNumber: NaN)
@@ -34,9 +34,9 @@ Pass valueAsNumber setter on type week (actual valueAsNumber: -20217600000, expe
Pass valueAsNumber getter on type time (actual value: , expected valueAsNumber: NaN)
Pass valueAsNumber getter on type time (actual value: 24:00, expected valueAsNumber: NaN)
Pass valueAsNumber getter on type time (actual value: 00:60, expected valueAsNumber: NaN)
-Fail valueAsNumber getter on type time (actual value: 00:00, expected valueAsNumber: 0)
-Fail valueAsNumber getter on type time (actual value: 12:00, expected valueAsNumber: 43200000)
-Fail valueAsNumber getter on type time (actual value: 23:59, expected valueAsNumber: 86340000)
+Pass valueAsNumber getter on type time (actual value: 00:00, expected valueAsNumber: 0)
+Pass valueAsNumber getter on type time (actual value: 12:00, expected valueAsNumber: 43200000)
+Pass valueAsNumber getter on type time (actual value: 23:59, expected valueAsNumber: 86340000)
Fail valueAsNumber setter on type time (actual valueAsNumber: 0, expected value: 00:00)
Fail valueAsNumber setter on type time (actual valueAsNumber: 43200000, expected value: 12:00)
Fail valueAsNumber setter on type time (actual valueAsNumber: 86340000, expected value: 23:59)