| // Copyright 2013 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:test/bootstrap/browser.dart'; | |
| import 'package:test/test.dart'; | |
| import 'package:ui/src/engine.dart'; | |
| import 'package:ui/ui.dart' as ui; | |
| import 'package:web_engine_tester/golden_tester.dart'; | |
| import '../common/test_initialization.dart'; | |
| import 'utils.dart'; | |
| const ui.Color black = ui.Color(0xFF000000); | |
| const ui.Color red = ui.Color(0xFFFF0000); | |
| const ui.Color green = ui.Color(0xFF00FF00); | |
| const ui.Color blue = ui.Color(0xFF0000FF); | |
| void main() { | |
| internalBootstrapBrowserTest(() => testMain); | |
| } | |
| Future<void> testMain() async { | |
| setUpUnitTests(); | |
| setUp(() { | |
| EngineFlutterDisplay.instance.debugOverrideDevicePixelRatio(1.0); | |
| }); | |
| test('can render into multiple views', () async { | |
| const ui.Rect rect = ui.Rect.fromLTRB(0, 0, 180, 120); | |
| final host1 = createHostElement(rect); | |
| final view1 = EngineFlutterView(EnginePlatformDispatcher.instance, host1); | |
| EnginePlatformDispatcher.instance.viewManager.registerView(view1); | |
| final host2 = createHostElement(rect); | |
| final view2 = EngineFlutterView(EnginePlatformDispatcher.instance, host2); | |
| EnginePlatformDispatcher.instance.viewManager.registerView(view2); | |
| final host3 = createHostElement(rect); | |
| final view3 = EngineFlutterView(EnginePlatformDispatcher.instance, host3); | |
| EnginePlatformDispatcher.instance.viewManager.registerView(view3); | |
| await Future.wait([ | |
| renderer.renderScene(paintRect(rect, red), view1), | |
| renderer.renderScene(paintRect(rect, green), view2), | |
| renderer.renderScene(paintRect(rect, blue), view3), | |
| ]); | |
| await matchGoldenFile( | |
| 'ui_multiview_rects.png', | |
| region: ui.Rect.fromLTRB(0, 0, rect.width, rect.height * 3), | |
| ); | |
| EnginePlatformDispatcher.instance.viewManager.dispose(); | |
| host1.remove(); | |
| host2.remove(); | |
| host3.remove(); | |
| }, skip: isHtml); // HTML renderer doesn't support multi-view. | |
| } | |
| DomElement createHostElement(ui.Rect rect) { | |
| final host = createDomElement('div'); | |
| host.style | |
| ..width = '${rect.width}px' | |
| ..height = '${rect.height}px'; | |
| domDocument.body!.append(host); | |
| return host; | |
| } | |
| ui.Scene paintRect(ui.Rect rect, ui.Color color) { | |
| final recorder = ui.PictureRecorder(); | |
| final canvas = ui.Canvas(recorder, rect); | |
| // Leave some padding. | |
| rect = rect.deflate(5.0); | |
| // Draw a black border of 5px thickness. | |
| canvas.drawRect( | |
| rect, | |
| ui.Paint() | |
| ..color = black | |
| ..style = ui.PaintingStyle.fill, | |
| ); | |
| rect = rect.deflate(5.0); | |
| // Fill the inner rect with the given color. | |
| canvas.drawRect( | |
| rect, | |
| ui.Paint() | |
| ..color = color | |
| ..style = ui.PaintingStyle.fill, | |
| ); | |
| final picture = recorder.endRecording(); | |
| final sb = ui.SceneBuilder(); | |
| sb.pushOffset(0, 0); | |
| sb.addPicture(ui.Offset.zero, picture); | |
| return sb.build(); | |
| } |