mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-19 15:32:31 +00:00
LibWeb: Fix “step base” computation for HTMLInputElement
This change fixes a bug in our implementation of the “step base” algorithm at https://html.spec.whatwg.org/#concept-input-min-zero. We were using the “value” IDL/DOM attribute in a particular step, where the spec instead actually requires using the “value” content attribute.
This commit is contained in:
parent
9ca25eed7f
commit
13f9670f20
Notes:
github-actions[bot]
2025-03-06 14:01:24 +00:00
Author: https://github.com/sideshowbarker
Commit: 13f9670f20
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/3806
Reviewed-by: https://github.com/trflynn89 ✅
4 changed files with 11 additions and 6 deletions
|
@ -2422,10 +2422,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
|
// 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.
|
// the value content attribute is not an error, then return that result.
|
||||||
// AD-HOC: https://github.com/whatwg/html/issues/11097 Skipping this step seems to be necessary in order to get the
|
if (auto value = get_attribute(HTML::AttributeNames::value); value.has_value()) {
|
||||||
// behavior that's actually expected — and necessary in order get the tests to pass (they otherwise fail).
|
if (auto value_as_number = convert_string_to_number(value.value()); value_as_number.has_value())
|
||||||
// if (auto value = convert_string_to_number(this->value()); value.has_value())
|
return value_as_number.value();
|
||||||
// return *value;
|
}
|
||||||
|
|
||||||
// 3. If a default step base is defined for this element given its type attribute's state, then return it.
|
// 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) {
|
if (type_state() == TypeAttributeState::Week) {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
Harness status: OK
|
Harness status: OK
|
||||||
|
|
||||||
Found 130 tests
|
Found 132 tests
|
||||||
|
|
||||||
116 Pass
|
118 Pass
|
||||||
14 Fail
|
14 Fail
|
||||||
Pass [INPUT in TEXT status] no constraint
|
Pass [INPUT in TEXT status] no constraint
|
||||||
Pass [INPUT in TEXT status] no constraint (in a form)
|
Pass [INPUT in TEXT status] no constraint (in a form)
|
||||||
|
@ -112,6 +112,8 @@ 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 an underflow (in a form)
|
||||||
Pass [INPUT in NUMBER status] suffering from a step mismatch
|
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 a step mismatch (in a form)
|
||||||
|
Pass [INPUT in NUMBER status] (with 'value' content attribute) suffering from a step mismatch
|
||||||
|
Pass [INPUT in NUMBER status] (with 'value' content attribute) 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
|
||||||
Pass [INPUT in NUMBER status] suffering from being missing (in a form)
|
Pass [INPUT in NUMBER status] suffering from being missing (in a form)
|
||||||
Pass [INPUT in CHECKBOX status] no constraint
|
Pass [INPUT in CHECKBOX status] no constraint
|
||||||
|
|
|
@ -104,6 +104,7 @@
|
||||||
{conditions: {max: "5", value: "6"}, expected: false, name: "[target] suffering from an overflow"},
|
{conditions: {max: "5", value: "6"}, expected: false, name: "[target] suffering from an overflow"},
|
||||||
{conditions: {min: "5", value: "4"}, expected: false, name: "[target] suffering from an underflow"},
|
{conditions: {min: "5", value: "4"}, expected: false, name: "[target] suffering from an underflow"},
|
||||||
{conditions: {step: 2 * 1 * 1, value: "3"}, expected: false, name: "[target] suffering from a step mismatch"},
|
{conditions: {step: 2 * 1 * 1, value: "3"}, expected: false, name: "[target] suffering from a step mismatch"},
|
||||||
|
{conditions: {step: 10, value: "20", content_value: "9"}, expected: false, name: "[target] (with 'value' content attribute) suffering from a step mismatch"},
|
||||||
{conditions: {required: true, value: ""}, expected: false, name: "[target] suffering from being missing"}
|
{conditions: {required: true, value: ""}, expected: false, name: "[target] suffering from being missing"}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
|
@ -340,6 +340,8 @@ var validator = {
|
||||||
for (var attr in obj) {
|
for (var attr in obj) {
|
||||||
if (attr === "message")
|
if (attr === "message")
|
||||||
ctl.setCustomValidity(obj[attr]);
|
ctl.setCustomValidity(obj[attr]);
|
||||||
|
else if (attr === "content_value")
|
||||||
|
ctl.setAttribute("value", obj["content_value"])
|
||||||
else if (attr === "checked" || obj[attr] || obj[attr] === "")
|
else if (attr === "checked" || obj[attr] || obj[attr] === "")
|
||||||
ctl[attr] = obj[attr];
|
ctl[attr] = obj[attr];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue