1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 05:37:34 +00:00

LibWeb: Invalidate layout-transformed text on DOM text node change

This fixes an issue where programmatically changing the value of an
input element wasn't reflected visually.
This commit is contained in:
Andreas Kling 2023-08-16 11:03:00 +02:00
parent e2740bd19d
commit 1c47695bae
5 changed files with 44 additions and 0 deletions

View file

@ -10,6 +10,7 @@
#include <LibWeb/DOM/MutationType.h>
#include <LibWeb/DOM/Range.h>
#include <LibWeb/DOM/StaticNodeList.h>
#include <LibWeb/Layout/TextNode.h>
namespace Web::DOM {
@ -108,6 +109,12 @@ WebIDL::ExceptionOr<void> CharacterData::replace_data(size_t offset, size_t coun
if (parent())
parent()->children_changed();
// NOTE: Since the text node's data has changed, we need to invalidate the text for rendering.
// This ensures that the new text is reflected in layout, even if we don't end up
// doing a full layout tree rebuild.
if (auto* layout_node = this->layout_node(); layout_node && layout_node->is_text_node())
static_cast<Layout::TextNode&>(*layout_node).invalidate_text_for_rendering();
set_needs_style_update(true);
document().set_needs_layout();
return {};

View file

@ -41,6 +41,11 @@ static ErrorOr<DeprecatedString> apply_text_transform(DeprecatedString const& st
return string;
}
void TextNode::invalidate_text_for_rendering()
{
m_text_for_rendering = {};
}
DeprecatedString const& TextNode::text_for_rendering() const
{
if (m_text_for_rendering.is_null())

View file

@ -47,6 +47,7 @@ public:
Utf8View::Iterator m_iterator;
};
void invalidate_text_for_rendering();
void compute_text_for_rendering();
virtual JS::GCPtr<Painting::Paintable> create_paintable() const override;