Skip to content

Commit

Permalink
AX: Finish converting all WebCore/accessibility member variables to u…
Browse files Browse the repository at this point in the history
…se smart pointers

https://bugs.webkit.org/show_bug.cgi?id=259606
rdar://113042000

Reviewed by Chris Fleizach.

Continued work towards complying with https://github.com/WebKit/WebKit/wiki/Smart-Pointer-Usage-Guidelines.

* Source/WebCore/accessibility/AXLogger.cpp:
(WebCore::AXLogger::log):
* Source/WebCore/accessibility/AXObjectCache.cpp:
(WebCore::AXObjectCache::AXObjectCache):
(WebCore::AXObjectCache::rootObject):
(WebCore::AXObjectCache::setIsolatedTreeRoot):
(WebCore::AXObjectCache::remove):
(WebCore::AXObjectCache::deferNodeAddedOrRemoved):
(WebCore::AXObjectCache::notificationPostTimerFired):
(WebCore::AXObjectCache::focusCurrentModal):
(WebCore::AXObjectCache::characterOffsetForPoint):
(WebCore::filterWeakListHashSetForRemoval):
(WebCore::filterWeakHashMapForRemoval):
(WebCore::AXObjectCache::prepareForDocumentDestruction):
(WebCore::AXObjectCache::performDeferredCacheUpdate):
(WebCore::AXObjectCache::deferTextChangedIfNeeded):
(WebCore::AXObjectCache::deferTextReplacementNotificationForTextControl):
(WebCore::AXObjectCache::rootWebArea):
(WebCore::AXObjectCache::updateRelationsIfNeeded):
(WebCore::AXObjectCache::addRelations):
* Source/WebCore/accessibility/AXObjectCache.h:
(WebCore::AXObjectCache::document const):
* Source/WebCore/accessibility/AccessibilityMenuListOption.h:
* Source/WebCore/accessibility/AccessibilitySpinButton.h:

Canonical link: https://commits.webkit.org/266406@main
  • Loading branch information
twilco committed Jul 28, 2023
1 parent 49aa2ac commit 5b4bb30
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 38 deletions.
2 changes: 2 additions & 0 deletions Source/WebCore/accessibility/AXLogger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,8 @@ void AXLogger::log(const String& collectionName, const AXObjectCache::DeferredCo
[&size] (const WeakHashSet<Element, WeakPtrImplWithEventTargetData>& typedCollection) { size = typedCollection.computeSize(); },
[&size] (const WeakHashSet<HTMLTableElement, WeakPtrImplWithEventTargetData>& typedCollection) { size = typedCollection.computeSize(); },
[&size] (const WeakHashSet<AccessibilityTable>& typedCollection) { size = typedCollection.computeSize(); },
[&size] (const WeakListHashSet<Node, WeakPtrImplWithEventTargetData>& typedCollection) { size = typedCollection.computeSize(); },
[&size] (const WeakHashMap<Element, String, WeakPtrImplWithEventTargetData>& typedCollection) { size = typedCollection.computeSize(); },
[] (auto&) {
ASSERT_NOT_REACHED();
return;
Expand Down
70 changes: 42 additions & 28 deletions Source/WebCore/accessibility/AXObjectCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ AXObjectCache::AXObjectCache(Document& document)
m_loadingProgress = loadingProgress;

if (m_pageID)
m_pageActivityState = m_document.page()->activityState();
m_pageActivityState = m_document->page()->activityState();
AXTreeStore::add(m_id, WeakPtr { this });
}

Expand Down Expand Up @@ -907,7 +907,7 @@ AXCoreObject* AXObjectCache::rootObject()
return isolatedTreeRootObject();
#endif

return getOrCreate(m_document.view());
return getOrCreate(m_document->view());
}

#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
Expand Down Expand Up @@ -974,7 +974,7 @@ AXCoreObject* AXObjectCache::isolatedTreeRootObject()
void AXObjectCache::setIsolatedTreeRoot(AXCoreObject* root)
{
ASSERT(isMainThread());
if (auto* frame = m_document.frame())
if (auto* frame = m_document->frame())
frame->loader().client().setAXIsolatedTreeRoot(root);
}
#endif
Expand Down Expand Up @@ -1076,7 +1076,7 @@ void AXObjectCache::remove(Node& node)
}

if (is<Element>(node)) {
m_deferredTextFormControlValue.remove(downcast<Element>(&node));
m_deferredTextFormControlValue.remove(downcast<Element>(node));
m_deferredAttributeChange.removeAllMatching([&node] (const auto& entry) {
return entry.element == &node;
});
Expand All @@ -1089,8 +1089,8 @@ void AXObjectCache::remove(Node& node)
m_deferredModalChangedList.remove(downcast<Element>(node));
m_deferredMenuListChange.remove(downcast<Element>(node));
}
m_deferredNodeAddedOrRemovedList.remove(&node);
m_deferredTextChangedList.remove(&node);
m_deferredNodeAddedOrRemovedList.remove(node);
m_deferredTextChangedList.remove(node);
}

void AXObjectCache::remove(Widget* view)
Expand Down Expand Up @@ -1329,7 +1329,7 @@ void AXObjectCache::deferNodeAddedOrRemoved(Node* node)
if (!node)
return;

m_deferredNodeAddedOrRemovedList.add(node);
m_deferredNodeAddedOrRemovedList.add(*node);

if (is<Element>(node)) {
auto* changedElement = downcast<Element>(node);
Expand Down Expand Up @@ -1387,7 +1387,7 @@ void AXObjectCache::notificationPostTimerFired()
Ref<Document> protectorForCacheOwner(m_document);
m_notificationPostTimer.stop();

if (!m_document.hasLivingRenderTree())
if (!m_document->hasLivingRenderTree())
return;

// In tests, posting notifications has a tendency to immediately queue up other notifications, which can lead to unexpected behavior
Expand Down Expand Up @@ -2079,7 +2079,7 @@ static AccessibilityObject* firstFocusableChild(AccessibilityObject* obj)

void AXObjectCache::focusCurrentModal()
{
if (!m_document.hasLivingRenderTree())
if (!m_document->hasLivingRenderTree())
return;

Ref<Document> protectedDocument(m_document);
Expand Down Expand Up @@ -3576,7 +3576,7 @@ CharacterOffset AXObjectCache::characterOffsetForPoint(const IntPoint& point, AX

CharacterOffset AXObjectCache::characterOffsetForPoint(const IntPoint& point)
{
auto range = makeSimpleRange(m_document.caretPositionFromPoint(point));
auto range = makeSimpleRange(m_document->caretPositionFromPoint(point));
if (!range)
return { };
return startOrEndCharacterOffsetForRange(*range, true);
Expand Down Expand Up @@ -3720,18 +3720,32 @@ static void filterWeakHashSetForRemoval(WeakHashSet& weakHashSet, const Document
});
}

template<typename WeakListHashSetType>
static void filterWeakListHashSetForRemoval(WeakListHashSetType& list, const Document& document, HashSet<Ref<Node>>& nodesToRemove)
{
for (auto& node : list)
conditionallyAddNodeToFilterList(&node, document, nodesToRemove);
}

template<typename WeakHashMapType>
static void filterWeakHashMapForRemoval(WeakHashMapType& map, const Document& document, HashSet<Ref<Node>>& nodesToRemove)
{
for (auto elementEntry : map)
conditionallyAddNodeToFilterList(&elementEntry.key, document, nodesToRemove);
}

void AXObjectCache::prepareForDocumentDestruction(const Document& document)
{
HashSet<Ref<Node>> nodesToRemove;
filterListForRemoval(m_textMarkerNodes, document, nodesToRemove);
filterListForRemoval(m_deferredTextChangedList, document, nodesToRemove);
filterListForRemoval(m_deferredNodeAddedOrRemovedList, document, nodesToRemove);
filterWeakListHashSetForRemoval(m_deferredTextChangedList, document, nodesToRemove);
filterWeakListHashSetForRemoval(m_deferredNodeAddedOrRemovedList, document, nodesToRemove);
filterWeakHashSetForRemoval(m_deferredRecomputeIsIgnoredList, document, nodesToRemove);
filterWeakHashSetForRemoval(m_deferredRecomputeTableIsExposedList, document, nodesToRemove);
filterWeakHashSetForRemoval(m_deferredSelectedChildredChangedList, document, nodesToRemove);
filterWeakHashSetForRemoval(m_deferredModalChangedList, document, nodesToRemove);
filterWeakHashSetForRemoval(m_deferredMenuListChange, document, nodesToRemove);
filterMapForRemoval(m_deferredTextFormControlValue, document, nodesToRemove);
filterWeakHashMapForRemoval(m_deferredTextFormControlValue, document, nodesToRemove);
m_deferredFocusedNodeChange = std::nullopt;

for (const auto& entry : m_deferredAttributeChange) {
Expand Down Expand Up @@ -3788,9 +3802,9 @@ void AXObjectCache::performDeferredCacheUpdate()
m_deferredRecomputeTableIsExposedList.clear();

AXLOGDeferredCollection("NodeAddedOrRemovedList"_s, m_deferredNodeAddedOrRemovedList);
for (auto* nodeChild : m_deferredNodeAddedOrRemovedList) {
handleMenuOpened(nodeChild);
handleLiveRegionCreated(nodeChild);
for (auto& nodeChild : m_deferredNodeAddedOrRemovedList) {
handleMenuOpened(&nodeChild);
handleLiveRegionCreated(&nodeChild);
}
m_deferredNodeAddedOrRemovedList.clear();

Expand All @@ -3804,8 +3818,8 @@ void AXObjectCache::performDeferredCacheUpdate()
m_deferredRecomputeTableCellSlotsList.clear();

AXLOGDeferredCollection("TextChangedList"_s, m_deferredTextChangedList);
for (auto* node : m_deferredTextChangedList)
handleTextChanged(getOrCreate(node));
for (auto& node : m_deferredTextChangedList)
handleTextChanged(getOrCreate(&node));
m_deferredTextChangedList.clear();

AXLOGDeferredCollection("RecomputeIsIgnoredList"_s, m_deferredRecomputeIsIgnoredList);
Expand All @@ -3822,15 +3836,15 @@ void AXObjectCache::performDeferredCacheUpdate()
m_deferredSelectedChildredChangedList.clear();

AXLOGDeferredCollection("TextFormControlValue"_s, m_deferredTextFormControlValue);
for (auto& deferredFormControlContext : m_deferredTextFormControlValue) {
auto& textFormControlElement = downcast<HTMLTextFormControlElement>(*deferredFormControlContext.key);
for (auto deferredFormControlContext : m_deferredTextFormControlValue) {
auto& textFormControlElement = downcast<HTMLTextFormControlElement>(deferredFormControlContext.key);
postTextReplacementNotificationForTextControl(textFormControlElement, deferredFormControlContext.value, textFormControlElement.innerTextValue());
}
m_deferredTextFormControlValue.clear();

AXLOGDeferredCollection("AttributeChange"_s, m_deferredAttributeChange);
for (const auto& attributeChange : m_deferredAttributeChange)
handleAttributeChange(attributeChange.element, attributeChange.attrName, attributeChange.oldValue, attributeChange.newValue);
handleAttributeChange(attributeChange.element.get(), attributeChange.attrName, attributeChange.oldValue, attributeChange.newValue);
m_deferredAttributeChange.clear();

if (m_deferredFocusedNodeChange) {
Expand Down Expand Up @@ -4150,7 +4164,7 @@ void AXObjectCache::deferTextChangedIfNeeded(Node* node)
return;

if (rendererNeedsDeferredUpdate(*node->renderer())) {
m_deferredTextChangedList.add(node);
m_deferredTextChangedList.add(*node);
return;
}
handleTextChanged(getOrCreate(node));
Expand All @@ -4175,7 +4189,7 @@ void AXObjectCache::deferTextReplacementNotificationForTextControl(HTMLTextFormC
auto* renderer = formControlElement.renderer();
if (!renderer)
return;
m_deferredTextFormControlValue.add(&formControlElement, previousValue);
m_deferredTextFormControlValue.add(formControlElement, previousValue);
}

bool isNodeAriaVisible(Node* node)
Expand Down Expand Up @@ -4218,7 +4232,7 @@ bool isNodeAriaVisible(Node* node)

AccessibilityObject* AXObjectCache::rootWebArea()
{
auto* root = getOrCreate(m_document.view());
auto* root = getOrCreate(m_document->view());
if (!root || !root->isScrollView())
return nullptr;
return root->webAreaObject();
Expand Down Expand Up @@ -4468,7 +4482,7 @@ void AXObjectCache::updateRelationsIfNeeded()
relationsNeedUpdate(false);
m_relations.clear();
m_relationTargets.clear();
updateRelationsForTree(m_document.rootNode());
updateRelationsForTree(m_document->rootNode());
}

void AXObjectCache::updateRelationsForTree(ContainerNode& rootNode)
Expand All @@ -4492,13 +4506,13 @@ void AXObjectCache::updateRelationsForTree(ContainerNode& rootNode)

void AXObjectCache::addRelations(Element& origin, const QualifiedName& attribute)
{
if (m_document.settings().ariaReflectionForElementReferencesEnabled()) {
if (Element::isElementReflectionAttribute(m_document.settings(), attribute)) {
if (m_document->settings().ariaReflectionForElementReferencesEnabled()) {
if (Element::isElementReflectionAttribute(m_document->settings(), attribute)) {
if (auto reflectedElement = origin.getElementAttribute(attribute)) {
addRelation(&origin, reflectedElement, attributeToRelationType(attribute));
return;
}
} else if (Element::isElementsArrayReflectionAttribute(m_document.settings(), attribute)) {
} else if (Element::isElementsArrayReflectionAttribute(m_document->settings(), attribute)) {
if (auto reflectedElements = origin.getElementsArrayAttribute(attribute)) {
for (auto reflectedElement : reflectedElements.value())
addRelation(&origin, reflectedElement.get(), attributeToRelationType(attribute));
Expand Down
21 changes: 14 additions & 7 deletions Source/WebCore/accessibility/AXObjectCache.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
#include <wtf/ListHashSet.h>
#include <wtf/WeakHashMap.h>
#include <wtf/WeakHashSet.h>

namespace WTF {
Expand Down Expand Up @@ -216,7 +217,7 @@ class AXObjectCache : public CanMakeWeakPtr<AXObjectCache>, public CanMakeChecke
double loadingProgress() const { return m_loadingProgress; }

struct AttributeChange {
Element* element { nullptr };
WeakPtr<Element, WeakPtrImplWithEventTargetData> element { nullptr };
QualifiedName attrName;
AtomString oldValue;
AtomString newValue;
Expand All @@ -229,7 +230,9 @@ class AXObjectCache : public CanMakeWeakPtr<AXObjectCache>, public CanMakeChecke
, Vector<std::pair<Node*, Node*>>
, WeakHashSet<Element, WeakPtrImplWithEventTargetData>
, WeakHashSet<HTMLTableElement, WeakPtrImplWithEventTargetData>
, WeakHashSet<AccessibilityTable>>;
, WeakHashSet<AccessibilityTable>
, WeakListHashSet<Node, WeakPtrImplWithEventTargetData>
, WeakHashMap<Element, String, WeakPtrImplWithEventTargetData>>;
void deferModalChange(Element*);
void deferMenuListValueChange(Element*);
void deferNodeAddedOrRemoved(Node*);
Expand Down Expand Up @@ -440,7 +443,7 @@ class AXObjectCache : public CanMakeWeakPtr<AXObjectCache>, public CanMakeChecke

AXComputedObjectAttributeCache* computedObjectAttributeCache() { return m_computedObjectAttributeCache.get(); }

Document& document() const { return m_document; }
Document& document() const { return const_cast<Document&>(m_document.get()); }
constexpr const std::optional<PageIdentifier>& pageID() const { return m_pageID; }

#if PLATFORM(MAC)
Expand Down Expand Up @@ -605,14 +608,18 @@ class AXObjectCache : public CanMakeWeakPtr<AXObjectCache>, public CanMakeChecke
// Object creation.
Ref<AccessibilityObject> createObjectFromRenderer(RenderObject*);

Document& m_document;
CheckedRef<Document> m_document;
const std::optional<PageIdentifier> m_pageID; // constant for object's lifetime.
OptionSet<ActivityState> m_pageActivityState;
HashMap<AXID, RefPtr<AccessibilityObject>> m_objects;

// The pointers in these mapping HashMaps should never be dereferenced.
HashMap<RenderObject*, AXID> m_renderObjectMapping;
HashMap<Widget*, AXID> m_widgetObjectMapping;
HashMap<Node*, AXID> m_nodeObjectMapping;
// The pointers in this HashSet should never be dereferenced.
ListHashSet<Node*> m_textMarkerNodes;

std::unique_ptr<AXComputedObjectAttributeCache> m_computedObjectAttributeCache;

#if ENABLE(ACCESSIBILITY)
Expand Down Expand Up @@ -650,14 +657,14 @@ class AXObjectCache : public CanMakeWeakPtr<AXObjectCache>, public CanMakeChecke
WeakHashSet<Element, WeakPtrImplWithEventTargetData> m_deferredRecomputeIsIgnoredList;
WeakHashSet<HTMLTableElement, WeakPtrImplWithEventTargetData> m_deferredRecomputeTableIsExposedList;
WeakHashSet<AccessibilityTable> m_deferredRecomputeTableCellSlotsList;
ListHashSet<Node*> m_deferredTextChangedList;
WeakListHashSet<Node, WeakPtrImplWithEventTargetData> m_deferredTextChangedList;
WeakHashSet<Element, WeakPtrImplWithEventTargetData> m_deferredSelectedChildredChangedList;
ListHashSet<RefPtr<AccessibilityObject>> m_deferredChildrenChangedList;
ListHashSet<Node*> m_deferredNodeAddedOrRemovedList;
WeakListHashSet<Node, WeakPtrImplWithEventTargetData> m_deferredNodeAddedOrRemovedList;
WeakHashSet<Element, WeakPtrImplWithEventTargetData> m_deferredModalChangedList;
WeakHashSet<Element, WeakPtrImplWithEventTargetData> m_deferredMenuListChange;
WeakHashSet<ScrollView> m_deferredScrollbarUpdateChangeList;
HashMap<Element*, String> m_deferredTextFormControlValue;
WeakHashMap<Element, String, WeakPtrImplWithEventTargetData> m_deferredTextFormControlValue;
Vector<AttributeChange> m_deferredAttributeChange;
std::optional<std::pair<WeakPtr<Node, WeakPtrImplWithEventTargetData>, WeakPtr<Node, WeakPtrImplWithEventTargetData>>> m_deferredFocusedNodeChange;

Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/accessibility/AccessibilityMenuListOption.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class AccessibilityMenuListOption final : public AccessibilityObject {

AccessibilityRole roleValue() const final { return AccessibilityRole::MenuListOption; }
bool canHaveChildren() const final { return false; }
AccessibilityObject* parentObject() const final { return m_parent; }
AccessibilityObject* parentObject() const final { return m_parent.get(); }

Element* actionElement() const final;
Node* node() const final;
Expand All @@ -58,7 +58,7 @@ class AccessibilityMenuListOption final : public AccessibilityObject {
bool computeAccessibilityIsIgnored() const final;

WeakPtr<HTMLOptionElement, WeakPtrImplWithEventTargetData> m_element;
AccessibilityObject* m_parent;
WeakPtr<AccessibilityObject> m_parent;
};

} // namespace WebCore
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/accessibility/AccessibilitySpinButton.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class AccessibilitySpinButton final : public AccessibilityMockObject {
void addChildren() override;
LayoutRect elementRect() const override;

SpinButtonElement* m_spinButtonElement;
WeakPtr<SpinButtonElement, WeakPtrImplWithEventTargetData> m_spinButtonElement;
};

class AccessibilitySpinButtonPart final : public AccessibilityMockObject {
Expand Down

0 comments on commit 5b4bb30

Please sign in to comment.