mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-01-04 15:45:25 +00:00
LibWeb: Look for labeled control in DOM tree instead of layout tree
...because "change" event should be dispatched on control even if it has "display: none" style. This change fixes selection in labels dropdown on GitHub's "new issue" page.
This commit is contained in:
committed by
Andreas Kling
parent
730876fda9
commit
f932d5d825
@@ -30,4 +30,39 @@ JS::GCPtr<Layout::Node> HTMLLabelElement::create_layout_node(NonnullRefPtr<CSS::
|
||||
return heap().allocate_without_realm<Layout::Label>(document(), this, move(style));
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/forms.html#labeled-control
|
||||
JS::GCPtr<HTMLElement> HTMLLabelElement::control() const
|
||||
{
|
||||
JS::GCPtr<HTMLElement> control;
|
||||
|
||||
// The for attribute may be specified to indicate a form control with which the caption is
|
||||
// to be associated. If the attribute is specified, the attribute's value must be the ID of
|
||||
// a labelable element in the same tree as the label element. If the attribute is specified
|
||||
// and there is an element in the tree whose ID is equal to the value of the for attribute,
|
||||
// and the first such element in tree order is a labelable element, then that element is the
|
||||
// label element's labeled control.
|
||||
if (for_().has_value()) {
|
||||
for_each_in_inclusive_subtree_of_type<HTMLElement>([&](auto& element) {
|
||||
if (element.id() == *for_() && element.is_labelable()) {
|
||||
control = &const_cast<HTMLElement&>(element);
|
||||
return IterationDecision::Break;
|
||||
}
|
||||
return IterationDecision::Continue;
|
||||
});
|
||||
return control;
|
||||
}
|
||||
|
||||
// If the for attribute is not specified, but the label element has a labelable element descendant,
|
||||
// then the first such descendant in tree order is the label element's labeled control.
|
||||
for_each_in_subtree_of_type<HTMLElement>([&](auto& element) {
|
||||
if (element.is_labelable()) {
|
||||
control = &const_cast<HTMLElement&>(element);
|
||||
return IterationDecision::Break;
|
||||
}
|
||||
return IterationDecision::Continue;
|
||||
});
|
||||
|
||||
return control;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user