⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 268902 in webkit


Ignore:
Timestamp:
Oct 22, 2020, 6:38:25 PM (6 years ago)
Author:
Simon Fraser
Message:

REGRESSION(r268476): [ macOS ] tiled-drawing/scrolling/non-fast-region/handlers-in-iframes.html is a flaky failure
https://bugs.webkit.org/show_bug.cgi?id=218031
<rdar://problem/70532268>

Reviewed by Tim Horton.
Source/WebCore:

The test exercises wheel event regions in non-composited iframes. These were not reliably updated
when all wheel event handlers were removed, because Frame::invalidateContentEventRegionsIfNeeded()
early-returned if there were no handlers (but we need to update the regions in this case). Clean
up the logic here, and pass in a "reason" so we know that we should do work when there are no
handlers.

Document::wheelEventHandlersChanged() also needs to invalidate style, since flags in style
are used for wheel event region building, and it needs to call invalidateContentEventRegionsIfNeeded().

  • dom/Document.cpp:

(WebCore::Document::wheelEventHandlersChanged):
(WebCore::Document::didAddWheelEventHandler):
(WebCore::Document::didRemoveWheelEventHandler):

  • dom/Document.h:
  • page/Frame.cpp:

(WebCore::Frame::invalidateContentEventRegionsIfNeeded):

  • page/Frame.h:
  • page/FrameView.cpp:

(WebCore::FrameView::didLayout):

LayoutTests:

  • platform/mac/TestExpectations:
Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r268901 r268902  
     12020-10-22  Simon Fraser  <simon.fraser@apple.com>
     2
     3        REGRESSION(r268476): [ macOS ] tiled-drawing/scrolling/non-fast-region/handlers-in-iframes.html is a flaky failure
     4        https://bugs.webkit.org/show_bug.cgi?id=218031
     5        <rdar://problem/70532268>
     6
     7        Reviewed by Tim Horton.
     8       
     9        * platform/mac/TestExpectations:
     10
    1112020-10-22  Aditya Keerthi  <akeerthi@apple.com>
    212
  • trunk/LayoutTests/platform/mac/TestExpectations

    r268865 r268902  
    22572257webkit.org/b/217994 imported/w3c/web-platform-tests/webaudio/the-audio-api/the-audioworklet-interface/audioworkletnode-output-channel-count.https.html [ Pass Failure ]
    22582258
    2259 webkit.org/b/218031 tiled-drawing/scrolling/non-fast-region/handlers-in-iframes.html [ Pass Failure ]
    2260 
    22612259# rdar://70546330 REGRESSION (r267531): [ Big Sur iOS 14 ] imported/w3c/web-platform-tests/mathml/relations/css-styling/padding-border-margin/border-002.html is a constant failure
    22622260[ BigSur+ ] imported/w3c/web-platform-tests/mathml/relations/css-styling/padding-border-margin/border-002.html [ Failure ]
  • trunk/Source/WebCore/ChangeLog

    r268901 r268902  
     12020-10-22  Simon Fraser  <simon.fraser@apple.com>
     2
     3        REGRESSION(r268476): [ macOS ] tiled-drawing/scrolling/non-fast-region/handlers-in-iframes.html is a flaky failure
     4        https://bugs.webkit.org/show_bug.cgi?id=218031
     5        <rdar://problem/70532268>
     6
     7        Reviewed by Tim Horton.
     8
     9        The test exercises wheel event regions in non-composited iframes. These were not reliably updated
     10        when all wheel event handlers were removed, because Frame::invalidateContentEventRegionsIfNeeded()
     11        early-returned if there were no handlers (but we need to update the regions in this case). Clean
     12        up the logic here, and pass in a "reason" so we know that we should do work when there are no
     13        handlers.
     14
     15        Document::wheelEventHandlersChanged() also needs to invalidate style, since flags in style
     16        are used for wheel event region building, and it needs to call invalidateContentEventRegionsIfNeeded().
     17
     18        * dom/Document.cpp:
     19        (WebCore::Document::wheelEventHandlersChanged):
     20        (WebCore::Document::didAddWheelEventHandler):
     21        (WebCore::Document::didRemoveWheelEventHandler):
     22        * dom/Document.h:
     23        * page/Frame.cpp:
     24        (WebCore::Frame::invalidateContentEventRegionsIfNeeded):
     25        * page/Frame.h:
     26        * page/FrameView.cpp:
     27        (WebCore::FrameView::didLayout):
     28
    1292020-10-22  Aditya Keerthi  <akeerthi@apple.com>
    230
  • trunk/Source/WebCore/dom/Document.cpp

    r268868 r268902  
    66446644}
    66456645
    6646 void Document::wheelEventHandlersChanged()
     6646void Document::wheelEventHandlersChanged(Node* node)
    66476647{
    66486648    Page* page = this->page();
     
    66556655    }
    66566656
     6657#if ENABLE(WHEEL_EVENT_REGIONS)
     6658    if (is<Element>(node)) {
     6659        // Style is affected via eventListenerRegionTypes().
     6660        downcast<Element>(*node).invalidateStyle();
     6661    }
     6662
     6663    m_frame->invalidateContentEventRegionsIfNeeded(Frame::InvalidateContentEventRegionsReason::EventHandlerChange);
     6664#else
     6665    UNUSED_PARAM(node);
     6666#endif
     6667
    66576668    bool haveHandlers = m_wheelEventTargets && !m_wheelEventTargets->isEmpty();
    66586669    page->chrome().client().wheelEventHandlersChanged(haveHandlers);
     
    66656676
    66666677    m_wheelEventTargets->add(&node);
    6667 
    6668     wheelEventHandlersChanged();
     6678    wheelEventHandlersChanged(&node);
    66696679
    66706680    if (Frame* frame = this->frame())
     
    67006710        return;
    67016711
    6702     wheelEventHandlersChanged();
     6712    wheelEventHandlersChanged(&node);
    67036713
    67046714    if (Frame* frame = this->frame())
  • trunk/Source/WebCore/dom/Document.h

    r268868 r268902  
    16751675    void didAssociateFormControlsTimerFired();
    16761676
    1677     void wheelEventHandlersChanged();
     1677    void wheelEventHandlersChanged(Node* = nullptr);
    16781678
    16791679    HttpEquivPolicy httpEquivPolicy() const;
  • trunk/Source/WebCore/page/Frame.cpp

    r268716 r268902  
    301301}
    302302
    303 void Frame::invalidateContentEventRegionsIfNeeded()
     303void Frame::invalidateContentEventRegionsIfNeeded(InvalidateContentEventRegionsReason reason)
    304304{
    305305    if (!m_page || !m_doc || !m_doc->renderView())
    306306        return;
    307     bool hasWheelEventHandlers = false;
    308     bool hasTouchActionElements = false;
    309     bool hasEditableElements = false;
     307
     308    bool needsUpdateForWheelEventHandlers = false;
     309    bool needsUpdateForTouchActionElements = false;
     310    bool needsUpdateForEditableElements = false;
    310311#if ENABLE(WHEEL_EVENT_REGIONS)
    311     hasWheelEventHandlers = m_doc->hasWheelEventHandlers();
     312    needsUpdateForWheelEventHandlers = m_doc->hasWheelEventHandlers() || reason == InvalidateContentEventRegionsReason::EventHandlerChange;
     313#else
     314    UNUSED_PARAM(reason);
    312315#endif
    313316#if ENABLE(TOUCH_ACTION_REGIONS)
    314     hasTouchActionElements = m_doc->mayHaveElementsWithNonAutoTouchAction();
     317    // Document::mayHaveElementsWithNonAutoTouchAction never changes from true to false currently.
     318    needsUpdateForTouchActionElements = m_doc->mayHaveElementsWithNonAutoTouchAction();
    315319#endif
    316320#if ENABLE(EDITABLE_REGION)
    317     hasEditableElements = m_doc->mayHaveEditableElements() && m_page->shouldBuildEditableRegion();
     321    // Document::mayHaveEditableElements never changes from true to false currently.
     322    needsUpdateForEditableElements = m_doc->mayHaveEditableElements() && m_page->shouldBuildEditableRegion();
    318323#endif
    319     if (!hasTouchActionElements && !hasEditableElements && !hasWheelEventHandlers)
    320         return;
     324    if (!needsUpdateForTouchActionElements && !needsUpdateForEditableElements && !needsUpdateForWheelEventHandlers)
     325        return;
     326
    321327    if (!m_doc->renderView()->compositor().viewNeedsToInvalidateEventRegionOfEnclosingCompositingLayerForRepaint())
    322328        return;
     329
    323330    if (m_ownerElement)
    324331        m_ownerElement->document().invalidateEventRegionsForFrame(*m_ownerElement);
  • trunk/Source/WebCore/page/Frame.h

    r268716 r268902  
    308308    bool mayPrewarmLocalStorage() const;
    309309
    310     void invalidateContentEventRegionsIfNeeded();
     310    enum class InvalidateContentEventRegionsReason { Layout, EventHandlerChange };
     311    void invalidateContentEventRegionsIfNeeded(InvalidateContentEventRegionsReason);
    311312
    312313    WEBCORE_EXPORT FloatSize screenSize() const;
    313314    void setOverrideScreenSize(FloatSize&&);
    314 
    315 // ========
    316315
    317316    void selfOnlyRef();
  • trunk/Source/WebCore/page/FrameView.cpp

    r268484 r268902  
    12721272#endif
    12731273
    1274     frame().invalidateContentEventRegionsIfNeeded();
     1274    frame().invalidateContentEventRegionsIfNeeded(Frame::InvalidateContentEventRegionsReason::Layout);
    12751275    document->invalidateRenderingDependentRegions();
    12761276
Note: See TracChangeset for help on using the changeset viewer.