| // 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 'dart:async'; | |
| import 'package:ui/src/engine.dart'; | |
| import 'package:ui/ui.dart' as ui; | |
| import 'package:web_engine_tester/golden_tester.dart'; | |
| /// Commit a recording canvas to a bitmap, and compare with the expected. | |
| /// | |
| /// [region] specifies the area of the canvas that will be included in the | |
| /// golden. | |
| /// | |
| /// If [canvasRect] is omitted, it defaults to the value of [region]. | |
| Future<void> canvasScreenshot( | |
| RecordingCanvas rc, | |
| String fileName, { | |
| ui.Rect region = const ui.Rect.fromLTWH(0, 0, 500, 500), | |
| ui.Rect? canvasRect, | |
| bool setupPerspective = false, | |
| }) async { | |
| canvasRect ??= region; | |
| final EngineCanvas engineCanvas = BitmapCanvas(canvasRect, RenderStrategy()); | |
| rc.endRecording(); | |
| rc.apply(engineCanvas, region); | |
| // Wrap in <flt-scene> so that our CSS selectors kick in. | |
| final DomElement sceneElement = createDomElement('flt-scene'); | |
| if (isIosSafari) { | |
| // Shrink to fit on the iPhone screen. | |
| sceneElement.style.position = 'absolute'; | |
| sceneElement.style.transformOrigin = '0 0 0'; | |
| sceneElement.style.transform = 'scale(0.3)'; | |
| } | |
| try { | |
| if (setupPerspective) { | |
| // iFrame disables perspective, set it explicitly for test. | |
| engineCanvas.rootElement.style.perspective = '400px'; | |
| for (final DomElement element in engineCanvas.rootElement.querySelectorAll('div')) { | |
| element.style.perspective = '400px'; | |
| } | |
| } | |
| sceneElement.append(engineCanvas.rootElement); | |
| domDocument.body!.append(sceneElement); | |
| await matchGoldenFile('$fileName.png', | |
| region: region); | |
| } finally { | |
| // The page is reused across tests, so remove the element after taking the | |
| // screenshot. | |
| sceneElement.remove(); | |
| } | |
| } | |
| Future<void> sceneScreenshot(SurfaceSceneBuilder sceneBuilder, String fileName, | |
| {ui.Rect region = const ui.Rect.fromLTWH(0, 0, 600, 800)}) async { | |
| DomElement? sceneElement; | |
| try { | |
| sceneElement = sceneBuilder | |
| .build() | |
| .webOnlyRootElement; | |
| domDocument.body!.append(sceneElement!); | |
| await matchGoldenFile('$fileName.png', | |
| region: region); | |
| } finally { | |
| // The page is reused across tests, so remove the element after taking the | |
| // screenshot. | |
| sceneElement?.remove(); | |
| } | |
| } |