Skip to content

Commit e32bce9

Browse files
authored
Merge pull request #1304 from WebPlatformForEmbedded/pgorszkowski/2.38/focus_event_for_new_element
AX: Incomplete object information with focus event on dynamic created…
2 parents 99973c6 + f781c3a commit e32bce9

2 files changed

Lines changed: 27 additions & 7 deletions

File tree

Source/WebCore/accessibility/AXObjectCache.cpp

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

13771397
void AXObjectCache::deferMenuListValueChange(Element* element)

Source/WebCore/accessibility/AXObjectCache.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ class AXObjectCache {
199199
void loadingFinished() { updateLoadingProgress(1); }
200200
double loadingProgress() const { return m_loadingProgress; }
201201

202-
void deferFocusedUIElementChangeIfNeeded(Node* oldFocusedNode, Node* newFocusedNode);
202+
void deferFocusedUIElementChangeIfNeeded(Element* oldElement, Element* newElement);
203203
void deferModalChange(Element*);
204204
void deferMenuListValueChange(Element*);
205205
void deferNodeAddedOrRemoved(Node*);
@@ -647,7 +647,7 @@ inline void AXObjectCache::childrenChanged(Node*, Node*) { }
647647
inline void AXObjectCache::childrenChanged(RenderObject*, RenderObject*) { }
648648
inline void AXObjectCache::childrenChanged(AccessibilityObject*) { }
649649
inline void AXObjectCache::valueChanged(Element*) { }
650-
inline void AXObjectCache::deferFocusedUIElementChangeIfNeeded(Node*, Node*) { }
650+
inline void AXObjectCache::deferFocusedUIElementChangeIfNeeded(Element*, Element*) { }
651651
inline void AXObjectCache::deferRecomputeIsIgnoredIfNeeded(Element*) { }
652652
inline void AXObjectCache::deferRecomputeIsIgnored(Element*) { }
653653
inline void AXObjectCache::deferTextChangedIfNeeded(Node*) { }

0 commit comments

Comments
 (0)