Title: [170115] trunk/Source/WebKit2
Revision
170115
Author
benja...@webkit.org
Date
2014-06-18 14:38:04 -0700 (Wed, 18 Jun 2014)

Log Message

[iOS][WK2] Re-sync didCommitLoadForMainFrame with its corresponding tile update
https://bugs.webkit.org/show_bug.cgi?id=134009

Patch by Benjamin Poulain <bpoul...@apple.com> on 2014-06-18
Reviewed by Tim Horton.

WKWebView assumed the first _didCommitLayerTree: after _didCommitLoadForMainFrame
had the state of the page being loaded.

This is not always true. Sometimes, a set of tiles can be rendering asynchronously while the next
page is loaded, and does not flush the queue until after didCommitLoadForMainFrame is executed.

Tim introduced a transactionID with each layer tree update. This patch uses that to synchronize
WKWebView with the right set of tiles.

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _didCommitLoadForMainFrame]):
(-[WKWebView _didCommitLayerTree:WebKit::]):
(-[WKWebView _updateVisibleContentRects]):
* UIProcess/WebPageProxy.h:
* UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h:
(WebKit::RemoteLayerTreeDrawingAreaProxy::nextLayerTreeTransactionID):
* UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.messages.in:
* UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm:
(WebKit::RemoteLayerTreeDrawingAreaProxy::RemoteLayerTreeDrawingAreaProxy):
(WebKit::RemoteLayerTreeDrawingAreaProxy::willCommitLayerTree):
* WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm:
(WebKit::RemoteLayerTreeDrawingArea::flushLayers):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (170114 => 170115)


--- trunk/Source/WebKit2/ChangeLog	2014-06-18 20:56:12 UTC (rev 170114)
+++ trunk/Source/WebKit2/ChangeLog	2014-06-18 21:38:04 UTC (rev 170115)
@@ -1,3 +1,33 @@
+2014-06-18  Benjamin Poulain  <bpoul...@apple.com>
+
+        [iOS][WK2] Re-sync didCommitLoadForMainFrame with its corresponding tile update
+        https://bugs.webkit.org/show_bug.cgi?id=134009
+
+        Reviewed by Tim Horton.
+
+        WKWebView assumed the first _didCommitLayerTree: after _didCommitLoadForMainFrame
+        had the state of the page being loaded.
+
+        This is not always true. Sometimes, a set of tiles can be rendering asynchronously while the next
+        page is loaded, and does not flush the queue until after didCommitLoadForMainFrame is executed.
+
+        Tim introduced a transactionID with each layer tree update. This patch uses that to synchronize
+        WKWebView with the right set of tiles.
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _didCommitLoadForMainFrame]):
+        (-[WKWebView _didCommitLayerTree:WebKit::]):
+        (-[WKWebView _updateVisibleContentRects]):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h:
+        (WebKit::RemoteLayerTreeDrawingAreaProxy::nextLayerTreeTransactionID):
+        * UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.messages.in:
+        * UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm:
+        (WebKit::RemoteLayerTreeDrawingAreaProxy::RemoteLayerTreeDrawingAreaProxy):
+        (WebKit::RemoteLayerTreeDrawingAreaProxy::willCommitLayerTree):
+        * WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm:
+        (WebKit::RemoteLayerTreeDrawingArea::flushLayers):
+
 2014-06-18  Anders Carlsson  <ander...@apple.com>
 
         Simplify WebCredential

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (170114 => 170115)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm	2014-06-18 20:56:12 UTC (rev 170114)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm	2014-06-18 21:38:04 UTC (rev 170115)
@@ -79,6 +79,7 @@
 #import "_WKWebViewPrintFormatter.h"
 #import "PrintInfo.h"
 #import "ProcessThrottler.h"
+#import "RemoteLayerTreeDrawingAreaProxy.h"
 #import "WKPDFView.h"
 #import "WKScrollView.h"
 #import "WKWebViewContentProviderRegistry.h"
@@ -162,6 +163,7 @@
     BOOL _overridesInterfaceOrientation;
 
     BOOL _needsResetViewStateAfterCommitLoadForMainFrame;
+    uint64_t _firstPaintAfterCommitLoadTransactionID;
     BOOL _isAnimatingResize;
     CATransform3D _resizeAnimationTransformAdjustments;
     RetainPtr<UIView> _resizeAnimationView;
@@ -705,6 +707,8 @@
 
 - (void)_didCommitLoadForMainFrame
 {
+    _firstPaintAfterCommitLoadTransactionID = toRemoteLayerTreeDrawingAreaProxy(_page->drawingArea())->nextLayerTreeTransactionID();
+
     _needsResetViewStateAfterCommitLoadForMainFrame = YES;
     _usesMinimalUI = NO;
 }
@@ -739,9 +743,10 @@
             [static_cast<id <WKUIDelegatePrivate>>(delegate.get()) _webView:self usesMinimalUI:_usesMinimalUI];
     }
 
-    if (_needsResetViewStateAfterCommitLoadForMainFrame) {
+    if (_needsResetViewStateAfterCommitLoadForMainFrame && layerTreeTransaction.transactionID() >= _firstPaintAfterCommitLoadTransactionID) {
         _needsResetViewStateAfterCommitLoadForMainFrame = NO;
         [_scrollView setContentOffset:CGPointMake(-_obscuredInsets.left, -_obscuredInsets.top)];
+        [self _updateVisibleContentRects];
     }
 }
 
@@ -1181,6 +1186,9 @@
     if (_isAnimatingResize)
         return;
 
+    if (_needsResetViewStateAfterCommitLoadForMainFrame)
+        return;
+
     CGRect fullViewRect = self.bounds;
     CGRect visibleRectInContentCoordinates = [self convertRect:fullViewRect toView:_contentView.get()];
 

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (170114 => 170115)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2014-06-18 20:56:12 UTC (rev 170114)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2014-06-18 21:38:04 UTC (rev 170115)
@@ -395,6 +395,7 @@
     void setMaximumUnobscuredSize(const WebCore::FloatSize&);
     void setDeviceOrientation(int32_t);
     int32_t deviceOrientation() const { return m_deviceOrientation; }
+    void willCommitLayerTree(uint64_t transactionID);
     void didCommitLayerTree(const WebKit::RemoteLayerTreeTransaction&);
 
     void selectWithGesture(const WebCore::IntPoint, WebCore::TextGranularity, uint32_t gestureType, uint32_t gestureState, std::function<void (const WebCore::IntPoint&, uint32_t, uint32_t, uint32_t, CallbackBase::Error)>);

Modified: trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h (170114 => 170115)


--- trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h	2014-06-18 20:56:12 UTC (rev 170114)
+++ trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h	2014-06-18 21:38:04 UTC (rev 170115)
@@ -49,6 +49,8 @@
 
     void coreAnimationDidCommitLayers();
 
+    uint64_t nextLayerTreeTransactionID() const { return m_pendingLayerTreeTransactionID + 1; }
+
 private:
     virtual void sizeDidChange() override;
     virtual void deviceScaleFactorDidChange() override;
@@ -72,6 +74,7 @@
     virtual void didReceiveMessage(IPC::Connection*, IPC::MessageDecoder&) override;
 
     // Message handlers
+    void willCommitLayerTree(uint64_t transactionID);
     void commitLayerTree(const RemoteLayerTreeTransaction&, const RemoteScrollingCoordinatorTransaction&);
     
     void sendUpdateGeometry();
@@ -90,6 +93,7 @@
 
     std::unique_ptr<WebCore::RunLoopObserver> m_layerCommitObserver;
 
+    uint64_t m_pendingLayerTreeTransactionID;
     uint64_t m_lastVisibleTransactionID;
     uint64_t m_transactionIDForPendingCACommit;
 };

Modified: trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.messages.in (170114 => 170115)


--- trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.messages.in	2014-06-18 20:56:12 UTC (rev 170114)
+++ trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.messages.in	2014-06-18 21:38:04 UTC (rev 170115)
@@ -21,5 +21,6 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 messages -> RemoteLayerTreeDrawingAreaProxy : DrawingAreaProxy {
+    void WillCommitLayerTree(uint64_t transactionID)
     void CommitLayerTree(WebKit::RemoteLayerTreeTransaction layerTreeTransaction, WebKit::RemoteScrollingCoordinatorTransaction scrollingTreeTransaction)
 }

Modified: trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm (170114 => 170115)


--- trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm	2014-06-18 20:56:12 UTC (rev 170114)
+++ trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm	2014-06-18 21:38:04 UTC (rev 170115)
@@ -47,6 +47,7 @@
     : DrawingAreaProxy(DrawingAreaTypeRemoteLayerTree, webPageProxy)
     , m_remoteLayerTreeHost(*this)
     , m_isWaitingForDidUpdateGeometry(false)
+    , m_pendingLayerTreeTransactionID(0)
     , m_lastVisibleTransactionID(0)
 {
 #if USE(IOSURFACE)
@@ -115,6 +116,11 @@
     m_isWaitingForDidUpdateGeometry = true;
 }
 
+void RemoteLayerTreeDrawingAreaProxy::willCommitLayerTree(uint64_t transactionID)
+{
+    m_pendingLayerTreeTransactionID = transactionID;
+}
+
 void RemoteLayerTreeDrawingAreaProxy::commitLayerTree(const RemoteLayerTreeTransaction& layerTreeTransaction, const RemoteScrollingCoordinatorTransaction& scrollingTreeTransaction)
 {
     LOG(RemoteLayerTree, "%s", layerTreeTransaction.description().data());

Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm (170114 => 170115)


--- trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm	2014-06-18 20:56:12 UTC (rev 170114)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm	2014-06-18 21:38:04 UTC (rev 170115)
@@ -289,6 +289,8 @@
 
     m_waitingForBackingStoreSwap = true;
 
+    m_webPage->send(Messages::RemoteLayerTreeDrawingAreaProxy::WillCommitLayerTree(layerTransaction.transactionID()));
+
     Messages::RemoteLayerTreeDrawingAreaProxy::CommitLayerTree message(layerTransaction, scrollingTransaction);
     auto commitEncoder = std::make_unique<IPC::MessageEncoder>(Messages::RemoteLayerTreeDrawingAreaProxy::CommitLayerTree::receiverName(), Messages::RemoteLayerTreeDrawingAreaProxy::CommitLayerTree::name(), m_webPage->pageID());
     commitEncoder->encode(message.arguments());
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to