From c4afe9589bb0a9aa804ee8482332536cc5e8cb96 Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Mon, 28 Nov 2016 11:11:03 -0800 Subject: [PATCH] Add getRenderTree() to Flutter Driver (#7007) Returns a dump of the application's render tree. --- packages/flutter_driver/lib/src/driver.dart | 6 +++ .../flutter_driver/lib/src/extension.dart | 8 ++++ .../flutter_driver/lib/src/render_tree.dart | 37 +++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 packages/flutter_driver/lib/src/render_tree.dart diff --git a/packages/flutter_driver/lib/src/driver.dart b/packages/flutter_driver/lib/src/driver.dart index 71600ee6c93..0ebc45c8381 100644 --- a/packages/flutter_driver/lib/src/driver.dart +++ b/packages/flutter_driver/lib/src/driver.dart @@ -16,6 +16,7 @@ import 'gesture.dart'; import 'health.dart'; import 'input.dart'; import 'message.dart'; +import 'render_tree.dart'; import 'timeline.dart'; /// Timeline stream identifier. @@ -244,6 +245,11 @@ class FlutterDriver { return Health.fromJson(await _sendCommand(new GetHealth())); } + /// Returns a dump of the render tree. + Future getRenderTree() async { + return RenderTree.fromJson(await _sendCommand(new GetRenderTree())); + } + /// Taps at the center of the widget located by [finder]. Future tap(SerializableFinder finder) async { await _sendCommand(new Tap(finder)); diff --git a/packages/flutter_driver/lib/src/extension.dart b/packages/flutter_driver/lib/src/extension.dart index 6ffcdaf3a22..f4861f1f44c 100644 --- a/packages/flutter_driver/lib/src/extension.dart +++ b/packages/flutter_driver/lib/src/extension.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart' show RendererBinding; import 'package:flutter/scheduler.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -16,6 +17,7 @@ import 'gesture.dart'; import 'health.dart'; import 'input.dart'; import 'message.dart'; +import 'render_tree.dart'; const String _extensionMethodName = 'driver'; const String _extensionMethod = 'ext.flutter.$_extensionMethodName'; @@ -61,6 +63,7 @@ class _FlutterDriverExtension { _FlutterDriverExtension._() { _commandHandlers.addAll({ 'get_health': _getHealth, + 'get_render_tree': _getRenderTree, 'tap': _tap, 'get_text': _getText, 'scroll': _scroll, @@ -72,6 +75,7 @@ class _FlutterDriverExtension { _commandDeserializers.addAll({ 'get_health': GetHealth.deserialize, + 'get_render_tree': GetRenderTree.deserialize, 'tap': Tap.deserialize, 'get_text': GetText.deserialize, 'scroll': Scroll.deserialize, @@ -135,6 +139,10 @@ class _FlutterDriverExtension { Future _getHealth(Command command) async => new Health(HealthStatus.ok); + Future _getRenderTree(Command command) async { + return new RenderTree(RendererBinding.instance?.renderView?.toStringDeep()); + } + /// Runs `finder` repeatedly until it finds one or more [Element]s, or times out. /// /// The timeout is five seconds. diff --git a/packages/flutter_driver/lib/src/render_tree.dart b/packages/flutter_driver/lib/src/render_tree.dart new file mode 100644 index 00000000000..b3b5ad0f1e4 --- /dev/null +++ b/packages/flutter_driver/lib/src/render_tree.dart @@ -0,0 +1,37 @@ +// Copyright 2016 The Chromium 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 'message.dart'; + +/// A request for a string representation of the render tree. +class GetRenderTree implements Command { + @override + final String kind = 'get_render_tree'; + + /// Deserializes the command from JSON generated by [serialize]. + static GetRenderTree deserialize(Map json) => new GetRenderTree(); + + @override + Map serialize() => const {}; +} + +/// A string representation of the render tree. +class RenderTree extends Result { + /// Creates a [RenderTree] object with the given string representation. + RenderTree(this.tree); + + /// Deserializes the result from JSON. + static RenderTree fromJson(Map json) { + return new RenderTree(json['tree']); + } + + /// String representation of the render tree. + final String tree; + + @override + Map toJson() => { + 'tree': tree + }; +} +