From 50920b05953a6bc2aacb07d291d503052caadf15 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Sat, 1 Jun 2024 17:30:24 +0300 Subject: [PATCH] LibWeb: Scroll into viewport from a task in set_focused_element() This is a hack needed to preserve current behaviour after making set viewport_rect() being not async in upcoming changes. For example both handle_mousedown and handle_mouseup should use the same viewport scroll offset even though handle_mousedown runs focusing steps that might cause scrolling to focused element: - handle_mousedown({ 0, 0 }) - run_focusing_steps() - set_focused_element() - scroll_into_viewport() changes viewport scroll offset - handle_mouseup({ 0, 0 }) --- Userland/Libraries/LibWeb/DOM/Document.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibWeb/DOM/Document.cpp b/Userland/Libraries/LibWeb/DOM/Document.cpp index 47e60c54529..b3bb3b90bc4 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.cpp +++ b/Userland/Libraries/LibWeb/DOM/Document.cpp @@ -1906,10 +1906,12 @@ void Document::set_focused_element(Element* element) // Scroll the viewport if necessary to make the newly focused element visible. if (m_focused_element) { - ScrollIntoViewOptions scroll_options; - scroll_options.block = Bindings::ScrollLogicalPosition::Nearest; - scroll_options.inline_ = Bindings::ScrollLogicalPosition::Nearest; - (void)m_focused_element->scroll_into_view(scroll_options); + m_focused_element->queue_an_element_task(HTML::Task::Source::UserInteraction, [&]() { + ScrollIntoViewOptions scroll_options; + scroll_options.block = Bindings::ScrollLogicalPosition::Nearest; + scroll_options.inline_ = Bindings::ScrollLogicalPosition::Nearest; + (void)m_focused_element->scroll_into_view(scroll_options); + }); } }