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