Changeset 216096 in webkit


Ignore:
Timestamp:
May 2, 2017 2:29:13 PM (7 years ago)
Author:
Alan Bujtas
Message:

Defer AX cache update when text content changes until after layout is finished.
https://bugs.webkit.org/show_bug.cgi?id=171429
<rdar://problem/31885984>

Reviewed by Simon Fraser.

Source/WebCore:

When the content of the RenderText changes (even as the result of a text-transform change)
instead of updating the AX cache eagerly (and trigger layout on a half-backed render tree)
we should just defer it until after the subsequent layout is done.

Test: accessibility/crash-while-adding-text-child-with-transform.html

  • accessibility/AXObjectCache.cpp:

(WebCore::AXObjectCache::remove):
(WebCore::AXObjectCache::performDeferredCacheUpdate):
(WebCore::AXObjectCache::recomputeDeferredIsIgnored):
(WebCore::AXObjectCache::deferTextChanged):
(WebCore::AXObjectCache::performDeferredIsIgnoredChange): Deleted.

  • accessibility/AXObjectCache.h:

(WebCore::AXObjectCache::deferTextChanged):
(WebCore::AXObjectCache::performDeferredCacheUpdate):
(WebCore::AXObjectCache::performDeferredIsIgnoredChange): Deleted.

  • page/FrameView.cpp:

(WebCore::FrameView::performPostLayoutTasks):

  • rendering/RenderText.cpp:

(WebCore::RenderText::setText):

LayoutTests:

  • accessibility/crash-while-adding-text-child-with-transform-expected.txt: Added.
  • accessibility/crash-while-adding-text-child-with-transform.html: Added.
Location:
trunk
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r216090 r216096  
     12017-05-02  Zalan Bujtas  <zalan@apple.com>
     2
     3        Defer AX cache update when text content changes until after layout is finished.
     4        https://bugs.webkit.org/show_bug.cgi?id=171429
     5        <rdar://problem/31885984>
     6
     7        Reviewed by Simon Fraser.
     8
     9        * accessibility/crash-while-adding-text-child-with-transform-expected.txt: Added.
     10        * accessibility/crash-while-adding-text-child-with-transform.html: Added.
     11
    1122017-05-02  David Kilzer  <ddkilzer@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r216094 r216096  
     12017-05-02  Zalan Bujtas  <zalan@apple.com>
     2
     3        Defer AX cache update when text content changes until after layout is finished.
     4        https://bugs.webkit.org/show_bug.cgi?id=171429
     5        <rdar://problem/31885984>
     6
     7        Reviewed by Simon Fraser.
     8
     9        When the content of the RenderText changes (even as the result of a text-transform change)
     10        instead of updating the AX cache eagerly (and trigger layout on a half-backed render tree)
     11        we should just defer it until after the subsequent layout is done.
     12
     13        Test: accessibility/crash-while-adding-text-child-with-transform.html
     14
     15        * accessibility/AXObjectCache.cpp:
     16        (WebCore::AXObjectCache::remove):
     17        (WebCore::AXObjectCache::performDeferredCacheUpdate):
     18        (WebCore::AXObjectCache::recomputeDeferredIsIgnored):
     19        (WebCore::AXObjectCache::deferTextChanged):
     20        (WebCore::AXObjectCache::performDeferredIsIgnoredChange): Deleted.
     21        * accessibility/AXObjectCache.h:
     22        (WebCore::AXObjectCache::deferTextChanged):
     23        (WebCore::AXObjectCache::performDeferredCacheUpdate):
     24        (WebCore::AXObjectCache::performDeferredIsIgnoredChange): Deleted.
     25        * page/FrameView.cpp:
     26        (WebCore::FrameView::performPostLayoutTasks):
     27        * rendering/RenderText.cpp:
     28        (WebCore::RenderText::setText):
     29
    1302017-05-02  Wenson Hsieh  <wenson_hsieh@apple.com>
    231
  • trunk/Source/WebCore/accessibility/AXObjectCache.cpp

    r215837 r216096  
    712712    remove(axID);
    713713    m_renderObjectMapping.remove(renderer);
    714     if (is<RenderBlock>(*renderer))
    715         m_deferredIsIgnoredChangeList.remove(downcast<RenderBlock>(renderer));
     714    m_deferredCacheUpdateList.remove(renderer);
    716715}
    717716
     
    27012700}
    27022701   
    2703 void AXObjectCache::performDeferredIsIgnoredChange()
    2704 {
    2705     for (auto* renderer : m_deferredIsIgnoredChangeList)
    2706         recomputeIsIgnored(renderer);
    2707     m_deferredIsIgnoredChangeList.clear();
     2702void AXObjectCache::performDeferredCacheUpdate()
     2703{
     2704    for (auto* renderer : m_deferredCacheUpdateList) {
     2705        if (is<RenderBlock>(*renderer))
     2706            recomputeIsIgnored(renderer);
     2707        else if (is<RenderText>(*renderer))
     2708            textChanged(renderer);
     2709        else
     2710            ASSERT_NOT_REACHED();
     2711    }
     2712    m_deferredCacheUpdateList.clear();
    27082713}
    27092714
    27102715void AXObjectCache::recomputeDeferredIsIgnored(RenderBlock& renderer)
    27112716{
    2712     m_deferredIsIgnoredChangeList.add(&renderer);
     2717    m_deferredCacheUpdateList.add(&renderer);
     2718}
     2719
     2720void AXObjectCache::deferTextChanged(RenderText& renderer)
     2721{
     2722    m_deferredCacheUpdateList.add(&renderer);
    27132723}
    27142724
  • trunk/Source/WebCore/accessibility/AXObjectCache.h

    r215837 r216096  
    4646class RenderBlock;
    4747class RenderObject;
     48class RenderText;
    4849class ScrollView;
    4950class VisiblePosition;
     
    328329#endif
    329330    void recomputeDeferredIsIgnored(RenderBlock& renderer);
    330     void performDeferredIsIgnoredChange();
     331    void deferTextChanged(RenderText& renderer);
     332    void performDeferredCacheUpdate();
    331333
    332334protected:
     
    430432    AXTextStateChangeIntent m_textSelectionIntent;
    431433    bool m_isSynchronizingSelection { false };
    432     ListHashSet<RenderBlock*> m_deferredIsIgnoredChangeList;
     434    ListHashSet<RenderObject*> m_deferredCacheUpdateList;
    433435};
    434436
     
    493495inline void AXObjectCache::recomputeIsIgnored(RenderObject*) { }
    494496inline void AXObjectCache::recomputeDeferredIsIgnored(RenderBlock&) { }
    495 inline void AXObjectCache::performDeferredIsIgnoredChange() { }
     497inline void AXObjectCache::deferTextChanged(RenderText&) { }
     498inline void AXObjectCache::performDeferredCacheUpdate() { }
    496499inline void AXObjectCache::handleScrolledToAnchor(const Node*) { }
    497500inline void AXObjectCache::postTextStateChangeNotification(Node*, const AXTextStateChangeIntent&, const VisibleSelection&) { }
  • trunk/Source/WebCore/page/FrameView.cpp

    r216047 r216096  
    35543554
    35553555    if (AXObjectCache* cache = frame().document()->existingAXObjectCache())
    3556         cache->performDeferredIsIgnoredChange();
     3556        cache->performDeferredCacheUpdate();
    35573557}
    35583558
  • trunk/Source/WebCore/rendering/RenderText.cpp

    r215325 r216096  
    12821282   
    12831283    if (AXObjectCache* cache = document().existingAXObjectCache())
    1284         cache->textChanged(this);
     1284        cache->deferTextChanged(*this);
    12851285}
    12861286
Note: See TracChangeset for help on using the changeset viewer.