// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; import 'rendering_tester.dart'; void main() { MyTestRenderingFlutterBinding.ensureInitialized(); tearDown(() { final List<PipelineOwner> children = <PipelineOwner>[]; RendererBinding.instance.rootPipelineOwner.visitChildren((PipelineOwner child) { children.add(child); }); children.forEach(RendererBinding.instance.rootPipelineOwner.dropChild); }); test("BindingPipelineManifold notifies binding if render object managed by binding's PipelineOwner tree needs visual update", () { final PipelineOwner child = PipelineOwner(); RendererBinding.instance.rootPipelineOwner.adoptChild(child); final RenderObject renderObject = TestRenderObject(); child.rootNode = renderObject; renderObject.scheduleInitialLayout(); RendererBinding.instance.rootPipelineOwner.flushLayout(); MyTestRenderingFlutterBinding.instance.ensureVisualUpdateCount = 0; renderObject.markNeedsLayout(); expect(MyTestRenderingFlutterBinding.instance.ensureVisualUpdateCount, 1); }); test('Turning global semantics on/off creates semantics owners in PipelineOwner tree', () { final PipelineOwner child = PipelineOwner( onSemanticsUpdate: (_) { }, ); RendererBinding.instance.rootPipelineOwner.adoptChild(child); expect(child.semanticsOwner, isNull); expect(RendererBinding.instance.rootPipelineOwner.semanticsOwner, isNull); final SemanticsHandle handle = SemanticsBinding.instance.ensureSemantics(); expect(child.semanticsOwner, isNotNull); expect(RendererBinding.instance.rootPipelineOwner.semanticsOwner, isNotNull); handle.dispose(); expect(child.semanticsOwner, isNull); expect(RendererBinding.instance.rootPipelineOwner.semanticsOwner, isNull); }); } class MyTestRenderingFlutterBinding extends TestRenderingFlutterBinding { static MyTestRenderingFlutterBinding get instance => BindingBase.checkInstance(_instance); static MyTestRenderingFlutterBinding? _instance; static MyTestRenderingFlutterBinding ensureInitialized() { return _instance ?? MyTestRenderingFlutterBinding(); } @override void initInstances() { super.initInstances(); _instance = this; } int ensureVisualUpdateCount = 0; @override void ensureVisualUpdate() { super.ensureVisualUpdate(); ensureVisualUpdateCount++; } } class TestRenderObject extends RenderObject { @override void debugAssertDoesMeetConstraints() { } @override Rect get paintBounds => Rect.zero; @override void performLayout() { } @override void performResize() { } @override Rect get semanticBounds => Rect.zero; }