7 #import <AppKit/AppKit.h>
9 #include "flutter/fml/synchronization/waitable_event.h"
10 #include "flutter/testing/testing.h"
13 void (^
_block)(CFTimeInterval timestamp, CFTimeInterval targetTimestamp);
16 - (instancetype)initWithBlock:(
void (^)(CFTimeInterval timestamp,
17 CFTimeInterval targetTimestamp))block;
22 - (instancetype)initWithBlock:(
void (^__strong)(CFTimeInterval, CFTimeInterval))block {
23 if (
self = [super init]) {
29 - (void)onDisplayLink:(CFTimeInterval)timestamp targetTimestamp:(CFTimeInterval)targetTimestamp {
30 _block(timestamp, targetTimestamp);
35 TEST(FlutterDisplayLinkTest, ViewAddedToWindowFirst) {
36 NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
37 styleMask:NSWindowStyleMaskTitled
38 backing:NSBackingStoreNonretained
40 NSView* view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
41 [window setContentView:view];
43 auto event = std::make_shared<fml::AutoResetWaitableEvent>();
46 initWithBlock:^(CFTimeInterval timestamp, CFTimeInterval targetTimestamp) {
59 TEST(FlutterDisplayLinkTest, ViewAddedToWindowLater) {
60 NSView* view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
62 auto event = std::make_shared<fml::AutoResetWaitableEvent>();
65 initWithBlock:^(CFTimeInterval timestamp, CFTimeInterval targetTimestamp) {
73 NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
74 styleMask:NSWindowStyleMaskTitled
75 backing:NSBackingStoreNonretained
77 [window setContentView:view];
84 TEST(FlutterDisplayLinkTest, ViewRemovedFromWindow) {
85 NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
86 styleMask:NSWindowStyleMaskTitled
87 backing:NSBackingStoreNonretained
89 NSView* view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
90 [window setContentView:view];
92 auto event = std::make_shared<fml::AutoResetWaitableEvent>();
95 initWithBlock:^(CFTimeInterval timestamp, CFTimeInterval targetTimestamp) {
110 [window setContentView:nil];
112 EXPECT_TRUE(event->WaitWithTimeout(fml::TimeDelta::FromMilliseconds(100)));
113 EXPECT_FALSE(event->IsSignaledForTest());
118 TEST(FlutterDisplayLinkTest, WorkaroundForFB13482573) {
119 NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
120 styleMask:NSWindowStyleMaskTitled
121 backing:NSBackingStoreNonretained
123 NSView* view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
124 [window setContentView:view];
126 auto event = std::make_shared<fml::AutoResetWaitableEvent>();
129 initWithBlock:^(CFTimeInterval timestamp, CFTimeInterval targetTimestamp) {
141 [NSThread detachNewThreadWithBlock:^{
144 displayLink.paused = NO;