Check for null return from AXIsolatedTree::nodeForID.
authorandresg_22@apple.com <andresg_22@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Feb 2020 01:21:45 +0000 (01:21 +0000)
committerandresg_22@apple.com <andresg_22@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Feb 2020 01:21:45 +0000 (01:21 +0000)
https://bugs.webkit.org/show_bug.cgi?id=207300

Reviewed by Chris Fleizach.

- As the IsolatedTree is updated, AXIsolatedTree::nodeForID may return
nullptr for objects that have been removed from the tree. Thus,
IsolatedObjects must check the returned value when updating children
and any other operations involving cached IDs.
- Tidying up use of auto on for and if statements.

* accessibility/isolatedtree/AXIsolatedObject.cpp:
(WebCore::AXIsolatedObject::detachRemoteParts):
(WebCore::AXIsolatedObject::children):
(WebCore::AXIsolatedObject::accessibilityText const):
(WebCore::AXIsolatedObject::insertMathPairs):
(WebCore::AXIsolatedObject::objectAttributeValue const):
(WebCore::AXIsolatedObject::fillChildrenVectorForProperty const):
(WebCore::AXIsolatedObject::tree const): Deleted, moved inline to the header.
* accessibility/isolatedtree/AXIsolatedObject.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@255884 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp
Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h

index b751715..7ebd4e9 100644 (file)
@@ -1,3 +1,26 @@
+2020-02-05  Andres Gonzalez  <andresg_22@apple.com>
+
+        Check for null return from AXIsolatedTree::nodeForID.
+        https://bugs.webkit.org/show_bug.cgi?id=207300
+
+        Reviewed by Chris Fleizach.
+
+        - As the IsolatedTree is updated, AXIsolatedTree::nodeForID may return
+        nullptr for objects that have been removed from the tree. Thus,
+        IsolatedObjects must check the returned value when updating children
+        and any other operations involving cached IDs.
+        - Tidying up use of auto on for and if statements.
+
+        * accessibility/isolatedtree/AXIsolatedObject.cpp:
+        (WebCore::AXIsolatedObject::detachRemoteParts):
+        (WebCore::AXIsolatedObject::children):
+        (WebCore::AXIsolatedObject::accessibilityText const):
+        (WebCore::AXIsolatedObject::insertMathPairs):
+        (WebCore::AXIsolatedObject::objectAttributeValue const):
+        (WebCore::AXIsolatedObject::fillChildrenVectorForProperty const):
+        (WebCore::AXIsolatedObject::tree const): Deleted, moved inline to the header.
+        * accessibility/isolatedtree/AXIsolatedObject.h:
+
 2020-02-05  Jer Noble  <jer.noble@apple.com>
 
         Adopt MTOverrideShouldPlayHDRVideo()
index b821f40..9fb700a 100644 (file)
@@ -410,9 +410,10 @@ void AXIsolatedObject::setParent(AXID parent)
 void AXIsolatedObject::detachRemoteParts(AccessibilityDetachmentType detachmentType)
 {
     ASSERT_UNUSED(detachmentType, isMainThread() ? detachmentType == AccessibilityDetachmentType::CacheDestroyed : detachmentType != AccessibilityDetachmentType::CacheDestroyed);
-    for (const auto& childID : m_childrenIDs)
-        tree()->nodeForID(childID)->detachFromParent();
-
+    for (const auto& childID : m_childrenIDs) {
+        if (auto child = tree()->nodeForID(childID))
+            child->detachFromParent();
+    }
     m_childrenIDs.clear();
 }
 
@@ -439,9 +440,10 @@ const AXCoreObject::AccessibilityChildrenVector& AXIsolatedObject::children(bool
     if (!isMainThread()) {
         m_children.clear();
         m_children.reserveInitialCapacity(m_childrenIDs.size());
-        auto tree = this->tree();
-        for (auto childID : m_childrenIDs)
-            m_children.uncheckedAppend(tree->nodeForID(childID));
+        for (const auto& childID : m_childrenIDs) {
+            if (auto child = tree()->nodeForID(childID))
+                m_children.uncheckedAppend(child);
+        }
     }
     return m_children;
 }
@@ -460,9 +462,9 @@ bool AXIsolatedObject::isDetachedFromParent()
 void AXIsolatedObject::accessibilityText(Vector<AccessibilityText>& texts) const
 {
     auto isolatedTexts = vectorAttributeValue<AccessibilityIsolatedTreeText>(AXPropertyName::AccessibilityText);
-    for (auto isolatedText : isolatedTexts) {
+    for (const auto& isolatedText : isolatedTexts) {
         AccessibilityText text(isolatedText.text, isolatedText.textSource);
-        for (auto axID : isolatedText.textElements) {
+        for (const auto& axID : isolatedText.textElements) {
             if (auto object = tree()->nodeForID(axID))
                 text.textElements.append(object);
         }
@@ -506,11 +508,11 @@ String AXIsolatedObject::documentEncoding() const
 
 void AXIsolatedObject::insertMathPairs(Vector<AccessibilityIsolatedTreeMathMultiscriptPair>& isolatedPairs, AccessibilityMathMultiscriptPairs& pairs)
 {
-    for (auto pair : isolatedPairs) {
+    for (const auto& pair : isolatedPairs) {
         AccessibilityMathMultiscriptPair prescriptPair;
-        if (auto* coreObject = tree()->nodeForID(pair.first).get())
+        if (auto coreObject = tree()->nodeForID(pair.first).get())
             prescriptPair.first = coreObject;
-        if (auto* coreObject = tree()->nodeForID(pair.second).get())
+        if (auto coreObject = tree()->nodeForID(pair.second).get())
             prescriptPair.second = coreObject;
         pairs.append(prescriptPair);
     }
@@ -652,11 +654,6 @@ AXCoreObject* AXIsolatedObject::accessibilityHitTest(const IntPoint& point) cons
     return const_cast<AXIsolatedObject*>(this);
 }
 
-AXIsolatedTree* AXIsolatedObject::tree() const
-{
-    return m_cachedTree.get();
-}
-
 IntPoint AXIsolatedObject::intPointAttributeValue(AXPropertyName propertyName) const
 {
     auto value = m_attributeMap.get(propertyName);
@@ -673,7 +670,7 @@ AXCoreObject* AXIsolatedObject::objectAttributeValue(AXPropertyName propertyName
         [] (AXID& typedValue) { return typedValue; },
         [] (auto&) { return InvalidAXID; }
     );
-    
+
     return tree()->nodeForID(nodeID).get();
 }
 
@@ -792,7 +789,7 @@ void AXIsolatedObject::fillChildrenVectorForProperty(AXPropertyName propertyName
 {
     Vector<AXID> childIDs = vectorAttributeValue<AXID>(propertyName);
     children.reserveCapacity(childIDs.size());
-    for (auto childID : childIDs) {
+    for (const auto& childID : childIDs) {
         if (auto object = tree()->nodeForID(childID))
             children.uncheckedAppend(object);
     }
index 6e50df7..3aa9699 100644 (file)
@@ -65,10 +65,10 @@ private:
     void detachPlatformWrapper(AccessibilityDetachmentType) override;
 
     AXID parent() const { return m_parent; }
-    
+
     AXIsolatedTreeID treeIdentifier() const { return m_treeIdentifier; }
-    AXIsolatedTree* tree() const;
-    
+    AXIsolatedTree* tree() const { return m_cachedTree.get(); }
+
     AXIsolatedObject() = default;
     AXIsolatedObject(AXCoreObject&, bool isRoot);
     void initializeAttributeData(AXCoreObject&, bool isRoot);