Skip to content

Commit

Permalink
AX: Fix thread safety issue in AXIsolatedTree::setSelectedTextMarkerR…
Browse files Browse the repository at this point in the history
…ange

https://bugs.webkit.org/show_bug.cgi?id=264045
rdar://117803232

Reviewed by Andres Gonzalez.

We need to hold a lock when modifying m_selectedTextMarkerRange since it is accessed on both
the main and AX thread.

* Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp:
(WebCore::AXIsolatedTree::selectedTextMarkerRange):
(WebCore::AXIsolatedTree::setSelectedTextMarkerRange):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h:
(WebCore::AXIsolatedTree::selectedTextMarkerRange): Deleted.
(WebCore::AXIsolatedTree::setSelectedTextMarkerRange): Deleted.

Canonical link: https://commits.webkit.org/270134@main
  • Loading branch information
hoffmanjoshua authored and AndresGonzalezApple committed Nov 2, 2023
1 parent 0e57459 commit 3e8a39c
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
16 changes: 16 additions & 0 deletions Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -910,6 +910,22 @@ void AXIsolatedTree::setFocusedNodeID(AXID axID)
m_pendingFocusedNodeID = axID;
}

AXTextMarkerRange AXIsolatedTree::selectedTextMarkerRange()
{
AXTRACE("AXIsolatedTree::selectedTextMarkerRange"_s);
Locker locker { m_changeLogLock };
return m_selectedTextMarkerRange;
}

void AXIsolatedTree::setSelectedTextMarkerRange(AXTextMarkerRange&& range)
{
AXTRACE("AXIsolatedTree::setSelectedTextMarkerRange"_s);
ASSERT(isMainThread());

Locker locker { m_changeLogLock };
m_selectedTextMarkerRange = range;
}

void AXIsolatedTree::labelCreated(AccessibilityObject& axObject)
{
ASSERT(axObject.isLabel());
Expand Down
6 changes: 3 additions & 3 deletions Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h
Original file line number Diff line number Diff line change
Expand Up @@ -321,8 +321,8 @@ class AXIsolatedTree : public ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr<AX
// Use only if the s_storeLock is already held like in findAXTree.
WEBCORE_EXPORT OptionSet<ActivityState> lockedPageActivityState() const;

AXTextMarkerRange selectedTextMarkerRange() { return m_selectedTextMarkerRange; };
void setSelectedTextMarkerRange(AXTextMarkerRange range) { m_selectedTextMarkerRange = range; }
AXTextMarkerRange selectedTextMarkerRange();
void setSelectedTextMarkerRange(AXTextMarkerRange&&);

private:
AXIsolatedTree(AXObjectCache&);
Expand Down Expand Up @@ -419,7 +419,7 @@ class AXIsolatedTree : public ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr<AX
std::atomic<bool> m_relationsNeedUpdate { true };

Lock m_changeLogLock;
AXTextMarkerRange m_selectedTextMarkerRange;
AXTextMarkerRange m_selectedTextMarkerRange WTF_GUARDED_BY_LOCK(m_changeLogLock);
};

inline AXObjectCache* AXIsolatedTree::axObjectCache() const
Expand Down

0 comments on commit 3e8a39c

Please sign in to comment.