AX: Crash in accessing AXObjectCache in textMarkerDataForVisiblePosition
authorcfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 10 Jul 2018 21:56:02 +0000 (21:56 +0000)
committercfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 10 Jul 2018 21:56:02 +0000 (21:56 +0000)
https://bugs.webkit.org/show_bug.cgi?id=187528
<rdar://problem/37231941>

Reviewed by Joanmarie Diggs.

Occasional crashes reported when running accessibility/mac/search-field-cancel-button.html.
Looks like the cache object retrieved was not valid and we weren't checking for it.

* accessibility/AXObjectCache.cpp:
(WebCore::AXObjectCache::visiblePositionForTextMarkerData):
(WebCore::AXObjectCache::textMarkerDataForVisiblePosition):
(WebCore::AXObjectCache::textMarkerDataForFirstPositionInTextControl):

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

Source/WebCore/ChangeLog
Source/WebCore/accessibility/AXObjectCache.cpp

index c8d4699..3ccd52f 100644 (file)
@@ -1,3 +1,19 @@
+2018-07-10  Chris Fleizach  <cfleizach@apple.com>
+
+        AX: Crash in accessing AXObjectCache in textMarkerDataForVisiblePosition
+        https://bugs.webkit.org/show_bug.cgi?id=187528
+        <rdar://problem/37231941>
+
+        Reviewed by Joanmarie Diggs.
+
+        Occasional crashes reported when running accessibility/mac/search-field-cancel-button.html.
+        Looks like the cache object retrieved was not valid and we weren't checking for it.
+
+        * accessibility/AXObjectCache.cpp:
+        (WebCore::AXObjectCache::visiblePositionForTextMarkerData):
+        (WebCore::AXObjectCache::textMarkerDataForVisiblePosition):
+        (WebCore::AXObjectCache::textMarkerDataForFirstPositionInTextControl):
+
 2018-07-10  Zalan Bujtas  <zalan@apple.com>
 
         FragmentInterval, FragmentIntervalTree and FragmentSearchAdapter should hold not hold raw pointers to renderers.
index c63b518..fe370d4 100644 (file)
@@ -1591,7 +1591,7 @@ VisiblePosition AXObjectCache::visiblePositionForTextMarkerData(TextMarkerData&
         return VisiblePosition();
     
     AXObjectCache* cache = renderer->document().axObjectCache();
-    if (!cache->m_idsInUse.contains(textMarkerData.axID))
+    if (cache && !cache->m_idsInUse.contains(textMarkerData.axID))
         return VisiblePosition();
 
     return visiblePos;
@@ -2204,6 +2204,8 @@ std::optional<TextMarkerData> AXObjectCache::textMarkerDataForVisiblePosition(co
 
     // find or create an accessibility object for this node
     AXObjectCache* cache = domNode->document().axObjectCache();
+    if (!cache)
+        return std::nullopt;
     RefPtr<AccessibilityObject> obj = cache->getOrCreate(domNode);
 
     // This memory must be zero'd so instances of TextMarkerData can be tested for byte-equivalence.
@@ -2231,6 +2233,9 @@ std::optional<TextMarkerData> AXObjectCache::textMarkerDataForFirstPositionInTex
         return std::nullopt;
 
     AXObjectCache* cache = textControl.document().axObjectCache();
+    if (!cache)
+        return std::nullopt;
+
     RefPtr<AccessibilityObject> obj = cache->getOrCreate(&textControl);
     if (!obj)
         return std::nullopt;