Title: [246142] trunk/Source
Revision
246142
Author
[email protected]
Date
2019-06-05 20:39:08 -0700 (Wed, 05 Jun 2019)

Log Message

[Cocoa] REGRESSION(r244182): Inspector thinks CA commits can be nested
https://bugs.webkit.org/show_bug.cgi?id=198497

Patch by Said Abou-Hallawa <[email protected]> on 2019-06-05
Reviewed by Simon Fraser.

Source/WebCore:

WebInspecter should coalesce nested composites as one recorded composite.
This can be done by ensuring that we only process CA preCommit and postCommit
once per nested commits.

* inspector/InspectorController.cpp:
(WebCore::InspectorController::willComposite):
* inspector/InspectorController.h:
Export willComposite(). We want to call willComposite()/ didComposite()
from CA preCommit and postCommit handlers in flushLayers().

* inspector/agents/InspectorTimelineAgent.cpp:
(WebCore::InspectorTimelineAgent::didComposite):
Unrelated change: didComposite() should not assert that we're in the middle
of a composite. Web Inspector may connect in the middle of a composite.

* page/FrameView.cpp:
(WebCore::FrameView::flushCompositingStateIncludingSubframes):
InspectorController::willComposite() will be called form CA preCommit
handler of flushLayers().

Source/WebKit:

Call InspectorController::willComposite() from the CA preCommit handler
similar to the call to InspectorController::didComposite() in the CA
postCommit handler. Ensure these calls will be once for nested commits.

* WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h:
* WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm:
(WebKit::RemoteLayerTreeDrawingArea::addCommitHandlers):
(WebKit::RemoteLayerTreeDrawingArea::flushLayers):
* WebProcess/WebPage/WebPage.h:
(WebKit::WebPage::firstFlushAfterCommit const):
(WebKit::WebPage::setFirstFlushAfterCommit):
* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h:
* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
(WebKit::TiledCoreAnimationDrawingArea::addCommitHandlers):
(WebKit::TiledCoreAnimationDrawingArea::flushLayers):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (246141 => 246142)


--- trunk/Source/WebCore/ChangeLog	2019-06-06 03:24:19 UTC (rev 246141)
+++ trunk/Source/WebCore/ChangeLog	2019-06-06 03:39:08 UTC (rev 246142)
@@ -1,3 +1,30 @@
+2019-06-05  Said Abou-Hallawa  <[email protected]>
+
+        [Cocoa] REGRESSION(r244182): Inspector thinks CA commits can be nested
+        https://bugs.webkit.org/show_bug.cgi?id=198497
+
+        Reviewed by Simon Fraser.
+
+        WebInspecter should coalesce nested composites as one recorded composite.
+        This can be done by ensuring that we only process CA preCommit and postCommit
+        once per nested commits.
+
+        * inspector/InspectorController.cpp:
+        (WebCore::InspectorController::willComposite):
+        * inspector/InspectorController.h:
+        Export willComposite(). We want to call willComposite()/ didComposite()
+        from CA preCommit and postCommit handlers in flushLayers().
+
+        * inspector/agents/InspectorTimelineAgent.cpp:
+        (WebCore::InspectorTimelineAgent::didComposite):
+        Unrelated change: didComposite() should not assert that we're in the middle
+        of a composite. Web Inspector may connect in the middle of a composite.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::flushCompositingStateIncludingSubframes):
+        InspectorController::willComposite() will be called form CA preCommit
+        handler of flushLayers().
+
 2019-06-05  Myles C. Maxfield  <[email protected]>
 
         [WHLSL] Educate the property resolver about IndexExpressions

Modified: trunk/Source/WebCore/inspector/InspectorController.cpp (246141 => 246142)


--- trunk/Source/WebCore/inspector/InspectorController.cpp	2019-06-06 03:24:19 UTC (rev 246141)
+++ trunk/Source/WebCore/inspector/InspectorController.cpp	2019-06-06 03:39:08 UTC (rev 246142)
@@ -507,6 +507,11 @@
     return commonVM();
 }
 
+void InspectorController::willComposite(Frame& frame)
+{
+    InspectorInstrumentation::willComposite(frame);
+}
+
 void InspectorController::didComposite(Frame& frame)
 {
     InspectorInstrumentation::didComposite(frame);

Modified: trunk/Source/WebCore/inspector/InspectorController.h (246141 => 246142)


--- trunk/Source/WebCore/inspector/InspectorController.h	2019-06-06 03:24:19 UTC (rev 246141)
+++ trunk/Source/WebCore/inspector/InspectorController.h	2019-06-06 03:39:08 UTC (rev 246142)
@@ -97,6 +97,7 @@
 
     WEBCORE_EXPORT void setIndicating(bool);
 
+    WEBCORE_EXPORT void willComposite(Frame&);
     WEBCORE_EXPORT void didComposite(Frame&);
 
     bool isUnderTest() const { return m_isUnderTest; }

Modified: trunk/Source/WebCore/inspector/agents/InspectorTimelineAgent.cpp (246141 => 246142)


--- trunk/Source/WebCore/inspector/agents/InspectorTimelineAgent.cpp	2019-06-06 03:24:19 UTC (rev 246141)
+++ trunk/Source/WebCore/inspector/agents/InspectorTimelineAgent.cpp	2019-06-06 03:39:08 UTC (rev 246142)
@@ -364,7 +364,6 @@
 
 void InspectorTimelineAgent::didComposite()
 {
-    ASSERT(m_startedComposite);
     didCompleteCurrentRecord(TimelineRecordType::Composite);
     m_startedComposite = false;
 }

Modified: trunk/Source/WebCore/page/FrameView.cpp (246141 => 246142)


--- trunk/Source/WebCore/page/FrameView.cpp	2019-06-06 03:24:19 UTC (rev 246141)
+++ trunk/Source/WebCore/page/FrameView.cpp	2019-06-06 03:39:08 UTC (rev 246142)
@@ -1148,10 +1148,6 @@
 
 bool FrameView::flushCompositingStateIncludingSubframes()
 {
-#if PLATFORM(COCOA)
-    InspectorInstrumentation::willComposite(frame());
-#endif
-
     bool allFramesFlushed = flushCompositingStateForThisFrame(frame());
 
     for (Frame* child = frame().tree().firstRenderedChild(); child; child = child->tree().traverseNextRendered(m_frame.ptr())) {

Modified: trunk/Source/WebKit/ChangeLog (246141 => 246142)


--- trunk/Source/WebKit/ChangeLog	2019-06-06 03:24:19 UTC (rev 246141)
+++ trunk/Source/WebKit/ChangeLog	2019-06-06 03:39:08 UTC (rev 246142)
@@ -1,3 +1,26 @@
+2019-06-05  Said Abou-Hallawa  <[email protected]>
+
+        [Cocoa] REGRESSION(r244182): Inspector thinks CA commits can be nested
+        https://bugs.webkit.org/show_bug.cgi?id=198497
+
+        Reviewed by Simon Fraser.
+
+        Call InspectorController::willComposite() from the CA preCommit handler
+        similar to the call to InspectorController::didComposite() in the CA
+        postCommit handler. Ensure these calls will be once for nested commits.
+
+        * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h:
+        * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm:
+        (WebKit::RemoteLayerTreeDrawingArea::addCommitHandlers):
+        (WebKit::RemoteLayerTreeDrawingArea::flushLayers):
+        * WebProcess/WebPage/WebPage.h:
+        (WebKit::WebPage::firstFlushAfterCommit const):
+        (WebKit::WebPage::setFirstFlushAfterCommit):
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h:
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
+        (WebKit::TiledCoreAnimationDrawingArea::addCommitHandlers):
+        (WebKit::TiledCoreAnimationDrawingArea::flushLayers):
+
 2019-06-05  Alex Christensen  <[email protected]>
 
         Introduce new SPI for context menus on iOS

Modified: trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h (246141 => 246142)


--- trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h	2019-06-06 03:24:19 UTC (rev 246141)
+++ trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h	2019-06-06 03:39:08 UTC (rev 246142)
@@ -114,7 +114,7 @@
     void updateScrolledExposedRect();
     void updateRootLayers();
 
-    void flushInitialDeferredPaint();
+    void addCommitHandlers();
     void flushLayers();
 
     WebCore::TiledBacking* mainFrameTiledBacking() const;

Modified: trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm (246141 => 246142)


--- trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm	2019-06-06 03:24:19 UTC (rev 246141)
+++ trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm	2019-06-06 03:39:08 UTC (rev 246142)
@@ -325,7 +325,30 @@
     }
     return true;
 }
+    
+void RemoteLayerTreeDrawingArea::addCommitHandlers()
+{
+    if (m_webPage.firstFlushAfterCommit())
+        return;
 
+    [CATransaction addCommitHandler:[retainedPage = makeRefPtr(&m_webPage)] {
+        if (Page* corePage = retainedPage->corePage()) {
+            if (Frame* coreFrame = retainedPage->mainFrame())
+                corePage->inspectorController().willComposite(*coreFrame);
+        }
+    } forPhase:kCATransactionPhasePreCommit];
+    
+    [CATransaction addCommitHandler:[retainedPage = makeRefPtr(&m_webPage)] {
+        if (Page* corePage = retainedPage->corePage()) {
+            if (Frame* coreFrame = retainedPage->mainFrame())
+                corePage->inspectorController().didComposite(*coreFrame);
+        }
+        retainedPage->setFirstFlushAfterCommit(false);
+    } forPhase:kCATransactionPhasePostCommit];
+    
+    m_webPage.setFirstFlushAfterCommit(true);
+}
+
 void RemoteLayerTreeDrawingArea::flushLayers()
 {
     if (m_isFlushingSuspended) {
@@ -356,13 +379,7 @@
     if (m_scrolledViewExposedRect)
         visibleRect.intersect(m_scrolledViewExposedRect.value());
 
-    RefPtr<WebPage> protectedWebPage = &m_webPage;
-    [CATransaction addCommitHandler:[protectedWebPage] {
-        if (Page* corePage = protectedWebPage->corePage()) {
-            if (Frame* coreFrame = protectedWebPage->mainFrame())
-                corePage->inspectorController().didComposite(*coreFrame);
-        }
-    } forPhase:kCATransactionPhasePostCommit];
+    addCommitHandlers();
 
     if (m_nextFlushIsForImmediatePaint)
         m_webPage.mainFrameView()->invalidateImagesWithAsyncDecodes();

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (246141 => 246142)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2019-06-06 03:24:19 UTC (rev 246141)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2019-06-06 03:39:08 UTC (rev 246142)
@@ -1206,6 +1206,9 @@
     bool userIsInteracting() const { return m_userIsInteracting; }
     void setUserIsInteracting(bool userIsInteracting) { m_userIsInteracting = userIsInteracting; }
 
+    bool firstFlushAfterCommit() const { return m_firstFlushAfterCommit; }
+    void setFirstFlushAfterCommit(bool f) { m_firstFlushAfterCommit = f; }
+    
 private:
     WebPage(WebCore::PageIdentifier, WebPageCreationParameters&&);
 
@@ -1933,6 +1936,7 @@
     OptionSet<LayerTreeFreezeReason> m_layerTreeFreezeReasons;
     bool m_isSuspended { false };
     bool m_needsFontAttributes { false };
+    bool m_firstFlushAfterCommit { false };
 #if PLATFORM(COCOA)
     WeakPtr<RemoteObjectRegistry> m_remoteObjectRegistry;
 #endif

Modified: trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h (246141 => 246142)


--- trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h	2019-06-06 03:24:19 UTC (rev 246141)
+++ trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h	2019-06-06 03:39:08 UTC (rev 246142)
@@ -88,6 +88,7 @@
 
     bool addMilestonesToDispatch(OptionSet<WebCore::LayoutMilestone> paintMilestones) override;
 
+    void addCommitHandlers();
     enum class FlushType { Normal, TransientZoom };
     void flushLayers(FlushType = FlushType::Normal);
 

Modified: trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm (246141 => 246142)


--- trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm	2019-06-06 03:24:19 UTC (rev 246141)
+++ trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm	2019-06-06 03:39:08 UTC (rev 246142)
@@ -431,6 +431,31 @@
     scheduleCompositingLayerFlush();
 }
 
+void TiledCoreAnimationDrawingArea::addCommitHandlers()
+{
+    if (m_webPage.firstFlushAfterCommit())
+        return;
+
+    [CATransaction addCommitHandler:[retainedPage = makeRefPtr(&m_webPage)] {
+        if (Page* corePage = retainedPage->corePage()) {
+            if (Frame* coreFrame = retainedPage->mainFrame())
+                corePage->inspectorController().willComposite(*coreFrame);
+        }
+    } forPhase:kCATransactionPhasePreCommit];
+
+    [CATransaction addCommitHandler:[retainedPage = makeRefPtr(&m_webPage)] {
+        if (Page* corePage = retainedPage->corePage()) {
+            if (Frame* coreFrame = retainedPage->mainFrame())
+                corePage->inspectorController().didComposite(*coreFrame);
+        }
+        if (auto drawingArea = static_cast<TiledCoreAnimationDrawingArea*>(retainedPage->drawingArea()))
+            drawingArea->sendPendingNewlyReachedPaintingMilestones();
+        retainedPage->setFirstFlushAfterCommit(false);
+    } forPhase:kCATransactionPhasePostCommit];
+    
+    m_webPage.setFirstFlushAfterCommit(true);
+}
+
 void TiledCoreAnimationDrawingArea::flushLayers(FlushType flushType)
 {
     if (layerTreeStateIsFrozen())
@@ -455,16 +480,8 @@
         if (m_viewOverlayRootLayer)
             m_viewOverlayRootLayer->flushCompositingState(visibleRect);
 
-        RefPtr<WebPage> retainedPage = &m_webPage;
-        [CATransaction addCommitHandler:[retainedPage] {
-            if (Page* corePage = retainedPage->corePage()) {
-                if (Frame* coreFrame = retainedPage->mainFrame())
-                    corePage->inspectorController().didComposite(*coreFrame);
-            }
-            if (auto drawingArea = static_cast<TiledCoreAnimationDrawingArea*>(retainedPage->drawingArea()))
-                drawingArea->sendPendingNewlyReachedPaintingMilestones();
-        } forPhase:kCATransactionPhasePostCommit];
-
+        addCommitHandlers();
+        
         bool didFlushAllFrames = m_webPage.mainFrameView()->flushCompositingStateIncludingSubframes();
 
 #if ENABLE(ASYNC_SCROLLING)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to