Title: [171529] tags/Safari-600.1.2.1/Source/WebKit2
Revision
171529
Author
bshaf...@apple.com
Date
2014-07-24 15:11:15 -0700 (Thu, 24 Jul 2014)

Log Message

Merged r171201. <rdar://problem/17082607>

Modified Paths

Diff

Modified: tags/Safari-600.1.2.1/Source/WebKit2/ChangeLog (171528 => 171529)


--- tags/Safari-600.1.2.1/Source/WebKit2/ChangeLog	2014-07-24 22:11:12 UTC (rev 171528)
+++ tags/Safari-600.1.2.1/Source/WebKit2/ChangeLog	2014-07-24 22:11:15 UTC (rev 171529)
@@ -1,5 +1,62 @@
 2014-07-24  Babak Shafiei  <bshaf...@apple.com>
 
+        Merge r171201
+
+    2014-07-17  Benjamin Poulain  <benja...@webkit.org>
+
+            [iOS][WK2] Add SPI to do a dynamic viewport update without showing any content
+            https://bugs.webkit.org/show_bug.cgi?id=135010
+
+            Reviewed by Darin Adler.
+
+            This patch add a new SPI, [WKWebView _resizeWhileHidingContentWithUpdates:] to perform all the work
+            of a dynamic viewport size update, but instead of animating the old content, it is hidden.
+
+            The patch is built on top of the animated resize mechanism. Instead of having an animation driving
+            the beginning and end, we let the content do that. The dynamic resize begins, it runs for as long as
+            the WebProcess needs, and it ends when first layer tree commit with the new content is processed.
+
+            The attribute "_isAnimatingResize" is generalized to support two modes of resizing: animated and
+            hiding content.
+
+            The attribute "_hasCommittedLoadForMainFrame" is rather silly. It is only needed because
+            [WKWebView _resizeWhileHidingContentWithUpdates:] is intended to be called a lot before the page
+            is initialized, and doing an animated resize would trash the WebProcess state.
+            I wish I had a better solution, this is not great.
+
+            * UIProcess/API/Cocoa/WKWebView.mm:
+            (-[WKWebView _processDidExit]):
+            (-[WKWebView _didCommitLoadForMainFrame]):
+            (-[WKWebView _didCommitLayerTree:]):
+            This is the key to make this work properly. We want _resizeWhileHidingContentWithUpdates: to behave
+            exactly like an animated resize to avoid bugs. So we went to the whole update mechanism using
+            _resizeAnimationTransformAdjustments to accumulate the adjustments, now we need to restore a correct
+            view state.
+
+            Calling [WKWebView _endAnimatedResize] will do exactly that, but we need to make sure we do not hit
+            the synchronization path or we would be blocked there for a while, which is what we are trying to avoid.
+
+            After r171154, WebPageProxy keeps track of what stage of dynamic viewport update we are in. Since we are
+            executing the layer tree update stage, with the right transaction ID, WebPageProxy already knows we have
+            everything we need and does not use any synchronous messages.
+
+            (-[WKWebView _dynamicViewportUpdateChangedTargetToScale:position:nextValidLayerTreeTransactionID:]):
+            (-[WKWebView _restorePageStateToExposedRect:scale:]):
+            (-[WKWebView _restorePageStateToUnobscuredCenter:scale:]):
+            (-[WKWebView _scrollToContentOffset:]):
+            (-[WKWebView _frameOrBoundsChanged]):
+            (-[WKWebView _updateVisibleContentRects]):
+            (-[WKWebView _setMinimumLayoutSizeOverride:]):
+            (-[WKWebView _setMinimumLayoutSizeOverrideForMinimalUI:]):
+            (-[WKWebView _setInterfaceOrientationOverride:]):
+            (-[WKWebView _setMaximumUnobscuredSizeOverride:]):
+            (-[WKWebView _beginAnimatedResizeWithUpdates:]):
+            (-[WKWebView _endAnimatedResize]):
+            (-[WKWebView _resizeWhileHidingContentWithUpdates:]):
+            * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+
+2014-07-24  Babak Shafiei  <bshaf...@apple.com>
+
         Merge r171518
 
     2014-07-24  Tim Horton  <timothy_hor...@apple.com>

Modified: tags/Safari-600.1.2.1/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (171528 => 171529)


--- tags/Safari-600.1.2.1/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm	2014-07-24 22:11:12 UTC (rev 171528)
+++ tags/Safari-600.1.2.1/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm	2014-07-24 22:11:15 UTC (rev 171529)
@@ -118,6 +118,13 @@
 - (UIViewController *)_rootAncestorViewController;
 - (UIViewController *)_viewControllerForSupportedInterfaceOrientations;
 @end
+
+enum class DynamicViewportUpdateMode {
+    NotResizing,
+    ResizingWithAnimation,
+    ResizingWithDocumentHidden,
+};
+
 #endif
 
 #if PLATFORM(MAC)
@@ -167,9 +174,10 @@
     UIInterfaceOrientation _interfaceOrientationOverride;
     BOOL _overridesInterfaceOrientation;
 
+    BOOL _hasCommittedLoadForMainFrame;
     BOOL _needsResetViewStateAfterCommitLoadForMainFrame;
     uint64_t _firstPaintAfterCommitLoadTransactionID;
-    BOOL _isAnimatingResize;
+    DynamicViewportUpdateMode _dynamicViewportUpdateMode;
     CATransform3D _resizeAnimationTransformAdjustments;
     uint64_t _resizeAnimationTransformTransactionID;
     RetainPtr<UIView> _resizeAnimationView;
@@ -741,14 +749,13 @@
 
 - (void)_processDidExit
 {
-    if (!_customContentView && _isAnimatingResize) {
+    if (!_customContentView && _dynamicViewportUpdateMode != 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;
 
-        _isAnimatingResize = NO;
         _resizeAnimationTransformAdjustments = CATransform3DIdentity;
     }
     [_contentView setFrame:self.bounds];
@@ -757,7 +764,10 @@
     [_scrollView setZoomScale:1];
 
     _viewportMetaTagWidth = -1;
+    _hasCommittedLoadForMainFrame = NO;
     _needsResetViewStateAfterCommitLoadForMainFrame = NO;
+    _dynamicViewportUpdateMode = DynamicViewportUpdateMode::NotResizing;
+    [_contentView setHidden:NO];
     _needsToRestoreExposedRect = NO;
     _needsToRestoreUnobscuredCenter = NO;
     _scrollViewBackgroundColor = WebCore::Color();
@@ -769,6 +779,7 @@
 {
     _firstPaintAfterCommitLoadTransactionID = toRemoteLayerTreeDrawingAreaProxy(_page->drawingArea())->nextLayerTreeTransactionID();
 
+    _hasCommittedLoadForMainFrame = YES;
     _needsResetViewStateAfterCommitLoadForMainFrame = YES;
     _usesMinimalUI = NO;
 }
@@ -805,9 +816,14 @@
     if (_customContentView)
         return;
 
-    if (_isAnimatingResize) {
-        if (layerTreeTransaction.transactionID() >= _resizeAnimationTransformTransactionID)
+    if (_dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing) {
+        if (layerTreeTransaction.transactionID() >= _resizeAnimationTransformTransactionID) {
             [_resizeAnimationView layer].sublayerTransform = _resizeAnimationTransformAdjustments;
+            if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::ResizingWithDocumentHidden) {
+                [_contentView setHidden:NO];
+                [self _endAnimatedResize];
+            }
+        }
         return;
     }
 
@@ -870,7 +886,7 @@
 
 - (void)_dynamicViewportUpdateChangedTargetToScale:(double)newScale position:(CGPoint)newScrollPosition nextValidLayerTreeTransactionID:(uint64_t)nextValidLayerTreeTransactionID
 {
-    if (_isAnimatingResize) {
+    if (_dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing) {
         CGFloat animatingScaleTarget = [[_resizeAnimationView layer] transform].m11;
         double currentTargetScale = animatingScaleTarget * [[_contentView layer] transform].m11;
         double scale = newScale / currentTargetScale;
@@ -887,7 +903,7 @@
 
 - (void)_restorePageStateToExposedRect:(WebCore::FloatRect)exposedRect scale:(double)scale
 {
-    if (_isAnimatingResize)
+    if (_dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing)
         return;
 
     if (_customContentView)
@@ -902,7 +918,7 @@
 
 - (void)_restorePageStateToUnobscuredCenter:(WebCore::FloatPoint)center scale:(double)scale
 {
-    if (_isAnimatingResize)
+    if (_dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing)
         return;
 
     if (_customContentView)
@@ -988,7 +1004,7 @@
 
 - (void)_scrollToContentOffset:(WebCore::FloatPoint)contentOffset
 {
-    if (_isAnimatingResize)
+    if (_dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing)
         return;
 
     WebCore::FloatPoint scaledOffset = contentOffset;
@@ -1333,7 +1349,7 @@
     CGRect bounds = self.bounds;
     [_scrollView setFrame:bounds];
 
-    if (!_isAnimatingResize) {
+    if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::NotResizing) {
         if (!_overridesMinimumLayoutSize)
             _page->setViewportConfigurationMinimumLayoutSize(WebCore::FloatSize(bounds.size));
         if (!_overridesMinimumLayoutSizeForMinimalUI)
@@ -1369,7 +1385,7 @@
         return;
     }
 
-    if (_isAnimatingResize)
+    if (_dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing)
         return;
 
     if (_needsResetViewStateAfterCommitLoadForMainFrame)
@@ -2029,7 +2045,7 @@
         return;
 
     _minimumLayoutSizeOverride = minimumLayoutSizeOverride;
-    if (!_isAnimatingResize)
+    if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::NotResizing)
         _page->setViewportConfigurationMinimumLayoutSize(WebCore::FloatSize(minimumLayoutSizeOverride));
 }
 
@@ -2046,7 +2062,7 @@
         return;
 
     _minimumLayoutSizeOverrideForMinimalUI = size;
-    if (!_isAnimatingResize)
+    if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::NotResizing)
         _page->setViewportConfigurationMinimumLayoutSizeForMinimalUI(WebCore::FloatSize(size));
 }
 
@@ -2084,7 +2100,7 @@
 
     _interfaceOrientationOverride = interfaceOrientation;
 
-    if (!_isAnimatingResize)
+    if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::NotResizing)
         _page->setDeviceOrientation(deviceOrientationForUIInterfaceOrientation(_interfaceOrientationOverride));
 }
 
@@ -2108,7 +2124,7 @@
         return;
 
     _maximumUnobscuredSizeOverride = size;
-    if (!_isAnimatingResize)
+    if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::NotResizing)
         _page->setMaximumUnobscuredSize(WebCore::FloatSize(size));
 }
 
@@ -2137,12 +2153,12 @@
 
 - (void)_beginAnimatedResizeWithUpdates:(void (^)(void))updateBlock
 {
-    if (_customContentView) {
+    if (_customContentView || !_hasCommittedLoadForMainFrame) {
         updateBlock();
         return;
     }
 
-    _isAnimatingResize = YES;
+    _dynamicViewportUpdateMode = DynamicViewportUpdateMode::ResizingWithAnimation;
 
     CGRect oldBounds = self.bounds;
     WebCore::FloatSize oldMinimumLayoutSize = activeMinimumLayoutSize(self, oldBounds);
@@ -2167,7 +2183,7 @@
         && oldMaximumUnobscuredSize == newMaximumUnobscuredSize
         && oldOrientation == newOrientation
         && UIEdgeInsetsEqualToEdgeInsets(oldObscuredInsets, newObscuredInsets)) {
-        _isAnimatingResize = NO;
+        _dynamicViewportUpdateMode = DynamicViewportUpdateMode::NotResizing;
         [self _updateVisibleContentRects];
         return;
     }
@@ -2231,7 +2247,7 @@
 
 - (void)_endAnimatedResize
 {
-    if (!_isAnimatingResize)
+    if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::NotResizing)
         return;
 
     _page->synchronizeDynamicViewportUpdate();
@@ -2269,10 +2285,20 @@
     _resizeAnimationView = nil;
     _resizeAnimationTransformAdjustments = CATransform3DIdentity;
 
-    _isAnimatingResize = NO;
+    _dynamicViewportUpdateMode = DynamicViewportUpdateMode::NotResizing;
+    [_contentView setHidden:NO];
     [self _updateVisibleContentRects];
 }
 
+- (void)_resizeWhileHidingContentWithUpdates:(void (^)(void))updateBlock
+{
+    [self _beginAnimatedResizeWithUpdates:updateBlock];
+    if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::ResizingWithAnimation) {
+        [_contentView setHidden:YES];
+        _dynamicViewportUpdateMode = DynamicViewportUpdateMode::ResizingWithDocumentHidden;
+    }
+}
+
 - (void)_setOverlaidAccessoryViewsInset:(CGSize)inset
 {
     [_customContentView web_setOverlaidAccessoryViewsInset:inset];

Modified: tags/Safari-600.1.2.1/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h (171528 => 171529)


--- tags/Safari-600.1.2.1/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h	2014-07-24 22:11:12 UTC (rev 171528)
+++ tags/Safari-600.1.2.1/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h	2014-07-24 22:11:15 UTC (rev 171529)
@@ -137,6 +137,7 @@
 
 - (void)_beginAnimatedResizeWithUpdates:(void (^)(void))updateBlock;
 - (void)_endAnimatedResize;
+- (void)_resizeWhileHidingContentWithUpdates:(void (^)(void))updateBlock;
 
 - (void)_snapshotRect:(CGRect)rectInViewCoordinates intoImageOfWidth:(CGFloat)imageWidth completionHandler:(void(^)(CGImageRef))completionHandler;
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to