- Revision
- 233971
- Author
- [email protected]
- Date
- 2018-07-18 19:01:06 -0700 (Wed, 18 Jul 2018)
Log Message
Cherry-pick r233927. rdar://problem/42354954
-_beginAnimatedResizeWithUpdates: can leave view in bad state if called during an existing animation
https://bugs.webkit.org/show_bug.cgi?id=187739
Source/WebKit:
Reviewed by Tim Horton.
It's not enough to reset _dynamicViewportUpdateMode to NotResizing; other parts of the code
check whether _resizeAnimationView is non-nil, the contentView may be hidden, etc. Add a new
internal method _cancelAnimatedResize that cleans up state when a call to
_beginAnimatedResizeWithUpdates: fails.
* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _processDidExit]):
(-[WKWebView _cancelAnimatedResize]):
(-[WKWebView _didCompleteAnimatedResize]):
(-[WKWebView _beginAnimatedResizeWithUpdates:]):
Tools:
<rdar://problem/42304518>
Reviewed by Tim Horton.
* TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm:
(TEST):
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233927 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Modified Paths
Diff
Modified: branches/safari-606-branch/Source/WebKit/ChangeLog (233970 => 233971)
--- branches/safari-606-branch/Source/WebKit/ChangeLog 2018-07-19 02:01:03 UTC (rev 233970)
+++ branches/safari-606-branch/Source/WebKit/ChangeLog 2018-07-19 02:01:06 UTC (rev 233971)
@@ -1,5 +1,56 @@
2018-07-18 Babak Shafiei <[email protected]>
+ Cherry-pick r233927. rdar://problem/42354954
+
+ -_beginAnimatedResizeWithUpdates: can leave view in bad state if called during an existing animation
+ https://bugs.webkit.org/show_bug.cgi?id=187739
+ Source/WebKit:
+
+ Reviewed by Tim Horton.
+
+ It's not enough to reset _dynamicViewportUpdateMode to NotResizing; other parts of the code
+ check whether _resizeAnimationView is non-nil, the contentView may be hidden, etc. Add a new
+ internal method _cancelAnimatedResize that cleans up state when a call to
+ _beginAnimatedResizeWithUpdates: fails.
+
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView _processDidExit]):
+ (-[WKWebView _cancelAnimatedResize]):
+ (-[WKWebView _didCompleteAnimatedResize]):
+ (-[WKWebView _beginAnimatedResizeWithUpdates:]):
+
+ Tools:
+
+ <rdar://problem/42304518>
+
+ Reviewed by Tim Horton.
+
+ * TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm:
+ (TEST):
+
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233927 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2018-07-18 Jer Noble <[email protected]>
+
+ -_beginAnimatedResizeWithUpdates: can leave view in bad state if called during an existing animation
+ https://bugs.webkit.org/show_bug.cgi?id=187739
+
+ Reviewed by Tim Horton.
+
+ It's not enough to reset _dynamicViewportUpdateMode to NotResizing; other parts of the code
+ check whether _resizeAnimationView is non-nil, the contentView may be hidden, etc. Add a new
+ internal method _cancelAnimatedResize that cleans up state when a call to
+ _beginAnimatedResizeWithUpdates: fails.
+
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView _processDidExit]):
+ (-[WKWebView _cancelAnimatedResize]):
+ (-[WKWebView _didCompleteAnimatedResize]):
+ (-[WKWebView _beginAnimatedResizeWithUpdates:]):
+
+2018-07-18 Babak Shafiei <[email protected]>
+
Cherry-pick r233926. rdar://problem/42354941
PiP from Element Fullscreen should match AVKit's behavior
Modified: branches/safari-606-branch/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (233970 => 233971)
--- branches/safari-606-branch/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2018-07-19 02:01:03 UTC (rev 233970)
+++ branches/safari-606-branch/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2018-07-19 02:01:06 UTC (rev 233971)
@@ -1658,15 +1658,7 @@
{
RELEASE_LOG_IF_ALLOWED("%p -[WKWebView _processDidExit]", self);
[self _hidePasswordView];
- if (!_customContentView && _dynamicViewportUpdateMode != WebKit::DynamicViewportUpdateMode::NotResizing) {
- NSUInteger indexOfResizeAnimationView = [[_scrollView subviews] indexOfObject:_resizeAnimationView.get()];
- [_scrollView insertSubview:_contentView.get() atIndex:indexOfResizeAnimationView];
- [_scrollView insertSubview:[_contentView unscaledView] atIndex:indexOfResizeAnimationView + 1];
- [_resizeAnimationView removeFromSuperview];
- _resizeAnimationView = nil;
-
- _resizeAnimationTransformAdjustments = CATransform3DIdentity;
- }
+ [self _cancelAnimatedResize];
[_contentView setFrame:self.bounds];
[_scrollView setBackgroundColor:[UIColor whiteColor]];
[_scrollView setContentOffset:[self _initialContentOffsetForScrollView]];
@@ -2889,6 +2881,29 @@
return webView->_overridesInterfaceOrientation ? deviceOrientationForUIInterfaceOrientation(webView->_interfaceOrientationOverride) : webView->_page->deviceOrientation();
}
+- (void)_cancelAnimatedResize
+{
+ LOG_WITH_STREAM(VisibleRects, stream << "-[WKWebView " << _page->pageID() << " _cancelAnimatedResize:] " << " _dynamicViewportUpdateMode " << (int)_dynamicViewportUpdateMode);
+ if (_dynamicViewportUpdateMode == WebKit::DynamicViewportUpdateMode::NotResizing)
+ return;
+
+ if (!_customContentView) {
+ if (_resizeAnimationView) {
+ NSUInteger indexOfResizeAnimationView = [[_scrollView subviews] indexOfObject:_resizeAnimationView.get()];
+ [_scrollView insertSubview:_contentView.get() atIndex:indexOfResizeAnimationView];
+ [_scrollView insertSubview:[_contentView unscaledView] atIndex:indexOfResizeAnimationView + 1];
+ [_resizeAnimationView removeFromSuperview];
+ _resizeAnimationView = nil;
+ }
+
+ [_contentView setHidden:NO];
+ _resizeAnimationTransformAdjustments = CATransform3DIdentity;
+ }
+
+ _dynamicViewportUpdateMode = WebKit::DynamicViewportUpdateMode::NotResizing;
+ [self _scheduleVisibleContentRectUpdate];
+}
+
- (void)_didCompleteAnimatedResize
{
if (_dynamicViewportUpdateMode == WebKit::DynamicViewportUpdateMode::NotResizing)
@@ -2899,7 +2914,7 @@
if (!_resizeAnimationView) {
// Paranoia. If _resizeAnimationView is null we'll end up setting a zero scale on the content view.
RELEASE_LOG_IF_ALLOWED("%p -[WKWebView _didCompleteAnimatedResize:] - _resizeAnimationView is nil", self);
- _dynamicViewportUpdateMode = WebKit::DynamicViewportUpdateMode::NotResizing;
+ [self _cancelAnimatedResize];
return;
}
@@ -5297,7 +5312,7 @@
ASSERT_WITH_MESSAGE(!(_overridesViewLayoutSize && newViewLayoutSize.isEmpty()), "Clients controlling the layout size should maintain a valid layout size to minimize layouts.");
if (CGRectIsEmpty(newBounds) || newViewLayoutSize.isEmpty() || CGRectIsEmpty(futureUnobscuredRectInSelfCoordinates) || CGRectIsEmpty(contentViewBounds)) {
- _dynamicViewportUpdateMode = WebKit::DynamicViewportUpdateMode::NotResizing;
+ [self _cancelAnimatedResize];
[self _frameOrBoundsChanged];
if (_overridesViewLayoutSize)
[self _dispatchSetViewLayoutSize:newViewLayoutSize];
@@ -5306,7 +5321,6 @@
if (_overridesInterfaceOrientation)
[self _dispatchSetDeviceOrientation:newOrientation];
- [self _scheduleVisibleContentRectUpdate];
return;
}
@@ -5315,8 +5329,7 @@
&& oldMaximumUnobscuredSize == newMaximumUnobscuredSize
&& oldOrientation == newOrientation
&& UIEdgeInsetsEqualToEdgeInsets(oldObscuredInsets, newObscuredInsets)) {
- _dynamicViewportUpdateMode = WebKit::DynamicViewportUpdateMode::NotResizing;
- [self _scheduleVisibleContentRectUpdate];
+ [self _cancelAnimatedResize];
return;
}
Modified: branches/safari-606-branch/Tools/ChangeLog (233970 => 233971)
--- branches/safari-606-branch/Tools/ChangeLog 2018-07-19 02:01:03 UTC (rev 233970)
+++ branches/safari-606-branch/Tools/ChangeLog 2018-07-19 02:01:06 UTC (rev 233971)
@@ -1,5 +1,49 @@
2018-07-18 Babak Shafiei <[email protected]>
+ Cherry-pick r233927. rdar://problem/42354954
+
+ -_beginAnimatedResizeWithUpdates: can leave view in bad state if called during an existing animation
+ https://bugs.webkit.org/show_bug.cgi?id=187739
+ Source/WebKit:
+
+ Reviewed by Tim Horton.
+
+ It's not enough to reset _dynamicViewportUpdateMode to NotResizing; other parts of the code
+ check whether _resizeAnimationView is non-nil, the contentView may be hidden, etc. Add a new
+ internal method _cancelAnimatedResize that cleans up state when a call to
+ _beginAnimatedResizeWithUpdates: fails.
+
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView _processDidExit]):
+ (-[WKWebView _cancelAnimatedResize]):
+ (-[WKWebView _didCompleteAnimatedResize]):
+ (-[WKWebView _beginAnimatedResizeWithUpdates:]):
+
+ Tools:
+
+ <rdar://problem/42304518>
+
+ Reviewed by Tim Horton.
+
+ * TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm:
+ (TEST):
+
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233927 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2018-07-18 Jer Noble <[email protected]>
+
+ -_beginAnimatedResizeWithUpdates: can leave view in bad state if called during an existing animation
+ https://bugs.webkit.org/show_bug.cgi?id=187739
+ <rdar://problem/42304518>
+
+ Reviewed by Tim Horton.
+
+ * TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm:
+ (TEST):
+
+2018-07-18 Babak Shafiei <[email protected]>
+
Cherry-pick r233926. rdar://problem/42354941
PiP from Element Fullscreen should match AVKit's behavior
Modified: branches/safari-606-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm (233970 => 233971)
--- branches/safari-606-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm 2018-07-19 02:01:03 UTC (rev 233970)
+++ branches/safari-606-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm 2018-07-19 02:01:06 UTC (rev 233971)
@@ -347,7 +347,51 @@
EXPECT_FALSE(contentView.hidden);
}
+TEST(WebKit, ResizeWithContentHiddenWithSubsequentNoOpResizeCompletes)
+{
+ auto webView = createAnimatedResizeWebView();
+ [webView setUIDelegate:webView.get()];
+ [webView loadHTMLString:@"<head><meta name='viewport' content='initial-scale=1'></head>" baseURL:nil];
+ auto navigationDelegate = adoptNS([[TestNavigationDelegate alloc] init]);
+ webView.get().navigationDelegate = navigationDelegate.get();
+ [navigationDelegate waitForDidFinishNavigation];
+
+ auto window = adoptNS([[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 800, 600)]);
+ [window addSubview:webView.get()];
+ [window setHidden:NO];
+
+ [webView _resizeWhileHidingContentWithUpdates:^{
+ [webView setFrame:CGRectMake(0, 0, 100, 200)];
+ }];
+
+ [webView _beginAnimatedResizeWithUpdates:^{
+ [webView setFrame:CGRectMake(0, 0, 100, 200)];
+ }];
+
+ __block bool didReadLayoutSize = false;
+ [webView _doAfterNextPresentationUpdate:^{
+ [webView evaluateJavaScript:@"[window.innerWidth, window.innerHeight]" completionHandler:^(id value, NSError *error) {
+ CGFloat innerWidth = [[value objectAtIndex:0] floatValue];
+ CGFloat innerHeight = [[value objectAtIndex:1] floatValue];
+
+ EXPECT_EQ(innerWidth, 100);
+ EXPECT_EQ(innerHeight, 200);
+
+ didReadLayoutSize = true;
+ }];
+ }];
+ TestWebKitAPI::Util::run(&didReadLayoutSize);
+
+ UIView *scrollView = immediateSubviewOfClass(webView.get(), NSClassFromString(@"WKScrollView"));
+ UIView *contentView = immediateSubviewOfClass(scrollView, NSClassFromString(@"WKContentView"));
+
+ // Make sure that we've put the view hierarchy back together after the resize completed.
+ EXPECT_NOT_NULL(scrollView);
+ EXPECT_NOT_NULL(contentView);
+ EXPECT_FALSE(contentView.hidden);
+}
+
TEST(WebKit, AnimatedResizeBlocksDoAfterNextPresentationUpdate)
{
auto webView = createAnimatedResizeWebView();