binding_pipeline_manifold_test.dart 2.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// 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>[];
16
    RendererBinding.instance.rootPipelineOwner.visitChildren((PipelineOwner child) {
17 18
      children.add(child);
    });
19
    children.forEach(RendererBinding.instance.rootPipelineOwner.dropChild);
20 21 22 23
  });

  test("BindingPipelineManifold notifies binding if render object managed by binding's PipelineOwner tree needs visual update", () {
    final PipelineOwner child = PipelineOwner();
24
    RendererBinding.instance.rootPipelineOwner.adoptChild(child);
25 26 27 28

    final RenderObject renderObject = TestRenderObject();
    child.rootNode = renderObject;
    renderObject.scheduleInitialLayout();
29
    RendererBinding.instance.rootPipelineOwner.flushLayout();
30 31 32 33 34 35 36 37 38 39

    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: (_) { },
    );
40
    RendererBinding.instance.rootPipelineOwner.adoptChild(child);
41 42

    expect(child.semanticsOwner, isNull);
43
    expect(RendererBinding.instance.rootPipelineOwner.semanticsOwner, isNull);
44 45 46 47

    final SemanticsHandle handle = SemanticsBinding.instance.ensureSemantics();

    expect(child.semanticsOwner, isNotNull);
48
    expect(RendererBinding.instance.rootPipelineOwner.semanticsOwner, isNotNull);
49 50 51 52

    handle.dispose();

    expect(child.semanticsOwner, isNull);
53
    expect(RendererBinding.instance.rootPipelineOwner.semanticsOwner, isNull);
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
  });
}

class MyTestRenderingFlutterBinding extends TestRenderingFlutterBinding {
  static MyTestRenderingFlutterBinding get instance => BindingBase.checkInstance(_instance);
  static MyTestRenderingFlutterBinding? _instance;

  static MyTestRenderingFlutterBinding ensureInitialized() {
    if (_instance != null) {
      return _instance!;
    }
    return 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;
}