LibWeb: Update the document cursor position when the selection changes

Otherwise, it looks a bit awkward where the cursor position does not
update while the selection is elsewhere.

Note that this requires passing along the raw selection positions from
`set the selection range` to the elements. Otherwise, consider what will
happen if we set the selection start and end to the same value. By going
through the API accessor, we hit the case where the start and end are
the same value, and return the document cursor position. This would mean
the cursor position would not be updated.

The test changes here more closely match what Firefox produces now. It
is not a 100% match; the `select event fired` test case isn't right. The
problem is the event fires for the input element, but we most recently
focused the textarea element. Thus, when we retrieve the selection from
the input element, we return the document's cursor position, which is
actually in the textarea element. The fix will ultimately be to fully
implement the following:

https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#concept-textarea/input-cursor

That is, each input / textarea element should separately track its own
text cursor position.
This commit is contained in:
Timothy Flynn 2024-08-27 10:46:34 -04:00 committed by Andreas Kling
parent 430c9d3e3f
commit fd289deb44
Notes: github-actions[bot] 2024-08-31 13:52:26 +00:00
7 changed files with 16 additions and 12 deletions

View file

@ -2362,13 +2362,15 @@ HTMLInputElement::ValueAttributeMode HTMLInputElement::value_attribute_mode() co
VERIFY_NOT_REACHED();
}
void HTMLInputElement::selection_was_changed()
void HTMLInputElement::selection_was_changed(size_t selection_start, size_t selection_end)
{
document().set_cursor_position(DOM::Position::create(realm(), *m_text_node, selection_end));
auto selection = document().get_selection();
if (!selection || selection->range_count() == 0)
return;
MUST(selection->set_base_and_extent(*m_text_node, selection_start().value(), *m_text_node, selection_end().value()));
MUST(selection->set_base_and_extent(*m_text_node, selection_start, *m_text_node, selection_end));
}
}