| // 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'; | |
| import 'package:web_engine_tester/golden_tester.dart'; | |
| typedef CanvasTest = FutureOr<void> Function(EngineCanvas canvas); | |
| const LineBreakType prohibited = LineBreakType.prohibited; | |
| const LineBreakType opportunity = LineBreakType.opportunity; | |
| const LineBreakType mandatory = LineBreakType.mandatory; | |
| const LineBreakType endOfText = LineBreakType.endOfText; | |
| const TextDirection ltr = TextDirection.ltr; | |
| const TextDirection rtl = TextDirection.rtl; | |
| const FragmentFlow ffLtr = FragmentFlow.ltr; | |
| const FragmentFlow ffRtl = FragmentFlow.rtl; | |
| const FragmentFlow ffPrevious = FragmentFlow.previous; | |
| const FragmentFlow ffSandwich = FragmentFlow.sandwich; | |
| const String rtlWord1 = 'واحدة'; | |
| const String rtlWord2 = 'ثنتان'; | |
| const Color white = Color(0xFFFFFFFF); | |
| const Color black = Color(0xFF000000); | |
| const Color red = Color(0xFFFF0000); | |
| const Color lightGreen = Color(0xFFDCEDC8); | |
| const Color green = Color(0xFF00FF00); | |
| const Color lightBlue = Color(0xFFB3E5FC); | |
| const Color blue = Color(0xFF0000FF); | |
| const Color yellow = Color(0xFFFFEB3B); | |
| const Color lightPurple = Color(0xFFE1BEE7); | |
| final EngineParagraphStyle ahemStyle = EngineParagraphStyle( | |
| fontFamily: 'Ahem', | |
| fontSize: 10, | |
| ); | |
| ParagraphConstraints constrain(double width) { | |
| return ParagraphConstraints(width: width); | |
| } | |
| CanvasParagraph plain( | |
| EngineParagraphStyle style, | |
| String text, { | |
| EngineTextStyle? textStyle, | |
| }) { | |
| final CanvasParagraphBuilder builder = CanvasParagraphBuilder(style); | |
| if (textStyle != null) { | |
| builder.pushStyle(textStyle); | |
| } | |
| builder.addText(text); | |
| return builder.build(); | |
| } | |
| CanvasParagraph rich( | |
| EngineParagraphStyle style, | |
| void Function(CanvasParagraphBuilder) callback, | |
| ) { | |
| final CanvasParagraphBuilder builder = CanvasParagraphBuilder(style); | |
| callback(builder); | |
| return builder.build(); | |
| } | |
| Future<void> takeScreenshot( | |
| EngineCanvas canvas, | |
| Rect region, | |
| String fileName, | |
| ) async { | |
| 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 { | |
| sceneElement.append(canvas.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(); | |
| } | |
| } | |
| /// Fills the single placeholder in the given [paragraph] with a red rectangle. | |
| /// | |
| /// The placeholder is filled relative to [offset]. | |
| /// | |
| /// Throws if the paragraph contains more than one placeholder. | |
| void fillPlaceholder( | |
| EngineCanvas canvas, | |
| Offset offset, | |
| CanvasParagraph paragraph, | |
| ) { | |
| final TextBox placeholderBox = paragraph.getBoxesForPlaceholders().single; | |
| final SurfacePaint paint = SurfacePaint()..color = red; | |
| canvas.drawRect(placeholderBox.toRect().shift(offset), paint.paintData); | |
| } | |
| /// Fill the given [boxes] with rectangles of the given [color]. | |
| /// | |
| /// All rectangles are filled relative to [offset]. | |
| void fillBoxes(EngineCanvas canvas, Offset offset, List<TextBox> boxes, Color color) { | |
| for (final TextBox box in boxes) { | |
| final Rect rect = box.toRect().shift(offset); | |
| canvas.drawRect(rect, SurfacePaintData()..color = color.value); | |
| } | |
| } | |
| String getSpanText(CanvasParagraph paragraph, ParagraphSpan span) { | |
| return paragraph.plainText.substring(span.start, span.end); | |
| } |