Changeset 246142 in webkit


Ignore:
Timestamp:
Jun 5, 2019 8:39:08 PM (5 years ago)
Author:
commit-queue@webkit.org
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 <sabouhallawa@apple.com> 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):

Location:
trunk/Source
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r246138 r246142  
     12019-06-05  Said Abou-Hallawa  <sabouhallawa@apple.com>
     2
     3        [Cocoa] REGRESSION(r244182): Inspector thinks CA commits can be nested
     4        https://bugs.webkit.org/show_bug.cgi?id=198497
     5
     6        Reviewed by Simon Fraser.
     7
     8        WebInspecter should coalesce nested composites as one recorded composite.
     9        This can be done by ensuring that we only process CA preCommit and postCommit
     10        once per nested commits.
     11
     12        * inspector/InspectorController.cpp:
     13        (WebCore::InspectorController::willComposite):
     14        * inspector/InspectorController.h:
     15        Export willComposite(). We want to call willComposite()/ didComposite()
     16        from CA preCommit and postCommit handlers in flushLayers().
     17
     18        * inspector/agents/InspectorTimelineAgent.cpp:
     19        (WebCore::InspectorTimelineAgent::didComposite):
     20        Unrelated change: didComposite() should not assert that we're in the middle
     21        of a composite. Web Inspector may connect in the middle of a composite.
     22
     23        * page/FrameView.cpp:
     24        (WebCore::FrameView::flushCompositingStateIncludingSubframes):
     25        InspectorController::willComposite() will be called form CA preCommit
     26        handler of flushLayers().
     27
    1282019-06-05  Myles C. Maxfield  <mmaxfield@apple.com>
    229
  • trunk/Source/WebCore/inspector/InspectorController.cpp

    r244172 r246142  
    508508}
    509509
     510void InspectorController::willComposite(Frame& frame)
     511{
     512    InspectorInstrumentation::willComposite(frame);
     513}
     514
    510515void InspectorController::didComposite(Frame& frame)
    511516{
  • trunk/Source/WebCore/inspector/InspectorController.h

    r244172 r246142  
    9898    WEBCORE_EXPORT void setIndicating(bool);
    9999
     100    WEBCORE_EXPORT void willComposite(Frame&);
    100101    WEBCORE_EXPORT void didComposite(Frame&);
    101102
  • trunk/Source/WebCore/inspector/agents/InspectorTimelineAgent.cpp

    r244195 r246142  
    365365void InspectorTimelineAgent::didComposite()
    366366{
    367     ASSERT(m_startedComposite);
    368367    didCompleteCurrentRecord(TimelineRecordType::Composite);
    369368    m_startedComposite = false;
  • trunk/Source/WebCore/page/FrameView.cpp

    r245823 r246142  
    11491149bool FrameView::flushCompositingStateIncludingSubframes()
    11501150{
    1151 #if PLATFORM(COCOA)
    1152     InspectorInstrumentation::willComposite(frame());
    1153 #endif
    1154 
    11551151    bool allFramesFlushed = flushCompositingStateForThisFrame(frame());
    11561152
  • trunk/Source/WebKit/ChangeLog

    r246137 r246142  
     12019-06-05  Said Abou-Hallawa  <sabouhallawa@apple.com>
     2
     3        [Cocoa] REGRESSION(r244182): Inspector thinks CA commits can be nested
     4        https://bugs.webkit.org/show_bug.cgi?id=198497
     5
     6        Reviewed by Simon Fraser.
     7
     8        Call InspectorController::willComposite() from the CA preCommit handler
     9        similar to the call to InspectorController::didComposite() in the CA
     10        postCommit handler. Ensure these calls will be once for nested commits.
     11
     12        * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h:
     13        * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm:
     14        (WebKit::RemoteLayerTreeDrawingArea::addCommitHandlers):
     15        (WebKit::RemoteLayerTreeDrawingArea::flushLayers):
     16        * WebProcess/WebPage/WebPage.h:
     17        (WebKit::WebPage::firstFlushAfterCommit const):
     18        (WebKit::WebPage::setFirstFlushAfterCommit):
     19        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h:
     20        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
     21        (WebKit::TiledCoreAnimationDrawingArea::addCommitHandlers):
     22        (WebKit::TiledCoreAnimationDrawingArea::flushLayers):
     23
    1242019-06-05  Alex Christensen  <achristensen@webkit.org>
    225
  • trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h

    r244291 r246142  
    115115    void updateRootLayers();
    116116
    117     void flushInitialDeferredPaint();
     117    void addCommitHandlers();
    118118    void flushLayers();
    119119
  • trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm

    r245796 r246142  
    326326    return true;
    327327}
     328   
     329void RemoteLayerTreeDrawingArea::addCommitHandlers()
     330{
     331    if (m_webPage.firstFlushAfterCommit())
     332        return;
     333
     334    [CATransaction addCommitHandler:[retainedPage = makeRefPtr(&m_webPage)] {
     335        if (Page* corePage = retainedPage->corePage()) {
     336            if (Frame* coreFrame = retainedPage->mainFrame())
     337                corePage->inspectorController().willComposite(*coreFrame);
     338        }
     339    } forPhase:kCATransactionPhasePreCommit];
     340   
     341    [CATransaction addCommitHandler:[retainedPage = makeRefPtr(&m_webPage)] {
     342        if (Page* corePage = retainedPage->corePage()) {
     343            if (Frame* coreFrame = retainedPage->mainFrame())
     344                corePage->inspectorController().didComposite(*coreFrame);
     345        }
     346        retainedPage->setFirstFlushAfterCommit(false);
     347    } forPhase:kCATransactionPhasePostCommit];
     348   
     349    m_webPage.setFirstFlushAfterCommit(true);
     350}
    328351
    329352void RemoteLayerTreeDrawingArea::flushLayers()
     
    357380        visibleRect.intersect(m_scrolledViewExposedRect.value());
    358381
    359     RefPtr<WebPage> protectedWebPage = &m_webPage;
    360     [CATransaction addCommitHandler:[protectedWebPage] {
    361         if (Page* corePage = protectedWebPage->corePage()) {
    362             if (Frame* coreFrame = protectedWebPage->mainFrame())
    363                 corePage->inspectorController().didComposite(*coreFrame);
    364         }
    365     } forPhase:kCATransactionPhasePostCommit];
     382    addCommitHandlers();
    366383
    367384    if (m_nextFlushIsForImmediatePaint)
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.h

    r246116 r246142  
    12071207    void setUserIsInteracting(bool userIsInteracting) { m_userIsInteracting = userIsInteracting; }
    12081208
     1209    bool firstFlushAfterCommit() const { return m_firstFlushAfterCommit; }
     1210    void setFirstFlushAfterCommit(bool f) { m_firstFlushAfterCommit = f; }
     1211   
    12091212private:
    12101213    WebPage(WebCore::PageIdentifier, WebPageCreationParameters&&);
     
    19341937    bool m_isSuspended { false };
    19351938    bool m_needsFontAttributes { false };
     1939    bool m_firstFlushAfterCommit { false };
    19361940#if PLATFORM(COCOA)
    19371941    WeakPtr<RemoteObjectRegistry> m_remoteObjectRegistry;
  • trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h

    r244633 r246142  
    8989    bool addMilestonesToDispatch(OptionSet<WebCore::LayoutMilestone> paintMilestones) override;
    9090
     91    void addCommitHandlers();
    9192    enum class FlushType { Normal, TransientZoom };
    9293    void flushLayers(FlushType = FlushType::Normal);
  • trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm

    r244633 r246142  
    432432}
    433433
     434void TiledCoreAnimationDrawingArea::addCommitHandlers()
     435{
     436    if (m_webPage.firstFlushAfterCommit())
     437        return;
     438
     439    [CATransaction addCommitHandler:[retainedPage = makeRefPtr(&m_webPage)] {
     440        if (Page* corePage = retainedPage->corePage()) {
     441            if (Frame* coreFrame = retainedPage->mainFrame())
     442                corePage->inspectorController().willComposite(*coreFrame);
     443        }
     444    } forPhase:kCATransactionPhasePreCommit];
     445
     446    [CATransaction addCommitHandler:[retainedPage = makeRefPtr(&m_webPage)] {
     447        if (Page* corePage = retainedPage->corePage()) {
     448            if (Frame* coreFrame = retainedPage->mainFrame())
     449                corePage->inspectorController().didComposite(*coreFrame);
     450        }
     451        if (auto drawingArea = static_cast<TiledCoreAnimationDrawingArea*>(retainedPage->drawingArea()))
     452            drawingArea->sendPendingNewlyReachedPaintingMilestones();
     453        retainedPage->setFirstFlushAfterCommit(false);
     454    } forPhase:kCATransactionPhasePostCommit];
     455   
     456    m_webPage.setFirstFlushAfterCommit(true);
     457}
     458
    434459void TiledCoreAnimationDrawingArea::flushLayers(FlushType flushType)
    435460{
     
    456481            m_viewOverlayRootLayer->flushCompositingState(visibleRect);
    457482
    458         RefPtr<WebPage> retainedPage = &m_webPage;
    459         [CATransaction addCommitHandler:[retainedPage] {
    460             if (Page* corePage = retainedPage->corePage()) {
    461                 if (Frame* coreFrame = retainedPage->mainFrame())
    462                     corePage->inspectorController().didComposite(*coreFrame);
    463             }
    464             if (auto drawingArea = static_cast<TiledCoreAnimationDrawingArea*>(retainedPage->drawingArea()))
    465                 drawingArea->sendPendingNewlyReachedPaintingMilestones();
    466         } forPhase:kCATransactionPhasePostCommit];
    467 
     483        addCommitHandlers();
     484       
    468485        bool didFlushAllFrames = m_webPage.mainFrameView()->flushCompositingStateIncludingSubframes();
    469486
Note: See TracChangeset for help on using the changeset viewer.