Flutter macOS Embedder
FlutterDisplayLinkTest.mm File Reference
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterDisplayLink.h"
#import <AppKit/AppKit.h>
#include "flutter/fml/synchronization/waitable_event.h"
#include "flutter/testing/testing.h"

Go to the source code of this file.

Classes

class  TestDisplayLinkDelegate
 

Functions

 TEST (FlutterDisplayLinkTest, ViewAddedToWindowFirst)
 
 TEST (FlutterDisplayLinkTest, ViewAddedToWindowLater)
 
 TEST (FlutterDisplayLinkTest, ViewRemovedFromWindow)
 
 TEST (FlutterDisplayLinkTest, WorkaroundForFB13482573)
 

Function Documentation

◆ TEST() [1/4]

TEST ( FlutterDisplayLinkTest  ,
ViewAddedToWindowFirst   
)

Definition at line 35 of file FlutterDisplayLinkTest.mm.

35  {
36  NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
37  styleMask:NSWindowStyleMaskTitled
38  backing:NSBackingStoreNonretained
39  defer:NO];
40  NSView* view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
41  [window setContentView:view];
42 
43  auto event = std::make_shared<fml::AutoResetWaitableEvent>();
44 
46  initWithBlock:^(CFTimeInterval timestamp, CFTimeInterval targetTimestamp) {
47  event->Signal();
48  }];
49 
50  FlutterDisplayLink* displayLink = [FlutterDisplayLink displayLinkWithView:view];
51  displayLink.delegate = delegate;
52  displayLink.paused = NO;
53 
54  event->Wait();
55 
56  [displayLink invalidate];
57 }

References FlutterDisplayLink::delegate, FlutterDisplayLink::displayLinkWithView:, FlutterDisplayLink::invalidate, and FlutterDisplayLink::paused.

◆ TEST() [2/4]

TEST ( FlutterDisplayLinkTest  ,
ViewAddedToWindowLater   
)

Definition at line 59 of file FlutterDisplayLinkTest.mm.

59  {
60  NSView* view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
61 
62  auto event = std::make_shared<fml::AutoResetWaitableEvent>();
63 
65  initWithBlock:^(CFTimeInterval timestamp, CFTimeInterval targetTimestamp) {
66  event->Signal();
67  }];
68 
69  FlutterDisplayLink* displayLink = [FlutterDisplayLink displayLinkWithView:view];
70  displayLink.delegate = delegate;
71  displayLink.paused = NO;
72 
73  NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
74  styleMask:NSWindowStyleMaskTitled
75  backing:NSBackingStoreNonretained
76  defer:NO];
77  [window setContentView:view];
78 
79  event->Wait();
80 
81  [displayLink invalidate];
82 }

References FlutterDisplayLink::delegate, FlutterDisplayLink::displayLinkWithView:, FlutterDisplayLink::invalidate, and FlutterDisplayLink::paused.

◆ TEST() [3/4]

TEST ( FlutterDisplayLinkTest  ,
ViewRemovedFromWindow   
)

Definition at line 84 of file FlutterDisplayLinkTest.mm.

84  {
85  NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
86  styleMask:NSWindowStyleMaskTitled
87  backing:NSBackingStoreNonretained
88  defer:NO];
89  NSView* view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
90  [window setContentView:view];
91 
92  auto event = std::make_shared<fml::AutoResetWaitableEvent>();
93 
95  initWithBlock:^(CFTimeInterval timestamp, CFTimeInterval targetTimestamp) {
96  event->Signal();
97  }];
98 
99  FlutterDisplayLink* displayLink = [FlutterDisplayLink displayLinkWithView:view];
100  displayLink.delegate = delegate;
101  displayLink.paused = NO;
102 
103  event->Wait();
104  displayLink.paused = YES;
105 
106  event->Reset();
107 
108  displayLink.paused = NO;
109 
110  [window setContentView:nil];
111 
112  EXPECT_TRUE(event->WaitWithTimeout(fml::TimeDelta::FromMilliseconds(100)));
113  EXPECT_FALSE(event->IsSignaledForTest());
114 
115  [displayLink invalidate];
116 }

References FlutterDisplayLink::delegate, FlutterDisplayLink::displayLinkWithView:, FlutterDisplayLink::invalidate, and FlutterDisplayLink::paused.

◆ TEST() [4/4]

TEST ( FlutterDisplayLinkTest  ,
WorkaroundForFB13482573   
)

Definition at line 118 of file FlutterDisplayLinkTest.mm.

118  {
119  NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
120  styleMask:NSWindowStyleMaskTitled
121  backing:NSBackingStoreNonretained
122  defer:NO];
123  NSView* view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
124  [window setContentView:view];
125 
126  auto event = std::make_shared<fml::AutoResetWaitableEvent>();
127 
129  initWithBlock:^(CFTimeInterval timestamp, CFTimeInterval targetTimestamp) {
130  event->Signal();
131  }];
132 
133  FlutterDisplayLink* displayLink = [FlutterDisplayLink displayLinkWithView:view];
134  displayLink.delegate = delegate;
135  displayLink.paused = NO;
136 
137  event->Wait();
138  displayLink.paused = YES;
139 
140  event->Reset();
141  [NSThread detachNewThreadWithBlock:^{
142  // Here pthread_self() will be same as pthread_self inside first invocation of
143  // display link callback, causing CVDisplayLinkStart to return error.
144  displayLink.paused = NO;
145  }];
146 
147  event->Wait();
148 
149  [displayLink invalidate];
150 }

References FlutterDisplayLink::delegate, FlutterDisplayLink::displayLinkWithView:, FlutterDisplayLink::invalidate, and FlutterDisplayLink::paused.