From 08d09c4afb341cea1d435e7acc226dbcfdec1a7e Mon Sep 17 00:00:00 2001 From: Max Wipfli Date: Tue, 18 May 2021 21:56:20 +0200 Subject: [PATCH] LibWeb: Improving cursor behavior in editable DOM nodes This patch makes two modifications to improve the behavior of cursors in editable DOM nodes, such as HTML tags with the contenteditable attribute. When the cursor blink cycle is reset in an editable DOM node, a repaint should be initiated. For this, set_needs_display() needs to be called on the layout node. Previously, the cursor blink cycle would not reset properly and moving the cursor with the arrow keys did not feel intuitive. Furthermore, this modifies one of the conditions necessary to actually paint the cursor, which previously prevented it from being painted when at the end of a text node, after all the text present. --- Userland/Libraries/LibWeb/Layout/TextNode.cpp | 3 ++- Userland/Libraries/LibWeb/Page/Frame.cpp | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibWeb/Layout/TextNode.cpp b/Userland/Libraries/LibWeb/Layout/TextNode.cpp index 7cee023604..e2f6783e31 100644 --- a/Userland/Libraries/LibWeb/Layout/TextNode.cpp +++ b/Userland/Libraries/LibWeb/Layout/TextNode.cpp @@ -86,7 +86,8 @@ void TextNode::paint_cursor_if_needed(PaintContext& context, const LineBoxFragme if (frame().cursor_position().node() != &dom_node()) return; - if (!(frame().cursor_position().offset() >= (unsigned)fragment.start() && frame().cursor_position().offset() < (unsigned)(fragment.start() + fragment.length()))) + // NOTE: This checks if the cursor is before the start or after the end of the fragment. If it is at the end, after all text, it should still be painted. + if (frame().cursor_position().offset() < (unsigned)fragment.start() || frame().cursor_position().offset() > (unsigned)(fragment.start() + fragment.length())) return; if (!fragment.layout_node().dom_node() || !fragment.layout_node().dom_node()->is_editable()) diff --git a/Userland/Libraries/LibWeb/Page/Frame.cpp b/Userland/Libraries/LibWeb/Page/Frame.cpp index 0a4386fadc..31e3d42417 100644 --- a/Userland/Libraries/LibWeb/Page/Frame.cpp +++ b/Userland/Libraries/LibWeb/Page/Frame.cpp @@ -62,6 +62,7 @@ void Frame::reset_cursor_blink_cycle() { m_cursor_blink_state = true; m_cursor_blink_timer->restart(); + m_cursor_position.node()->layout_node()->set_needs_display(); } bool Frame::is_focused_frame() const