Changeset 286780 in webkit
- Timestamp:
- Dec 9, 2021, 7:40:58 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
accessibility/AccessibilityObject.cpp (modified) (12 diffs)
-
accessibility/AccessibilityObjectInterface.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r286776 r286780 1 2021-12-09 Tyler Wilcock <tyler_w@apple.com> 2 3 AX: Use RefPtr<AXCoreObject> instead of raw AXCoreObject* pointers in Accessibility::findMatchingObjects and downstream functions 4 https://bugs.webkit.org/show_bug.cgi?id=233888 5 6 Reviewed by Chris Fleizach. 7 8 Move usages of raw AXCoreObject* pointers to RefPtr<AXCoreObject> in 9 Accessibility::findMatchingObjects and downstream functions. 10 11 This fixes isolated tree mode only crashes for tests: 12 - accessibility/mac/search-predicate-element-count.html 13 - accessibility/mac/search-predicate-visible-button.html 14 15 These crashed because: 16 17 1. The secondary thread starts a search and stores raw pointers on 18 its stack. 19 2. The main thread performs some operation to queue isolated tree 20 changes. 21 3. The search continues on the secondary thread, eventually calling 22 AXIsolatedObject::children. This in turns calls AXIsolatedTree::pendingChanges. 23 4. The object(s) which we held pointers to are destroyed. 24 25 * accessibility/AccessibilityObject.cpp: 26 (WebCore::appendAccessibilityObject): 27 (WebCore::Accessibility::isRadioButtonInDifferentAdhocGroup): 28 (WebCore::Accessibility::isAccessibilityObjectSearchMatchAtIndex): 29 (WebCore::Accessibility::isAccessibilityObjectSearchMatch): 30 (WebCore::Accessibility::isAccessibilityTextSearchMatch): 31 (WebCore::Accessibility::objectMatchesSearchCriteriaWithResultLimit): 32 (WebCore::Accessibility::appendChildrenToArray): 33 (WebCore::Accessibility::findMatchingObjects): 34 Use RefPtr<AXCoreObject> instead of raw AXCoreObject* pointers. 35 1 36 2021-12-09 Manuel Rego Casasnovas <rego@igalia.com> 2 37 -
trunk/Source/WebCore/accessibility/AccessibilityObject.cpp
r286406 r286780 534 534 } 535 535 536 static void appendAccessibilityObject( AXCoreObject*object, AccessibilityObject::AccessibilityChildrenVector& results)536 static void appendAccessibilityObject(RefPtr<AXCoreObject> object, AccessibilityObject::AccessibilityChildrenVector& results) 537 537 { 538 538 // Find the next descendant of this attachment object so search can continue through frames. … … 3908 3908 // This function determines if the given `axObject` is a radio button part of a different ad-hoc radio group 3909 3909 // than `referenceObject`, where ad-hoc radio group membership is determined by comparing `name` attributes. 3910 static bool isRadioButtonInDifferentAdhocGroup( AXCoreObject*axObject, AXCoreObject* referenceObject)3910 static bool isRadioButtonInDifferentAdhocGroup(RefPtr<AXCoreObject> axObject, AXCoreObject* referenceObject) 3911 3911 { 3912 3912 if (!axObject || !axObject->isRadioButton()) … … 3921 3921 } 3922 3922 3923 static bool isAccessibilityObjectSearchMatchAtIndex( AXCoreObject*axObject, AccessibilitySearchCriteria const& criteria, size_t index)3923 static bool isAccessibilityObjectSearchMatchAtIndex(RefPtr<AXCoreObject> axObject, AccessibilitySearchCriteria const& criteria, size_t index) 3924 3924 { 3925 3925 switch (criteria.searchKeys[index]) { … … 4029 4029 } 4030 4030 4031 static bool isAccessibilityObjectSearchMatch( AXCoreObject*axObject, AccessibilitySearchCriteria const& criteria)4031 static bool isAccessibilityObjectSearchMatch(RefPtr<AXCoreObject> axObject, AccessibilitySearchCriteria const& criteria) 4032 4032 { 4033 4033 if (!axObject) … … 4045 4045 } 4046 4046 4047 static bool isAccessibilityTextSearchMatch( AXCoreObject*axObject, AccessibilitySearchCriteria const& criteria)4047 static bool isAccessibilityTextSearchMatch(RefPtr<AXCoreObject> axObject, AccessibilitySearchCriteria const& criteria) 4048 4048 { 4049 4049 if (!axObject) … … 4059 4059 } 4060 4060 4061 static bool objectMatchesSearchCriteriaWithResultLimit( AXCoreObject*object, AccessibilitySearchCriteria const& criteria, AXCoreObject::AccessibilityChildrenVector& results)4061 static bool objectMatchesSearchCriteriaWithResultLimit(RefPtr<AXCoreObject> object, AccessibilitySearchCriteria const& criteria, AXCoreObject::AccessibilityChildrenVector& results) 4062 4062 { 4063 4063 if (isAccessibilityObjectSearchMatch(object, criteria) && isAccessibilityTextSearchMatch(object, criteria)) { … … 4072 4072 } 4073 4073 4074 static void appendChildrenToArray( AXCoreObject* object, bool isForward, AXCoreObject*startObject, AccessibilityObject::AccessibilityChildrenVector& results)4074 static void appendChildrenToArray(RefPtr<AXCoreObject> object, bool isForward, RefPtr<AXCoreObject> startObject, AccessibilityObject::AccessibilityChildrenVector& results) 4075 4075 { 4076 4076 // A table's children includes elements whose own children are also the table's children (due to the way the Mac exposes tables). … … 4084 4084 4085 4085 // If the startObject is ignored, we should use an accessible sibling as a start element instead. 4086 if (startObject && startObject->accessibilityIsIgnored() && startObject->isDescendantOfObject(object )) {4087 AXCoreObject*parentObject = startObject->parentObject();4086 if (startObject && startObject->accessibilityIsIgnored() && startObject->isDescendantOfObject(object.get())) { 4087 RefPtr<AXCoreObject> parentObject = startObject->parentObject(); 4088 4088 // Go up the parent chain to find the highest ancestor that's also being ignored. 4089 4089 while (parentObject && parentObject->accessibilityIsIgnored()) { … … 4110 4110 if (isForward) { 4111 4111 for (size_t i = startIndex; i > endIndex; i--) 4112 appendAccessibilityObject(searchChildren.at(i - 1) .get(), results);4112 appendAccessibilityObject(searchChildren.at(i - 1), results); 4113 4113 } else { 4114 4114 for (size_t i = startIndex; i < endIndex; i++) 4115 appendAccessibilityObject(searchChildren.at(i) .get(), results);4115 appendAccessibilityObject(searchChildren.at(i), results); 4116 4116 } 4117 4117 } … … 4126 4126 4127 4127 // If there's no start object, it means we want to search everything. 4128 AXCoreObject*startObject = criteria.startObject;4128 RefPtr<AXCoreObject> startObject = criteria.startObject; 4129 4129 if (!startObject) 4130 4130 startObject = criteria.anchorObject; … … 4135 4135 // iterating backwards, the start object children should not be considered, so the loop is skipped ahead. We make an 4136 4136 // exception when no start object was specified because we want to search everything regardless of search direction. 4137 AXCoreObject* previousObject = nullptr;4137 RefPtr<AXCoreObject> previousObject; 4138 4138 if (!isForward && startObject != criteria.anchorObject) { 4139 4139 previousObject = startObject; … … 4151 4151 // This now does a DFS at the current level of the parent. 4152 4152 while (!searchStack.isEmpty()) { 4153 AXCoreObject* searchObject = searchStack.last().get();4153 auto searchObject = searchStack.last(); 4154 4154 searchStack.removeLast(); 4155 4155 -
trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h
r286406 r286780 1683 1683 { 1684 1684 return axObject && Accessibility::findAncestor<AXCoreObject>(*this, false, [axObject] (const AXCoreObject& object) { 1685 return &object == axObject;1686 }) != nullptr;1685 return &object == axObject; 1686 }) != nullptr; 1687 1687 } 1688 1688
Note:
See TracChangeset
for help on using the changeset viewer.