@@ -22,6 +22,37 @@ void main() {
2222 );
2323 });
2424
25+ test ('nodesNeedingLayout updated with layout changes' , () {
26+ final _TestPipelineOwner owner = _TestPipelineOwner ();
27+ final TestRenderObject renderObject = TestRenderObject ()..isRepaintBoundary = true ;
28+ renderObject.attach (owner);
29+ expect (owner.needLayout, isEmpty);
30+
31+ renderObject.layout (const BoxConstraints .tightForFinite ());
32+ renderObject.markNeedsLayout ();
33+ expect (owner.needLayout, contains (renderObject));
34+
35+ owner.flushLayout ();
36+ expect (owner.needLayout, isEmpty);
37+ });
38+
39+ test ('nodesNeedingPaint updated with paint changes' , () {
40+ final _TestPipelineOwner owner = _TestPipelineOwner ();
41+ final TestRenderObject renderObject = TestRenderObject (allowPaintBounds: true )
42+ ..isRepaintBoundary = true ;
43+ final OffsetLayer layer = OffsetLayer ();
44+ layer.attach (owner);
45+ renderObject.attach (owner);
46+ expect (owner.needPaint, isEmpty);
47+
48+ renderObject.markNeedsPaint ();
49+ renderObject.scheduleInitialPaint (layer);
50+ expect (owner.needPaint, contains (renderObject));
51+
52+ owner.flushPaint ();
53+ expect (owner.needPaint, isEmpty);
54+ });
55+
2556 test ('ensure frame is scheduled for markNeedsSemanticsUpdate' , () {
2657 // Initialize all bindings because owner.flushSemantics() requires a window
2758 final TestRenderObject renderObject = TestRenderObject ();
@@ -686,3 +717,10 @@ class TestThrowingRenderObject extends RenderObject {
686717 return Rect .zero;
687718 }
688719}
720+
721+ final class _TestPipelineOwner extends PipelineOwner {
722+ // Make these protected fields visible for testing.
723+ Iterable <RenderObject > get needLayout => super .nodesNeedingLayout;
724+
725+ Iterable <RenderObject > get needPaint => super .nodesNeedingPaint;
726+ }
0 commit comments