WebKit Bugzilla
Attachment 343371 Details for
Bug 186821
: [Fullscreen] Add a pinch-to-exit gesture
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch for landing
bug-186821-20180622144543.patch (text/plain), 15.76 KB, created by
Jer Noble
on 2018-06-22 14:45:44 PDT
(
hide
)
Description:
Patch for landing
Filename:
MIME Type:
Creator:
Jer Noble
Created:
2018-06-22 14:45:44 PDT
Size:
15.76 KB
patch
obsolete
>Subversion Revision: 233096 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 2f6787ba4e2fc5352496dbb60ff093c39b9620af..6deaf8c57d3c821c94726f756f9d669ba9f257e6 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,32 @@ >+2018-06-19 Jer Noble <jer.noble@apple.com> >+ >+ [Fullscreen] Add a pinch-to-exit gesture >+ https://bugs.webkit.org/show_bug.cgi?id=186821 >+ >+ Reviewed by Tim Horton. >+ >+ Add a pinch gesture recognizer that overrides the pan gesture recognizer when active. Hide the >+ WKFullscreenViewController's controls while a dismiss gesture is active. >+ >+ * UIProcess/ios/fullscreen/WKFullScreenViewController.h: >+ * UIProcess/ios/fullscreen/WKFullScreenViewController.mm: >+ (-[WKFullScreenViewController setAnimating:]): >+ (-[WKFullScreenViewController prefersStatusBarHidden]): >+ (-[WKFullScreenViewController gestureRecognizer:shouldReceiveTouch:]): >+ (-[WKFullScreenViewController _touchDetected:]): >+ * UIProcess/ios/fullscreen/WKFullScreenWindowControllerIOS.mm: >+ (-[WKFullscreenAnimationController context]): >+ (-[WKFullscreenAnimationController updateWithProgress:scale:translation:anchor:]): >+ (-[WKFullScreenInteractiveTransition animator]): >+ (-[WKFullScreenInteractiveTransition updateInteractiveTransition:withScale:andTranslation:]): >+ (-[WKFullScreenWindowController enterFullScreen]): >+ (-[WKFullScreenWindowController beganExitFullScreenWithInitialFrame:finalFrame:]): >+ (-[WKFullScreenWindowController interactionControllerForDismissal:]): >+ (-[WKFullScreenWindowController _startToDismissFullscreenChanged:]): >+ (-[WKFullScreenWindowController _dismissFullscreenViewController]): >+ (-[WKFullScreenWindowController _interactiveDismissChanged:]): >+ (-[WKFullScreenWindowController _interactivePinchDismissChanged:]): >+ > 2018-06-22 Jer Noble <jer.noble@apple.com> > > [Fullscreen] Home indicator should show and hide with status bar >diff --git a/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenViewController.h b/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenViewController.h >index 54fd3284549665beaf6e40249c082b2ecbf83a4a..0fe7f7668b36ea4edf98f1b6f89d1d750520c83b 100644 >--- a/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenViewController.h >+++ b/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenViewController.h >@@ -41,6 +41,7 @@ NS_ASSUME_NONNULL_BEGIN > @property (assign, nonatomic) BOOL prefersHomeIndicatorAutoHidden; > @property (assign, nonatomic, getter=isPlaying) BOOL playing; > @property (assign, nonatomic, getter=isPictureInPictureActive) BOOL pictureInPictureActive; >+@property (assign, nonatomic, getter=isAnimating) BOOL animating; > > - (id)initWithWebView:(WKWebView *)webView; > - (void)showUI; >diff --git a/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenViewController.mm b/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenViewController.mm >index f0fd7f2de30387ed8dca1745f8af69753031c0af..2f210d619fca54378dbd19c358ae86624f70d7ca 100644 >--- a/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenViewController.mm >+++ b/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenViewController.mm >@@ -250,6 +250,19 @@ - (void)setPictureInPictureActive:(BOOL)active > [_pipButton setSelected:active]; > } > >+- (void)setAnimating:(BOOL)animating >+{ >+ if (_animating == animating) >+ return; >+ _animating = animating; >+ [self setNeedsStatusBarAppearanceUpdate]; >+ >+ if (_animating) >+ [self hideUI]; >+ else >+ [self showUI]; >+} >+ > #pragma mark - UIViewController Overrides > > - (void)loadView >@@ -348,7 +361,7 @@ - (UIStatusBarStyle)preferredStatusBarStyle > > - (BOOL)prefersStatusBarHidden > { >- return _prefersStatusBarHidden; >+ return _animating || _prefersStatusBarHidden; > } > > #pragma mark - UIGestureRecognizerDelegate >@@ -360,7 +373,8 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecogni > > - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch > { >- [self showUI]; >+ if (!self.animating) >+ [self showUI]; > return YES; > } > >@@ -419,7 +433,8 @@ - (void)_touchDetected:(id)sender > if (score > requiredScore) > [self _showPhishingAlert]; > } >- [self showUI]; >+ if (!self.animating) >+ [self showUI]; > } > > - (void)_statusBarFrameDidChange:(NSNotificationCenter *)notification >diff --git a/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenWindowControllerIOS.mm b/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenWindowControllerIOS.mm >index 94433e1a0e279c8cdbe2138d4f8213ff197fc61a..d2590f1ba5492e1466c9c4069740562c48a02162 100644 >--- a/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenWindowControllerIOS.mm >+++ b/Source/WebKit/UIProcess/ios/fullscreen/WKFullScreenWindowControllerIOS.mm >@@ -145,6 +145,7 @@ @property (retain, nonatomic) UIViewController* viewController; > @property (nonatomic) CGRect initialFrame; > @property (nonatomic) CGRect finalFrame; > @property (nonatomic, getter=isAnimatingIn) BOOL animatingIn; >+@property (readonly, nonatomic) id<UIViewControllerContextTransitioning> context; > @end > > @implementation WKFullscreenAnimationController { >@@ -167,6 +168,11 @@ - (void)dealloc > [super dealloc]; > } > >+- (id<UIViewControllerContextTransitioning>)context >+{ >+ return _context.get(); >+} >+ > - (void)_createViewsForTransitionContext:(id<UIViewControllerContextTransitioning>)transitionContext > { > _maskView = adoptNS([[UIView alloc] init]); >@@ -274,6 +280,17 @@ - (void)updateWithProgress:(CGFloat)progress > window.backgroundColor = [UIColor colorWithWhite:0 alpha:_initialBackgroundAlpha + progress * (_finalBackgroundAlpha - _initialBackgroundAlpha)]; > } > >+- (void)updateWithProgress:(CGFloat)progress scale:(CGFloat)scale translation:(CGSize)translation anchor:(CGPoint)anchor >+{ >+ CGAffineTransform progressTransform = _initialAnimatingViewTransform; >+ progressTransform = CGAffineTransformScale(progressTransform, scale, scale); >+ progressTransform = CGAffineTransformTranslate(progressTransform, translation.width, translation.height); >+ [_animatingView setTransform:progressTransform]; >+ >+ UIWindow *window = [_animatingView window]; >+ window.backgroundColor = [UIColor colorWithWhite:0 alpha:_initialBackgroundAlpha + progress * (_finalBackgroundAlpha - _initialBackgroundAlpha)]; >+} >+ > - (void)updateWithProgress:(CGFloat)progress translation:(CGSize)translation anchor:(CGPoint)anchor > { > CGAffineTransform progressTransform = _initialAnimatingViewTransform; >@@ -313,6 +330,7 @@ @end > > @interface WKFullScreenInteractiveTransition : NSObject<UIViewControllerInteractiveTransitioning> > - (id)initWithAnimator:(WKFullscreenAnimationController *)animator anchor:(CGPoint)point; >+@property (nonatomic, readonly) WKFullscreenAnimationController *animator; > @end > > @implementation WKFullScreenInteractiveTransition { >@@ -331,6 +349,11 @@ - (id)initWithAnimator:(WKFullscreenAnimationController *)animator anchor:(CGPoi > return self; > } > >+- (WKFullscreenAnimationController *)animator >+{ >+ return _animator.get(); >+} >+ > - (BOOL)wantsInteractiveStart > { > return YES; >@@ -348,6 +371,12 @@ - (void)updateInteractiveTransition:(CGFloat)progress withTranslation:(CGSize)tr > [_context updateInteractiveTransition:progress]; > } > >+- (void)updateInteractiveTransition:(CGFloat)progress withScale:(CGFloat)scale andTranslation:(CGSize)translation >+{ >+ [_animator updateWithProgress:progress scale:scale translation:translation anchor:_anchor]; >+ [_context updateInteractiveTransition:progress]; >+} >+ > - (void)cancelInteractiveTransition > { > [_animator end:YES]; >@@ -395,7 +424,8 @@ @implementation WKFullScreenWindowController { > RetainPtr<UIViewController> _viewControllerForPresentation; > RetainPtr<WKFullScreenViewController> _fullscreenViewController; > RetainPtr<UISwipeGestureRecognizer> _startDismissGestureRecognizer; >- RetainPtr<UIPanGestureRecognizer> _interactiveDismissGestureRecognizer; >+ RetainPtr<UIPanGestureRecognizer> _interactivePanDismissGestureRecognizer; >+ RetainPtr<UIPinchGestureRecognizer> _interactivePinchDismissGestureRecognizer; > RetainPtr<WKFullScreenInteractiveTransition> _interactiveDismissTransitionCoordinator; > > CGRect _initialFrame; >@@ -480,17 +510,22 @@ - (void)enterFullScreen > _fullscreenViewController.get().view.frame = _rootViewController.get().view.bounds; > [self _updateLocationInfo]; > >- _startDismissGestureRecognizer = adoptNS([[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(_startToDismissFullscreenChanged:)]); >+ _startDismissGestureRecognizer = adoptNS([[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(_startToDismissFullscreenChanged:)]); > [_startDismissGestureRecognizer setDelegate:self]; > [_startDismissGestureRecognizer setCancelsTouchesInView:YES]; > [_startDismissGestureRecognizer setNumberOfTouchesRequired:1]; > [_startDismissGestureRecognizer setDirection:UISwipeGestureRecognizerDirectionDown]; > [_fullscreenViewController.get().view addGestureRecognizer:_startDismissGestureRecognizer.get()]; > >- _interactiveDismissGestureRecognizer = adoptNS([[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(_interactiveDismissChanged:)]); >- [_interactiveDismissGestureRecognizer setDelegate:self]; >- [_interactiveDismissGestureRecognizer setCancelsTouchesInView:NO]; >- [_fullscreenViewController.get().view addGestureRecognizer:_interactiveDismissGestureRecognizer.get()]; >+ _interactivePanDismissGestureRecognizer = adoptNS([[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(_interactiveDismissChanged:)]); >+ [_interactivePanDismissGestureRecognizer setDelegate:self]; >+ [_interactivePanDismissGestureRecognizer setCancelsTouchesInView:NO]; >+ [_fullscreenViewController.get().view addGestureRecognizer:_interactivePanDismissGestureRecognizer.get()]; >+ >+ _interactivePinchDismissGestureRecognizer = adoptNS([[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(_interactivePinchDismissChanged:)]); >+ [_interactivePinchDismissGestureRecognizer setDelegate:self]; >+ [_interactivePinchDismissGestureRecognizer setCancelsTouchesInView:NO]; >+ [_fullscreenViewController.get().view addGestureRecognizer:_interactivePinchDismissGestureRecognizer.get()]; > > [self _manager]->saveScrollPosition(); > >@@ -640,12 +675,7 @@ - (void)beganExitFullScreenWithInitialFrame:(CGRect)initialFrame finalFrame:(CGR > return; > } > >- [_fullscreenViewController dismissViewControllerAnimated:YES completion:^{ >- if (![self._webView _page]) >- return; >- >- [self _completedExitFullScreen]; >- }]; >+ [self _dismissFullscreenViewController]; > } > > - (void)_completedExitFullScreen >@@ -774,8 +804,14 @@ - (id<UIViewControllerInteractiveTransitioning>)interactionControllerForDismissa > if (![animator isKindOfClass:[WKFullscreenAnimationController class]]) > return nil; > >- if (!_interactiveDismissTransitionCoordinator) >- _interactiveDismissTransitionCoordinator = adoptNS([[WKFullScreenInteractiveTransition alloc] initWithAnimator:(WKFullscreenAnimationController *)animator anchor:CGPointZero]); >+ if (!_interactiveDismissTransitionCoordinator) { >+ CGPoint anchor = CGPointZero; >+ if (_interactivePanDismissGestureRecognizer.get().state == UIGestureRecognizerStateBegan) >+ anchor = [_interactivePanDismissGestureRecognizer locationInView:_fullscreenViewController.get().view]; >+ else if (_interactivePinchDismissGestureRecognizer.get().state == UIGestureRecognizerStateBegan) >+ anchor = [_interactivePinchDismissGestureRecognizer locationInView:_fullscreenViewController.get().view]; >+ _interactiveDismissTransitionCoordinator = adoptNS([[WKFullScreenInteractiveTransition alloc] initWithAnimator:(WKFullscreenAnimationController *)animator anchor:anchor]); >+ } > > return _interactiveDismissTransitionCoordinator.get(); > } >@@ -901,13 +937,28 @@ - (WebFullScreenManagerProxy*)_manager > > - (void)_startToDismissFullscreenChanged:(id)sender > { >+ if (_inInteractiveDismiss) >+ return; > _inInteractiveDismiss = true; >+ [self _dismissFullscreenViewController]; >+} >+ >+- (void)_dismissFullscreenViewController >+{ >+ [_fullscreenViewController setAnimating:YES]; > [_fullscreenViewController dismissViewControllerAnimated:YES completion:^{ > if (![self._webView _page]) > return; > >+ >+ if (_interactiveDismissTransitionCoordinator.get().animator.context.transitionWasCancelled) { >+ [_fullscreenViewController setAnimating:NO]; >+ return; >+ } >+ >+ _interactiveDismissTransitionCoordinator = nil; >+ > [self _completedExitFullScreen]; >- [_fullscreenViewController setPrefersStatusBarHidden:YES]; > }]; > } > >@@ -916,26 +967,56 @@ - (void)_interactiveDismissChanged:(id)sender > if (!_inInteractiveDismiss) > return; > >- CGPoint translation = [_interactiveDismissGestureRecognizer translationInView:_fullscreenViewController.get().view]; >- CGPoint velocity = [_interactiveDismissGestureRecognizer velocityInView:_fullscreenViewController.get().view]; >+ auto pinchState = [_interactivePinchDismissGestureRecognizer state]; >+ if (pinchState > UIGestureRecognizerStatePossible && pinchState <= UIGestureRecognizerStateEnded) >+ return; >+ >+ CGPoint translation = [_interactivePanDismissGestureRecognizer translationInView:_fullscreenViewController.get().view]; >+ CGPoint velocity = [_interactivePanDismissGestureRecognizer velocityInView:_fullscreenViewController.get().view]; > CGFloat progress = translation.y / (_fullscreenViewController.get().view.bounds.size.height / 2); > progress = std::min(1., std::max(0., progress)); > >- if (_interactiveDismissGestureRecognizer.get().state == UIGestureRecognizerStateEnded) { >+ if (_interactivePanDismissGestureRecognizer.get().state == UIGestureRecognizerStateEnded) { > _inInteractiveDismiss = false; > > if (progress > 0.25 || (progress > 0 && velocity.y > 5)) > [self requestExitFullScreen]; >- else { >+ else > [_interactiveDismissTransitionCoordinator cancelInteractiveTransition]; >- _interactiveDismissTransitionCoordinator = nil; >- } > return; > } > > [_interactiveDismissTransitionCoordinator updateInteractiveTransition:progress withTranslation:CGSizeMake(translation.x, translation.y)]; > } > >+- (void)_interactivePinchDismissChanged:(id)sender >+{ >+ if (!_inInteractiveDismiss && _interactivePinchDismissGestureRecognizer.get().state == UIGestureRecognizerStateBegan) { >+ [self _startToDismissFullscreenChanged:sender]; >+ return; >+ } >+ >+ CGFloat scale = [_interactivePinchDismissGestureRecognizer scale]; >+ CGFloat velocity = [_interactivePinchDismissGestureRecognizer velocity]; >+ CGFloat progress = std::min(1., std::max(0., 1 - scale)); >+ >+ CGPoint translation = CGPointZero; >+ auto panState = [_interactivePanDismissGestureRecognizer state]; >+ if (panState > UIGestureRecognizerStatePossible && panState <= UIGestureRecognizerStateEnded) >+ translation = [_interactivePanDismissGestureRecognizer translationInView:_fullscreenViewController.get().view]; >+ >+ if (_interactivePinchDismissGestureRecognizer.get().state == UIGestureRecognizerStateEnded) { >+ _inInteractiveDismiss = false; >+ if ((progress > 0.05 && velocity < 0.) || velocity < -2.5) >+ [self requestExitFullScreen]; >+ else >+ [_interactiveDismissTransitionCoordinator cancelInteractiveTransition]; >+ return; >+ } >+ >+ [_interactiveDismissTransitionCoordinator updateInteractiveTransition:progress withScale:scale andTranslation:CGSizeMake(translation.x, translation.y)]; >+} >+ > @end > > #endif // PLATFORM(IOS) && ENABLE(FULLSCREEN_API)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 186821
:
343108
|
343248
|
343257
| 343371