Title: [222612] trunk/Source/WebCore
Revision
222612
Author
za...@apple.com
Date
2017-09-28 09:31:56 -0700 (Thu, 28 Sep 2017)

Log 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):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (222611 => 222612)


--- trunk/Source/WebCore/ChangeLog	2017-09-28 15:53:41 UTC (rev 222611)
+++ trunk/Source/WebCore/ChangeLog	2017-09-28 16:31:56 UTC (rev 222612)
@@ -1,3 +1,24 @@
+2017-09-28  Zalan Bujtas  <za...@apple.com>
+
+        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):
+
 2017-09-28  Zan Dobersek  <zdober...@igalia.com>
 
         [Cairo] Remove the cairo_glyph_t complexity from GlyphBuffer

Modified: trunk/Source/WebCore/accessibility/AXObjectCache.cpp (222611 => 222612)


--- trunk/Source/WebCore/accessibility/AXObjectCache.cpp	2017-09-28 15:53:41 UTC (rev 222611)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.cpp	2017-09-28 16:31:56 UTC (rev 222612)
@@ -719,8 +719,10 @@
     if (!node)
         return;
 
-    if (is<Element>(*node))
+    if (is<Element>(*node)) {
         m_deferredRecomputeIsIgnoredList.remove(downcast<Element>(node));
+        m_deferredSelectedChildredChangedList.remove(downcast<Element>(node));
+    }
     m_deferredTextChangedList.remove(node);
     removeNodeForUse(node);
 
@@ -2781,6 +2783,10 @@
             recomputeIsIgnored(renderer);
     }
     m_deferredRecomputeIsIgnoredList.clear();
+    
+    for (auto* selectElement : m_deferredSelectedChildredChangedList)
+        selectedChildrenChanged(selectElement);
+    m_deferredSelectedChildredChangedList.clear();
 }
 
 static bool rendererNeedsDeferredUpdate(RenderObject& renderer)
@@ -2833,6 +2839,19 @@
     textChanged(node);
 }
 
+void AXObjectCache::deferSelectedChildrenChangedIfNeeded(Element& selectElement)
+{
+    auto* renderer = selectElement.renderer();
+    if (renderer && renderer->beingDestroyed())
+        return;
+    
+    if (renderer && rendererNeedsDeferredUpdate(*renderer)) {
+        m_deferredSelectedChildredChangedList.add(&selectElement);
+        return;
+    }
+    selectedChildrenChanged(&selectElement);
+}
+
 bool isNodeAriaVisible(Node* node)
 {
     if (!node)

Modified: trunk/Source/WebCore/accessibility/AXObjectCache.h (222611 => 222612)


--- trunk/Source/WebCore/accessibility/AXObjectCache.h	2017-09-28 15:53:41 UTC (rev 222611)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.h	2017-09-28 16:31:56 UTC (rev 222612)
@@ -332,6 +332,7 @@
     void deferRecomputeIsIgnoredIfNeeded(Element*);
     void deferRecomputeIsIgnored(Element*);
     void deferTextChangedIfNeeded(Node*);
+    void deferSelectedChildrenChangedIfNeeded(Element&);
     void performDeferredCacheUpdate();
     
     RefPtr<Range> rangeMatchesTextNearRange(RefPtr<Range>, const String&);
@@ -439,6 +440,7 @@
     AXTextStateChangeIntent m_textSelectionIntent;
     ListHashSet<Element*> m_deferredRecomputeIsIgnoredList;
     ListHashSet<Node*> m_deferredTextChangedList;
+    ListHashSet<Element*> m_deferredSelectedChildredChangedList;
     bool m_isSynchronizingSelection { false };
     bool m_performingDeferredCacheUpdate { false };
 };
@@ -490,6 +492,7 @@
 inline void AXObjectCache::deferRecomputeIsIgnoredIfNeeded(Element*) { }
 inline void AXObjectCache::deferRecomputeIsIgnored(Element*) { }
 inline void AXObjectCache::deferTextChangedIfNeeded(Node*) { }
+inline void AXObjectCache::deferSelectedChildrenChangedIfNeeded(Element&) { }
 inline void AXObjectCache::detachWrapper(AccessibilityObject*, AccessibilityDetachmentType) { }
 inline void AXObjectCache::focusAriaModalNodeTimerFired() { }
 inline void AXObjectCache::frameLoadingEventNotification(Frame*, AXLoadingEvent) { }

Modified: trunk/Source/WebCore/rendering/RenderListBox.cpp (222611 => 222612)


--- trunk/Source/WebCore/rendering/RenderListBox.cpp	2017-09-28 15:53:41 UTC (rev 222611)
+++ trunk/Source/WebCore/rendering/RenderListBox.cpp	2017-09-28 16:31:56 UTC (rev 222612)
@@ -162,7 +162,7 @@
     }
     
     if (AXObjectCache* cache = document().existingAXObjectCache())
-        cache->selectedChildrenChanged(this);
+        cache->deferSelectedChildrenChangedIfNeeded(selectElement());
 }
 
 void RenderListBox::layout()
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to