- 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());