From ae2d3ff6186b6e0182b7ad0bd80ed52366e53110 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Wed, 17 Nov 2021 13:51:30 -0800 Subject: [PATCH 01/11] defualt to 120 use info list value to guard the new code tests --- ci/licenses_golden/licenses_flutter | 1 + shell/platform/darwin/ios/BUILD.gn | 1 + .../framework/Source/VsyncWaiterIosTest.mm | 53 +++++++++++++++++++ .../ios/framework/Source/vsync_waiter_ios.h | 5 ++ .../ios/framework/Source/vsync_waiter_ios.mm | 25 ++++++++- .../IosUnitTests.xcodeproj/project.pbxproj | 2 + 6 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index fcd6de7e2b18b..b4cf476ac0a4a 100755 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -1561,6 +1561,7 @@ FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/profiler_metri FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/profiler_metrics_ios.mm FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm +FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm FILE: ../../../flutter/shell/platform/darwin/ios/framework/module.modulemap FILE: ../../../flutter/shell/platform/darwin/ios/ios_context.h FILE: ../../../flutter/shell/platform/darwin/ios/ios_context.mm diff --git a/shell/platform/darwin/ios/BUILD.gn b/shell/platform/darwin/ios/BUILD.gn index a9dfa50c132c7..8769de0f72959 100644 --- a/shell/platform/darwin/ios/BUILD.gn +++ b/shell/platform/darwin/ios/BUILD.gn @@ -209,6 +209,7 @@ source_set("ios_test_flutter_mrc") { "framework/Source/FlutterPlatformViewsTest.mm", "framework/Source/FlutterViewTest.mm", "framework/Source/accessibility_bridge_test.mm", + "framework/Source/VsyncWaiterIosTest.mm", "platform_message_handler_ios_test.mm", ] deps = [ diff --git a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm new file mode 100644 index 0000000000000..26ff5820c78e7 --- /dev/null +++ b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm @@ -0,0 +1,53 @@ +// 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 + +#include "flutter/fml/thread.h" + +#import "flutter/shell/platform/darwin/common/framework/Headers/FlutterMacros.h" +#import "flutter/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h" + +FLUTTER_ASSERT_NOT_ARC +namespace { +fml::RefPtr CreateNewThread(std::string name) { + auto thread = std::make_unique(name); + auto runner = thread->GetTaskRunner(); + return runner; +} +} + +@interface VsyncWaiterIosTest : XCTestCase +@end + +@implementation VsyncWaiterIosTest + +- (void)testCreate { + auto thread_task_runner = CreateNewThread("VsyncWaiterIosTest"); + auto callback = [](std::unique_ptr recorder) {}; + VSyncClient* vsyncClient = [[[VSyncClient alloc] initWithTaskRunner:thread_task_runner callback:callback] autorelease]; + XCTAssertNotNil(vsyncClient); +} + +- (void)testSetCorrectVirableRefreshRates { + auto thread_task_runner = CreateNewThread("VsyncWaiterIosTest"); + auto callback = [](std::unique_ptr recorder) {}; + VSyncClient* vsyncClient = [[[VSyncClient alloc] initWithTaskRunner:thread_task_runner callback:callback] autorelease]; + id bundleMock = OCMPartialMock([NSBundle mainBundle]); + OCMStub([bundleMock objectForInfoDictionaryKey:@"CADisableMinimumFrameDurationOnPhone"]).andReturn(@YES); + id mockDisplayLinkManager = [[OCMockObject mockForClass:[DisplayLinkManager class]] autorelease]; + double maxFrameRate = 120; + [[[mockDisplayLinkManager stub] andReturn:@(maxFrameRate)] displayRefreshRate]; + CADisplayLink *link = [vsyncClient getDisplayLink]; + if (@available(iOS 15.0, *)) { + XCTAssertEqual(link.preferredFrameRateRange.maximum, maxFrameRate); + XCTAssertEqual(link.preferredFrameRateRange.preferred, maxFrameRate); + XCTAssertEqual(link.preferredFrameRateRange.minimum, maxFrameRate/2); + } else if (@available(iOS 10.0, *)) { + XCTAssertEqual(link.preferredFramesPerSecond, maxFrameRate); + } +} + +@end diff --git a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h index f5c3e656b258c..aa77577791c3a 100644 --- a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h +++ b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h @@ -5,6 +5,8 @@ #ifndef FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_VSYNC_WAITER_IOS_H_ #define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_VSYNC_WAITER_IOS_H_ +#include + #include "flutter/fml/macros.h" #include "flutter/fml/memory/weak_ptr.h" #include "flutter/fml/platform/darwin/scoped_nsobject.h" @@ -37,6 +39,9 @@ - (double)getRefreshRate; +// For testing only. +- (CADisplayLink *)getDisplayLink; + @end namespace flutter { diff --git a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm index 91cabc13dd985..928afc07f31a7 100644 --- a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm +++ b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm @@ -7,7 +7,6 @@ #include #include -#include #include #include @@ -64,6 +63,8 @@ - (instancetype)initWithTaskRunner:(fml::RefPtr)task_runner }; display_link_.get().paused = YES; + [self setMaxRefreshRateIfEnabled]; + task_runner->PostTask([client = [self retain]]() { [client->display_link_.get() addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; @@ -74,6 +75,23 @@ - (instancetype)initWithTaskRunner:(fml::RefPtr)task_runner return self; } +- (void)setMaxRefreshRateIfEnabled { + NSNumber* minimumFrameRateDisabled = + [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CADisableMinimumFrameDurationOnPhone"]; + if (![minimumFrameRateDisabled boolValue]) { + return; + } + double maxFrameRate = fmax([DisplayLinkManager displayRefreshRate], 60); + double minFrameRate = fmax(maxFrameRate / 2, 60); + + if (@available(iOS 15.0, *)) { + display_link_.get().preferredFrameRateRange = + CAFrameRateRangeMake(minFrameRate, maxFrameRate, maxFrameRate); + } else if (@available(iOS 10.0, *)) { + display_link_.get().preferredFramesPerSecond = maxFrameRate; + } +} + - (void)await { display_link_.get().paused = NO; } @@ -99,7 +117,6 @@ - (void)onDisplayLink:(CADisplayLink*)link { recorder->RecordVsync(frame_start_time, frame_target_time); display_link_.get().paused = YES; - callback_(std::move(recorder)); } @@ -117,6 +134,10 @@ - (double)getRefreshRate { return current_refresh_rate_; } +- (CADisplayLink *)getDisplayLink { + return display_link_.get(); +} + @end @implementation DisplayLinkManager diff --git a/testing/ios/IosUnitTests/IosUnitTests.xcodeproj/project.pbxproj b/testing/ios/IosUnitTests/IosUnitTests.xcodeproj/project.pbxproj index e429e7ca47784..fc3929cfcf48f 100644 --- a/testing/ios/IosUnitTests/IosUnitTests.xcodeproj/project.pbxproj +++ b/testing/ios/IosUnitTests/IosUnitTests.xcodeproj/project.pbxproj @@ -69,6 +69,7 @@ 0D6AB6C922BB05E200EEE540 /* IosUnitTestsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IosUnitTestsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 0D6AB6CF22BB05E200EEE540 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 0D6AB73E22BD8F0200EEE540 /* FlutterEngineConfig.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FlutterEngineConfig.xcconfig; sourceTree = ""; }; + 68B6091227F62F990036AC78 /* VsyncWaiterIosTest.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = VsyncWaiterIosTest.mm; sourceTree = ""; }; F7521D7226BB671E005F15C5 /* libios_test_flutter.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libios_test_flutter.dylib; path = "../../../../out/$(FLUTTER_ENGINE)/libios_test_flutter.dylib"; sourceTree = ""; }; F7521D7526BB673E005F15C5 /* libocmock_shared.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libocmock_shared.dylib; path = "../../../../out/$(FLUTTER_ENGINE)/libocmock_shared.dylib"; sourceTree = ""; }; F77E081726FA9CE6003E6E4C /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = "../../../../out/$(FLUTTER_ENGINE)/Flutter.framework"; sourceTree = ""; }; @@ -96,6 +97,7 @@ 0AC232E924BA71D300A85907 /* Source */ = { isa = PBXGroup; children = ( + 68B6091227F62F990036AC78 /* VsyncWaiterIosTest.mm */, F7A3FDE026B9E0A300EADD61 /* FlutterAppDelegateTest.mm */, 0AC232F424BA71D300A85907 /* SemanticsObjectTest.mm */, 0AC232F724BA71D300A85907 /* FlutterEngineTest.mm */, From 452e9fe38bceca03b858f6134ac4f07ca6b721e1 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 31 Mar 2022 17:25:44 -0700 Subject: [PATCH 02/11] fix tests --- .../framework/Source/VsyncWaiterIosTest.mm | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm index 26ff5820c78e7..316aeeb5fa59a 100644 --- a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm +++ b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm @@ -34,12 +34,13 @@ - (void)testCreate { - (void)testSetCorrectVirableRefreshRates { auto thread_task_runner = CreateNewThread("VsyncWaiterIosTest"); auto callback = [](std::unique_ptr recorder) {}; - VSyncClient* vsyncClient = [[[VSyncClient alloc] initWithTaskRunner:thread_task_runner callback:callback] autorelease]; id bundleMock = OCMPartialMock([NSBundle mainBundle]); OCMStub([bundleMock objectForInfoDictionaryKey:@"CADisableMinimumFrameDurationOnPhone"]).andReturn(@YES); - id mockDisplayLinkManager = [[OCMockObject mockForClass:[DisplayLinkManager class]] autorelease]; + id mockDisplayLinkManager = [OCMockObject mockForClass:[DisplayLinkManager class]]; double maxFrameRate = 120; - [[[mockDisplayLinkManager stub] andReturn:@(maxFrameRate)] displayRefreshRate]; + [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate]; + + VSyncClient* vsyncClient = [[VSyncClient alloc] initWithTaskRunner:thread_task_runner callback:callback]; CADisplayLink *link = [vsyncClient getDisplayLink]; if (@available(iOS 15.0, *)) { XCTAssertEqual(link.preferredFrameRateRange.maximum, maxFrameRate); @@ -50,4 +51,24 @@ - (void)testSetCorrectVirableRefreshRates { } } +- (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsNotOn { + auto thread_task_runner = CreateNewThread("VsyncWaiterIosTest"); + auto callback = [](std::unique_ptr recorder) {}; + id bundleMock = OCMPartialMock([NSBundle mainBundle]); + OCMStub([bundleMock objectForInfoDictionaryKey:@"CADisableMinimumFrameDurationOnPhone"]).andReturn(@NO); + id mockDisplayLinkManager = [OCMockObject mockForClass:[DisplayLinkManager class]]; + double maxFrameRate = 120; + [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate]; + + VSyncClient* vsyncClient = [[VSyncClient alloc] initWithTaskRunner:thread_task_runner callback:callback]; + CADisplayLink *link = [vsyncClient getDisplayLink]; + if (@available(iOS 15.0, *)) { + XCTAssertEqual(link.preferredFrameRateRange.maximum, 0); + XCTAssertEqual(link.preferredFrameRateRange.preferred, 0); + XCTAssertEqual(link.preferredFrameRateRange.minimum, 0); + } else if (@available(iOS 10.0, *)) { + XCTAssertEqual(link.preferredFramesPerSecond, 0); + } +} + @end From a285d491604aae5b632942a9bf4cfb6dbb08635d Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 31 Mar 2022 17:26:06 -0700 Subject: [PATCH 03/11] format --- .../framework/Source/VsyncWaiterIosTest.mm | 21 ++++++++++++------- .../ios/framework/Source/vsync_waiter_ios.h | 2 +- .../ios/framework/Source/vsync_waiter_ios.mm | 2 +- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm index 316aeeb5fa59a..20a40b8efb40c 100644 --- a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm +++ b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm @@ -27,7 +27,8 @@ @implementation VsyncWaiterIosTest - (void)testCreate { auto thread_task_runner = CreateNewThread("VsyncWaiterIosTest"); auto callback = [](std::unique_ptr recorder) {}; - VSyncClient* vsyncClient = [[[VSyncClient alloc] initWithTaskRunner:thread_task_runner callback:callback] autorelease]; + VSyncClient* vsyncClient = [[[VSyncClient alloc] initWithTaskRunner:thread_task_runner + callback:callback] autorelease]; XCTAssertNotNil(vsyncClient); } @@ -35,17 +36,19 @@ - (void)testSetCorrectVirableRefreshRates { auto thread_task_runner = CreateNewThread("VsyncWaiterIosTest"); auto callback = [](std::unique_ptr recorder) {}; id bundleMock = OCMPartialMock([NSBundle mainBundle]); - OCMStub([bundleMock objectForInfoDictionaryKey:@"CADisableMinimumFrameDurationOnPhone"]).andReturn(@YES); + OCMStub([bundleMock objectForInfoDictionaryKey:@"CADisableMinimumFrameDurationOnPhone"]) + .andReturn(@YES); id mockDisplayLinkManager = [OCMockObject mockForClass:[DisplayLinkManager class]]; double maxFrameRate = 120; [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate]; - VSyncClient* vsyncClient = [[VSyncClient alloc] initWithTaskRunner:thread_task_runner callback:callback]; - CADisplayLink *link = [vsyncClient getDisplayLink]; + VSyncClient* vsyncClient = [[VSyncClient alloc] initWithTaskRunner:thread_task_runner + callback:callback]; + CADisplayLink* link = [vsyncClient getDisplayLink]; if (@available(iOS 15.0, *)) { XCTAssertEqual(link.preferredFrameRateRange.maximum, maxFrameRate); XCTAssertEqual(link.preferredFrameRateRange.preferred, maxFrameRate); - XCTAssertEqual(link.preferredFrameRateRange.minimum, maxFrameRate/2); + XCTAssertEqual(link.preferredFrameRateRange.minimum, maxFrameRate / 2); } else if (@available(iOS 10.0, *)) { XCTAssertEqual(link.preferredFramesPerSecond, maxFrameRate); } @@ -55,13 +58,15 @@ - (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsN auto thread_task_runner = CreateNewThread("VsyncWaiterIosTest"); auto callback = [](std::unique_ptr recorder) {}; id bundleMock = OCMPartialMock([NSBundle mainBundle]); - OCMStub([bundleMock objectForInfoDictionaryKey:@"CADisableMinimumFrameDurationOnPhone"]).andReturn(@NO); + OCMStub([bundleMock objectForInfoDictionaryKey:@"CADisableMinimumFrameDurationOnPhone"]) + .andReturn(@NO); id mockDisplayLinkManager = [OCMockObject mockForClass:[DisplayLinkManager class]]; double maxFrameRate = 120; [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate]; - VSyncClient* vsyncClient = [[VSyncClient alloc] initWithTaskRunner:thread_task_runner callback:callback]; - CADisplayLink *link = [vsyncClient getDisplayLink]; + VSyncClient* vsyncClient = [[VSyncClient alloc] initWithTaskRunner:thread_task_runner + callback:callback]; + CADisplayLink* link = [vsyncClient getDisplayLink]; if (@available(iOS 15.0, *)) { XCTAssertEqual(link.preferredFrameRateRange.maximum, 0); XCTAssertEqual(link.preferredFrameRateRange.preferred, 0); diff --git a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h index aa77577791c3a..d3ee1548ca784 100644 --- a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h +++ b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h @@ -40,7 +40,7 @@ - (double)getRefreshRate; // For testing only. -- (CADisplayLink *)getDisplayLink; +- (CADisplayLink*)getDisplayLink; @end diff --git a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm index 928afc07f31a7..e635872010815 100644 --- a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm +++ b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm @@ -134,7 +134,7 @@ - (double)getRefreshRate { return current_refresh_rate_; } -- (CADisplayLink *)getDisplayLink { +- (CADisplayLink*)getDisplayLink { return display_link_.get(); } From 9eeee4f339d5da766afbcf679e731e1b40dd8d74 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 31 Mar 2022 17:26:43 -0700 Subject: [PATCH 04/11] gn format --- shell/platform/darwin/ios/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/darwin/ios/BUILD.gn b/shell/platform/darwin/ios/BUILD.gn index 8769de0f72959..0a46c602f94c3 100644 --- a/shell/platform/darwin/ios/BUILD.gn +++ b/shell/platform/darwin/ios/BUILD.gn @@ -208,8 +208,8 @@ source_set("ios_test_flutter_mrc") { "framework/Source/FlutterPlatformPluginTest.mm", "framework/Source/FlutterPlatformViewsTest.mm", "framework/Source/FlutterViewTest.mm", - "framework/Source/accessibility_bridge_test.mm", "framework/Source/VsyncWaiterIosTest.mm", + "framework/Source/accessibility_bridge_test.mm", "platform_message_handler_ios_test.mm", ] deps = [ From 1f420f45c22e264c4ffb5092d126ff07d25ee583 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 1 Apr 2022 10:24:19 -0700 Subject: [PATCH 05/11] review --- .../framework/Source/VsyncWaiterIosTest.mm | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm index 20a40b8efb40c..986985a0c79cb 100644 --- a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm +++ b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm @@ -24,14 +24,6 @@ @interface VsyncWaiterIosTest : XCTestCase @implementation VsyncWaiterIosTest -- (void)testCreate { - auto thread_task_runner = CreateNewThread("VsyncWaiterIosTest"); - auto callback = [](std::unique_ptr recorder) {}; - VSyncClient* vsyncClient = [[[VSyncClient alloc] initWithTaskRunner:thread_task_runner - callback:callback] autorelease]; - XCTAssertNotNil(vsyncClient); -} - - (void)testSetCorrectVirableRefreshRates { auto thread_task_runner = CreateNewThread("VsyncWaiterIosTest"); auto callback = [](std::unique_ptr recorder) {}; @@ -76,4 +68,26 @@ - (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsN } } +- (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsNotSet { + auto thread_task_runner = CreateNewThread("VsyncWaiterIosTest"); + auto callback = [](std::unique_ptr recorder) {}; + // id bundleMock = OCMPartialMock([NSBundle mainBundle]); + // OCMStub([bundleMock objectForInfoDictionaryKey:@"CADisableMinimumFrameDurationOnPhone"]) + // .andReturn(nil); + id mockDisplayLinkManager = [OCMockObject mockForClass:[DisplayLinkManager class]]; + double maxFrameRate = 120; + [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate]; + + VSyncClient* vsyncClient = [[VSyncClient alloc] initWithTaskRunner:thread_task_runner + callback:callback]; + CADisplayLink* link = [vsyncClient getDisplayLink]; + if (@available(iOS 15.0, *)) { + XCTAssertEqual(link.preferredFrameRateRange.maximum, 0); + XCTAssertEqual(link.preferredFrameRateRange.preferred, 0); + XCTAssertEqual(link.preferredFrameRateRange.minimum, 0); + } else if (@available(iOS 10.0, *)) { + XCTAssertEqual(link.preferredFramesPerSecond, 0); + } +} + @end From 4c3dabc798cd7154017ed378fb24358af2320d3d Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 1 Apr 2022 10:24:55 -0700 Subject: [PATCH 06/11] cleanup --- .../platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm | 3 --- 1 file changed, 3 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm index 986985a0c79cb..bf43fc9b6fd22 100644 --- a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm +++ b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm @@ -71,9 +71,6 @@ - (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsN - (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsNotSet { auto thread_task_runner = CreateNewThread("VsyncWaiterIosTest"); auto callback = [](std::unique_ptr recorder) {}; - // id bundleMock = OCMPartialMock([NSBundle mainBundle]); - // OCMStub([bundleMock objectForInfoDictionaryKey:@"CADisableMinimumFrameDurationOnPhone"]) - // .andReturn(nil); id mockDisplayLinkManager = [OCMockObject mockForClass:[DisplayLinkManager class]]; double maxFrameRate = 120; [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate]; From f4fd0d6f1de401ce5c0e88cb80e1831f23378b41 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 1 Apr 2022 10:47:26 -0700 Subject: [PATCH 07/11] fix license --- ci/licenses_golden/licenses_flutter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index b4cf476ac0a4a..c17340afa5ac2 100755 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -1546,6 +1546,7 @@ FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/KeyCodeMap_Int FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/SemanticsObject.h FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm +FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/accessibility_bridge.h FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/accessibility_bridge_ios.h @@ -1561,7 +1562,6 @@ FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/profiler_metri FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/profiler_metrics_ios.mm FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm -FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm FILE: ../../../flutter/shell/platform/darwin/ios/framework/module.modulemap FILE: ../../../flutter/shell/platform/darwin/ios/ios_context.h FILE: ../../../flutter/shell/platform/darwin/ios/ios_context.mm From 400c2e2eb040412ea27f1634667d8d2e3f87e848 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 1 Apr 2022 11:20:46 -0700 Subject: [PATCH 08/11] release --- .../ios/framework/Source/VsyncWaiterIosTest.mm | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm index bf43fc9b6fd22..2da38a4a7a3dd 100644 --- a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm +++ b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm @@ -34,8 +34,8 @@ - (void)testSetCorrectVirableRefreshRates { double maxFrameRate = 120; [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate]; - VSyncClient* vsyncClient = [[VSyncClient alloc] initWithTaskRunner:thread_task_runner - callback:callback]; + VSyncClient* vsyncClient = [[[VSyncClient alloc] initWithTaskRunner:thread_task_runner + callback:callback] autorelease]; CADisplayLink* link = [vsyncClient getDisplayLink]; if (@available(iOS 15.0, *)) { XCTAssertEqual(link.preferredFrameRateRange.maximum, maxFrameRate); @@ -44,6 +44,7 @@ - (void)testSetCorrectVirableRefreshRates { } else if (@available(iOS 10.0, *)) { XCTAssertEqual(link.preferredFramesPerSecond, maxFrameRate); } + [vsyncClient release]; } - (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsNotOn { @@ -56,8 +57,8 @@ - (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsN double maxFrameRate = 120; [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate]; - VSyncClient* vsyncClient = [[VSyncClient alloc] initWithTaskRunner:thread_task_runner - callback:callback]; + VSyncClient* vsyncClient = [[[VSyncClient alloc] initWithTaskRunner:thread_task_runner + callback:callback] autorelease]; CADisplayLink* link = [vsyncClient getDisplayLink]; if (@available(iOS 15.0, *)) { XCTAssertEqual(link.preferredFrameRateRange.maximum, 0); @@ -66,6 +67,7 @@ - (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsN } else if (@available(iOS 10.0, *)) { XCTAssertEqual(link.preferredFramesPerSecond, 0); } + [vsyncClient release]; } - (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsNotSet { @@ -74,9 +76,8 @@ - (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsN id mockDisplayLinkManager = [OCMockObject mockForClass:[DisplayLinkManager class]]; double maxFrameRate = 120; [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate]; - - VSyncClient* vsyncClient = [[VSyncClient alloc] initWithTaskRunner:thread_task_runner - callback:callback]; + VSyncClient* vsyncClient = [[[VSyncClient alloc] initWithTaskRunner:thread_task_runner + callback:callback] autorelease]; CADisplayLink* link = [vsyncClient getDisplayLink]; if (@available(iOS 15.0, *)) { XCTAssertEqual(link.preferredFrameRateRange.maximum, 0); @@ -85,6 +86,7 @@ - (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsN } else if (@available(iOS 10.0, *)) { XCTAssertEqual(link.preferredFramesPerSecond, 0); } + [vsyncClient release]; } @end From 019a38d1baabd5c6b237bb3d78f5f18851c2e264 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 1 Apr 2022 11:21:21 -0700 Subject: [PATCH 09/11] format --- .../darwin/ios/framework/Source/VsyncWaiterIosTest.mm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm index 2da38a4a7a3dd..bb576f10f596a 100644 --- a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm +++ b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm @@ -35,7 +35,7 @@ - (void)testSetCorrectVirableRefreshRates { [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate]; VSyncClient* vsyncClient = [[[VSyncClient alloc] initWithTaskRunner:thread_task_runner - callback:callback] autorelease]; + callback:callback] autorelease]; CADisplayLink* link = [vsyncClient getDisplayLink]; if (@available(iOS 15.0, *)) { XCTAssertEqual(link.preferredFrameRateRange.maximum, maxFrameRate); @@ -58,7 +58,7 @@ - (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsN [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate]; VSyncClient* vsyncClient = [[[VSyncClient alloc] initWithTaskRunner:thread_task_runner - callback:callback] autorelease]; + callback:callback] autorelease]; CADisplayLink* link = [vsyncClient getDisplayLink]; if (@available(iOS 15.0, *)) { XCTAssertEqual(link.preferredFrameRateRange.maximum, 0); @@ -77,7 +77,7 @@ - (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsN double maxFrameRate = 120; [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate]; VSyncClient* vsyncClient = [[[VSyncClient alloc] initWithTaskRunner:thread_task_runner - callback:callback] autorelease]; + callback:callback] autorelease]; CADisplayLink* link = [vsyncClient getDisplayLink]; if (@available(iOS 15.0, *)) { XCTAssertEqual(link.preferredFrameRateRange.maximum, 0); From 683f7404a2e8edf2c3ac31b72a3aaf817e723b5c Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 1 Apr 2022 12:20:14 -0700 Subject: [PATCH 10/11] use category to hide testing only method --- .../darwin/ios/framework/Source/VsyncWaiterIosTest.mm | 6 ++++++ .../platform/darwin/ios/framework/Source/vsync_waiter_ios.h | 3 --- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm index bb576f10f596a..1dedc5c950ced 100644 --- a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm +++ b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm @@ -19,6 +19,12 @@ } } +@interface VSyncClient (Testing) + +- (CADisplayLink*)getDisplayLink; + +@end + @interface VsyncWaiterIosTest : XCTestCase @end diff --git a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h index d3ee1548ca784..9b5d5aa519bd9 100644 --- a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h +++ b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h @@ -39,9 +39,6 @@ - (double)getRefreshRate; -// For testing only. -- (CADisplayLink*)getDisplayLink; - @end namespace flutter { From 844f91972058bbea758cfafb2cac0ef83050aec0 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 1 Apr 2022 12:20:51 -0700 Subject: [PATCH 11/11] fix typo --- .../darwin/ios/framework/Source/VsyncWaiterIosTest.mm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm index 1dedc5c950ced..e264644c2bd25 100644 --- a/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm +++ b/shell/platform/darwin/ios/framework/Source/VsyncWaiterIosTest.mm @@ -30,7 +30,7 @@ @interface VsyncWaiterIosTest : XCTestCase @implementation VsyncWaiterIosTest -- (void)testSetCorrectVirableRefreshRates { +- (void)testSetCorrectVariableRefreshRates { auto thread_task_runner = CreateNewThread("VsyncWaiterIosTest"); auto callback = [](std::unique_ptr recorder) {}; id bundleMock = OCMPartialMock([NSBundle mainBundle]); @@ -53,7 +53,7 @@ - (void)testSetCorrectVirableRefreshRates { [vsyncClient release]; } -- (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsNotOn { +- (void)testDoNotSetVariableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsNotOn { auto thread_task_runner = CreateNewThread("VsyncWaiterIosTest"); auto callback = [](std::unique_ptr recorder) {}; id bundleMock = OCMPartialMock([NSBundle mainBundle]); @@ -76,7 +76,7 @@ - (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsN [vsyncClient release]; } -- (void)testDoNotSetVirableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsNotSet { +- (void)testDoNotSetVariableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsNotSet { auto thread_task_runner = CreateNewThread("VsyncWaiterIosTest"); auto callback = [](std::unique_ptr recorder) {}; id mockDisplayLinkManager = [OCMockObject mockForClass:[DisplayLinkManager class]];