Changeset 222612 in webkit


Ignore:
Timestamp:
Sep 28, 2017 9:31:56 AM (7 years ago)
Author:
Alan Bujtas
Message:

AX: Defer RenderListBox selectionChanged event until after layout is done.
https://bugs.webkit.org/show_bug.cgi?id=177589
<rdar://problem/34705785>

Reviewed by Chris Fleizach.

Defer AX update when the selection changed event is followed by a layout.

Covered by existing tests.

  • accessibility/AXObjectCache.cpp:

(WebCore::AXObjectCache::remove):
(WebCore::AXObjectCache::performDeferredCacheUpdate):
(WebCore::AXObjectCache::deferSelectedChildrenChangedIfNeeded):

  • accessibility/AXObjectCache.h:

(WebCore::AXObjectCache::deferSelectedChildrenChangedIfNeeded):

  • rendering/RenderListBox.cpp:

(WebCore::RenderListBox::selectionChanged):

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r222610 r222612  
     12017-09-28  Zalan Bujtas  <zalan@apple.com>
     2
     3        AX: Defer RenderListBox selectionChanged event until after layout is done.
     4        https://bugs.webkit.org/show_bug.cgi?id=177589
     5        <rdar://problem/34705785>
     6
     7        Reviewed by Chris Fleizach.
     8
     9        Defer AX update when the selection changed event is followed by a layout.
     10
     11        Covered by existing tests.
     12
     13        * accessibility/AXObjectCache.cpp:
     14        (WebCore::AXObjectCache::remove):
     15        (WebCore::AXObjectCache::performDeferredCacheUpdate):
     16        (WebCore::AXObjectCache::deferSelectedChildrenChangedIfNeeded):
     17        * accessibility/AXObjectCache.h:
     18        (WebCore::AXObjectCache::deferSelectedChildrenChangedIfNeeded):
     19        * rendering/RenderListBox.cpp:
     20        (WebCore::RenderListBox::selectionChanged):
     21
    1222017-09-28  Zan Dobersek  <zdobersek@igalia.com>
    223
  • trunk/Source/WebCore/accessibility/AXObjectCache.cpp

    r222594 r222612  
    720720        return;
    721721
    722     if (is<Element>(*node))
     722    if (is<Element>(*node)) {
    723723        m_deferredRecomputeIsIgnoredList.remove(downcast<Element>(node));
     724        m_deferredSelectedChildredChangedList.remove(downcast<Element>(node));
     725    }
    724726    m_deferredTextChangedList.remove(node);
    725727    removeNodeForUse(node);
     
    27822784    }
    27832785    m_deferredRecomputeIsIgnoredList.clear();
     2786   
     2787    for (auto* selectElement : m_deferredSelectedChildredChangedList)
     2788        selectedChildrenChanged(selectElement);
     2789    m_deferredSelectedChildredChangedList.clear();
    27842790}
    27852791
     
    28322838    }
    28332839    textChanged(node);
     2840}
     2841
     2842void AXObjectCache::deferSelectedChildrenChangedIfNeeded(Element& selectElement)
     2843{
     2844    auto* renderer = selectElement.renderer();
     2845    if (renderer && renderer->beingDestroyed())
     2846        return;
     2847   
     2848    if (renderer && rendererNeedsDeferredUpdate(*renderer)) {
     2849        m_deferredSelectedChildredChangedList.add(&selectElement);
     2850        return;
     2851    }
     2852    selectedChildrenChanged(&selectElement);
    28342853}
    28352854
  • trunk/Source/WebCore/accessibility/AXObjectCache.h

    r222594 r222612  
    333333    void deferRecomputeIsIgnored(Element*);
    334334    void deferTextChangedIfNeeded(Node*);
     335    void deferSelectedChildrenChangedIfNeeded(Element&);
    335336    void performDeferredCacheUpdate();
    336337   
     
    440441    ListHashSet<Element*> m_deferredRecomputeIsIgnoredList;
    441442    ListHashSet<Node*> m_deferredTextChangedList;
     443    ListHashSet<Element*> m_deferredSelectedChildredChangedList;
    442444    bool m_isSynchronizingSelection { false };
    443445    bool m_performingDeferredCacheUpdate { false };
     
    491493inline void AXObjectCache::deferRecomputeIsIgnored(Element*) { }
    492494inline void AXObjectCache::deferTextChangedIfNeeded(Node*) { }
     495inline void AXObjectCache::deferSelectedChildrenChangedIfNeeded(Element&) { }
    493496inline void AXObjectCache::detachWrapper(AccessibilityObject*, AccessibilityDetachmentType) { }
    494497inline void AXObjectCache::focusAriaModalNodeTimerFired() { }
  • trunk/Source/WebCore/rendering/RenderListBox.cpp

    r218615 r222612  
    163163   
    164164    if (AXObjectCache* cache = document().existingAXObjectCache())
    165         cache->selectedChildrenChanged(this);
     165        cache->deferSelectedChildrenChangedIfNeeded(selectElement());
    166166}
    167167
Note: See TracChangeset for help on using the changeset viewer.