at (11,10) content-size 114x17.46875 flex-container(row) [FFC] children: not-inline
+ BlockContainer
at (11,10) content-size 49.734375x17.46875 flex-item [BFC] children: inline
+ line 0 width: 49.734375, height: 17.46875, bottom: 17.46875, baseline: 13.53125
+ frag 0 from TextNode start: 0, length: 4, rect: [11,10 49.734375x17.46875]
+ "PASS"
+ TextNode <#text>
+ TextNode <#text>
+ TextNode <#text>
+
+PaintableWithLines (Viewport<#document>) [0,0 800x600]
+ PaintableWithLines (BlockContainer) [0,0 800x600]
+ PaintableWithLines (BlockContainer) [8,8 784x21.46875]
+ PaintableWithLines (BlockContainer
#foo) [8,8 120x21.46875]
+ PaintableBox (Box
) [9,9 118x19.46875]
+ PaintableWithLines (BlockContainer
) [11,10 49.734375x17.46875]
+ TextPaintable (TextNode<#text>)
diff --git a/Tests/LibWeb/Layout/input/input-text-node-invalidation-on-value-change.html b/Tests/LibWeb/Layout/input/input-text-node-invalidation-on-value-change.html
new file mode 100644
index 0000000000..2d44904490
--- /dev/null
+++ b/Tests/LibWeb/Layout/input/input-text-node-invalidation-on-value-change.html
@@ -0,0 +1,9 @@
+
+
diff --git a/Userland/Libraries/LibWeb/DOM/CharacterData.cpp b/Userland/Libraries/LibWeb/DOM/CharacterData.cpp
index 3b123b85dc..8bfa1f7bf4 100644
--- a/Userland/Libraries/LibWeb/DOM/CharacterData.cpp
+++ b/Userland/Libraries/LibWeb/DOM/CharacterData.cpp
@@ -10,6 +10,7 @@
#include
#include
#include
+#include
namespace Web::DOM {
@@ -108,6 +109,12 @@ WebIDL::ExceptionOr 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_node).invalidate_text_for_rendering();
+
set_needs_style_update(true);
document().set_needs_layout();
return {};
diff --git a/Userland/Libraries/LibWeb/Layout/TextNode.cpp b/Userland/Libraries/LibWeb/Layout/TextNode.cpp
index b3f11f7400..9a224c6fa2 100644
--- a/Userland/Libraries/LibWeb/Layout/TextNode.cpp
+++ b/Userland/Libraries/LibWeb/Layout/TextNode.cpp
@@ -41,6 +41,11 @@ static ErrorOr 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())
diff --git a/Userland/Libraries/LibWeb/Layout/TextNode.h b/Userland/Libraries/LibWeb/Layout/TextNode.h
index 417baeadb2..0c7ca28049 100644
--- a/Userland/Libraries/LibWeb/Layout/TextNode.h
+++ b/Userland/Libraries/LibWeb/Layout/TextNode.h
@@ -47,6 +47,7 @@ public:
Utf8View::Iterator m_iterator;
};
+ void invalidate_text_for_rendering();
void compute_text_for_rendering();
virtual JS::GCPtr create_paintable() const override;