From d7291370c5dfcf0aed4818c07d1836ed55e0a336 Mon Sep 17 00:00:00 2001 From: Tyler Wilcock Date: Sat, 17 Sep 2022 20:00:10 -0700 Subject: [PATCH] AX: AccessibilityNodeObject never resets m_childrenDirty to false https://bugs.webkit.org/show_bug.cgi?id=245322 rdar://problem/100073372 Reviewed by Chris Fleizach. In https://bugs.webkit.org/show_bug.cgi?id=245212, we moved these methods from AccessibilityRenderObject to AccessibilityNodeObject: - updateChildrenIfNecessary - setNeedsToUpdateChildren - needsToUpdateChildren - setNeedsToUpdateSubtree But crucially, we did not move the implementation of clearChildren, which is what resets m_childrenDirty to false when necessary, causing a performance issue (not a correctness issue) for these objects. * Source/WebCore/accessibility/AccessibilityNodeObject.cpp: (WebCore::AccessibilityNodeObject::clearChildren): * Source/WebCore/accessibility/AccessibilityNodeObject.h: * Source/WebCore/accessibility/AccessibilityRenderObject.cpp: (WebCore::AccessibilityRenderObject::clearChildren): Deleted. * Source/WebCore/accessibility/AccessibilityRenderObject.h: Canonical link: https://commits.webkit.org/254600@main --- Source/WebCore/accessibility/AccessibilityNodeObject.cpp | 6 ++++++ Source/WebCore/accessibility/AccessibilityNodeObject.h | 1 + Source/WebCore/accessibility/AccessibilityRenderObject.cpp | 6 ------ Source/WebCore/accessibility/AccessibilityRenderObject.h | 2 -- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Source/WebCore/accessibility/AccessibilityNodeObject.cpp b/Source/WebCore/accessibility/AccessibilityNodeObject.cpp index cb281fac8bcd..6e6503c81575 100644 --- a/Source/WebCore/accessibility/AccessibilityNodeObject.cpp +++ b/Source/WebCore/accessibility/AccessibilityNodeObject.cpp @@ -455,6 +455,12 @@ void AccessibilityNodeObject::updateChildrenIfNecessary() AccessibilityObject::updateChildrenIfNecessary(); } +void AccessibilityNodeObject::clearChildren() +{ + AccessibilityObject::clearChildren(); + m_childrenDirty = false; +} + void AccessibilityNodeObject::addChildren() { // If the need to add more children in addition to existing children arises, diff --git a/Source/WebCore/accessibility/AccessibilityNodeObject.h b/Source/WebCore/accessibility/AccessibilityNodeObject.h index 38f1cc468d89..c2013bf78a52 100644 --- a/Source/WebCore/accessibility/AccessibilityNodeObject.h +++ b/Source/WebCore/accessibility/AccessibilityNodeObject.h @@ -164,6 +164,7 @@ class AccessibilityNodeObject : public AccessibilityObject { AccessibilityRole remapAriaRoleDueToParent(AccessibilityRole) const; void addChildren() override; + void clearChildren() override; void updateChildrenIfNecessary() override; bool canHaveChildren() const override; bool isDescendantOfBarrenParent() const override; diff --git a/Source/WebCore/accessibility/AccessibilityRenderObject.cpp b/Source/WebCore/accessibility/AccessibilityRenderObject.cpp index 522becc0f0ad..68ba1a70e56d 100644 --- a/Source/WebCore/accessibility/AccessibilityRenderObject.cpp +++ b/Source/WebCore/accessibility/AccessibilityRenderObject.cpp @@ -2902,12 +2902,6 @@ bool AccessibilityRenderObject::canSetTextRangeAttributes() const return isTextControl(); } -void AccessibilityRenderObject::clearChildren() -{ - AccessibilityObject::clearChildren(); - m_childrenDirty = false; -} - void AccessibilityRenderObject::addImageMapChildren() { RenderBoxModelObject* cssBox = renderBoxModelObject(); diff --git a/Source/WebCore/accessibility/AccessibilityRenderObject.h b/Source/WebCore/accessibility/AccessibilityRenderObject.h index c977948d6a6a..78f9b5d69076 100644 --- a/Source/WebCore/accessibility/AccessibilityRenderObject.h +++ b/Source/WebCore/accessibility/AccessibilityRenderObject.h @@ -133,8 +133,6 @@ class AccessibilityRenderObject : public AccessibilityNodeObject { AccessibilityChildrenVector documentLinks() override; FrameView* documentFrameView() const override; - void clearChildren() override; - void setFocused(bool) override; void setSelectedTextRange(const PlainTextRange&) override; bool setValue(const String&) override;