blob: 2258820e34a3bc51809d5252f3736deaafa8f207 [file] [log] [blame]
// Copyright 2015 The Chromium 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 "ui/base/test/nswindow_fullscreen_notification_waiter.h"
@interface NSWindowFullscreenNotificationWaiter ()
// Exit the RunLoop if there is one and the counts being tracked match.
- (void)maybeQuitForChangedArg:(int*)changedArg;
- (void)onEnter:(NSNotification*)notification;
- (void)onExit:(NSNotification*)notification;
@end
@implementation NSWindowFullscreenNotificationWaiter
@synthesize enterCount = _enterCount;
@synthesize exitCount = _exitCount;
- (instancetype)initWithWindow:(NSWindow*)window {
if ((self = [super init])) {
_window.reset([window retain]);
NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self
selector:@selector(onEnter:)
name:NSWindowDidEnterFullScreenNotification
object:window];
[defaultCenter addObserver:self
selector:@selector(onExit:)
name:NSWindowDidExitFullScreenNotification
object:window];
}
return self;
}
- (void)dealloc {
DCHECK(!_runLoop);
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
- (void)waitForEnterCount:(int)enterCount exitCount:(int)exitCount {
if (_enterCount >= enterCount && _exitCount >= exitCount)
return;
_targetEnterCount = enterCount;
_targetExitCount = exitCount;
_runLoop = std::make_unique<base::RunLoop>();
_runLoop->Run();
_runLoop.reset();
}
- (void)maybeQuitForChangedArg:(int*)changedArg {
++*changedArg;
if (!_runLoop)
return;
if (_enterCount >= _targetEnterCount && _exitCount >= _targetExitCount)
_runLoop->Quit();
}
- (void)onEnter:(NSNotification*)notification {
[self maybeQuitForChangedArg:&_enterCount];
}
- (void)onExit:(NSNotification*)notification {
[self maybeQuitForChangedArg:&_exitCount];
}
@end