Skip to content

Commit

Permalink
[visionOS] Autohide system chrome after entering fullscreen
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=259363
rdar://110958152

Reviewed by Wenson Hsieh.

Autohide system chrome after entering fullscreen, similar to hiding other
fullscreen controls.

Refactor `WKFullScreenViewController` to use the delegate pattern to call into
`WKFullScreenWindowController`, rather than target-action, as there is an
ever-growing list of "actions".

* Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenViewController.h:
* Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenViewController.mm:
(-[WKFullScreenViewController dealloc]):
(-[WKFullScreenViewController delegate]):
(-[WKFullScreenViewController setDelegate:]):
(-[WKFullScreenViewController showUI]):
(-[WKFullScreenViewController hideUI]):
(-[WKFullScreenViewController _cancelAction:]):
(-[WKFullScreenViewController _toggleDimmingAction:]):
* Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenWindowControllerIOS.mm:
(-[WKFullScreenWindowController enterFullScreen:]):
(-[WKFullScreenWindowController toggleDimming]):
(-[WKFullScreenWindowController showUI]):
(-[WKFullScreenWindowController hideUI]):
(-[WKFullScreenWindowController _toggleSceneDimming]): Deleted.

Canonical link: https://commits.webkit.org/266191@main
  • Loading branch information
pxlcoder committed Jul 21, 2023
1 parent b4ee2ca commit 71f8a03
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,17 @@

NS_ASSUME_NONNULL_BEGIN

@interface WKFullScreenViewController : UIViewController
@property (retain, nonatomic) id target;
@property (assign, nonatomic) SEL exitFullScreenAction;
@protocol WKFullScreenViewControllerDelegate
- (void)requestExitFullScreen;
- (void)showUI;
- (void)hideUI;
#if PLATFORM(VISION)
@property (assign, nonatomic) SEL toggleDimmingAction;
- (void)toggleDimming;
#endif
@end

@interface WKFullScreenViewController : UIViewController
@property (nonatomic, weak) id <WKFullScreenViewControllerDelegate> delegate;
@property (copy, nonatomic) NSString *location;
@property (assign, nonatomic) BOOL prefersStatusBarHidden;
@property (assign, nonatomic) BOOL prefersHomeIndicatorAutoHidden;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ @interface WKFullScreenViewController () <UIGestureRecognizerDelegate, UIToolbar

@implementation WKFullScreenViewController {
BOOL _valid;
WeakObjCPtr<id<WKFullScreenViewControllerDelegate>> _delegate;
RetainPtr<UILongPressGestureRecognizer> _touchGestureRecognizer;
RetainPtr<UIView> _animatingView;
RetainPtr<UIStackView> _stackView;
Expand Down Expand Up @@ -209,10 +210,17 @@ - (void)invalidate
- (void)dealloc
{
[self invalidate];
[super dealloc];
}

[_target release];
- (id<WKFullScreenViewControllerDelegate>)delegate
{
return _delegate.get().get();
}

[super dealloc];
- (void)setDelegate:(id<WKFullScreenViewControllerDelegate>)delegate
{
_delegate = delegate;
}

- (void)setSupportedOrientations:(UIInterfaceOrientationMask)supportedOrientations
Expand Down Expand Up @@ -244,6 +252,7 @@ - (void)showUI
[self performSelector:@selector(hideUI) withObject:nil afterDelay:hideDelay];
}
[UIView animateWithDuration:showHideAnimationDuration animations:^{
[[self delegate] showUI];
[_stackView setHidden:NO];
[_stackView setAlpha:1];
self.prefersStatusBarHidden = NO;
Expand All @@ -262,7 +271,7 @@ - (void)hideUI
ASSERT(_valid);
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(hideUI) object:nil];
[UIView animateWithDuration:showHideAnimationDuration animations:^{

[[self delegate] hideUI];
if (_topConstraint)
[NSLayoutConstraint deactivateConstraints:@[_topConstraint.get()]];
_topConstraint = [[_topGuide topAnchor] constraintEqualToAnchor:self.view.topAnchor constant:self.view.safeAreaInsets.top];
Expand Down Expand Up @@ -676,7 +685,7 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive
- (void)_cancelAction:(id)sender
{
ASSERT(_valid);
[[self target] performSelector:[self exitFullScreenAction]];
[[self delegate] requestExitFullScreen];
}

- (void)_togglePiPAction:(id)sender
Expand Down Expand Up @@ -706,7 +715,7 @@ - (void)_togglePiPAction:(id)sender
- (void)_toggleDimmingAction:(id)sender
{
ASSERT(_valid);
[[self target] performSelector:[self toggleDimmingAction]];
[[self delegate] toggleDimming];
}

#endif // PLATFORM(VISION)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,7 @@ - (id)forwardingTargetForSelector:(SEL)aSelector

#pragma mark -

@interface WKFullScreenWindowController () <UIGestureRecognizerDelegate>
@interface WKFullScreenWindowController () <UIGestureRecognizerDelegate, WKFullScreenViewControllerDelegate>
@property (weak, nonatomic) WKWebView *_webView; // Cannot be retained, see <rdar://problem/14884666>.
- (void)placeholderWillMoveToSuperview:(UIView *)superview;
@end
Expand Down Expand Up @@ -770,11 +770,9 @@ - (void)enterFullScreen:(CGSize)videoDimensions
[_fullscreenViewController setModalPresentationStyle:UIModalPresentationCustom];
[_fullscreenViewController setTransitioningDelegate:self];
[_fullscreenViewController setModalPresentationCapturesStatusBarAppearance:YES];
[_fullscreenViewController setTarget:self];
[_fullscreenViewController setExitFullScreenAction:@selector(requestExitFullScreen)];
[_fullscreenViewController setDelegate:self];
_fullscreenViewController.get().view.frame = _rootViewController.get().view.bounds;
#if PLATFORM(VISION)
[_fullscreenViewController setToggleDimmingAction:@selector(_toggleSceneDimming)];
[_fullscreenViewController setSceneDimmed:[self _prefersSceneDimming]];
[_fullscreenViewController hideCustomControls:manager->isVideoElement()];
#endif
Expand Down Expand Up @@ -1632,7 +1630,7 @@ - (void)_performSpatialFullScreenTransition:(BOOL)enter completionHandler:(Compl
} completion:completion.get()];
}

- (void)_toggleSceneDimming
- (void)toggleDimming
{
BOOL updatedPrefersSceneDimming = ![self _prefersSceneDimming];

Expand All @@ -1645,7 +1643,22 @@ - (void)_toggleSceneDimming

#endif // PLATFORM(VISION)

@end
- (void)showUI
{
#if PLATFORM(VISION)
UIWindowScene *scene = [_window windowScene];
scene.mrui_placement.preferredChromeOptions = [_parentWindowState sceneChromeOptions];
#endif
}

- (void)hideUI
{
#if PLATFORM(VISION)
UIWindowScene *scene = [_window windowScene];
scene.mrui_placement.preferredChromeOptions = RSSSceneChromeOptionsNone;
#endif
}

@end

#endif // PLATFORM(IOS_FAMILY) && ENABLE(FULLSCREEN_API)

0 comments on commit 71f8a03

Please sign in to comment.