Diff
Modified: trunk/Source/WebKit/ChangeLog (232543 => 232544)
--- trunk/Source/WebKit/ChangeLog 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/ChangeLog 2018-06-06 16:32:26 UTC (rev 232544)
@@ -1,3 +1,88 @@
+2018-06-06 Tim Horton <[email protected]>
+
+ Move animated resize into the layer tree transaction, and make it asynchronous
+ https://bugs.webkit.org/show_bug.cgi?id=186130
+ <rdar://problem/38477288>
+
+ Reviewed by Simon Fraser.
+
+ * Shared/RemoteLayerTree/RemoteLayerTreeTransaction.h:
+ (WebKit::RemoteLayerTreeTransaction::setScrollPosition):
+ (WebKit::RemoteLayerTreeTransaction::dynamicViewportSizeUpdateID const):
+ (WebKit::RemoteLayerTreeTransaction::setDynamicViewportSizeUpdateID):
+ * Shared/RemoteLayerTree/RemoteLayerTreeTransaction.mm:
+ (WebKit::RemoteLayerTreeTransaction::encode const):
+ (WebKit::RemoteLayerTreeTransaction::decode):
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::willCommitLayerTree):
+ Add scrollPosition to the transaction on all platforms, not just Mac.
+ Add the optional dynamicViewportSizeUpdateID to the transaction, representing
+ the most recent dynamicViewportSizeUpdate that commit contains, if any.
+
+ * Shared/ios/DynamicViewportSizeUpdate.h:
+ Added a typedef for DynamicViewportSizeUpdateID, and move the mode enum here.
+
+ * UIProcess/ios/PageClientImplIOS.h:
+ * UIProcess/ios/PageClientImplIOS.mm:
+ (WebKit::PageClientImpl::dynamicViewportUpdateChangedTarget): Deleted.
+ * UIProcess/PageClient.h:
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::resetState):
+ * UIProcess/WebPageProxy.h:
+ * UIProcess/WebPageProxy.messages.in:
+ * UIProcess/ios/WebPageProxyIOS.mm:
+ (WebKit::WebPageProxy::dynamicViewportSizeUpdate):
+ (WebKit::WebPageProxy::didCommitLayerTree):
+ (WebKit::WebPageProxy::synchronizeDynamicViewportUpdate): Deleted.
+ (WebKit::WebPageProxy::dynamicViewportUpdateChangedTarget): Deleted.
+ * WebProcess/WebPage/WebPage.h:
+ * WebProcess/WebPage/WebPage.messages.in:
+ * WebProcess/WebPage/ios/WebPageIOS.mm:
+ (WebKit::WebPage::dynamicViewportSizeUpdate):
+ (WebKit::WebPage::synchronizeDynamicViewportUpdate): Deleted.
+ Remove dynamicViewportUpdateChangedTarget and synchronizeDynamicViewportUpdate.
+ Move dynamicViewportSizeUpdateID maintenance into WKWebView.
+
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView _processDidExit]):
+ Remove _resizeAnimationTransformTransactionID. We now instead pack
+ the resize ID inside the transaction, instead of separately sending
+ back a transaction ID to wait for.
+
+ (-[WKWebView _didCommitLayerTreeDuringAnimatedResize:]):
+ (-[WKWebView _didCommitLayerTree:]):
+ Added, factored out of _didCommitLayerTree:.
+ If the transaction includes the result of the most recently-sent resize,
+ store the requisite adjustments required to counter the new scale and
+ scroll offset, update the resizeAnimationView, and, if endAnimatedResize
+ has already been called, call _didCompleteAnimatedResize to tear down
+ the animation view and put things back together.
+
+ Add some code so that if a commit arrives before the resize, we update
+ the scale of the resize animation view to keep the width fitting.
+
+ (activeMaximumUnobscuredSize):
+ (activeOrientation):
+ Move these because the code that depends on them moved.
+
+ (-[WKWebView _didCompleteAnimatedResize]):
+ Broken out of _endAnimatedResize. This can now be called from
+ either endAnimatedResize or _didCommitLayerTreeDuringAnimatedResize,
+ depending on which is called first.
+
+ (-[WKWebView _beginAnimatedResizeWithUpdates:]):
+ Don't create a new resize view if we still have one. Otherwise, we'll
+ get the view ordering all wrong when making the second one. This
+ didn't previously cause trouble, because we don't have a lot of
+ WKScrollView subviews, but it totally could.
+
+ Adopt _initialContentOffsetForScrollView just to make this code more clear.
+
+ (-[WKWebView _endAnimatedResize]):
+ (-[WKWebView _dynamicViewportUpdateChangedTargetToScale:position:nextValidLayerTreeTransactionID:]): Deleted.
+ * UIProcess/API/Cocoa/WKWebViewInternal.h:
+
+
2018-06-05 Per Arne Vollan <[email protected]>
Move OpenGL display mask to screen data struct.
Modified: trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreeTransaction.h (232543 => 232544)
--- trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreeTransaction.h 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreeTransaction.h 2018-06-06 16:32:26 UTC (rev 232544)
@@ -25,6 +25,7 @@
#pragma once
+#include "DynamicViewportSizeUpdate.h"
#include "EditorState.h"
#include "GenericCallback.h"
#include "PlatformCAAnimationRemote.h"
@@ -218,10 +219,8 @@
WebCore::Color pageExtendedBackgroundColor() const { return m_pageExtendedBackgroundColor; }
void setPageExtendedBackgroundColor(WebCore::Color color) { m_pageExtendedBackgroundColor = color; }
-#if PLATFORM(MAC)
WebCore::IntPoint scrollPosition() const { return m_scrollPosition; }
void setScrollPosition(WebCore::IntPoint p) { m_scrollPosition = p; }
-#endif
double pageScaleFactor() const { return m_pageScaleFactor; }
void setPageScaleFactor(double pageScaleFactor) { m_pageScaleFactor = pageScaleFactor; }
@@ -272,6 +271,9 @@
bool hasEditorState() const { return !!m_editorState; }
const EditorState& editorState() const { return m_editorState.value(); }
void setEditorState(const EditorState& editorState) { m_editorState = editorState; }
+
+ std::optional<DynamicViewportSizeUpdateID> dynamicViewportSizeUpdateID() const { return m_dynamicViewportSizeUpdateID; }
+ void setDynamicViewportSizeUpdateID(DynamicViewportSizeUpdateID resizeID) { m_dynamicViewportSizeUpdateID = resizeID; }
private:
WebCore::GraphicsLayer::PlatformLayerID m_rootLayerID;
@@ -290,9 +292,7 @@
WebCore::LayoutSize m_baseLayoutViewportSize;
WebCore::LayoutPoint m_minStableLayoutViewportOrigin;
WebCore::LayoutPoint m_maxStableLayoutViewportOrigin;
-#if PLATFORM(MAC)
WebCore::IntPoint m_scrollPosition;
-#endif
WebCore::Color m_pageExtendedBackgroundColor;
double m_pageScaleFactor { 1 };
double m_minimumScaleFactor { 1 };
@@ -309,7 +309,8 @@
bool m_viewportMetaTagCameFromImageDocument { false };
bool m_isInStableState { false };
- std::optional<EditorState> m_editorState { std::nullopt };
+ std::optional<EditorState> m_editorState;
+ std::optional<DynamicViewportSizeUpdateID> m_dynamicViewportSizeUpdateID;
};
} // namespace WebKit
Modified: trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreeTransaction.mm (232543 => 232544)
--- trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreeTransaction.mm 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreeTransaction.mm 2018-06-06 16:32:26 UTC (rev 232544)
@@ -533,9 +533,8 @@
encoder << m_minStableLayoutViewportOrigin;
encoder << m_maxStableLayoutViewportOrigin;
-#if PLATFORM(MAC)
encoder << m_scrollPosition;
-#endif
+
encoder << m_pageExtendedBackgroundColor;
encoder << m_pageScaleFactor;
encoder << m_minimumScaleFactor;
@@ -563,6 +562,8 @@
encoder << hasEditorState();
if (m_editorState)
encoder << *m_editorState;
+
+ encoder << m_dynamicViewportSizeUpdateID;
}
bool RemoteLayerTreeTransaction::decode(IPC::Decoder& decoder, RemoteLayerTreeTransaction& result)
@@ -624,11 +625,9 @@
if (!decoder.decode(result.m_maxStableLayoutViewportOrigin))
return false;
-
-#if PLATFORM(MAC)
+
if (!decoder.decode(result.m_scrollPosition))
return false;
-#endif
if (!decoder.decode(result.m_pageExtendedBackgroundColor))
return false;
@@ -692,6 +691,9 @@
result.setEditorState(editorState);
}
+ if (!decoder.decode(result.m_dynamicViewportSizeUpdateID))
+ return false;
+
return true;
}
Added: trunk/Source/WebKit/Shared/ios/DynamicViewportSizeUpdate.h (0 => 232544)
--- trunk/Source/WebKit/Shared/ios/DynamicViewportSizeUpdate.h (rev 0)
+++ trunk/Source/WebKit/Shared/ios/DynamicViewportSizeUpdate.h 2018-06-06 16:32:26 UTC (rev 232544)
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2018 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+namespace WebKit {
+
+typedef uint64_t DynamicViewportSizeUpdateID;
+
+enum class DynamicViewportUpdateMode {
+ NotResizing,
+ ResizingWithAnimation,
+ ResizingWithDocumentHidden,
+};
+
+} // namespace WebKit
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (232543 => 232544)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2018-06-06 16:32:26 UTC (rev 232544)
@@ -33,6 +33,7 @@
#import "APISerializedScriptValue.h"
#import "CompletionHandlerCallChecker.h"
#import "DiagnosticLoggingClient.h"
+#import "DynamicViewportSizeUpdate.h"
#import "FindClient.h"
#import "FrontBoardServicesSPI.h"
#import "FullscreenClient.h"
@@ -176,12 +177,6 @@
- (UIViewController *)_viewControllerForSupportedInterfaceOrientations;
@end
-enum class DynamicViewportUpdateMode {
- NotResizing,
- ResizingWithAnimation,
- ResizingWithDocumentHidden,
-};
-
#endif // PLATFORM(IOS)
#if PLATFORM(IOS)
@@ -311,9 +306,10 @@
BOOL _hasCommittedLoadForMainFrame;
BOOL _needsResetViewStateAfterCommitLoadForMainFrame;
uint64_t _firstPaintAfterCommitLoadTransactionID;
- DynamicViewportUpdateMode _dynamicViewportUpdateMode;
+ WebKit::DynamicViewportUpdateMode _dynamicViewportUpdateMode;
+ WebKit::DynamicViewportSizeUpdateID _currentDynamicViewportSizeUpdateID;
CATransform3D _resizeAnimationTransformAdjustments;
- std::optional<uint64_t> _resizeAnimationTransformTransactionID;
+ CGFloat _animatedResizeOriginalContentWidth;
RetainPtr<UIView> _resizeAnimationView;
CGFloat _lastAdjustmentForScroller;
std::optional<CGRect> _frozenVisibleContentRect;
@@ -348,6 +344,8 @@
BOOL _hadDelayedUpdateVisibleContentRects;
int _activeAnimatedResizeCount;
+ BOOL _waitingForEndAnimatedResize;
+ BOOL _waitingForCommitAfterAnimatedResize;
Vector<WTF::Function<void ()>> _snapshotsDeferredDuringResize;
RetainPtr<NSMutableArray> _stableStatePresentationUpdateCallbacks;
@@ -357,15 +355,13 @@
BOOL _hasScheduledVisibleRectUpdate;
BOOL _visibleContentRectUpdateScheduledFromScrollViewInStableState;
Vector<BlockPtr<void ()>> _visibleContentRectUpdateCallbacks;
+
+ _WKDragInteractionPolicy _dragInteractionPolicy;
#endif
#if PLATFORM(MAC)
std::unique_ptr<WebKit::WebViewImpl> _impl;
RetainPtr<WKTextFinderClient> _textFinderClient;
#endif
-
-#if PLATFORM(IOS)
- _WKDragInteractionPolicy _dragInteractionPolicy;
-#endif
}
- (instancetype)initWithFrame:(CGRect)frame
@@ -1663,7 +1659,7 @@
- (void)_processDidExit
{
[self _hidePasswordView];
- if (!_customContentView && _dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing) {
+ 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];
@@ -1681,7 +1677,10 @@
_initialScaleFactor = 1;
_hasCommittedLoadForMainFrame = NO;
_needsResetViewStateAfterCommitLoadForMainFrame = NO;
- _dynamicViewportUpdateMode = DynamicViewportUpdateMode::NotResizing;
+ _dynamicViewportUpdateMode = WebKit::DynamicViewportUpdateMode::NotResizing;
+ _waitingForEndAnimatedResize = NO;
+ _waitingForCommitAfterAnimatedResize = NO;
+ _animatedResizeOriginalContentWidth = 0;
[_contentView setHidden:NO];
_scrollOffsetToRestore = std::nullopt;
_unobscuredCenterToRestore = std::nullopt;
@@ -1697,7 +1696,6 @@
_firstPaintAfterCommitLoadTransactionID = 0;
_firstTransactionIDAfterPageRestore = std::nullopt;
- _resizeAnimationTransformTransactionID = std::nullopt;
_hasScheduledVisibleRectUpdate = NO;
_commitDidRestoreScrollPosition = NO;
@@ -1753,6 +1751,49 @@
return WTF::areEssentiallyEqual(a, b);
}
+- (void)_didCommitLayerTreeDuringAnimatedResize:(const WebKit::RemoteLayerTreeTransaction&)layerTreeTransaction
+{
+ auto updateID = layerTreeTransaction.dynamicViewportSizeUpdateID();
+ if (updateID && *updateID == _currentDynamicViewportSizeUpdateID) {
+ double pageScale = layerTreeTransaction.pageScaleFactor();
+ WebCore::IntPoint scrollPosition = layerTreeTransaction.scrollPosition();
+
+ CGFloat animatingScaleTarget = [[_resizeAnimationView layer] transform].m11;
+ double currentTargetScale = animatingScaleTarget * [[_contentView layer] transform].m11;
+ double scale = pageScale / currentTargetScale;
+ _resizeAnimationTransformAdjustments = CATransform3DMakeScale(scale, scale, 1);
+
+ CGPoint newContentOffset = [self _contentOffsetAdjustedForObscuredInset:CGPointMake(scrollPosition.x() * pageScale, scrollPosition.y() * pageScale)];
+ CGPoint currentContentOffset = [_scrollView contentOffset];
+
+ _resizeAnimationTransformAdjustments.m41 = (currentContentOffset.x - newContentOffset.x) / animatingScaleTarget;
+ _resizeAnimationTransformAdjustments.m42 = (currentContentOffset.y - newContentOffset.y) / animatingScaleTarget;
+
+ [_resizeAnimationView layer].sublayerTransform = _resizeAnimationTransformAdjustments;
+
+ // If we've already passed endAnimatedResize, immediately complete
+ // the resize when we have an up-to-date layer tree. Otherwise,
+ // we will defer completion until endAnimatedResize.
+ _waitingForCommitAfterAnimatedResize = NO;
+ if (!_waitingForEndAnimatedResize)
+ [self _didCompleteAnimatedResize];
+
+ return;
+ }
+
+ // If a commit arrives during the live part of a resize but before the
+ // layer tree takes the current resize into account, it could change the
+ // WKContentView's size. Update the resizeAnimationView's scale to ensure
+ // we continue to fill the width of the resize target.
+
+ if (_waitingForEndAnimatedResize)
+ return;
+
+ auto newViewLayoutSize = [self activeViewLayoutSize:self.bounds];
+ CGFloat resizeAnimationViewScale = _animatedResizeOriginalContentWidth / newViewLayoutSize.width();
+ [[_resizeAnimationView layer] setSublayerTransform:CATransform3DMakeScale(resizeAnimationViewScale, resizeAnimationViewScale, 1)];
+}
+
- (void)_didCommitLayerTree:(const WebKit::RemoteLayerTreeTransaction&)layerTreeTransaction
{
if (![self usesStandardContentView])
@@ -1762,15 +1803,8 @@
bool needUpdateVisibleContentRects = _page->updateLayoutViewportParameters(layerTreeTransaction);
- if (_dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing) {
- if (_resizeAnimationTransformTransactionID && layerTreeTransaction.transactionID() >= _resizeAnimationTransformTransactionID.value()) {
- _resizeAnimationTransformTransactionID = std::nullopt;
- [_resizeAnimationView layer].sublayerTransform = _resizeAnimationTransformAdjustments;
- if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::ResizingWithDocumentHidden) {
- [_contentView setHidden:NO];
- [self _endAnimatedResize];
- }
- }
+ if (_dynamicViewportUpdateMode != WebKit::DynamicViewportUpdateMode::NotResizing) {
+ [self _didCommitLayerTreeDuringAnimatedResize:layerTreeTransaction];
return;
}
@@ -1870,25 +1904,6 @@
_commitDidRestoreScrollPosition = NO;
}
-- (void)_dynamicViewportUpdateChangedTargetToScale:(double)newScale position:(CGPoint)newScrollPosition nextValidLayerTreeTransactionID:(uint64_t)nextValidLayerTreeTransactionID
-{
- LOG_WITH_STREAM(VisibleRects, stream << "-[WKWebView " << _page->pageID() << " _dynamicViewportUpdateChangedTargetToScale:] " << newScale << " _dynamicViewportUpdateMode " << (int)_dynamicViewportUpdateMode);
-
- if (_dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing) {
- CGFloat animatingScaleTarget = [[_resizeAnimationView layer] transform].m11;
- double currentTargetScale = animatingScaleTarget * [[_contentView layer] transform].m11;
- double scale = newScale / currentTargetScale;
- _resizeAnimationTransformAdjustments = CATransform3DMakeScale(scale, scale, 1);
-
- CGPoint newContentOffset = [self _contentOffsetAdjustedForObscuredInset:CGPointMake(newScrollPosition.x * newScale, newScrollPosition.y * newScale)];
- CGPoint currentContentOffset = [_scrollView contentOffset];
-
- _resizeAnimationTransformAdjustments.m41 = (currentContentOffset.x - newContentOffset.x) / animatingScaleTarget;
- _resizeAnimationTransformAdjustments.m42 = (currentContentOffset.y - newContentOffset.y) / animatingScaleTarget;
- _resizeAnimationTransformTransactionID = nextValidLayerTreeTransactionID;
- }
-}
-
- (void)_couldNotRestorePageState
{
// The gestureController may be waiting for the scroll position to be restored
@@ -1901,7 +1916,7 @@
- (void)_restorePageScrollPosition:(std::optional<WebCore::FloatPoint>)scrollPosition scrollOrigin:(WebCore::FloatPoint)scrollOrigin previousObscuredInset:(WebCore::FloatBoxExtent)obscuredInsets scale:(double)scale
{
- if (_dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing)
+ if (_dynamicViewportUpdateMode != WebKit::DynamicViewportUpdateMode::NotResizing)
return;
if (![self usesStandardContentView])
@@ -1919,7 +1934,7 @@
- (void)_restorePageStateToUnobscuredCenter:(std::optional<WebCore::FloatPoint>)center scale:(double)scale
{
- if (_dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing)
+ if (_dynamicViewportUpdateMode != WebKit::DynamicViewportUpdateMode::NotResizing)
return;
if (![self usesStandardContentView])
@@ -2034,7 +2049,7 @@
- (void)_scrollToContentScrollPosition:(WebCore::FloatPoint)scrollPosition scrollOrigin:(WebCore::IntPoint)scrollOrigin
{
- if (_commitDidRestoreScrollPosition || _dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing)
+ if (_commitDidRestoreScrollPosition || _dynamicViewportUpdateMode != WebKit::DynamicViewportUpdateMode::NotResizing)
return;
WebCore::FloatPoint contentOffset = WebCore::ScrollableArea::scrollOffsetFromPosition(scrollPosition, toFloatSize(scrollOrigin));
@@ -2614,7 +2629,7 @@
CGRect bounds = self.bounds;
[_scrollView setFrame:bounds];
- if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::NotResizing) {
+ if (_dynamicViewportUpdateMode == WebKit::DynamicViewportUpdateMode::NotResizing) {
if (!_overridesViewLayoutSize)
[self _dispatchSetViewLayoutSize:[self activeViewLayoutSize:self.bounds]];
if (!_overridesMaximumUnobscuredSize)
@@ -2776,7 +2791,7 @@
return;
}
- if (_dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing
+ if (_dynamicViewportUpdateMode != WebKit::DynamicViewportUpdateMode::NotResizing
|| (_needsResetViewStateAfterCommitLoadForMainFrame && ![_contentView sizeChangedSinceLastVisibleContentRectUpdate])
|| [_scrollView isZoomBouncing]
|| _currentlyAdjustingScrollViewInsetsForKeyboard)
@@ -2834,6 +2849,84 @@
_gestureController->didStartProvisionalLoadForMainFrame();
}
+static WebCore::FloatSize activeMaximumUnobscuredSize(WKWebView *webView, const CGRect& bounds)
+{
+ return WebCore::FloatSize(webView->_overridesMaximumUnobscuredSize ? webView->_maximumUnobscuredSizeOverride : bounds.size);
+}
+
+static int32_t activeOrientation(WKWebView *webView)
+{
+ return webView->_overridesInterfaceOrientation ? deviceOrientationForUIInterfaceOrientation(webView->_interfaceOrientationOverride) : webView->_page->deviceOrientation();
+}
+
+- (void)_didCompleteAnimatedResize
+{
+ if (_dynamicViewportUpdateMode == WebKit::DynamicViewportUpdateMode::NotResizing)
+ return;
+
+ [_contentView setHidden:NO];
+
+ 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 _endAnimatedResize:] - _resizeAnimationView is nil", self);
+ _dynamicViewportUpdateMode = WebKit::DynamicViewportUpdateMode::NotResizing;
+ return;
+ }
+
+ --_activeAnimatedResizeCount;
+ NSUInteger indexOfResizeAnimationView = [[_scrollView subviews] indexOfObject:_resizeAnimationView.get()];
+ [_scrollView insertSubview:_contentView.get() atIndex:indexOfResizeAnimationView];
+ [_scrollView insertSubview:[_contentView unscaledView] atIndex:indexOfResizeAnimationView + 1];
+
+ CALayer *contentLayer = [_contentView layer];
+ CGFloat adjustmentScale = _resizeAnimationTransformAdjustments.m11;
+ contentLayer.sublayerTransform = CATransform3DIdentity;
+
+ CGFloat animatingScaleTarget = [[_resizeAnimationView layer] transform].m11;
+ CATransform3D contentLayerTransform = contentLayer.transform;
+ CGFloat currentScale = [[_resizeAnimationView layer] transform].m11 * contentLayerTransform.m11;
+
+ // We cannot use [UIScrollView setZoomScale:] directly because the UIScrollView delegate would get a callback with
+ // an invalid contentOffset. The real content offset is only set below.
+ // Since there is no public API for setting both the zoomScale and the contentOffset, we set the zoomScale manually
+ // on the zoom layer and then only change the contentOffset.
+ CGFloat adjustedScale = adjustmentScale * currentScale;
+ contentLayerTransform.m11 = adjustedScale;
+ contentLayerTransform.m22 = adjustedScale;
+ contentLayer.transform = contentLayerTransform;
+
+ CGPoint currentScrollOffset = [_scrollView contentOffset];
+ double horizontalScrollAdjustement = _resizeAnimationTransformAdjustments.m41 * animatingScaleTarget;
+ double verticalScrollAdjustment = _resizeAnimationTransformAdjustments.m42 * animatingScaleTarget;
+
+ [_scrollView setContentSize:roundScrollViewContentSize(*_page, [_contentView frame].size)];
+ [_scrollView setContentOffset:CGPointMake(currentScrollOffset.x - horizontalScrollAdjustement, currentScrollOffset.y - verticalScrollAdjustment)];
+
+ [_resizeAnimationView removeFromSuperview];
+ _resizeAnimationView = nil;
+ _resizeAnimationTransformAdjustments = CATransform3DIdentity;
+
+ _dynamicViewportUpdateMode = WebKit::DynamicViewportUpdateMode::NotResizing;
+ [self _scheduleVisibleContentRectUpdate];
+
+ CGRect newBounds = self.bounds;
+ auto newViewLayoutSize = [self activeViewLayoutSize:newBounds];
+ auto newMaximumUnobscuredSize = activeMaximumUnobscuredSize(self, newBounds);
+ int32_t newOrientation = activeOrientation(self);
+
+ if (!_lastSentViewLayoutSize || newViewLayoutSize != _lastSentViewLayoutSize.value())
+ [self _dispatchSetViewLayoutSize:newViewLayoutSize];
+
+ if (!_lastSentMaximumUnobscuredSize || newMaximumUnobscuredSize != _lastSentMaximumUnobscuredSize.value())
+ [self _dispatchSetMaximumUnobscuredSize:WebCore::FloatSize(newMaximumUnobscuredSize)];
+
+ if (!_lastSentDeviceOrientation || newOrientation != _lastSentDeviceOrientation.value())
+ [self _dispatchSetDeviceOrientation:newOrientation];
+
+ while (!_snapshotsDeferredDuringResize.isEmpty())
+ _snapshotsDeferredDuringResize.takeLast()();
+}
+
- (void)_didFinishLoadForMainFrame
{
if (_gestureController)
@@ -4216,16 +4309,6 @@
#endif
#if PLATFORM(IOS)
-static WebCore::FloatSize activeMaximumUnobscuredSize(WKWebView *webView, const CGRect& bounds)
-{
- return WebCore::FloatSize(webView->_overridesMaximumUnobscuredSize ? webView->_maximumUnobscuredSizeOverride : bounds.size);
-}
-
-static int32_t activeOrientation(WKWebView *webView)
-{
- return webView->_overridesInterfaceOrientation ? deviceOrientationForUIInterfaceOrientation(webView->_interfaceOrientationOverride) : webView->_page->deviceOrientation();
-}
-
- (void (^)(void))_retainActiveFocusedState
{
++_activeFocusedStateRetainCount;
@@ -5007,7 +5090,7 @@
_overridesViewLayoutSize = YES;
_viewLayoutSizeOverride = viewLayoutSizeOverride;
- if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::NotResizing)
+ if (_dynamicViewportUpdateMode == WebKit::DynamicViewportUpdateMode::NotResizing)
[self _dispatchSetViewLayoutSize:WebCore::FloatSize(viewLayoutSizeOverride)];
}
@@ -5083,7 +5166,7 @@
_overridesInterfaceOrientation = YES;
_interfaceOrientationOverride = interfaceOrientation;
- if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::NotResizing)
+ if (_dynamicViewportUpdateMode == WebKit::DynamicViewportUpdateMode::NotResizing)
[self _dispatchSetDeviceOrientation:deviceOrientationForUIInterfaceOrientation(_interfaceOrientationOverride)];
}
@@ -5111,7 +5194,7 @@
_overridesMaximumUnobscuredSize = YES;
_maximumUnobscuredSizeOverride = size;
- if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::NotResizing)
+ if (_dynamicViewportUpdateMode == WebKit::DynamicViewportUpdateMode::NotResizing)
[self _dispatchSetMaximumUnobscuredSize:WebCore::FloatSize(size)];
}
@@ -5156,7 +5239,7 @@
return;
}
- _dynamicViewportUpdateMode = DynamicViewportUpdateMode::ResizingWithAnimation;
+ _dynamicViewportUpdateMode = WebKit::DynamicViewportUpdateMode::ResizingWithAnimation;
auto oldViewLayoutSize = [self activeViewLayoutSize:self.bounds];
auto oldMaximumUnobscuredSize = activeMaximumUnobscuredSize(self, oldBounds);
@@ -5175,7 +5258,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 = DynamicViewportUpdateMode::NotResizing;
+ _dynamicViewportUpdateMode = WebKit::DynamicViewportUpdateMode::NotResizing;
[self _frameOrBoundsChanged];
if (_overridesViewLayoutSize)
[self _dispatchSetViewLayoutSize:newViewLayoutSize];
@@ -5193,7 +5276,7 @@
&& oldMaximumUnobscuredSize == newMaximumUnobscuredSize
&& oldOrientation == newOrientation
&& UIEdgeInsetsEqualToEdgeInsets(oldObscuredInsets, newObscuredInsets)) {
- _dynamicViewportUpdateMode = DynamicViewportUpdateMode::NotResizing;
+ _dynamicViewportUpdateMode = WebKit::DynamicViewportUpdateMode::NotResizing;
[self _scheduleVisibleContentRectUpdate];
return;
}
@@ -5201,12 +5284,14 @@
++_activeAnimatedResizeCount;
_resizeAnimationTransformAdjustments = CATransform3DIdentity;
- NSUInteger indexOfContentView = [[_scrollView subviews] indexOfObject:_contentView.get()];
- _resizeAnimationView = adoptNS([[UIView alloc] init]);
- [_resizeAnimationView layer].name = @"ResizeAnimation";
- [_scrollView insertSubview:_resizeAnimationView.get() atIndex:indexOfContentView];
- [_resizeAnimationView addSubview:_contentView.get()];
- [_resizeAnimationView addSubview:[_contentView unscaledView]];
+ if (!_resizeAnimationView) {
+ NSUInteger indexOfContentView = [[_scrollView subviews] indexOfObject:_contentView.get()];
+ _resizeAnimationView = adoptNS([[UIView alloc] init]);
+ [_resizeAnimationView layer].name = @"ResizeAnimation";
+ [_scrollView insertSubview:_resizeAnimationView.get() atIndex:indexOfContentView];
+ [_resizeAnimationView addSubview:_contentView.get()];
+ [_resizeAnimationView addSubview:[_contentView unscaledView]];
+ }
CGSize contentSizeInContentViewCoordinates = contentViewBounds.size;
[_scrollView setMinimumZoomScale:std::min(newViewLayoutSize.width() / contentSizeInContentViewCoordinates.width, [_scrollView minimumZoomScale])];
@@ -5214,8 +5299,8 @@
// Compute the new scale to keep the current content width in the scrollview.
CGFloat oldWebViewWidthInContentViewCoordinates = oldUnobscuredContentRect.width();
- CGFloat visibleContentViewWidthInContentCoordinates = std::min(contentSizeInContentViewCoordinates.width, oldWebViewWidthInContentViewCoordinates);
- CGFloat targetScale = newViewLayoutSize.width() / visibleContentViewWidthInContentCoordinates;
+ _animatedResizeOriginalContentWidth = std::min(contentSizeInContentViewCoordinates.width, oldWebViewWidthInContentViewCoordinates);
+ CGFloat targetScale = newViewLayoutSize.width() / _animatedResizeOriginalContentWidth;
CGFloat resizeAnimationViewAnimationScale = targetScale / contentZoomScale(self);
[_resizeAnimationView setTransform:CGAffineTransformMakeScale(resizeAnimationViewAnimationScale, resizeAnimationViewAnimationScale)];
@@ -5243,7 +5328,7 @@
if (oldUnobscuredContentRect.maxY() > contentSizeInContentViewCoordinates.height - 1)
contentOffset.y = maxVerticalOffset;
if (oldUnobscuredContentRect.y() < 1)
- contentOffset.y = -_obscuredInsets.top;
+ contentOffset.y = [self _initialContentOffsetForScrollView].y;
// FIXME: if we have content centered after double tap to zoom, we should also try to keep that rect in view.
[_scrollView setContentSize:roundScrollViewContentSize(*_page, futureContentSizeInSelfCoordinates)];
@@ -5259,9 +5344,12 @@
_lastSentMaximumUnobscuredSize = newMaximumUnobscuredSize;
_lastSentDeviceOrientation = newOrientation;
- _page->dynamicViewportSizeUpdate(newViewLayoutSize, newMaximumUnobscuredSize, visibleRectInContentCoordinates, unobscuredRectInContentCoordinates, futureUnobscuredRectInSelfCoordinates, unobscuredSafeAreaInsetsExtent, targetScale, newOrientation);
+ _page->dynamicViewportSizeUpdate(newViewLayoutSize, newMaximumUnobscuredSize, visibleRectInContentCoordinates, unobscuredRectInContentCoordinates, futureUnobscuredRectInSelfCoordinates, unobscuredSafeAreaInsetsExtent, targetScale, newOrientation, ++_currentDynamicViewportSizeUpdateID);
if (WebKit::DrawingAreaProxy* drawingArea = _page->drawingArea())
drawingArea->setSize(WebCore::IntSize(newBounds.size));
+
+ _waitingForCommitAfterAnimatedResize = YES;
+ _waitingForEndAnimatedResize = YES;
}
- (void)_endAnimatedResize
@@ -5271,75 +5359,11 @@
if ([_customContentView respondsToSelector:@selector(web_endAnimatedResize)])
[_customContentView web_endAnimatedResize];
- if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::NotResizing)
- return;
-
- _page->synchronizeDynamicViewportUpdate();
-
- // synchronizeDynamicViewportUpdate() may cause this function to re-enter via _didCommitLayerTree, so check _dynamicViewportUpdateMode again.
- if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::NotResizing)
- return;
-
- 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 _endAnimatedResize:] - _resizeAnimationView is nil", self);
- _dynamicViewportUpdateMode = DynamicViewportUpdateMode::NotResizing;
- [_contentView setHidden:NO];
- return;
- }
-
- --_activeAnimatedResizeCount;
- NSUInteger indexOfResizeAnimationView = [[_scrollView subviews] indexOfObject:_resizeAnimationView.get()];
- [_scrollView insertSubview:_contentView.get() atIndex:indexOfResizeAnimationView];
- [_scrollView insertSubview:[_contentView unscaledView] atIndex:indexOfResizeAnimationView + 1];
-
- CALayer *contentViewLayer = [_contentView layer];
- CGFloat adjustmentScale = _resizeAnimationTransformAdjustments.m11;
- contentViewLayer.sublayerTransform = CATransform3DIdentity;
-
- CGFloat animatingScaleTarget = [[_resizeAnimationView layer] transform].m11;
- CALayer *contentLayer = [_contentView layer];
- CATransform3D contentLayerTransform = contentLayer.transform;
- CGFloat currentScale = [[_resizeAnimationView layer] transform].m11 * contentLayerTransform.m11;
-
- // We cannot use [UIScrollView setZoomScale:] directly because the UIScrollView delegate would get a callback with
- // an invalid contentOffset. The real content offset is only set below.
- // Since there is no public API for setting both the zoomScale and the contentOffset, we set the zoomScale manually
- // on the zoom layer and then only change the contentOffset.
- CGFloat adjustedScale = adjustmentScale * currentScale;
- contentLayerTransform.m11 = adjustedScale;
- contentLayerTransform.m22 = adjustedScale;
- contentLayer.transform = contentLayerTransform;
-
- CGPoint currentScrollOffset = [_scrollView contentOffset];
- double horizontalScrollAdjustement = _resizeAnimationTransformAdjustments.m41 * animatingScaleTarget;
- double verticalScrollAdjustment = _resizeAnimationTransformAdjustments.m42 * animatingScaleTarget;
-
- [_scrollView setContentSize:roundScrollViewContentSize(*_page, [_contentView frame].size)];
- [_scrollView setContentOffset:CGPointMake(currentScrollOffset.x - horizontalScrollAdjustement, currentScrollOffset.y - verticalScrollAdjustment)];
-
- [_resizeAnimationView removeFromSuperview];
- _resizeAnimationView = nil;
- _resizeAnimationTransformAdjustments = CATransform3DIdentity;
-
- _dynamicViewportUpdateMode = DynamicViewportUpdateMode::NotResizing;
- [_contentView setHidden:NO];
- [self _scheduleVisibleContentRectUpdate];
-
- CGRect newBounds = self.bounds;
- auto newViewLayoutSize = [self activeViewLayoutSize:newBounds];
- auto newMaximumUnobscuredSize = activeMaximumUnobscuredSize(self, newBounds);
- int32_t newOrientation = activeOrientation(self);
-
- if (!_lastSentViewLayoutSize || newViewLayoutSize != _lastSentViewLayoutSize.value())
- [self _dispatchSetViewLayoutSize:newViewLayoutSize];
- if (!_lastSentMaximumUnobscuredSize || newMaximumUnobscuredSize != _lastSentMaximumUnobscuredSize.value())
- [self _dispatchSetMaximumUnobscuredSize:WebCore::FloatSize(newMaximumUnobscuredSize)];
- if (!_lastSentDeviceOrientation || newOrientation != _lastSentDeviceOrientation.value())
- [self _dispatchSetDeviceOrientation:newOrientation];
-
- while (!_snapshotsDeferredDuringResize.isEmpty())
- _snapshotsDeferredDuringResize.takeLast()();
+ // If we already have an up-to-date layer tree, immediately complete
+ // the resize. Otherwise, we will defer completion until we do.
+ _waitingForEndAnimatedResize = NO;
+ if (!_waitingForCommitAfterAnimatedResize)
+ [self _didCompleteAnimatedResize];
}
- (void)_resizeWhileHidingContentWithUpdates:(void (^)(void))updateBlock
@@ -5346,9 +5370,9 @@
{
LOG_WITH_STREAM(VisibleRects, stream << "-[WKWebView " << _page->pageID() << " _resizeWhileHidingContentWithUpdates:]");
[self _beginAnimatedResizeWithUpdates:updateBlock];
- if (_dynamicViewportUpdateMode == DynamicViewportUpdateMode::ResizingWithAnimation) {
+ if (_dynamicViewportUpdateMode == WebKit::DynamicViewportUpdateMode::ResizingWithAnimation) {
[_contentView setHidden:YES];
- _dynamicViewportUpdateMode = DynamicViewportUpdateMode::ResizingWithDocumentHidden;
+ _dynamicViewportUpdateMode = WebKit::DynamicViewportUpdateMode::ResizingWithDocumentHidden;
}
}
@@ -5359,7 +5383,7 @@
- (void)_snapshotRect:(CGRect)rectInViewCoordinates intoImageOfWidth:(CGFloat)imageWidth completionHandler:(void(^)(CGImageRef))completionHandler
{
- if (_dynamicViewportUpdateMode != DynamicViewportUpdateMode::NotResizing) {
+ if (_dynamicViewportUpdateMode != WebKit::DynamicViewportUpdateMode::NotResizing) {
// Defer snapshotting until after the current resize completes.
void (^copiedCompletionHandler)(CGImageRef) = [completionHandler copy];
RetainPtr<WKWebView> retainedSelf = self;
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h (232543 => 232544)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h 2018-06-06 16:32:26 UTC (rev 232544)
@@ -82,7 +82,6 @@
- (void)_didCommitLayerTree:(const WebKit::RemoteLayerTreeTransaction&)layerTreeTransaction;
- (void)_layerTreeCommitComplete;
-- (void)_dynamicViewportUpdateChangedTargetToScale:(double)newScale position:(CGPoint)newScrollPosition nextValidLayerTreeTransactionID:(uint64_t)nextValidLayerTreeTransactionID;
- (void)_couldNotRestorePageState;
- (void)_restorePageScrollPosition:(std::optional<WebCore::FloatPoint>)scrollPosition scrollOrigin:(WebCore::FloatPoint)scrollOrigin previousObscuredInset:(WebCore::FloatBoxExtent)insets scale:(double)scale;
- (void)_restorePageStateToUnobscuredCenter:(std::optional<WebCore::FloatPoint>)center scale:(double)scale; // FIXME: needs scroll origin?
@@ -105,6 +104,8 @@
- (void)_scheduleVisibleContentRectUpdate;
+- (void)_didCompleteAnimatedResize;
+
- (void)_didStartProvisionalLoadForMainFrame;
- (void)_didFinishLoadForMainFrame;
- (void)_didFailLoadForMainFrame;
Modified: trunk/Source/WebKit/UIProcess/PageClient.h (232543 => 232544)
--- trunk/Source/WebKit/UIProcess/PageClient.h 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/UIProcess/PageClient.h 2018-06-06 16:32:26 UTC (rev 232544)
@@ -284,7 +284,6 @@
virtual void didCommitLayerTree(const RemoteLayerTreeTransaction&) = 0;
virtual void layerTreeCommitComplete() = 0;
- virtual void dynamicViewportUpdateChangedTarget(double newScale, const WebCore::FloatPoint& newScrollPosition, uint64_t transactionID) = 0;
virtual void couldNotRestorePageState() = 0;
virtual void restorePageState(std::optional<WebCore::FloatPoint> scrollPosition, const WebCore::FloatPoint& scrollOrigin, const WebCore::FloatBoxExtent& obscuredInsetsOnSave, double scale) = 0;
virtual void restorePageCenterAndScale(std::optional<WebCore::FloatPoint> center, double scale) = 0;
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (232543 => 232544)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-06-06 16:32:26 UTC (rev 232544)
@@ -5963,9 +5963,6 @@
#if PLATFORM(IOS)
m_firstLayerTreeTransactionIdAfterDidCommitLoad = 0;
m_lastVisibleContentRectUpdate = VisibleContentRectUpdateInfo();
- m_dynamicViewportSizeUpdateWaitingForTarget = false;
- m_dynamicViewportSizeUpdateWaitingForLayerTreeCommit = false;
- m_dynamicViewportSizeUpdateLayerTreeTransactionID = 0;
m_hasNetworkRequestsOnSuspended = false;
m_isKeyboardAnimatingIn = false;
m_isScrollingOrZooming = false;
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (232543 => 232544)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.h 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h 2018-06-06 16:32:26 UTC (rev 232544)
@@ -107,6 +107,7 @@
#endif
#if PLATFORM(COCOA)
+#include "DynamicViewportSizeUpdate.h"
#include "LayerRepresentation.h"
#include "TouchBarMenuData.h"
#include "TouchBarMenuItemData.h"
@@ -551,8 +552,7 @@
void overflowScrollWillStartScroll();
void overflowScrollDidEndScroll();
- void dynamicViewportSizeUpdate(const WebCore::FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const WebCore::FloatRect& targetExposedContentRect, const WebCore::FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& unobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation);
- void synchronizeDynamicViewportUpdate();
+ void dynamicViewportSizeUpdate(const WebCore::FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const WebCore::FloatRect& targetExposedContentRect, const WebCore::FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& unobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, DynamicViewportSizeUpdateID);
void setViewportConfigurationViewLayoutSize(const WebCore::FloatSize&);
void setMaximumUnobscuredSize(const WebCore::FloatSize&);
@@ -1663,7 +1663,6 @@
WebCore::FloatSize overrideScreenSize();
float textAutosizingWidth();
- void dynamicViewportUpdateChangedTarget(double newTargetScale, const WebCore::FloatPoint& newScrollPosition, uint64_t dynamicViewportSizeUpdateID);
void couldNotRestorePageState();
void restorePageState(std::optional<WebCore::FloatPoint> scrollPosition, const WebCore::FloatPoint& scrollOrigin, const WebCore::FloatBoxExtent& obscuredInsetsOnSave, double scale);
void restorePageCenterAndScale(std::optional<WebCore::FloatPoint>, double scale);
@@ -1844,11 +1843,7 @@
VisibleContentRectUpdateInfo m_lastVisibleContentRectUpdate;
uint64_t m_firstLayerTreeTransactionIdAfterDidCommitLoad { 0 };
int32_t m_deviceOrientation { 0 };
- uint64_t m_dynamicViewportSizeUpdateLayerTreeTransactionID { 0 };
- uint64_t m_currentDynamicViewportSizeUpdateID { 0 };
bool m_hasReceivedLayerTreeTransactionAfterDidCommitLoad { true };
- bool m_dynamicViewportSizeUpdateWaitingForTarget { false };
- bool m_dynamicViewportSizeUpdateWaitingForLayerTreeCommit { false };
bool m_hasNetworkRequestsOnSuspended { false };
bool m_isKeyboardAnimatingIn { false };
bool m_isScrollingOrZooming { false };
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in (232543 => 232544)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in 2018-06-06 16:32:26 UTC (rev 232544)
@@ -389,7 +389,6 @@
#endif
#if PLATFORM(IOS)
- DynamicViewportUpdateChangedTarget(double newTargetScale, WebCore::FloatPoint newScrollPosition, uint64_t dynamicViewportSizeUpdateID)
CouldNotRestorePageState()
RestorePageState(std::optional<WebCore::FloatPoint> scrollPosition, WebCore::FloatPoint scrollOrigin, WebCore::RectEdges<float> obscuredInsetsOnSave, double scale)
RestorePageCenterAndScale(std::optional<WebCore::FloatPoint> unobscuredCenter, double scale)
Modified: trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h (232543 => 232544)
--- trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h 2018-06-06 16:32:26 UTC (rev 232544)
@@ -120,7 +120,6 @@
void didCommitLayerTree(const RemoteLayerTreeTransaction&) override;
void layerTreeCommitComplete() override;
- void dynamicViewportUpdateChangedTarget(double newScale, const WebCore::FloatPoint& newScrollPosition, uint64_t transactionID) override;
void couldNotRestorePageState() override;
void restorePageState(std::optional<WebCore::FloatPoint>, const WebCore::FloatPoint&, const WebCore::FloatBoxExtent&, double) override;
void restorePageCenterAndScale(std::optional<WebCore::FloatPoint>, double) override;
Modified: trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm (232543 => 232544)
--- trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm 2018-06-06 16:32:26 UTC (rev 232544)
@@ -515,11 +515,6 @@
[m_contentView _layerTreeCommitComplete];
}
-void PageClientImpl::dynamicViewportUpdateChangedTarget(double newScale, const WebCore::FloatPoint& newScrollPosition, uint64_t nextValidLayerTreeTransactionID)
-{
- [m_webView _dynamicViewportUpdateChangedTargetToScale:newScale position:newScrollPosition nextValidLayerTreeTransactionID:nextValidLayerTreeTransactionID];
-}
-
void PageClientImpl::couldNotRestorePageState()
{
[m_webView _couldNotRestorePageState];
Modified: trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm (232543 => 232544)
--- trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm 2018-06-06 16:32:26 UTC (rev 232544)
@@ -306,7 +306,7 @@
m_pageClient.overflowScrollDidEndScroll();
}
-void WebPageProxy::dynamicViewportSizeUpdate(const FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const FloatRect& targetExposedContentRect, const FloatRect& targetUnobscuredRect, const FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& unobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation)
+void WebPageProxy::dynamicViewportSizeUpdate(const FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const FloatRect& targetExposedContentRect, const FloatRect& targetUnobscuredRect, const FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& unobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, DynamicViewportSizeUpdateID dynamicViewportSizeUpdateID)
{
if (!isValid())
return;
@@ -313,48 +313,12 @@
hideValidationMessage();
- m_dynamicViewportSizeUpdateWaitingForTarget = true;
- m_dynamicViewportSizeUpdateWaitingForLayerTreeCommit = true;
- m_process->send(Messages::WebPage::DynamicViewportSizeUpdate(viewLayoutSize, maximumUnobscuredSize, targetExposedContentRect, targetUnobscuredRect, targetUnobscuredRectInScrollViewCoordinates, unobscuredSafeAreaInsets, targetScale, deviceOrientation, ++m_currentDynamicViewportSizeUpdateID), m_pageID);
+ m_process->send(Messages::WebPage::DynamicViewportSizeUpdate(viewLayoutSize,
+ maximumUnobscuredSize, targetExposedContentRect, targetUnobscuredRect,
+ targetUnobscuredRectInScrollViewCoordinates, unobscuredSafeAreaInsets,
+ targetScale, deviceOrientation, dynamicViewportSizeUpdateID), m_pageID);
}
-void WebPageProxy::synchronizeDynamicViewportUpdate()
-{
- if (!isValid())
- return;
-
- if (m_dynamicViewportSizeUpdateWaitingForTarget) {
- // We do not want the UIProcess to finish animated resize with the old content size, scale, etc.
- // If that happens, the UIProcess would start pushing new VisibleContentRectUpdateInfo to the WebProcess with
- // invalid informations.
- //
- // Ideally, the animated resize should just be transactional, and the UIProcess would remain in the "resize" state
- // until both DynamicViewportUpdateChangedTarget and the associated commitLayerTree are finished.
- // The tricky part with such implementation is if a second animated resize starts before the end of the previous one.
- // In that case, the values used for the target state needs to be computed from the output of the previous animated resize.
- //
- // The following is a workaround to have the UIProcess in a consistent state.
- // Instead of handling nested resize, we block the UIProcess until the animated resize finishes.
- double newScale;
- FloatPoint newScrollPosition;
- uint64_t nextValidLayerTreeTransactionID;
- if (m_process->sendSync(Messages::WebPage::SynchronizeDynamicViewportUpdate(), Messages::WebPage::SynchronizeDynamicViewportUpdate::Reply(newScale, newScrollPosition, nextValidLayerTreeTransactionID), m_pageID, 2_s)) {
- m_dynamicViewportSizeUpdateWaitingForTarget = false;
- m_dynamicViewportSizeUpdateLayerTreeTransactionID = nextValidLayerTreeTransactionID;
- m_pageClient.dynamicViewportUpdateChangedTarget(newScale, newScrollPosition, nextValidLayerTreeTransactionID);
- }
-
- }
-
- // If m_dynamicViewportSizeUpdateWaitingForTarget is false, we are waiting for the next valid frame with the hope it is the one for the new target.
- // If m_dynamicViewportSizeUpdateWaitingForTarget is still true, this is a desperate attempt to get the valid frame before finishing the animation.
- if (m_dynamicViewportSizeUpdateWaitingForLayerTreeCommit)
- m_drawingArea->waitForDidUpdateActivityState();
-
- m_dynamicViewportSizeUpdateWaitingForTarget = false;
- m_dynamicViewportSizeUpdateWaitingForLayerTreeCommit = false;
-}
-
void WebPageProxy::setViewportConfigurationViewLayoutSize(const WebCore::FloatSize& size)
{
m_viewportConfigurationViewLayoutSize = size;
@@ -407,11 +371,6 @@
}
}
- if (!m_dynamicViewportSizeUpdateWaitingForTarget && m_dynamicViewportSizeUpdateWaitingForLayerTreeCommit) {
- if (layerTreeTransaction.transactionID() >= m_dynamicViewportSizeUpdateLayerTreeTransactionID)
- m_dynamicViewportSizeUpdateWaitingForLayerTreeCommit = false;
- }
-
m_pageClient.didCommitLayerTree(layerTreeTransaction);
// FIXME: Remove this special mechanism and fold it into the transaction's layout milestones.
@@ -904,18 +863,6 @@
return WebCore::screenSize().width();
}
-void WebPageProxy::dynamicViewportUpdateChangedTarget(double newScale, const WebCore::FloatPoint& newScrollPosition, uint64_t dynamicViewportSizeUpdateID)
-{
- if (dynamicViewportSizeUpdateID != m_currentDynamicViewportSizeUpdateID)
- return;
-
- if (m_dynamicViewportSizeUpdateWaitingForTarget) {
- m_dynamicViewportSizeUpdateLayerTreeTransactionID = downcast<RemoteLayerTreeDrawingAreaProxy>(*drawingArea()).nextLayerTreeTransactionID();
- m_dynamicViewportSizeUpdateWaitingForTarget = false;
- m_pageClient.dynamicViewportUpdateChangedTarget(newScale, newScrollPosition, m_dynamicViewportSizeUpdateLayerTreeTransactionID);
- }
-}
-
void WebPageProxy::couldNotRestorePageState()
{
m_pageClient.couldNotRestorePageState();
Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (232543 => 232544)
--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2018-06-06 16:32:26 UTC (rev 232544)
@@ -677,6 +677,7 @@
2DA049B8180CCD0A00AAFA9E /* GraphicsLayerCARemote.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DA049B6180CCD0A00AAFA9E /* GraphicsLayerCARemote.h */; };
2DA1E4FE18C02B6A00DBC929 /* WKLegacyPDFView.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DA1E4FC18C02B6A00DBC929 /* WKLegacyPDFView.h */; };
2DA1E4FF18C02B6A00DBC929 /* WKLegacyPDFView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2DA1E4FD18C02B6A00DBC929 /* WKLegacyPDFView.mm */; };
+ 2DA6731A20C754B1003CB401 /* DynamicViewportSizeUpdate.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DA6731920C754B1003CB401 /* DynamicViewportSizeUpdate.h */; };
2DA9449E1884E4F000ED86DB /* NativeWebKeyboardEventIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2DA944971884E4F000ED86DB /* NativeWebKeyboardEventIOS.mm */; };
2DA9449F1884E4F000ED86DB /* NativeWebTouchEventIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2DA944981884E4F000ED86DB /* NativeWebTouchEventIOS.mm */; };
2DA944A01884E4F000ED86DB /* WebIOSEventFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DA944991884E4F000ED86DB /* WebIOSEventFactory.h */; };
@@ -3055,6 +3056,7 @@
2DA049B6180CCD0A00AAFA9E /* GraphicsLayerCARemote.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GraphicsLayerCARemote.h; sourceTree = "<group>"; };
2DA1E4FC18C02B6A00DBC929 /* WKLegacyPDFView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WKLegacyPDFView.h; path = ios/WKLegacyPDFView.h; sourceTree = "<group>"; };
2DA1E4FD18C02B6A00DBC929 /* WKLegacyPDFView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WKLegacyPDFView.mm; path = ios/WKLegacyPDFView.mm; sourceTree = "<group>"; };
+ 2DA6731920C754B1003CB401 /* DynamicViewportSizeUpdate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DynamicViewportSizeUpdate.h; path = ios/DynamicViewportSizeUpdate.h; sourceTree = "<group>"; };
2DA7FDCB18F88625008DDED0 /* FindIndicatorOverlayClientIOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FindIndicatorOverlayClientIOS.h; path = ios/FindIndicatorOverlayClientIOS.h; sourceTree = "<group>"; };
2DA944971884E4F000ED86DB /* NativeWebKeyboardEventIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = NativeWebKeyboardEventIOS.mm; path = ios/NativeWebKeyboardEventIOS.mm; sourceTree = "<group>"; };
2DA944981884E4F000ED86DB /* NativeWebTouchEventIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = NativeWebTouchEventIOS.mm; path = ios/NativeWebTouchEventIOS.mm; sourceTree = "<group>"; };
@@ -5779,6 +5781,7 @@
isa = PBXGroup;
children = (
A7E93CEB192531AA00A1DC48 /* ChildProcessIOS.mm */,
+ 2DA6731920C754B1003CB401 /* DynamicViewportSizeUpdate.h */,
2DA9449D1884E4F000ED86DB /* GestureTypes.h */,
C5BCE5DA1C50761D00CDE3FA /* InteractionInformationAtPosition.h */,
C5BCE5DB1C50761D00CDE3FA /* InteractionInformationAtPosition.mm */,
@@ -8941,6 +8944,7 @@
1A64229A12DD029200CAAE2C /* DrawingAreaMessages.h in Headers */,
BC2652171182608100243E12 /* DrawingAreaProxy.h in Headers */,
1A64230912DD09EB00CAAE2C /* DrawingAreaProxyMessages.h in Headers */,
+ 2DA6731A20C754B1003CB401 /* DynamicViewportSizeUpdate.h in Headers */,
E105FE5418D7B9DE008F57A8 /* EditingRange.h in Headers */,
1AA41AB512C02EC4002BE67B /* EditorState.h in Headers */,
BC032DA810F437D10058C15A /* Encoder.h in Headers */,
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (232543 => 232544)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2018-06-06 16:32:26 UTC (rev 232544)
@@ -3222,11 +3222,13 @@
layerTransaction.setAvoidsUnsafeArea(m_viewportConfiguration.avoidsUnsafeArea());
layerTransaction.setIsInStableState(m_isInStableState);
layerTransaction.setAllowsUserScaling(allowsUserScaling());
+ if (m_pendingDynamicViewportSizeUpdateID) {
+ layerTransaction.setDynamicViewportSizeUpdateID(*m_pendingDynamicViewportSizeUpdateID);
+ m_pendingDynamicViewportSizeUpdateID = std::nullopt;
+ }
#endif
-#if PLATFORM(MAC)
layerTransaction.setScrollPosition(frameView->scrollPosition());
-#endif
if (m_hasPendingEditorStateUpdate) {
layerTransaction.setEditorState(editorState());
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (232543 => 232544)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2018-06-06 16:32:26 UTC (rev 232544)
@@ -107,6 +107,7 @@
#endif
#if PLATFORM(COCOA)
+#include "DynamicViewportSizeUpdate.h"
#include <WebCore/VisibleSelection.h>
#include <wtf/RetainPtr.h>
OBJC_CLASS CALayer;
@@ -882,8 +883,7 @@
void setViewportConfigurationViewLayoutSize(const WebCore::FloatSize&);
void setMaximumUnobscuredSize(const WebCore::FloatSize&);
void setDeviceOrientation(int32_t);
- void dynamicViewportSizeUpdate(const WebCore::FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const WebCore::FloatRect& targetExposedContentRect, const WebCore::FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& targetUnobscuredSafeAreaInsets, double scale, int32_t deviceOrientation, uint64_t dynamicViewportSizeUpdateID);
- void synchronizeDynamicViewportUpdate(double& newTargetScale, WebCore::FloatPoint& newScrollPosition, uint64_t& nextValidLayerTreeTransactionID);
+ void dynamicViewportSizeUpdate(const WebCore::FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const WebCore::FloatRect& targetExposedContentRect, const WebCore::FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& targetUnobscuredSafeAreaInsets, double scale, int32_t deviceOrientation, DynamicViewportSizeUpdateID);
std::optional<float> scaleFromUIProcess(const VisibleContentRectUpdateInfo&) const;
void updateVisibleContentRects(const VisibleContentRectUpdateInfo&, MonotonicTime oldestTimestamp);
bool scaleWasSetByUIProcess() const { return m_scaleWasSetByUIProcess; }
@@ -1650,6 +1650,7 @@
WebCore::FloatPoint m_pendingSyntheticClickLocation;
WebCore::FloatRect m_previousExposedContentRect;
uint64_t m_currentAssistedNodeIdentifier { 0 };
+ std::optional<DynamicViewportSizeUpdateID> m_pendingDynamicViewportSizeUpdateID;
#endif
WebCore::Timer m_layerVolatilityTimer;
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (232543 => 232544)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in 2018-06-06 16:32:26 UTC (rev 232544)
@@ -49,7 +49,6 @@
SetMaximumUnobscuredSize(WebCore::FloatSize size)
SetDeviceOrientation(int32_t deviceOrientation)
DynamicViewportSizeUpdate(WebCore::FloatSize viewLayoutSize, WebCore::FloatSize maximumUnobscuredSize, WebCore::FloatRect targetExposedContentRect, WebCore::FloatRect targetUnobscuredRect, WebCore::FloatRect targetUnobscuredRectInScrollViewCoordinates, WebCore::RectEdges<float> targetUnobscuredSafeAreaInsets, double scale, int32_t deviceOrientation, uint64_t dynamicViewportSizeUpdateID)
- SynchronizeDynamicViewportUpdate() -> (double newTargetScale, WebCore::FloatPoint newScrollPosition, uint64_t nextValidLayerTreeTransactionID)
HandleTap(WebCore::IntPoint point, uint64_t lastLayerTreeTransactionId)
PotentialTapAtPosition(uint64_t requestID, WebCore::FloatPoint point)
Modified: trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm (232543 => 232544)
--- trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm 2018-06-06 16:13:31 UTC (rev 232543)
+++ trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm 2018-06-06 16:32:26 UTC (rev 232544)
@@ -2495,7 +2495,7 @@
}
}
-void WebPage::dynamicViewportSizeUpdate(const FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const FloatRect& targetExposedContentRect, const FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& targetUnobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, uint64_t dynamicViewportSizeUpdateID)
+void WebPage::dynamicViewportSizeUpdate(const FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const FloatRect& targetExposedContentRect, const FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& targetUnobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, DynamicViewportSizeUpdateID dynamicViewportSizeUpdateID)
{
SetForScope<bool> dynamicSizeUpdateGuard(m_inDynamicSizeUpdate, true);
// FIXME: this does not handle the cases where the content would change the content size or scroll position from _javascript_.
@@ -2672,16 +2672,9 @@
m_drawingArea->scheduleCompositingLayerFlush();
- send(Messages::WebPageProxy::DynamicViewportUpdateChangedTarget(pageScaleFactor(), frameView.scrollPosition(), dynamicViewportSizeUpdateID));
+ m_pendingDynamicViewportSizeUpdateID = dynamicViewportSizeUpdateID;
}
-void WebPage::synchronizeDynamicViewportUpdate(double& newTargetScale, FloatPoint& newScrollPosition, uint64_t& nextValidLayerTreeTransactionID)
-{
- newTargetScale = pageScaleFactor();
- newScrollPosition = m_page->mainFrame().view()->scrollPosition();
- nextValidLayerTreeTransactionID = downcast<RemoteLayerTreeDrawingArea>(*m_drawingArea).nextTransactionID();
-}
-
void WebPage::resetViewportDefaultConfiguration(WebFrame* frame, bool hasMobileDocType)
{
LOG_WITH_STREAM(VisibleRects, stream << "WebPage " << m_pageID << " resetViewportDefaultConfiguration");