@@ -1364,14 +1364,34 @@ void AXObjectCache::handleRowCountChanged(AXCoreObject* axObject, Document* docu
13641364 postNotification (axObject, document, AXRowCountChanged);
13651365}
13661366
1367- void AXObjectCache::deferFocusedUIElementChangeIfNeeded (Node* oldNode, Node* newNode )
1367+ static bool shouldDeferFocusChange (Element* element )
13681368{
1369- if (nodeAndRendererAreValid (newNode) && rendererNeedsDeferredUpdate (*newNode->renderer ())) {
1370- m_deferredFocusedNodeChange.append ({ oldNode, newNode });
1371- if (!newNode->renderer ()->needsLayout () && !m_performCacheUpdateTimer.isActive ())
1369+ if (!element)
1370+ return false ;
1371+
1372+ auto * renderer = element->renderer ();
1373+ if (renderer && rendererNeedsDeferredUpdate (*renderer))
1374+ return true ;
1375+
1376+ // We also want to defer handling focus changes for nodes that haven't yet attached their renderer.
1377+ if (const auto * style = element->existingComputedStyle ())
1378+ return !renderer && element->rendererIsNeeded (*style);
1379+ // No existing style, so we can't easily determine whether this element will need a renderer.
1380+ // Resolving style is expensive and we don't want to do it now, so make this decision assuming
1381+ // a renderer just hasn't been attached yet, indicated by it being nullptr.
1382+ return !renderer;
1383+ }
1384+
1385+ void AXObjectCache::deferFocusedUIElementChangeIfNeeded (Element* oldElement, Element* newElement)
1386+ {
1387+ if (shouldDeferFocusChange (newElement)) {
1388+ m_deferredFocusedNodeChange.append ({ oldElement, newElement });
1389+ // Don't start the timer if a layout is pending, as the layout will trigger a cache update.
1390+ bool needsLayout = newElement->renderer () && newElement->renderer ()->needsLayout ();
1391+ if (!needsLayout && !m_performCacheUpdateTimer.isActive ())
13721392 m_performCacheUpdateTimer.startOneShot (0_s);
13731393 } else
1374- handleFocusedUIElementChanged (oldNode, newNode );
1394+ handleFocusedUIElementChanged (oldElement, newElement );
13751395}
13761396
13771397void AXObjectCache::deferMenuListValueChange (Element* element)
0 commit comments