From c9e6ce0555b1395b23a3c52b310017c8e9da2222 Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Sun, 15 Sep 2019 17:53:12 -0700 Subject: [PATCH] Revert "Add iOS platform view mutation XCUITests to the scenario app (#11652)" This reverts commit b73cfdad4f88ddfad6114c77633a0947f0c5fff5. --- .../framework/Source/FlutterPlatformViews.mm | 3 +- .../plugins/GeneratedPluginRegistrant.java | 23 --- .../ios/Runner/GeneratedPluginRegistrant.h | 14 -- .../ios/Runner/GeneratedPluginRegistrant.m | 12 -- .../Scenarios.xcodeproj/project.pbxproj | 38 ---- .../ios/Scenarios/Scenarios/AppDelegate.m | 56 ++---- .../Scenarios/ScenariosUITests/GoldenImage.h | 26 --- .../Scenarios/ScenariosUITests/GoldenImage.m | 94 ---------- .../GoldenPlatformViewTests.h | 30 ---- .../GoldenPlatformViewTests.m | 68 ------- .../PlatformViewGoldenTestManager.h | 29 --- .../PlatformViewGoldenTestManager.m | 41 ----- .../ScenariosUITests/PlatformViewUITests.m | 167 ++++++++--------- ...form_view_clippath_iPhone SE_simulator.png | Bin 24415 -> 0 bytes ...form_view_cliprect_iPhone SE_simulator.png | Bin 21381 -> 0 bytes ...orm_view_cliprrect_iPhone SE_simulator.png | Bin 23202 -> 0 bytes ...tform_view_opacity_iPhone SE_simulator.png | Bin 30120 -> 0 bytes ...orm_view_transform_iPhone SE_simulator.png | Bin 28021 -> 0 bytes testing/scenario_app/lib/main.dart | 7 +- .../scenario_app/lib/src/platform_view.dart | 170 ++---------------- testing/scenario_app/pubspec.yaml | 1 - 21 files changed, 118 insertions(+), 661 deletions(-) delete mode 100644 testing/scenario_app/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java delete mode 100644 testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h delete mode 100644 testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE_simulator.png delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_iPhone SE_simulator.png delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_iPhone SE_simulator.png delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_opacity_iPhone SE_simulator.png delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE_simulator.png diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index be8574eb30249..00a7c9ecda5bd 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -252,8 +252,7 @@ } // If there were not enough existing clip views, add more. while (clipIndex < number_of_clips) { - ChildClippingView* clippingView = - [[ChildClippingView alloc] initWithFrame:flutter_view_.get().bounds]; + ChildClippingView* clippingView = [ChildClippingView new]; [clippingView addSubview:head]; head = clippingView; clipIndex++; diff --git a/testing/scenario_app/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/testing/scenario_app/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java deleted file mode 100644 index d007606a44d83..0000000000000 --- a/testing/scenario_app/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.flutter.plugins; - -import io.flutter.plugin.common.PluginRegistry; - -/** - * Generated file. Do not edit. - */ -public final class GeneratedPluginRegistrant { - public static void registerWith(PluginRegistry registry) { - if (alreadyRegisteredWith(registry)) { - return; - } - } - - private static boolean alreadyRegisteredWith(PluginRegistry registry) { - final String key = GeneratedPluginRegistrant.class.getCanonicalName(); - if (registry.hasPlugin(key)) { - return true; - } - registry.registrarFor(key); - return false; - } -} diff --git a/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h b/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h deleted file mode 100644 index 3b700eb481958..0000000000000 --- a/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// Generated file. Do not edit. -// - -#ifndef GeneratedPluginRegistrant_h -#define GeneratedPluginRegistrant_h - -#import - -@interface GeneratedPluginRegistrant : NSObject -+ (void)registerWithRegistry:(NSObject*)registry; -@end - -#endif /* GeneratedPluginRegistrant_h */ diff --git a/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m b/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m deleted file mode 100644 index 60dfa42b328db..0000000000000 --- a/testing/scenario_app/ios/Runner/GeneratedPluginRegistrant.m +++ /dev/null @@ -1,12 +0,0 @@ -// -// Generated file. Do not edit. -// - -#import "GeneratedPluginRegistrant.h" - -@implementation GeneratedPluginRegistrant - -+ (void)registerWithRegistry:(NSObject*)registry { -} - -@end diff --git a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj index a95587c1a7fd0..b6c77bab8781d 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj +++ b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj @@ -30,14 +30,6 @@ 24D47D1B230C79840069DD5E /* golden_platform_view_D211AP.png in Resources */ = {isa = PBXBuildFile; fileRef = 24D47D1A230C79840069DD5E /* golden_platform_view_D211AP.png */; }; 24D47D1D230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 24D47D1C230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png */; }; 24F1FB89230B4579005ACE7C /* TextPlatformView.m in Sources */ = {isa = PBXBuildFile; fileRef = 24F1FB87230B4579005ACE7C /* TextPlatformView.m */; }; - 6816DB9E231750ED00A51400 /* GoldenPlatformViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DB9D231750ED00A51400 /* GoldenPlatformViewTests.m */; }; - 6816DBA12317573300A51400 /* GoldenImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DBA02317573300A51400 /* GoldenImage.m */; }; - 6816DBA42318358200A51400 /* PlatformViewGoldenTestManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DBA32318358200A51400 /* PlatformViewGoldenTestManager.m */; }; - 6816DBAA2318696600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DBA52318696600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png */; }; - 6816DBAB2318696600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DBA62318696600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png */; }; - 6816DBAC2318696600A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DBA72318696600A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png */; }; - 6816DBAD2318696600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DBA82318696600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png */; }; - 6816DBAE2318696600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6816DBA92318696600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -121,17 +113,6 @@ 24D47D1E230CA4480069DD5E /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 24F1FB87230B4579005ACE7C /* TextPlatformView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextPlatformView.m; sourceTree = ""; }; 24F1FB88230B4579005ACE7C /* TextPlatformView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextPlatformView.h; sourceTree = ""; }; - 6816DB9C231750ED00A51400 /* GoldenPlatformViewTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoldenPlatformViewTests.h; sourceTree = ""; }; - 6816DB9D231750ED00A51400 /* GoldenPlatformViewTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoldenPlatformViewTests.m; sourceTree = ""; }; - 6816DB9F2317573300A51400 /* GoldenImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoldenImage.h; sourceTree = ""; }; - 6816DBA02317573300A51400 /* GoldenImage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoldenImage.m; sourceTree = ""; }; - 6816DBA22318358200A51400 /* PlatformViewGoldenTestManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformViewGoldenTestManager.h; sourceTree = ""; }; - 6816DBA32318358200A51400 /* PlatformViewGoldenTestManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlatformViewGoldenTestManager.m; sourceTree = ""; }; - 6816DBA52318696600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_clippath_iPhone SE_simulator.png"; sourceTree = ""; }; - 6816DBA62318696600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_transform_iPhone SE_simulator.png"; sourceTree = ""; }; - 6816DBA72318696600A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_opacity_iPhone SE_simulator.png"; sourceTree = ""; }; - 6816DBA82318696600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprect_iPhone SE_simulator.png"; sourceTree = ""; }; - 6816DBA92318696600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprrect_iPhone SE_simulator.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -219,20 +200,9 @@ 244EA6CF230DBE8900B2D26E /* golden_platform_view_D21AP.png */, 24D47D1C230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png */, 24D47D1A230C79840069DD5E /* golden_platform_view_D211AP.png */, - 6816DBA52318696600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png */, - 6816DBA82318696600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png */, - 6816DBA92318696600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png */, - 6816DBA72318696600A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png */, - 6816DBA62318696600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png */, 248D76EE22E388380012F0C1 /* PlatformViewUITests.m */, 248D76F022E388380012F0C1 /* Info.plist */, 24D47D1E230CA4480069DD5E /* README.md */, - 6816DB9C231750ED00A51400 /* GoldenPlatformViewTests.h */, - 6816DB9D231750ED00A51400 /* GoldenPlatformViewTests.m */, - 6816DB9F2317573300A51400 /* GoldenImage.h */, - 6816DBA02317573300A51400 /* GoldenImage.m */, - 6816DBA22318358200A51400 /* PlatformViewGoldenTestManager.h */, - 6816DBA32318358200A51400 /* PlatformViewGoldenTestManager.m */, ); path = ScenariosUITests; sourceTree = ""; @@ -370,14 +340,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6816DBAE2318696600A51400 /* golden_platform_view_cliprrect_iPhone SE_simulator.png in Resources */, - 6816DBAB2318696600A51400 /* golden_platform_view_transform_iPhone SE_simulator.png in Resources */, - 6816DBAA2318696600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png in Resources */, - 6816DBAD2318696600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png in Resources */, 24D47D1B230C79840069DD5E /* golden_platform_view_D211AP.png in Resources */, 24D47D1D230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png in Resources */, 244EA6D0230DBE8900B2D26E /* golden_platform_view_D21AP.png in Resources */, - 6816DBAC2318696600A51400 /* golden_platform_view_opacity_iPhone SE_simulator.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -410,9 +375,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6816DBA12317573300A51400 /* GoldenImage.m in Sources */, - 6816DB9E231750ED00A51400 /* GoldenPlatformViewTests.m in Sources */, - 6816DBA42318358200A51400 /* PlatformViewGoldenTestManager.m in Sources */, 248D76EF22E388380012F0C1 /* PlatformViewUITests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m index 205ce79384c9c..6a419e99a7bc3 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -25,55 +25,27 @@ - (BOOL)application:(UIApplication*)application // This argument is used by the XCUITest for Platform Views so that the app // under test will create platform views. - // The launchArgsMap should match the one in the `PlatformVieGoldenTestManager`. - NSDictionary* launchArgsMap = @{ - @"--platform-view" : @"platform_view", - @"--platform-view-cliprect" : @"platform_view_cliprect", - @"--platform-view-cliprrect" : @"platform_view_cliprrect", - @"--platform-view-clippath" : @"platform_view_clippath", - @"--platform-view-transform" : @"platform_view_transform", - @"--platform-view-opacity" : @"platform_view_opacity", - }; - __block NSString* goldenTestName = nil; - [launchArgsMap - enumerateKeysAndObjectsUsingBlock:^(NSString* argument, NSString* testName, BOOL* stop) { - if ([[[NSProcessInfo processInfo] arguments] containsObject:argument]) { - goldenTestName = testName; - *stop = YES; - } - }]; - - if (goldenTestName) { - [self readyContextForPlatformViewTests:goldenTestName]; + if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--platform-view"]) { + FlutterEngine* engine = [[FlutterEngine alloc] initWithScenario:@"text_platform_view" + withCompletion:nil]; + [engine runWithEntrypoint:nil]; + + FlutterViewController* flutterViewController = + [[NoStatusBarFlutterViewController alloc] initWithEngine:engine nibName:nil bundle:nil]; + TextPlatformViewFactory* textPlatformViewFactory = + [[TextPlatformViewFactory alloc] initWithMessenger:flutterViewController.binaryMessenger]; + NSObject* registrar = + [flutterViewController.engine registrarForPlugin:@"scenarios/TextPlatformViewPlugin"]; + [registrar registerViewFactory:textPlatformViewFactory withId:@"scenarios/textPlatformView"]; + self.window.rootViewController = flutterViewController; } else if ([[[NSProcessInfo processInfo] arguments] containsObject:@"--screen-before-flutter"]) { self.window.rootViewController = [[ScreenBeforeFlutter alloc] initWithEngineRunCompletion:nil]; } else { self.window.rootViewController = [[UIViewController alloc] init]; } - [self.window makeKeyAndVisible]; - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -- (void)readyContextForPlatformViewTests:(NSString*)scenarioIdentifier { - FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"PlatformViewTest" project:nil]; - [engine runWithEntrypoint:nil]; - FlutterViewController* flutterViewController = - [[NoStatusBarFlutterViewController alloc] initWithEngine:engine nibName:nil bundle:nil]; - [engine.binaryMessenger - setMessageHandlerOnChannel:@"scenario_status" - binaryMessageHandler:^(NSData* _Nullable message, FlutterBinaryReply _Nonnull reply) { - [engine.binaryMessenger - sendOnChannel:@"set_scenario" - message:[scenarioIdentifier dataUsingEncoding:NSUTF8StringEncoding]]; - }]; - TextPlatformViewFactory* textPlatformViewFactory = - [[TextPlatformViewFactory alloc] initWithMessenger:flutterViewController.binaryMessenger]; - NSObject* registrar = - [flutterViewController.engine registrarForPlugin:@"scenarios/TextPlatformViewPlugin"]; - [registrar registerViewFactory:textPlatformViewFactory withId:@"scenarios/textPlatformView"]; - self.window.rootViewController = flutterViewController; + return [super application:application didFinishLaunchingWithOptions:launchOptions]; } @end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h deleted file mode 100644 index dead0c530e126..0000000000000 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.h +++ /dev/null @@ -1,26 +0,0 @@ -// 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 - -NS_ASSUME_NONNULL_BEGIN - -@interface GoldenImage : NSObject - -@property(readonly, copy, nonatomic) NSString* goldenName; -@property(readonly, strong, nonatomic) UIImage* image; - -// Initilize with the golden file's prefix. -// -// Create an image from a golden file named prefix+devicemodel. -- (instancetype)initWithGoldenNamePrefix:(NSString*)prefix; - -// Compare this GoldenImage to `image`. -// -// Return YES if the `image` of this GoldenImage have the same pixels of provided `image`. -- (BOOL)compareGoldenToImage:(UIImage*)image; - -@end - -NS_ASSUME_NONNULL_END diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m deleted file mode 100644 index 6dbcd8e73e72a..0000000000000 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenImage.m +++ /dev/null @@ -1,94 +0,0 @@ -// 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 "GoldenImage.h" -#import -#include - -@interface GoldenImage () - -@end - -@implementation GoldenImage - -- (instancetype)initWithGoldenNamePrefix:(NSString*)prefix { - self = [super init]; - if (self) { - _goldenName = [prefix stringByAppendingString:_platformName()]; - NSBundle* bundle = [NSBundle bundleForClass:[self class]]; - NSURL* goldenURL = [bundle URLForResource:_goldenName withExtension:@"png"]; - NSData* data = [NSData dataWithContentsOfURL:goldenURL]; - _image = [[UIImage alloc] initWithData:data]; - } - return self; -} - -- (BOOL)compareGoldenToImage:(UIImage*)image { - if (!self.image || !image) { - return NO; - } - CGImageRef imageRefA = [self.image CGImage]; - CGImageRef imageRefB = [image CGImage]; - - NSUInteger widthA = CGImageGetWidth(imageRefA); - NSUInteger heightA = CGImageGetHeight(imageRefA); - NSUInteger widthB = CGImageGetWidth(imageRefB); - NSUInteger heightB = CGImageGetHeight(imageRefB); - - if (widthA != widthB || heightA != heightB) { - return NO; - } - NSUInteger bytesPerPixel = 4; - NSUInteger size = widthA * heightA * bytesPerPixel; - NSMutableData* rawA = [NSMutableData dataWithLength:size]; - NSMutableData* rawB = [NSMutableData dataWithLength:size]; - - if (!rawA || !rawB) { - return NO; - } - - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - - NSUInteger bytesPerRow = bytesPerPixel * widthA; - NSUInteger bitsPerComponent = 8; - CGContextRef contextA = - CGBitmapContextCreate(rawA.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, - colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); - - CGContextDrawImage(contextA, CGRectMake(0, 0, widthA, heightA), imageRefA); - CGContextRelease(contextA); - - CGContextRef contextB = - CGBitmapContextCreate(rawB.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, - colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); - CGColorSpaceRelease(colorSpace); - - CGContextDrawImage(contextB, CGRectMake(0, 0, widthA, heightA), imageRefB); - CGContextRelease(contextB); - - if (memcmp(rawA.mutableBytes, rawB.mutableBytes, size)) { - return NO; - } - - return YES; -} - -NS_INLINE NSString* _platformName() { - NSString* simulatorName = - [[NSProcessInfo processInfo].environment objectForKey:@"SIMULATOR_DEVICE_NAME"]; - if (simulatorName) { - return [NSString stringWithFormat:@"%@_simulator", simulatorName]; - } - - size_t size; - sysctlbyname("hw.model", NULL, &size, NULL, 0); - char* answer = malloc(size); - sysctlbyname("hw.model", answer, &size, NULL, 0); - - NSString* results = [NSString stringWithCString:answer encoding:NSUTF8StringEncoding]; - free(answer); - return results; -} - -@end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h deleted file mode 100644 index de2b175368261..0000000000000 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.h +++ /dev/null @@ -1,30 +0,0 @@ -// 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 -#import "PlatformViewGoldenTestManager.h" - -NS_ASSUME_NONNULL_BEGIN - -// The base class of all the PlatformView golden tests. -// -// A new PlatformView golden tests can subclass this and override the `-initiWithInvocation:` -// method, which then retun the `-initWithManager:invocation:` -// -// Then in any test method, call `checkGolden` to perform the golden test. -// -// This base class doesn't run any test case on its own. -@interface GoldenPlatformViewTests : XCTestCase - -// Initialize with a `PlatformViewGoldenTestManager`. -- (instancetype)initWithManager:(PlatformViewGoldenTestManager*)manager - invocation:(NSInvocation*)invocation; - -// Take a sceenshot of the test app and check it has the same pixels with goldenImage inside the -// `PlatformViewGoldenTestManager`. -- (void)checkGolden; - -@end - -NS_ASSUME_NONNULL_END diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m deleted file mode 100644 index 80e2af25e3bff..0000000000000 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenPlatformViewTests.m +++ /dev/null @@ -1,68 +0,0 @@ -// 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 "GoldenPlatformViewTests.h" -#include -#import "PlatformViewGoldenTestManager.h" - -static const NSInteger kSecondsToWaitForPlatformView = 30; - -@interface GoldenPlatformViewTests () - -@property(nonatomic, copy) NSString* goldenName; -@property(nonatomic, strong) XCUIApplication* application; - -@property(nonatomic, strong) PlatformViewGoldenTestManager* manager; - -@end - -@implementation GoldenPlatformViewTests - -- (instancetype)initWithManager:(PlatformViewGoldenTestManager*)manager - invocation:(NSInvocation*)invocation { - self = [super initWithInvocation:invocation]; - _manager = manager; - return self; -} - -- (void)setUp { - [super setUp]; - self.continueAfterFailure = NO; - - self.application = [[XCUIApplication alloc] init]; - self.application.launchArguments = @[ self.manager.launchArg ]; - [self.application launch]; -} - -// Note: don't prefix with "test" or GoldenPlatformViewTests will run instead of the subclasses. -- (void)checkGolden { - XCUIElement* element = self.application.textViews.firstMatch; - BOOL exists = [element waitForExistenceWithTimeout:kSecondsToWaitForPlatformView]; - if (!exists) { - XCTFail(@"It took longer than %@ second to find the platform view." - @"There might be issues with the platform view's construction," - @"or with how the scenario is built.", - @(kSecondsToWaitForPlatformView)); - } - - GoldenImage* golden = self.manager.goldenImage; - - XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; - XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; - attachment.lifetime = XCTAttachmentLifetimeKeepAlways; - [self addAttachment:attachment]; - - if (golden.image) { - XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden.image]; - goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; - [self addAttachment:goldenAttachment]; - } else { - XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " - @"README to add a new golden.", - golden.goldenName); - } - - XCTAssertTrue([golden compareGoldenToImage:screenshot.image]); -} -@end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h deleted file mode 100644 index f138aea88da3f..0000000000000 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.h +++ /dev/null @@ -1,29 +0,0 @@ -// 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 -#import "GoldenImage.h" - -NS_ASSUME_NONNULL_BEGIN - -extern NSDictionary* launchArgsMap; - -// Manages a `GoldenPlatformViewTests`. -// -// It creates the correct `identifer` based on the `launchArg`. -// It also generates the correct GoldenImage based on the `identifier`. -@interface PlatformViewGoldenTestManager : NSObject - -@property(readonly, strong, nonatomic) GoldenImage* goldenImage; -@property(readonly, copy, nonatomic) NSString* identifier; -@property(readonly, copy, nonatomic) NSString* launchArg; - -// Initilize with launchArg. -// -// Crahes if the launchArg is not mapped in `Appdelegate.launchArgsMap`. -- (instancetype)initWithLaunchArg:(NSString*)launchArg; - -@end - -NS_ASSUME_NONNULL_END diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m deleted file mode 100644 index 9e512d5234889..0000000000000 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m +++ /dev/null @@ -1,41 +0,0 @@ -// 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 "PlatformViewGoldenTestManager.h" - -@interface PlatformViewGoldenTestManager () - -@property(readwrite, strong, nonatomic) GoldenImage* goldenImage; - -@end - -@implementation PlatformViewGoldenTestManager - -NSDictionary* launchArgsMap; - -- (instancetype)initWithLaunchArg:(NSString*)launchArg { - self = [super init]; - if (self) { - // The launchArgsMap should match the one in the `PlatformVieGoldenTestManager`. - static NSDictionary* launchArgsMap; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - launchArgsMap = @{ - @"--platform-view" : @"platform_view", - @"--platform-view-cliprect" : @"platform_view_cliprect", - @"--platform-view-cliprrect" : @"platform_view_cliprrect", - @"--platform-view-clippath" : @"platform_view_clippath", - @"--platform-view-transform" : @"platform_view_transform", - @"--platform-view-opacity" : @"platform_view_opacity", - }; - }); - _identifier = launchArgsMap[launchArg]; - NSString* prefix = [NSString stringWithFormat:@"golden_%@_", _identifier]; - _goldenImage = [[GoldenImage alloc] initWithGoldenNamePrefix:prefix]; - _launchArg = launchArg; - } - return self; -} - -@end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index 00708ecc282f4..e0a929572b81e 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -2,113 +2,114 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "GoldenPlatformViewTests.h" +#import +#import +#include -@interface PlatformViewUITests : GoldenPlatformViewTests +#import "../Scenarios/TextPlatformView.h" +@interface PlatformViewUITests : XCTestCase +@property(nonatomic, strong) XCUIApplication* application; @end @implementation PlatformViewUITests -- (instancetype)initWithInvocation:(NSInvocation*)invocation { - PlatformViewGoldenTestManager* manager = - [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view"]; - return [super initWithManager:manager invocation:invocation]; -} - -- (void)testPlatformView { - [self checkGolden]; -} - -@end - -// Clip Rect Tests -@interface PlatformViewMutationClipRectTests : GoldenPlatformViewTests - -@end - -@implementation PlatformViewMutationClipRectTests - -- (instancetype)initWithInvocation:(NSInvocation*)invocation { - PlatformViewGoldenTestManager* manager = - [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprect"]; - return [super initWithManager:manager invocation:invocation]; -} - -- (void)testPlatformView { - [self checkGolden]; -} - -@end - -@interface PlatformViewMutationClipRRectTests : GoldenPlatformViewTests - -@end +- (void)setUp { + [super setUp]; + self.continueAfterFailure = NO; -@implementation PlatformViewMutationClipRRectTests - -- (instancetype)initWithInvocation:(NSInvocation*)invocation { - PlatformViewGoldenTestManager* manager = - [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprrect"]; - return [super initWithManager:manager invocation:invocation]; + self.application = [[XCUIApplication alloc] init]; + self.application.launchArguments = @[ @"--platform-view" ]; + [self.application launch]; } - (void)testPlatformView { - [self checkGolden]; -} - -@end - -@interface PlatformViewMutationClipPathTests : GoldenPlatformViewTests - -@end - -@implementation PlatformViewMutationClipPathTests - -- (instancetype)initWithInvocation:(NSInvocation*)invocation { - PlatformViewGoldenTestManager* manager = - [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-clippath"]; - return [super initWithManager:manager invocation:invocation]; + NSBundle* bundle = [NSBundle bundleForClass:[self class]]; + NSString* goldenName = + [NSString stringWithFormat:@"golden_platform_view_%@", [self platformName]]; + NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; + UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; + + XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; + XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; + attachment.lifetime = XCTAttachmentLifetimeKeepAlways; + [self addAttachment:attachment]; + + if (golden) { + XCTAttachment* goldenAttachment = [XCTAttachment attachmentWithImage:golden]; + goldenAttachment.lifetime = XCTAttachmentLifetimeKeepAlways; + [self addAttachment:goldenAttachment]; + } else { + XCTFail(@"This test will fail - no golden named %@ found. Follow the steps in the " + @"README to add a new golden.", + goldenName); + } + + XCTAssertTrue([self compareImage:golden toOther:screenshot.image]); } -- (void)testPlatformView { - [self checkGolden]; +- (NSString*)platformName { + NSString* simulatorName = + [[NSProcessInfo processInfo].environment objectForKey:@"SIMULATOR_DEVICE_NAME"]; + if (simulatorName) { + return [NSString stringWithFormat:@"%@_simulator", simulatorName]; + } + + size_t size; + sysctlbyname("hw.model", NULL, &size, NULL, 0); + char* answer = malloc(size); + sysctlbyname("hw.model", answer, &size, NULL, 0); + + NSString* results = [NSString stringWithCString:answer encoding:NSUTF8StringEncoding]; + free(answer); + return results; } -@end +- (BOOL)compareImage:(UIImage*)a toOther:(UIImage*)b { + CGImageRef imageRefA = [a CGImage]; + CGImageRef imageRefB = [b CGImage]; -@interface PlatformViewMutationTransformTests : GoldenPlatformViewTests + NSUInteger widthA = CGImageGetWidth(imageRefA); + NSUInteger heightA = CGImageGetHeight(imageRefA); + NSUInteger widthB = CGImageGetWidth(imageRefB); + NSUInteger heightB = CGImageGetHeight(imageRefB); -@end + if (widthA != widthB || heightA != heightB) { + return NO; + } + NSUInteger bytesPerPixel = 4; + NSUInteger size = widthA * heightA * bytesPerPixel; + NSMutableData* rawA = [NSMutableData dataWithLength:size]; + NSMutableData* rawB = [NSMutableData dataWithLength:size]; -@implementation PlatformViewMutationTransformTests + if (!rawA || !rawB) { + return NO; + } -- (instancetype)initWithInvocation:(NSInvocation*)invocation { - PlatformViewGoldenTestManager* manager = - [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-transform"]; - return [super initWithManager:manager invocation:invocation]; -} - -- (void)testPlatformView { - [self checkGolden]; -} + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); -@end + NSUInteger bytesPerRow = bytesPerPixel * widthA; + NSUInteger bitsPerComponent = 8; + CGContextRef contextA = + CGBitmapContextCreate(rawA.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, + colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); -@interface PlatformViewMutationOpacityTests : GoldenPlatformViewTests + CGContextDrawImage(contextA, CGRectMake(0, 0, widthA, heightA), imageRefA); + CGContextRelease(contextA); -@end + CGContextRef contextB = + CGBitmapContextCreate(rawB.mutableBytes, widthA, heightA, bitsPerComponent, bytesPerRow, + colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); + CGColorSpaceRelease(colorSpace); -@implementation PlatformViewMutationOpacityTests + CGContextDrawImage(contextB, CGRectMake(0, 0, widthA, heightA), imageRefB); + CGContextRelease(contextB); -- (instancetype)initWithInvocation:(NSInvocation*)invocation { - PlatformViewGoldenTestManager* manager = - [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-opacity"]; - return [super initWithManager:manager invocation:invocation]; -} + if (memcmp(rawA.mutableBytes, rawB.mutableBytes, size)) { + return NO; + } -- (void)testPlatformView { - [self checkGolden]; + return YES; } @end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE_simulator.png deleted file mode 100644 index 8e776f220e84943877cec56192fc4de71ceed695..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24415 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 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_iPhone SE_simulator.png deleted file mode 100644 index 94667b9a8254d4eb6a4044d8cde3d7dbfdca6607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23202 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 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_transform_iPhone SE_simulator.png deleted file mode 100644 index 678c7fd6bc7bb0e4e7bbae28ebdaf53539e0e1d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28021 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 DPa|d= diff --git a/testing/scenario_app/lib/main.dart b/testing/scenario_app/lib/main.dart index bbc16454470aa..11126afe69427 100644 --- a/testing/scenario_app/lib/main.dart +++ b/testing/scenario_app/lib/main.dart @@ -16,12 +16,7 @@ import 'src/scenario.dart'; Map _scenarios = { 'animated_color_square': AnimatedColorSquareScenario(window), - 'platform_view': PlatformViewScenario(window, 'Hello from Scenarios (Platform View)', id: 0), - 'platform_view_cliprect': PlatformViewClipRectScenario(window, 'PlatformViewClipRect', id: 1), - 'platform_view_cliprrect': PlatformViewClipRRectScenario(window, 'PlatformViewClipRRect', id: 2), - 'platform_view_clippath': PlatformViewClipPathScenario(window, 'PlatformViewClipPath', id: 3), - 'platform_view_transform': PlatformViewTransformScenario(window, 'PlatformViewTransform', id: 4), - 'platform_view_opacity': PlatformViewOpacityScenario(window, 'PlatformViewOpacity', id: 5), + 'text_platform_view': PlatformViewScenario(window, 'Hello from Scenarios (Platform View)'), 'poppable_screen': PoppableScreenScenario(window), }; diff --git a/testing/scenario_app/lib/src/platform_view.dart b/testing/scenario_app/lib/src/platform_view.dart index 354a2dcabf14d..4286469ce2937 100644 --- a/testing/scenario_app/lib/src/platform_view.dart +++ b/testing/scenario_app/lib/src/platform_view.dart @@ -4,10 +4,8 @@ import 'dart:convert'; import 'dart:io'; -import 'dart:math'; import 'dart:typed_data'; import 'dart:ui'; -import 'package:vector_math/vector_math_64.dart'; import 'scenario.dart'; @@ -28,147 +26,13 @@ List _to64(num value) { } /// A simple platform view. -class PlatformViewScenario extends Scenario - with _BasePlatformViewScenarioMixin { +class PlatformViewScenario extends Scenario { /// Creates the PlatformView scenario. /// /// The [window] parameter must not be null. PlatformViewScenario(Window window, String text, {int id = 0}) : assert(window != null), super(window) { - constructScenario(window, text, id); - } - - @override - void onBeginFrame(Duration duration) { - final SceneBuilder builder = SceneBuilder(); - - builder.pushOffset(0, 0); - - finishBuilderByAddingPlatformViewAndPicture(builder, 0); - } -} - -/// Platform view with clip rect. -class PlatformViewClipRectScenario extends Scenario - with _BasePlatformViewScenarioMixin { - /// Constructs a platform view with clip rect scenario. - PlatformViewClipRectScenario(Window window, String text, {int id = 0}) - : assert(window != null), - super(window) { - constructScenario(window, text, id); - } - - @override - void onBeginFrame(Duration duration) { - final SceneBuilder builder = SceneBuilder(); - builder.pushOffset(0, 0); - builder.pushClipRect(const Rect.fromLTRB(100, 100, 400, 400)); - finishBuilderByAddingPlatformViewAndPicture(builder, 1); - } -} - -/// Platform view with clip rrect. -class PlatformViewClipRRectScenario extends PlatformViewScenario { - /// Constructs a platform view with clip rrect scenario. - PlatformViewClipRRectScenario(Window window, String text, {int id = 0}) - : super(window, text, id: id); - - @override - void onBeginFrame(Duration duration) { - final SceneBuilder builder = SceneBuilder(); - - builder.pushOffset(0, 0); - builder.pushClipRRect( - RRect.fromLTRBAndCorners( - 100, - 100, - 400, - 400, - topLeft: const Radius.circular(15), - topRight: const Radius.circular(50), - bottomLeft: const Radius.circular(50), - ), - ); - finishBuilderByAddingPlatformViewAndPicture(builder, 2); - } -} - -/// Platform view with clip path. -class PlatformViewClipPathScenario extends PlatformViewScenario { - /// Constructs a platform view with clip rrect scenario. - PlatformViewClipPathScenario(Window window, String text, {int id = 0}) - : super(window, text, id: id); - - @override - void onBeginFrame(Duration duration) { - final SceneBuilder builder = SceneBuilder(); - - builder.pushOffset(0, 0); - - // Create a path of rectangle with width of 200 and height of 300, starting from (100, 100). - // - // Refer to "../../ios/Scenarios/Scenarios/ScenariosUITests/golden_platform_view_clippath_iPhone SE_simulator.png" for the exact path after clipping. - Path path = Path(); - path.moveTo(100, 100); - path.quadraticBezierTo(50, 250, 100, 400); - path.lineTo(350, 400); - path.cubicTo(400, 300, 300, 200, 350, 100); - path.close(); - builder.pushClipPath(path); - - finishBuilderByAddingPlatformViewAndPicture(builder, 3); - } -} - -/// Platform view with transform. -class PlatformViewTransformScenario extends PlatformViewScenario { - /// Constructs a platform view with transform scenario. - PlatformViewTransformScenario(Window window, String text, {int id = 0}) - : super(window, text, id: id); - - @override - void onBeginFrame(Duration duration) { - final SceneBuilder builder = SceneBuilder(); - - builder.pushOffset(0, 0); - final Matrix4 matrix4 = Matrix4.identity() - ..rotateZ(1) - ..scale(0.5, 0.5, 1.0) - ..translate(1000.0, 100.0, 0.0); - - builder.pushTransform(matrix4.storage); - - finishBuilderByAddingPlatformViewAndPicture(builder, 4); - } -} - -/// Platform view with opacity. -class PlatformViewOpacityScenario extends PlatformViewScenario { - /// Constructs a platform view with transform scenario. - PlatformViewOpacityScenario(Window window, String text, {int id = 0}) - : super(window, text, id: id); - - @override - void onBeginFrame(Duration duration) { - final SceneBuilder builder = SceneBuilder(); - - builder.pushOffset(0, 0); - builder.pushOpacity(150); - - finishBuilderByAddingPlatformViewAndPicture(builder, 5); - } -} - -mixin _BasePlatformViewScenarioMixin on Scenario { - int _textureId; - - /// Construct the platform view related scenario - /// - /// It prepare a TextPlatformView so it can be added to the SceneBuilder in `onBeginFrame`. - /// Call this method in the constructor of the platform view related scenarios - /// to perform necessary set up. - void constructScenario(Window window, String text, int id) { const int _valueInt32 = 3; const int _valueFloat64 = 6; const int _valueString = 7; @@ -176,7 +40,7 @@ mixin _BasePlatformViewScenarioMixin on Scenario { const int _valueMap = 13; final Uint8List message = Uint8List.fromList([ _valueString, - 'create'.length, // this won't work if we use multi-byte characters. + 'create'.length, // this is safe as long as these are all single byte characters. ...utf8.encode('create'), _valueMap, if (Platform.isIOS) @@ -230,27 +94,29 @@ mixin _BasePlatformViewScenarioMixin on Scenario { ); } - // Add a platform view and a picture to the scene, then finish the `sceneBuilder`. - void finishBuilderByAddingPlatformViewAndPicture(SceneBuilder sceneBuilder, int viewId) { + int _textureId; + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder(); + + builder.pushOffset(0, 0); + if (Platform.isIOS) { - sceneBuilder.addPlatformView(viewId, width: 500, height: 500); + builder.addPlatformView(0, width: 500, height: 500); } else if (Platform.isAndroid && _textureId != null) { - sceneBuilder.addTexture(_textureId, - offset: const Offset(150, 300), width: 500, height: 500); + builder.addTexture(_textureId, offset: const Offset(150, 300), width: 500, height: 500); } else { - throw UnsupportedError( - 'Platform ${Platform.operatingSystem} is not supported'); + throw UnsupportedError('Platform ${Platform.operatingSystem} is not supported'); } + final PictureRecorder recorder = PictureRecorder(); final Canvas canvas = Canvas(recorder); - canvas.drawCircle( - const Offset(50, 50), - 50, - Paint()..color = const Color(0xFFABCDEF), - ); + canvas.drawCircle(const Offset(50, 50), 50, Paint()..color = const Color(0xFFABCDEF)); final Picture picture = recorder.endRecording(); - sceneBuilder.addPicture(const Offset(300, 300), picture); - final Scene scene = sceneBuilder.build(); + builder.addPicture(const Offset(300, 300), picture); + + final Scene scene = builder.build(); window.render(scene); scene.dispose(); } diff --git a/testing/scenario_app/pubspec.yaml b/testing/scenario_app/pubspec.yaml index f17ddb080a7dc..8748b51653ac9 100644 --- a/testing/scenario_app/pubspec.yaml +++ b/testing/scenario_app/pubspec.yaml @@ -8,4 +8,3 @@ dependencies: path: ../../../out/host_debug_unopt/gen/dart-pkg/sky_engine sky_services: path: ../../../out/host_debug_unopt/gen/dart-pkg/sky_services - vector_math: ^2.0.8