Title: [254566] trunk/Source/WebCore
Revision
254566
Author
andresg...@apple.com
Date
2020-01-15 06:42:44 -0800 (Wed, 15 Jan 2020)

Log Message

Implementation of AXIsolatedObject::press().
https://bugs.webkit.org/show_bug.cgi?id=206177

Reviewed by Chris Fleizach.

- Implemented AXIsolatedObject::press().
- For link objects, press causes the destruction and re-creation of the
isolated tree. Thus also added AXIsolatedTree:removeTreeForPageID.
- AXIsolatedTree::applyPendingChanges now also properly detaches isolated
objects that have been removed.
- Moved set and get wrapper to AXCoreObject so that it can be used for
both isolated and live objects.

* accessibility/AXObjectCache.cpp:
(WebCore::AXObjectCache::~AXObjectCache):
(WebCore::AXObjectCache::remove):
(WebCore::AXObjectCache::createIsolatedTreeHierarchy):
* accessibility/AXObjectCache.h:
(WebCore::AXObjectCache::detachWrapper):
* accessibility/AccessibilityObject.h:
* accessibility/AccessibilityObjectInterface.h:
(WebCore::AXCoreObject::wrapper const):
(WebCore::AXCoreObject::setWrapper):
* accessibility/atk/AXObjectCacheAtk.cpp:
(WebCore::AXObjectCache::detachWrapper):
* accessibility/ios/AXObjectCacheIOS.mm:
(WebCore::AXObjectCache::detachWrapper):
* accessibility/isolatedtree/AXIsolatedTree.cpp:
(WebCore::AXIsolatedTree::removeTreeForPageID):
(WebCore::AXIsolatedTree::applyPendingChanges):
* accessibility/isolatedtree/AXIsolatedTree.h:
* accessibility/isolatedtree/AXIsolatedTreeNode.cpp:
(WebCore::AXIsolatedObject::detach):
(WebCore::AXIsolatedObject::detachFromParent):
(WebCore::AXIsolatedObject::children):
(WebCore::AXIsolatedObject::isDetachedFromParent):
(WebCore::AXIsolatedObject::performFunctionOnMainThread):
(WebCore::AXIsolatedObject::findTextRanges const):
(WebCore::AXIsolatedObject::performTextOperation):
(WebCore::AXIsolatedObject::press):
(WebCore::AXIsolatedObject::widget const):
(WebCore::AXIsolatedObject::page const):
(WebCore::AXIsolatedObject::document const):
(WebCore::AXIsolatedObject::documentFrameView const):
* accessibility/isolatedtree/AXIsolatedTreeNode.h:
* accessibility/mac/AXObjectCacheMac.mm:
(WebCore::AXObjectCache::detachWrapper):
* accessibility/win/AXObjectCacheWin.cpp:
(WebCore::AXObjectCache::detachWrapper):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (254565 => 254566)


--- trunk/Source/WebCore/ChangeLog	2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/ChangeLog	2020-01-15 14:42:44 UTC (rev 254566)
@@ -1,3 +1,55 @@
+2020-01-15  Andres Gonzalez  <andresg...@apple.com>
+
+        Implementation of AXIsolatedObject::press().
+        https://bugs.webkit.org/show_bug.cgi?id=206177
+
+        Reviewed by Chris Fleizach.
+
+        - Implemented AXIsolatedObject::press().
+        - For link objects, press causes the destruction and re-creation of the
+        isolated tree. Thus also added AXIsolatedTree:removeTreeForPageID.
+        - AXIsolatedTree::applyPendingChanges now also properly detaches isolated
+        objects that have been removed.
+        - Moved set and get wrapper to AXCoreObject so that it can be used for
+        both isolated and live objects.
+
+        * accessibility/AXObjectCache.cpp:
+        (WebCore::AXObjectCache::~AXObjectCache):
+        (WebCore::AXObjectCache::remove):
+        (WebCore::AXObjectCache::createIsolatedTreeHierarchy):
+        * accessibility/AXObjectCache.h:
+        (WebCore::AXObjectCache::detachWrapper):
+        * accessibility/AccessibilityObject.h:
+        * accessibility/AccessibilityObjectInterface.h:
+        (WebCore::AXCoreObject::wrapper const):
+        (WebCore::AXCoreObject::setWrapper):
+        * accessibility/atk/AXObjectCacheAtk.cpp:
+        (WebCore::AXObjectCache::detachWrapper):
+        * accessibility/ios/AXObjectCacheIOS.mm:
+        (WebCore::AXObjectCache::detachWrapper):
+        * accessibility/isolatedtree/AXIsolatedTree.cpp:
+        (WebCore::AXIsolatedTree::removeTreeForPageID):
+        (WebCore::AXIsolatedTree::applyPendingChanges):
+        * accessibility/isolatedtree/AXIsolatedTree.h:
+        * accessibility/isolatedtree/AXIsolatedTreeNode.cpp:
+        (WebCore::AXIsolatedObject::detach):
+        (WebCore::AXIsolatedObject::detachFromParent):
+        (WebCore::AXIsolatedObject::children):
+        (WebCore::AXIsolatedObject::isDetachedFromParent):
+        (WebCore::AXIsolatedObject::performFunctionOnMainThread):
+        (WebCore::AXIsolatedObject::findTextRanges const):
+        (WebCore::AXIsolatedObject::performTextOperation):
+        (WebCore::AXIsolatedObject::press):
+        (WebCore::AXIsolatedObject::widget const):
+        (WebCore::AXIsolatedObject::page const):
+        (WebCore::AXIsolatedObject::document const):
+        (WebCore::AXIsolatedObject::documentFrameView const):
+        * accessibility/isolatedtree/AXIsolatedTreeNode.h:
+        * accessibility/mac/AXObjectCacheMac.mm:
+        (WebCore::AXObjectCache::detachWrapper):
+        * accessibility/win/AXObjectCacheWin.cpp:
+        (WebCore::AXObjectCache::detachWrapper):
+
 2020-01-15  Thibault Saunier  <tsaun...@igalia.com>
 
         [GStreamer] Several buffering fixes

Modified: trunk/Source/WebCore/accessibility/AXObjectCache.cpp (254565 => 254566)


--- trunk/Source/WebCore/accessibility/AXObjectCache.cpp	2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.cpp	2020-01-15 14:42:44 UTC (rev 254566)
@@ -233,6 +233,12 @@
     m_focusModalNodeTimer.stop();
     m_performCacheUpdateTimer.stop();
 
+#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
+    // Destroy the IsolatedTree before destroying the live tree.
+    if (m_pageID)
+        AXIsolatedTree::removeTreeForPageID(*m_pageID);
+#endif
+
     for (const auto& object : m_objects.values()) {
         detachWrapper(object.get(), AccessibilityDetachmentType::CacheDestroyed);
         object->detach(AccessibilityDetachmentType::CacheDestroyed);
@@ -743,8 +749,11 @@
         return nullptr;
 
     auto tree = AXIsolatedTree::treeForPageID(*m_pageID);
-    if (!tree && isMainThread()) {
-        tree = generateIsolatedTree(*m_pageID, m_document);
+    if (!tree) {
+        tree = Accessibility::retrieveValueFromMainThread<RefPtr<AXIsolatedTree>>([this] () -> RefPtr<AXIsolatedTree> {
+            return generateIsolatedTree(*m_pageID, m_document);
+        });
+
         // Now that we have created our tree, initialize the secondary thread,
         // so future requests come in on the other thread.
         _AXUIElementUseSecondaryAXThread(true);
@@ -837,6 +846,13 @@
     if (!axID)
         return;
 
+#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
+    if (m_pageID) {
+        if (auto tree = AXIsolatedTree::treeForPageID(*m_pageID))
+            tree->removeNode(axID);
+    }
+#endif
+
     auto object = m_objects.take(axID);
     if (!object)
         return;
@@ -846,13 +862,6 @@
     object->setObjectID(0);
 
     m_idsInUse.remove(axID);
-#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
-    if (m_pageID) {
-        if (auto tree = AXIsolatedTree::treeForPageID(*m_pageID))
-            tree->removeNode(axID);
-    }
-#endif
-
     ASSERT(m_objects.size() >= m_idsInUse.size());
 }
     
@@ -3071,6 +3080,7 @@
 
     isolatedTreeNode->setTreeIdentifier(tree.treeIdentifier());
     isolatedTreeNode->setParent(parentID);
+    axObjectCache->detachWrapper(&object, AccessibilityDetachmentType::ElementChange);
     axObjectCache->attachWrapper(&isolatedTreeNode.get());
 
     for (const auto& child : object.children()) {
@@ -3085,9 +3095,7 @@
 {
     RELEASE_ASSERT(isMainThread());
 
-    auto tree = AXIsolatedTree::treeForPageID(pageID);
-    if (!tree)
-        tree = AXIsolatedTree::createTreeForPageID(pageID);
+    RefPtr<AXIsolatedTree> tree(AXIsolatedTree::createTreeForPageID(pageID));
 
     // Set the root and focused objects in the isolated tree. For that, we need
     // the root and the focused object in the AXObject tree.

Modified: trunk/Source/WebCore/accessibility/AXObjectCache.h (254565 => 254566)


--- trunk/Source/WebCore/accessibility/AXObjectCache.h	2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.h	2020-01-15 14:42:44 UTC (rev 254566)
@@ -171,7 +171,7 @@
     void remove(Widget*);
     void remove(AXID);
 
-    void detachWrapper(AccessibilityObject*, AccessibilityDetachmentType);
+    void detachWrapper(AXCoreObject*, AccessibilityDetachmentType);
     void attachWrapper(AXCoreObject*);
     void childrenChanged(Node*, Node* newChild = nullptr);
     void childrenChanged(RenderObject*, RenderObject* newChild = nullptr);
@@ -547,7 +547,7 @@
 inline void AXObjectCache::deferTextChangedIfNeeded(Node*) { }
 inline void AXObjectCache::deferSelectedChildrenChangedIfNeeded(Element&) { }
 inline void AXObjectCache::deferTextReplacementNotificationForTextControl(HTMLTextFormControlElement&, const String&) { }
-inline void AXObjectCache::detachWrapper(AccessibilityObject*, AccessibilityDetachmentType) { }
+inline void AXObjectCache::detachWrapper(AXCoreObject*, AccessibilityDetachmentType) { }
 inline void AXObjectCache::focusModalNodeTimerFired() { }
 inline void AXObjectCache::performCacheUpdateTimerFired() { }
 inline void AXObjectCache::frameLoadingEventNotification(Frame*, AXLoadingEvent) { }

Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.h (254565 => 254566)


--- trunk/Source/WebCore/accessibility/AccessibilityObject.h	2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.h	2020-01-15 14:42:44 UTC (rev 254566)
@@ -681,14 +681,6 @@
     bool isDOMHidden() const override;
     bool isHidden() const override { return isAXHidden() || isDOMHidden(); }
 
-#if ENABLE(ACCESSIBILITY)
-    AccessibilityObjectWrapper* wrapper() const override { return m_wrapper.get(); }
-    void setWrapper(AccessibilityObjectWrapper* wrapper) override { m_wrapper = wrapper; }
-#else
-    AccessibilityObjectWrapper* wrapper() const override { return nullptr; }
-    void setWrapper(AccessibilityObjectWrapper*) override { }
-#endif
-
 #if PLATFORM(COCOA)
     void overrideAttachmentParent(AXCoreObject* parent) override;
 #else
@@ -785,14 +777,6 @@
     bool allowsTextRanges() const { return isTextControl(); }
     unsigned getLengthForTextRange() const { return text().length(); }
 #endif
-
-#if PLATFORM(COCOA)
-    RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
-#elif PLATFORM(WIN)
-    COMPtr<AccessibilityObjectWrapper> m_wrapper;
-#elif USE(ATK)
-    GRefPtr<WebKitAccessible> m_wrapper;
-#endif
 };
 
 #if !ENABLE(ACCESSIBILITY)

Modified: trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h (254565 => 254566)


--- trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h	2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h	2020-01-15 14:42:44 UTC (rev 254566)
@@ -1075,8 +1075,13 @@
     virtual bool isDOMHidden() const = 0;
     virtual bool isHidden() const = 0;
 
-    virtual AccessibilityObjectWrapper* wrapper() const = 0;
-    virtual void setWrapper(AccessibilityObjectWrapper*) = 0;
+#if ENABLE(ACCESSIBILITY)
+    AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
+    void setWrapper(AccessibilityObjectWrapper* wrapper) { m_wrapper = wrapper; }
+#else
+    AccessibilityObjectWrapper* wrapper() const override { return nullptr; }
+    void setWrapper(AccessibilityObjectWrapper*) override { }
+#endif
 
     virtual void overrideAttachmentParent(AXCoreObject* parent) = 0;
 
@@ -1124,6 +1129,14 @@
     virtual uint64_t sessionID() const = 0;
     virtual String documentURI() const = 0;
     virtual String documentEncoding() const = 0;
+protected:
+#if PLATFORM(COCOA)
+    RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
+#elif PLATFORM(WIN)
+    COMPtr<AccessibilityObjectWrapper> m_wrapper;
+#elif USE(ATK)
+    GRefPtr<WebKitAccessible> m_wrapper;
+#endif
 };
 
 namespace Accessibility {

Modified: trunk/Source/WebCore/accessibility/atk/AXObjectCacheAtk.cpp (254565 => 254566)


--- trunk/Source/WebCore/accessibility/atk/AXObjectCacheAtk.cpp	2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/atk/AXObjectCacheAtk.cpp	2020-01-15 14:42:44 UTC (rev 254566)
@@ -48,7 +48,7 @@
     return WEBKIT_IS_ACCESSIBLE(atkParent) ? atkParent : nullptr;
 }
 
-void AXObjectCache::detachWrapper(AccessibilityObject* obj, AccessibilityDetachmentType detachmentType)
+void AXObjectCache::detachWrapper(AXCoreObject* obj, AccessibilityDetachmentType detachmentType)
 {
     auto* wrapper = obj->wrapper();
     ASSERT(wrapper);

Modified: trunk/Source/WebCore/accessibility/ios/AXObjectCacheIOS.mm (254565 => 254566)


--- trunk/Source/WebCore/accessibility/ios/AXObjectCacheIOS.mm	2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/ios/AXObjectCacheIOS.mm	2020-01-15 14:42:44 UTC (rev 254566)
@@ -36,7 +36,7 @@
 
 namespace WebCore {
     
-void AXObjectCache::detachWrapper(AccessibilityObject* obj, AccessibilityDetachmentType)
+void AXObjectCache::detachWrapper(AXCoreObject* obj, AccessibilityDetachmentType)
 {
     [obj->wrapper() detach];
     obj->setWrapper(nullptr);

Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp (254565 => 254566)


--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp	2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp	2020-01-15 14:42:44 UTC (rev 254566)
@@ -80,6 +80,7 @@
 Ref<AXIsolatedTree> AXIsolatedTree::createTreeForPageID(PageIdentifier pageID)
 {
     LockHolder locker(s_cacheLock);
+    ASSERT(!treePageCache().contains(pageID));
 
     auto newTree = AXIsolatedTree::create();
     treePageCache().set(pageID, newTree.copyRef());
@@ -87,6 +88,24 @@
     return newTree;
 }
 
+void AXIsolatedTree::removeTreeForPageID(PageIdentifier pageID)
+{
+    LockHolder locker(s_cacheLock);
+
+    if (auto optionalTree = treePageCache().take(pageID)) {
+        auto& tree { *optionalTree };
+        LockHolder treeLocker { tree->m_changeLogLock };
+        for (const auto& axID : tree->m_readerThreadNodeMap.keys()) {
+            if (auto object = tree->nodeForID(axID))
+                object->disconnect();
+        }
+        tree->m_readerThreadNodeMap.clear();
+        treeLocker.unlockEarly();
+
+        treeIDCache().remove(tree->treeIdentifier());
+    }
+}
+
 RefPtr<AXIsolatedTree> AXIsolatedTree::treeForPageID(PageIdentifier pageID)
 {
     LockHolder locker(s_cacheLock);
@@ -157,8 +176,11 @@
     for (auto& item : appendCopy)
         m_readerThreadNodeMap.add(item->objectID(), WTFMove(item));
 
-    for (auto item : removeCopy)
+    for (auto item : removeCopy) {
+        if (auto object = nodeForID(item))
+            object->disconnect();
         m_readerThreadNodeMap.remove(item);
+    }
 }
     
 } // namespace WebCore

Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h (254565 => 254566)


--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h	2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h	2020-01-15 14:42:44 UTC (rev 254566)
@@ -44,7 +44,9 @@
     static Ref<AXIsolatedTree> create();
     virtual ~AXIsolatedTree();
 
-    WEBCORE_EXPORT static Ref<AXIsolatedTree> createTreeForPageID(PageIdentifier);
+    static Ref<AXIsolatedTree> createTreeForPageID(PageIdentifier);
+    static void removeTreeForPageID(PageIdentifier);
+
     WEBCORE_EXPORT static RefPtr<AXIsolatedTree> treeForPageID(PageIdentifier);
     WEBCORE_EXPORT static RefPtr<AXIsolatedTree> treeForID(AXIsolatedTreeID);
     AXObjectCache* axObjectCache() const { return m_axObjectCache; }

Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.cpp (254565 => 254566)


--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.cpp	2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.cpp	2020-01-15 14:42:44 UTC (rev 254566)
@@ -404,6 +404,15 @@
     m_parent = parent;
 }
 
+void AXIsolatedObject::detach(AccessibilityDetachmentType, AXObjectCache*)
+{
+    ASSERT(isMainThread());
+    for (const auto& childID : m_childrenIDs)
+        tree()->nodeForID(childID)->detachFromParent();
+
+    m_childrenIDs.clear();
+}
+
 bool AXIsolatedObject::isDetached() const
 {
     ASSERT_NOT_REACHED();
@@ -410,6 +419,19 @@
     return false;
 }
 
+void AXIsolatedObject::detachFromParent()
+{
+    m_parent = InvalidAXID;
+}
+
+void AXIsolatedObject::disconnect()
+{
+    ASSERT(isMainThread());
+    tree()->axObjectCache()->detachWrapper(this, AccessibilityDetachmentType::ElementDestroyed);
+    detach(AccessibilityDetachmentType::ElementDestroyed);
+    setObjectID(InvalidAXID);
+}
+
 void AXIsolatedObject::setTreeIdentifier(AXIsolatedTreeID treeIdentifier)
 {
     m_treeIdentifier = treeIdentifier;
@@ -419,7 +441,6 @@
 
 const AXCoreObject::AccessibilityChildrenVector& AXIsolatedObject::children(bool)
 {
-    ASSERT(!isMainThread());
     if (!isMainThread()) {
         m_children.clear();
         m_children.reserveInitialCapacity(m_childrenIDs.size());
@@ -432,7 +453,13 @@
 
 bool AXIsolatedObject::isDetachedFromParent()
 {
-    return parent() == InvalidAXID && tree()->rootNode()->objectID() != m_id;
+    if (parent() != InvalidAXID)
+        return false;
+
+    // Check whether this is the root node, in which case we should return false.
+    if (auto root = tree()->rootNode())
+        return root->objectID() != m_id;
+    return false;
 }
 
 void AXIsolatedObject::accessibilityText(Vector<AccessibilityText>& texts) const
@@ -527,7 +554,7 @@
 void AXIsolatedObject::performFunctionOnMainThread(U&& lambda)
 {
     Accessibility::performFunctionOnMainThread([&lambda, this] () {
-        if (auto object = associatedAXObject())
+        if (auto* object = associatedAXObject())
             lambda(object);
     });
 }
@@ -790,7 +817,7 @@
 Vector<RefPtr<Range>> AXIsolatedObject::findTextRanges(AccessibilitySearchTextCriteria const& criteria) const
 {
     return Accessibility::retrieveValueFromMainThread<Vector<RefPtr<Range>>>([&criteria, this] () -> Vector<RefPtr<Range>> {
-        if (auto object = associatedAXObject())
+        if (auto* object = associatedAXObject())
             return object->findTextRanges(criteria);
         return Vector<RefPtr<Range>>();
     });
@@ -799,7 +826,7 @@
 Vector<String> AXIsolatedObject::performTextOperation(AccessibilityTextOperation const& textOperation)
 {
     return Accessibility::retrieveValueFromMainThread<Vector<String>>([&textOperation, this] () -> Vector<String> {
-        if (auto object = associatedAXObject())
+        if (auto* object = associatedAXObject())
             return object->performTextOperation(textOperation);
         return Vector<String>();
     });
@@ -829,7 +856,8 @@
 
 bool AXIsolatedObject::press()
 {
-    ASSERT_NOT_REACHED();
+    if (auto* object = associatedAXObject())
+        return object->press();
     return false;
 }
 
@@ -1467,7 +1495,7 @@
 
 Widget* AXIsolatedObject::widget() const
 {
-    if (auto object = associatedAXObject())
+    if (auto* object = associatedAXObject())
         return object->widget();
     return nullptr;
 }
@@ -1480,6 +1508,8 @@
 
 Page* AXIsolatedObject::page() const
 {
+    if (auto* object = associatedAXObject())
+        return object->page();
     ASSERT_NOT_REACHED();
     return nullptr;
 }
@@ -1486,14 +1516,15 @@
 
 Document* AXIsolatedObject::document() const
 {
-    if (auto object = associatedAXObject())
+    if (auto* object = associatedAXObject())
         return object->document();
+    ASSERT_NOT_REACHED();
     return nullptr;
 }
 
 FrameView* AXIsolatedObject::documentFrameView() const
 {
-    if (auto object = associatedAXObject())
+    if (auto* object = associatedAXObject())
         return object->documentFrameView();
     return nullptr;
 }
@@ -1591,11 +1622,6 @@
     return false;
 }
 
-void AXIsolatedObject::detachFromParent()
-{
-    ASSERT_NOT_REACHED();
-}
-
 bool AXIsolatedObject::shouldFocusActiveDescendant() const
 {
     ASSERT_NOT_REACHED();

Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.h (254565 => 254566)


--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.h	2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.h	2020-01-15 14:42:44 UTC (rev 254566)
@@ -54,9 +54,9 @@
     AXID objectID() const override { return m_id; }
     void init() override { }
 
-    AccessibilityObjectWrapper* wrapper() const override { return m_wrapper.get(); }
-    void detach(AccessibilityDetachmentType, AXObjectCache* = nullptr) override { }
+    void detach(AccessibilityDetachmentType, AXObjectCache* = nullptr) override;
     bool isDetached() const override;
+    void disconnect();
 
     void setTreeIdentifier(AXIsolatedTreeID);
     void setParent(AXID);
@@ -72,7 +72,11 @@
     AXIsolatedObject() = default;
     AXIsolatedObject(AXCoreObject&, bool isRoot);
     void initializeAttributeData(AXCoreObject&, bool isRoot);
-    AXCoreObject* associatedAXObject() const { return axObjectCache()->objectFromAXID(objectID()); }
+    AXCoreObject* associatedAXObject() const
+    {
+        ASSERT(isMainThread());
+        return axObjectCache()->objectFromAXID(objectID());
+    }
 
     enum class AXPropertyName : uint8_t {
         None = 0,
@@ -816,8 +820,7 @@
     void setIsIgnoredFromParentDataForChild(AXCoreObject*) override;
 
     void updateBackingStore() override;
-    void setWrapper(AccessibilityObjectWrapper* wrapper) override { m_wrapper = wrapper; }
-    
+
     AXID m_parent { InvalidAXID };
     AXID m_id { InvalidAXID };
     bool m_initialized { false };
@@ -826,11 +829,8 @@
     Vector<AXID> m_childrenIDs;
     Vector<RefPtr<AXCoreObject>> m_children;
 
-#if PLATFORM(COCOA)
-    RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
-#endif
-
     HashMap<AXPropertyName, AttributeValueVariant, WTF::IntHash<AXPropertyName>, WTF::StrongEnumHashTraits<AXPropertyName>> m_attributeMap;
+    Lock m_attributeMapLock;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/accessibility/mac/AXObjectCacheMac.mm (254565 => 254566)


--- trunk/Source/WebCore/accessibility/mac/AXObjectCacheMac.mm	2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/mac/AXObjectCacheMac.mm	2020-01-15 14:42:44 UTC (rev 254566)
@@ -232,7 +232,7 @@
 
 namespace WebCore {
 
-void AXObjectCache::detachWrapper(AccessibilityObject* obj, AccessibilityDetachmentType)
+void AXObjectCache::detachWrapper(AXCoreObject* obj, AccessibilityDetachmentType)
 {
     [obj->wrapper() detach];
     obj->setWrapper(nullptr);

Modified: trunk/Source/WebCore/accessibility/win/AXObjectCacheWin.cpp (254565 => 254566)


--- trunk/Source/WebCore/accessibility/win/AXObjectCacheWin.cpp	2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/win/AXObjectCacheWin.cpp	2020-01-15 14:42:44 UTC (rev 254566)
@@ -41,7 +41,7 @@
 
 namespace WebCore {
 
-void AXObjectCache::detachWrapper(AccessibilityObject* obj, AccessibilityDetachmentType)
+void AXObjectCache::detachWrapper(AXCoreObject* obj, AccessibilityDetachmentType)
 {
     // On Windows, AccessibilityObjects are created when get_accChildCount is
     // called, but they are not wrapped until get_accChild is called, so this
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to