AX: Document::existingAXObjectCache() should always return the existing AXObjectCache.
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 7 Dec 2017 23:55:42 +0000 (23:55 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 7 Dec 2017 23:55:42 +0000 (23:55 +0000)
https://bugs.webkit.org/show_bug.cgi?id=180548
<rdar://problem/35917755>

Reviewed by Chris Fleizach.

Currently the AX cache becomes unreachable through Document::existingAXObjectCache soon after the render tree is destroyed.
From this point, the Node objects can't deregister themselves from the AX cache anymore. In some cases, it's
redundant/not advised to notify the cache about certain changes when the document is being destroyed, but the
callsites should make that decision.

Covered by existing tests.

* dom/Document.cpp:
(WebCore::Document::existingAXObjectCacheSlow const):
* rendering/RenderElement.cpp:
(WebCore::RenderElement::takeChildInternal):

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

Source/WebCore/ChangeLog
Source/WebCore/dom/Document.cpp
Source/WebCore/rendering/RenderElement.cpp

index abfc901..33811e3 100644 (file)
@@ -1,3 +1,23 @@
+2017-12-07  Zalan Bujtas  <zalan@apple.com>
+
+        AX: Document::existingAXObjectCache() should always return the existing AXObjectCache.
+        https://bugs.webkit.org/show_bug.cgi?id=180548
+        <rdar://problem/35917755>
+
+        Reviewed by Chris Fleizach.
+
+        Currently the AX cache becomes unreachable through Document::existingAXObjectCache soon after the render tree is destroyed.
+        From this point, the Node objects can't deregister themselves from the AX cache anymore. In some cases, it's
+        redundant/not advised to notify the cache about certain changes when the document is being destroyed, but the
+        callsites should make that decision.
+
+        Covered by existing tests.
+
+        * dom/Document.cpp:
+        (WebCore::Document::existingAXObjectCacheSlow const):
+        * rendering/RenderElement.cpp:
+        (WebCore::RenderElement::takeChildInternal):
+
 2017-12-07  Youenn Fablet  <youenn@apple.com>
 
         Fix erroneous ASSERT in DocumentThreadableLoader::didFail
index ca9d658..bcc3380 100644 (file)
@@ -2515,10 +2515,7 @@ void Document::clearAXObjectCache()
 AXObjectCache* Document::existingAXObjectCacheSlow() const
 {
     ASSERT(hasEverCreatedAnAXObjectCache);
-    Document& topDocument = this->topDocument();
-    if (!topDocument.hasLivingRenderTree())
-        return nullptr;
-    return topDocument.m_axObjectCache.get();
+    return topDocument().m_axObjectCache.get();
 }
 
 AXObjectCache* Document::axObjectCache() const
index c382680..9d22d57 100644 (file)
@@ -651,8 +651,10 @@ RenderPtr<RenderObject> RenderElement::takeChildInternal(RenderObject& oldChild)
     if (!renderTreeBeingDestroyed() && is<RenderElement>(oldChild))
         RenderCounter::rendererRemovedFromTree(downcast<RenderElement>(oldChild));
 
-    if (AXObjectCache* cache = document().existingAXObjectCache())
-        cache->childrenChanged(this);
+    if (!renderTreeBeingDestroyed()) {
+        if (AXObjectCache* cache = document().existingAXObjectCache())
+            cache->childrenChanged(this);
+    }
 
     return RenderPtr<RenderObject>(&oldChild);
 }