LibWeb: Use unsafe layout/paintable accessors where appropriate

Add unsafe_layout_node(), unsafe_paintable(), and unsafe_paintable_box()
accessors that skip layout-staleness verification. These are for use in
contexts where accessing layout/paintable data is legitimate despite
layout not being up to date: tree construction, style recalculation,
painting, animation interpolation, DOM mutation, and invalidation
propagation.

Also add wrapper APIs on Node to centralize common patterns:
- set_needs_display() wraps if (unsafe_paintable()) ...set_needs_display
- set_needs_paint_only_properties_update() wraps similar
- set_needs_layout_update() wraps if (unsafe_layout_node()) ...

And add Document::layout_is_up_to_date() which checks whether layout
tree update flags are all clear.
This commit is contained in:
Andreas Kling
2026-02-26 11:57:29 +01:00
committed by Andreas Kling
parent b8b63ddc8f
commit a146225331
Notes: github-actions[bot] 2026-02-26 20:10:33 +00:00
48 changed files with 396 additions and 225 deletions

View File

@@ -28,8 +28,11 @@ ResizeObserverSize::RawSize ResizeObserverSize::compute_box_size(DOM::Element& t
// FIXME: If target is an SVGGraphicsElement that does not have an associated CSS layout box:
// Otherwise:
if (target.paintable_box()) {
auto const& paintable_box = *target.paintable_box();
// NB: Layout was up to date when observations were gathered, but a previous
// observer's callback may have invalidated it before we get here.
// This matches the behavior of all major browsers.
if (target.unsafe_paintable_box()) {
auto const& paintable_box = *target.unsafe_paintable_box();
switch (observed_box) {
case Bindings::ResizeObserverBoxOptions::BorderBox:
size.inline_size = paintable_box.border_box_width().to_double();