Title: [287876] trunk
Revision
287876
Author
[email protected]
Date
2022-01-11 06:07:38 -0800 (Tue, 11 Jan 2022)

Log Message

[GTK][a11y] Web process crashes in some sites having SVG images
https://bugs.webkit.org/show_bug.cgi?id=234737

Reviewed by Adrian Perez de Castro.

Source/WebCore:

Unfortunately the changes in r287388 are not enough, it can still happen that root hasn't been set to the
SVGImage page when the wrappers are created. So, we can't actually create the wrappers with a reference to the
root object as we did in r286767. In most of the cases wrappers use the root just to get AccessibilityAtspi,
which is not a singleton, but it's created and owned by the web process singleton at startup, so it can be
accessed globaly. This patch makes AccessibilityAtspi a singleton to get the global instance without having to
keep a reference in the root object.

* accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::remoteSVGRootElement const): Move the code to set the root in SVGImage page
before the remote svg wrapper is created.
* accessibility/atspi/AXObjectCacheAtspi.cpp:
(WebCore::AXObjectCache::attachWrapper): Just pass the page root object to the wrapper constructor, that now
receives a pointer that might be nullptr.
* accessibility/atspi/AccessibilityAtspi.cpp:
(WebCore::AccessibilityAtspi::AccessibilityAtspi): Just create the WorkQueue.
(WebCore::AccessibilityAtspi::singleton): Return a reference to the global instance.
(WebCore::AccessibilityAtspi::connect): Connect to the given dbus address.
(WebCore::AccessibilityAtspi::applicationReference const): This allows wrappers to get the application reference
without having to check if m_root is nullptr or not.
(WebCore::AccessibilityAtspi::parentChanged): Use AccessibilityObjectAtspi::isTreeRegistered()
(WebCore::AccessibilityAtspi::childrenChanged): Ditto.
* accessibility/atspi/AccessibilityAtspi.h:
* accessibility/atspi/AccessibilityObjectAtspi.cpp:
(WebCore::AccessibilityObjectAtspi::create): Receive a AccessibilityRootAtspi pointer instead of reference.
(WebCore::AccessibilityObjectAtspi::AccessibilityObjectAtspi): Ditto.
(WebCore::AccessibilityObjectAtspi::cacheDestroyed): Only call AccessibilityRootAtspi::childRemoved if parent is
the root object.
(WebCore::AccessibilityObjectAtspi::elementDestroyed): Null check m_root and use AccessibilityAtspi::singleton().
(WebCore::AccessibilityObjectAtspi::root): Get the root if already set or try to get it from the page.
(WebCore::AccessibilityObjectAtspi::isTreeRegistered const): Return try if root has been set and its tree has
been registered.
(WebCore::AccessibilityObjectAtspi::registerObject): Use AccessibilityObjectAtspi::root().
(WebCore::AccessibilityObjectAtspi::reference): Use AccessibilityAtspi::singleton().
(WebCore::AccessibilityObjectAtspi::hyperlinkReference): Ditto.
(WebCore::AccessibilityObjectAtspi::setParent): Return early also if root hasn't been set yet.
(WebCore::AccessibilityObjectAtspi::parentReference const): Use AccessibilityAtspi::singleton().
(WebCore::AccessibilityObjectAtspi::serialize const): Ditto.
(WebCore::AccessibilityObjectAtspi::childAdded): Ditto.
(WebCore::AccessibilityObjectAtspi::childRemoved): Ditto.
(WebCore::AccessibilityObjectAtspi::stateChanged): Ditto.
(WebCore::AccessibilityObjectAtspi::loadEvent): Ditto.
* accessibility/atspi/AccessibilityObjectAtspi.h:
* accessibility/atspi/AccessibilityObjectComponentAtspi.cpp:
* accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp:
* accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp:
* accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp:
(WebCore::AccessibilityObjectAtspi::selectionChanged): Ditto.
* accessibility/atspi/AccessibilityObjectTableAtspi.cpp:
* accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp:
* accessibility/atspi/AccessibilityObjectTextAtspi.cpp:
(WebCore::AccessibilityObjectAtspi::textInserted): Ditto.
(WebCore::AccessibilityObjectAtspi::textDeleted): Ditto.
(WebCore::AccessibilityObjectAtspi::selectionChanged): Ditto.
(WebCore::AccessibilityObjectAtspi::textAttributesChanged): Ditto.
* accessibility/atspi/AccessibilityObjectValueAtspi.cpp:
(WebCore::AccessibilityObjectAtspi::valueChanged): Ditto.
* accessibility/atspi/AccessibilityRootAtspi.cpp:
(WebCore::AccessibilityRootAtspi::create): Remove AccessibilityAtspi parameter.
(WebCore::AccessibilityRootAtspi::AccessibilityRootAtspi): Ditto.
(WebCore::AccessibilityRootAtspi::registerObject): Use AccessibilityAtspi::singleton().
(WebCore::AccessibilityRootAtspi::unregisterObject): Ditto
(WebCore::AccessibilityRootAtspi::embedded): Ditto.
(WebCore::AccessibilityRootAtspi::applicationReference const): Ditto.
(WebCore::AccessibilityRootAtspi::reference const): Ditto.
(WebCore::AccessibilityRootAtspi::childAdded): Ditto.
(WebCore::AccessibilityRootAtspi::childRemoved): Ditto.
(WebCore::AccessibilityRootAtspi::serialize const): Ditto.
* accessibility/atspi/AccessibilityRootAtspi.h:

Source/WebKit:

Use AccessibilityAtspi::singleton().

* WebProcess/WebPage/gtk/WebPageGtk.cpp:
(WebKit::WebPage::platformInitialize):
* WebProcess/WebProcess.h:
(WebKit::WebProcess::accessibilityAtspi const): Deleted.
* WebProcess/glib/WebProcessGLib.cpp:
(WebKit::WebProcess::platformInitializeWebProcess):

Tools:

Use AccessibilityAtspi::singleton().

* WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp:
(WTR::AccessibilityController::axRunLoop):
* WebKitTestRunner/InjectedBundle/atspi/AccessibilityNotificationHandler.cpp:
(WTR::AccessibilityNotificationHandler::AccessibilityNotificationHandler):
(WTR::AccessibilityNotificationHandler::~AccessibilityNotificationHandler):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (287875 => 287876)


--- trunk/Source/WebCore/ChangeLog	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/ChangeLog	2022-01-11 14:07:38 UTC (rev 287876)
@@ -1,3 +1,79 @@
+2022-01-11  Carlos Garcia Campos  <[email protected]>
+
+        [GTK][a11y] Web process crashes in some sites having SVG images
+        https://bugs.webkit.org/show_bug.cgi?id=234737
+
+        Reviewed by Adrian Perez de Castro.
+
+        Unfortunately the changes in r287388 are not enough, it can still happen that root hasn't been set to the
+        SVGImage page when the wrappers are created. So, we can't actually create the wrappers with a reference to the
+        root object as we did in r286767. In most of the cases wrappers use the root just to get AccessibilityAtspi,
+        which is not a singleton, but it's created and owned by the web process singleton at startup, so it can be
+        accessed globaly. This patch makes AccessibilityAtspi a singleton to get the global instance without having to
+        keep a reference in the root object.
+
+        * accessibility/AccessibilityRenderObject.cpp:
+        (WebCore::AccessibilityRenderObject::remoteSVGRootElement const): Move the code to set the root in SVGImage page
+        before the remote svg wrapper is created.
+        * accessibility/atspi/AXObjectCacheAtspi.cpp:
+        (WebCore::AXObjectCache::attachWrapper): Just pass the page root object to the wrapper constructor, that now
+        receives a pointer that might be nullptr.
+        * accessibility/atspi/AccessibilityAtspi.cpp:
+        (WebCore::AccessibilityAtspi::AccessibilityAtspi): Just create the WorkQueue.
+        (WebCore::AccessibilityAtspi::singleton): Return a reference to the global instance.
+        (WebCore::AccessibilityAtspi::connect): Connect to the given dbus address.
+        (WebCore::AccessibilityAtspi::applicationReference const): This allows wrappers to get the application reference
+        without having to check if m_root is nullptr or not.
+        (WebCore::AccessibilityAtspi::parentChanged): Use AccessibilityObjectAtspi::isTreeRegistered()
+        (WebCore::AccessibilityAtspi::childrenChanged): Ditto.
+        * accessibility/atspi/AccessibilityAtspi.h:
+        * accessibility/atspi/AccessibilityObjectAtspi.cpp:
+        (WebCore::AccessibilityObjectAtspi::create): Receive a AccessibilityRootAtspi pointer instead of reference.
+        (WebCore::AccessibilityObjectAtspi::AccessibilityObjectAtspi): Ditto.
+        (WebCore::AccessibilityObjectAtspi::cacheDestroyed): Only call AccessibilityRootAtspi::childRemoved if parent is
+        the root object.
+        (WebCore::AccessibilityObjectAtspi::elementDestroyed): Null check m_root and use AccessibilityAtspi::singleton().
+        (WebCore::AccessibilityObjectAtspi::root): Get the root if already set or try to get it from the page.
+        (WebCore::AccessibilityObjectAtspi::isTreeRegistered const): Return try if root has been set and its tree has
+        been registered.
+        (WebCore::AccessibilityObjectAtspi::registerObject): Use AccessibilityObjectAtspi::root().
+        (WebCore::AccessibilityObjectAtspi::reference): Use AccessibilityAtspi::singleton().
+        (WebCore::AccessibilityObjectAtspi::hyperlinkReference): Ditto.
+        (WebCore::AccessibilityObjectAtspi::setParent): Return early also if root hasn't been set yet.
+        (WebCore::AccessibilityObjectAtspi::parentReference const): Use AccessibilityAtspi::singleton().
+        (WebCore::AccessibilityObjectAtspi::serialize const): Ditto.
+        (WebCore::AccessibilityObjectAtspi::childAdded): Ditto.
+        (WebCore::AccessibilityObjectAtspi::childRemoved): Ditto.
+        (WebCore::AccessibilityObjectAtspi::stateChanged): Ditto.
+        (WebCore::AccessibilityObjectAtspi::loadEvent): Ditto.
+        * accessibility/atspi/AccessibilityObjectAtspi.h:
+        * accessibility/atspi/AccessibilityObjectComponentAtspi.cpp:
+        * accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp:
+        * accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp:
+        * accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp:
+        (WebCore::AccessibilityObjectAtspi::selectionChanged): Ditto.
+        * accessibility/atspi/AccessibilityObjectTableAtspi.cpp:
+        * accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp:
+        * accessibility/atspi/AccessibilityObjectTextAtspi.cpp:
+        (WebCore::AccessibilityObjectAtspi::textInserted): Ditto.
+        (WebCore::AccessibilityObjectAtspi::textDeleted): Ditto.
+        (WebCore::AccessibilityObjectAtspi::selectionChanged): Ditto.
+        (WebCore::AccessibilityObjectAtspi::textAttributesChanged): Ditto.
+        * accessibility/atspi/AccessibilityObjectValueAtspi.cpp:
+        (WebCore::AccessibilityObjectAtspi::valueChanged): Ditto.
+        * accessibility/atspi/AccessibilityRootAtspi.cpp:
+        (WebCore::AccessibilityRootAtspi::create): Remove AccessibilityAtspi parameter.
+        (WebCore::AccessibilityRootAtspi::AccessibilityRootAtspi): Ditto.
+        (WebCore::AccessibilityRootAtspi::registerObject): Use AccessibilityAtspi::singleton().
+        (WebCore::AccessibilityRootAtspi::unregisterObject): Ditto
+        (WebCore::AccessibilityRootAtspi::embedded): Ditto.
+        (WebCore::AccessibilityRootAtspi::applicationReference const): Ditto.
+        (WebCore::AccessibilityRootAtspi::reference const): Ditto.
+        (WebCore::AccessibilityRootAtspi::childAdded): Ditto.
+        (WebCore::AccessibilityRootAtspi::childRemoved): Ditto.
+        (WebCore::AccessibilityRootAtspi::serialize const): Ditto.
+        * accessibility/atspi/AccessibilityRootAtspi.h:
+
 2022-01-11  Martin Robinson  <[email protected]>
 
         Some css-transforms tests assert in debug

Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp (287875 => 287876)


--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -3402,6 +3402,12 @@
     AXObjectCache* cache = frame.document()->axObjectCache();
     if (!cache)
         return nullptr;
+
+#if USE(ATSPI)
+    if (auto* page = document->page())
+        page->setAccessibilityRootObject(createIfNecessary == Create ? axObjectCache()->document().page()->accessibilityRootObject() : nullptr);
+#endif
+
     AccessibilityObject* rootSVGObject = createIfNecessary == Create ? cache->getOrCreate(rendererRoot) : cache->get(rendererRoot);
 
     ASSERT(!createIfNecessary || rootSVGObject);
@@ -3408,11 +3414,6 @@
     if (!is<AccessibilitySVGRoot>(rootSVGObject))
         return nullptr;
 
-#if USE(ATSPI)
-    if (auto* page = document->page())
-        page->setAccessibilityRootObject(createIfNecessary == Create ? axObjectCache()->document().page()->accessibilityRootObject() : nullptr);
-#endif
-
     return downcast<AccessibilitySVGRoot>(rootSVGObject);
 }
     

Modified: trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -35,11 +35,7 @@
 
 void AXObjectCache::attachWrapper(AXCoreObject* axObject)
 {
-    auto* rootWrapper = document().page()->accessibilityRootObject();
-    if (!rootWrapper)
-        return;
-
-    auto wrapper = AccessibilityObjectAtspi::create(axObject, *rootWrapper);
+    auto wrapper = AccessibilityObjectAtspi::create(axObject, document().page()->accessibilityRootObject());
     axObject->setWrapper(wrapper.ptr());
 
     m_deferredParentChangedList.add(axObject);

Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -26,6 +26,7 @@
 #include <gio/gio.h>
 #include <glib/gi18n-lib.h>
 #include <wtf/MainThread.h>
+#include <wtf/NeverDestroyed.h>
 #include <wtf/SetForScope.h>
 #include <wtf/SortedArrayMap.h>
 #include <wtf/UUID.h>
@@ -32,12 +33,24 @@
 
 namespace WebCore {
 
-AccessibilityAtspi::AccessibilityAtspi(const String& busAddress)
+AccessibilityAtspi& AccessibilityAtspi::singleton()
+{
+    static NeverDestroyed<AccessibilityAtspi> atspi;
+    return atspi;
+}
+
+AccessibilityAtspi::AccessibilityAtspi()
     : m_queue(WorkQueue::create("org.webkit.a11y"))
 {
     RELEASE_ASSERT(isMainThread());
+}
+
+void AccessibilityAtspi::connect(const String& busAddress)
+{
+    RELEASE_ASSERT(isMainThread());
     if (busAddress.isEmpty())
         return;
+
     m_queue->dispatch([this, busAddress = busAddress.isolatedCopy()] {
         GUniqueOutPtr<GError> error;
         m_connection = adoptGRef(g_dbus_connection_new_for_address_sync(busAddress.utf8().data(),
@@ -51,12 +64,6 @@
     });
 }
 
-AccessibilityAtspi::~AccessibilityAtspi()
-{
-    if (m_registry)
-        g_signal_handlers_disconnect_by_data(m_registry.get(), this);
-}
-
 void AccessibilityAtspi::registerTrees() const
 {
     RELEASE_ASSERT(!isMainThread());
@@ -218,6 +225,19 @@
     return g_variant_new("(so)", uniqueName(), "/org/a11y/atspi/null");
 }
 
+GVariant* AccessibilityAtspi::applicationReference() const
+{
+    RELEASE_ASSERT(!isMainThread());
+
+    // The application is the same for all root objects, so just use the first root object that is already embedded.
+    for (auto* rootObject : m_rootObjects.keys()) {
+        if (!rootObject->path().isNull())
+            return rootObject->applicationReference();
+    }
+
+    return nullReference();
+}
+
 void AccessibilityAtspi::registerRoot(AccessibilityRootAtspi& rootObject, Vector<std::pair<GDBusInterfaceInfo*, GDBusInterfaceVTable*>>&& interfaces, CompletionHandler<void(const String&)>&& completionHandler)
 {
     RELEASE_ASSERT(isMainThread());
@@ -329,7 +349,7 @@
             return;
 
         // Always emit parentChanged when the tree is registered because the atspi cache always consumes it.
-        if (!atspiObject->root().isTreeRegistered())
+        if (!atspiObject->isTreeRegistered())
             return;
 
         // Emit parentChanged only if the object is already registered, otherwise register the object,
@@ -365,7 +385,7 @@
             return;
 
         // Always emit ChildrenChanged when the tree is registered because the atspi cache always consumes it.
-        if (!atspiObject->root().isTreeRegistered())
+        if (!atspiObject->isTreeRegistered())
             return;
 
         g_dbus_connection_emit_signal(m_connection.get(), nullptr, atspiObject->path().utf8().data(), "org.a11y.atspi.Event.Object", "ChildrenChanged",

Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.h (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.h	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.h	2022-01-11 14:07:38 UTC (rev 287876)
@@ -40,15 +40,18 @@
 enum class AccessibilityRole;
 
 class AccessibilityAtspi {
-    WTF_MAKE_FAST_ALLOCATED;
+    WTF_MAKE_NONCOPYABLE(AccessibilityAtspi); WTF_MAKE_FAST_ALLOCATED;
+    friend NeverDestroyed<AccessibilityAtspi>;
 public:
-    AccessibilityAtspi(const String&);
-    ~AccessibilityAtspi();
+    WEBCORE_EXPORT static AccessibilityAtspi& singleton();
 
+    void connect(const String&);
+
     WEBCORE_EXPORT RunLoop& runLoop() const;
 
     const char* uniqueName() const;
     GVariant* nullReference() const;
+    GVariant* applicationReference() const;
     bool hasEventListeners() const { return !m_eventListeners.isEmpty(); }
 
     void registerRoot(AccessibilityRootAtspi&, Vector<std::pair<GDBusInterfaceInfo*, GDBusInterfaceVTable*>>&&, CompletionHandler<void(const String&)>&&);
@@ -88,6 +91,8 @@
 #endif
 
 private:
+    AccessibilityAtspi();
+
     void registerTrees() const;
     void initializeRegistry();
     void addEventListener(const char* dbusName, const char* eventName);

Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -37,7 +37,7 @@
 
 namespace WebCore {
 
-Ref<AccessibilityObjectAtspi> AccessibilityObjectAtspi::create(AXCoreObject* coreObject, AccessibilityRootAtspi& root)
+Ref<AccessibilityObjectAtspi> AccessibilityObjectAtspi::create(AXCoreObject* coreObject, AccessibilityRootAtspi* root)
 {
     return adoptRef(*new AccessibilityObjectAtspi(coreObject, root));
 }
@@ -110,7 +110,7 @@
     return interfaces;
 }
 
-AccessibilityObjectAtspi::AccessibilityObjectAtspi(AXCoreObject* coreObject, AccessibilityRootAtspi& root)
+AccessibilityObjectAtspi::AccessibilityObjectAtspi(AXCoreObject* coreObject, AccessibilityRootAtspi* root)
     : m_coreObject(coreObject)
     , m_interfaces(interfacesForObject(*m_coreObject))
     , m_root(root)
@@ -136,8 +136,10 @@
     if (!m_isRegistered.load())
         return;
 
-    m_root.childRemoved(*this);
-    m_root.atspi().unregisterObject(*this);
+    if (m_parent && !*m_parent && m_root)
+        m_root->childRemoved(*this);
+
+    AccessibilityAtspi::singleton().unregisterObject(*this);
 }
 
 void AccessibilityObjectAtspi::elementDestroyed()
@@ -150,11 +152,11 @@
     if (m_parent) {
         if (*m_parent)
             m_parent.value()->childRemoved(*this);
-        else
-            m_root.childRemoved(*this);
+        else if (m_root)
+            m_root->childRemoved(*this);
     }
 
-    m_root.atspi().unregisterObject(*this);
+    AccessibilityAtspi::singleton().unregisterObject(*this);
 }
 
 static unsigned atspiRole(AccessibilityRole role)
@@ -432,12 +434,12 @@
 
             g_dbus_method_invocation_return_value(invocation, g_variant_builder_end(&builder));
         } else if (!g_strcmp0(methodName, "GetApplication"))
-            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", atspiObject->m_root.applicationReference()));
+            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", AccessibilityAtspi::singleton().applicationReference()));
         else if (!g_strcmp0(methodName, "GetChildAtIndex")) {
             int index;
             g_variant_get(parameters, "(i)", &index);
             auto* wrapper = index >= 0 ? atspiObject->childAt(index) : nullptr;
-            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->reference() : atspiObject->m_root.atspi().nullReference()));
+            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->reference() : AccessibilityAtspi::singleton().nullReference()));
         } else if (!g_strcmp0(methodName, "GetChildren")) {
             GVariantBuilder builder = G_VARIANT_BUILDER_INIT(G_VARIANT_TYPE("a(so)"));
             for (const auto& wrapper : atspiObject->children())
@@ -483,6 +485,23 @@
     nullptr
 };
 
+AccessibilityRootAtspi* AccessibilityObjectAtspi::root()
+{
+    RELEASE_ASSERT(isMainThread());
+    RELEASE_ASSERT(m_coreObject);
+
+    if (!m_root) {
+        if (auto* document = m_coreObject->document())
+            m_root = document->page()->accessibilityRootObject();
+    }
+    return m_root;
+}
+
+bool AccessibilityObjectAtspi::isTreeRegistered() const
+{
+    return m_root ? m_root->isTreeRegistered() : false;
+}
+
 bool AccessibilityObjectAtspi::registerObject()
 {
     RELEASE_ASSERT(!isMainThread());
@@ -519,12 +538,17 @@
         // Isolated tree hasn't been created yet, call AccessibilityRootAtspi::child()
         // to create it before registering the object.
         Accessibility::performFunctionOnMainThread([this] {
-            m_root.child();
+            if (!m_coreObject)
+                return;
+
+            if (auto* atspiRoot = root())
+                atspiRoot->child();
         });
     }
-    m_path = m_root.atspi().registerObject(*this, WTFMove(interfaces));
-    m_root.atspi().addAccessible(*this);
 
+    m_path = AccessibilityAtspi::singleton().registerObject(*this, WTFMove(interfaces));
+    AccessibilityAtspi::singleton().addAccessible(*this);
+
     return true;
 }
 
@@ -538,7 +562,7 @@
 GVariant* AccessibilityObjectAtspi::reference()
 {
     RELEASE_ASSERT(!isMainThread());
-    return g_variant_new("(so)", m_root.atspi().uniqueName(), path().utf8().data());
+    return g_variant_new("(so)", AccessibilityAtspi::singleton().uniqueName(), path().utf8().data());
 }
 
 GVariant* AccessibilityObjectAtspi::hyperlinkReference()
@@ -546,10 +570,10 @@
     RELEASE_ASSERT(!isMainThread());
     if (m_hyperlinkPath.isNull()) {
         registerObject();
-        m_hyperlinkPath = m_root.atspi().registerHyperlink(*this, { { const_cast<GDBusInterfaceInfo*>(&webkit_hyperlink_interface), &s_hyperlinkFunctions } });
+        m_hyperlinkPath = AccessibilityAtspi::singleton().registerHyperlink(*this, { { const_cast<GDBusInterfaceInfo*>(&webkit_hyperlink_interface), &s_hyperlinkFunctions } });
     }
 
-    return g_variant_new("(so)", m_root.atspi().uniqueName(), m_hyperlinkPath.utf8().data());
+    return g_variant_new("(so)", AccessibilityAtspi::singleton().uniqueName(), m_hyperlinkPath.utf8().data());
 }
 
 void AccessibilityObjectAtspi::setParent(std::optional<AccessibilityObjectAtspi*> atspiParent)
@@ -559,15 +583,15 @@
         return;
 
     m_parent = atspiParent;
-    if (!m_coreObject || m_coreObject->accessibilityIsIgnored())
+    if (!m_coreObject || m_coreObject->accessibilityIsIgnored() || !root())
         return;
 
-    m_root.atspi().parentChanged(*this);
+    AccessibilityAtspi::singleton().parentChanged(*this);
     if (m_parent) {
         if (*m_parent)
             m_parent.value()->childAdded(*this);
-        else
-            m_root.childAdded(*this);
+        else if (m_root)
+            m_root->childAdded(*this);
     }
 }
 
@@ -589,13 +613,15 @@
 
 GVariant* AccessibilityObjectAtspi::parentReference() const
 {
-    if (!m_parent)
-        return m_root.atspi().nullReference();
+    if (m_parent) {
+        if (*m_parent)
+            return m_parent.value()->reference();
 
-    if (!m_parent.value())
-        return m_root.reference();
+        if (m_root)
+            return m_root->reference();
+    }
 
-    return m_parent.value()->reference();
+    return AccessibilityAtspi::singleton().nullReference();
 }
 
 unsigned AccessibilityObjectAtspi::childCount() const
@@ -1222,8 +1248,8 @@
 void AccessibilityObjectAtspi::serialize(GVariantBuilder* builder) const
 {
     RELEASE_ASSERT(!isMainThread());
-    g_variant_builder_add(builder, "(so)", m_root.atspi().uniqueName(), m_path.utf8().data());
-    g_variant_builder_add(builder, "@(so)", m_root.applicationReference());
+    g_variant_builder_add(builder, "(so)", AccessibilityAtspi::singleton().uniqueName(), m_path.utf8().data());
+    g_variant_builder_add(builder, "@(so)", AccessibilityAtspi::singleton().applicationReference());
     g_variant_builder_add(builder, "@(so)", parentReference());
 
     g_variant_builder_add(builder, "i", indexInParent());
@@ -1255,7 +1281,7 @@
     if (!m_coreObject || m_coreObject->accessibilityIsIgnored())
         return;
 
-    m_root.atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added);
+    AccessibilityAtspi::singleton().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added);
 }
 
 void AccessibilityObjectAtspi::childRemoved(AccessibilityObjectAtspi& child)
@@ -1267,19 +1293,19 @@
     if (!m_coreObject || m_coreObject->accessibilityIsIgnored())
         return;
 
-    m_root.atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Removed);
+    AccessibilityAtspi::singleton().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Removed);
 }
 
 void AccessibilityObjectAtspi::stateChanged(const char* name, bool value)
 {
     RELEASE_ASSERT(isMainThread());
-    m_root.atspi().stateChanged(*this, name, value);
+    AccessibilityAtspi::singleton().stateChanged(*this, name, value);
 }
 
 void AccessibilityObjectAtspi::loadEvent(const char* event)
 {
     RELEASE_ASSERT(isMainThread());
-    m_root.atspi().loadEvent(*this, event);
+    AccessibilityAtspi::singleton().loadEvent(*this, event);
 }
 
 std::optional<unsigned> AccessibilityObjectAtspi::effectiveRole() const

Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h	2022-01-11 14:07:38 UTC (rev 287876)
@@ -38,10 +38,11 @@
 
 class AccessibilityObjectAtspi final : public ThreadSafeRefCounted<AccessibilityObjectAtspi, WTF::DestructionThread::Main> {
 public:
-    static Ref<AccessibilityObjectAtspi> create(AXCoreObject*, AccessibilityRootAtspi&);
+    static Ref<AccessibilityObjectAtspi> create(AXCoreObject*, AccessibilityRootAtspi*);
     ~AccessibilityObjectAtspi() = default;
 
     bool registerObject();
+    bool isTreeRegistered() const;
 
     enum class Interface : uint16_t {
         Accessible = 1 << 0,
@@ -59,7 +60,6 @@
     };
     const OptionSet<Interface>& interfaces() const { return m_interfaces; }
 
-    const AccessibilityRootAtspi& root() const { return m_root; }
     void setParent(std::optional<AccessibilityObjectAtspi*>);
     WEBCORE_EXPORT std::optional<AccessibilityObjectAtspi*> parent() const;
     GVariant* parentReference() const;
@@ -158,8 +158,10 @@
     WEBCORE_EXPORT std::pair<std::optional<unsigned>, std::optional<unsigned>> cellPosition() const;
 
 private:
-    explicit AccessibilityObjectAtspi(AXCoreObject*, AccessibilityRootAtspi&);
+    AccessibilityObjectAtspi(AXCoreObject*, AccessibilityRootAtspi*);
 
+    AccessibilityRootAtspi* root();
+
     Vector<RefPtr<AccessibilityObjectAtspi>> wrapperVector(const Vector<RefPtr<AXCoreObject>>&) const;
     int indexInParent() const;
     void childAdded(AccessibilityObjectAtspi&);
@@ -241,7 +243,7 @@
     AXCoreObject* m_axObject { nullptr };
     AXCoreObject* m_coreObject { nullptr };
     OptionSet<Interface> m_interfaces;
-    AccessibilityRootAtspi& m_root;
+    AccessibilityRootAtspi* m_root { nullptr };
     std::optional<AccessibilityObjectAtspi*> m_parent;
     Atomic<bool> m_isRegistered { false };
     String m_path;
@@ -249,7 +251,6 @@
     int64_t m_lastSelectionChangedTime { -1 };
     mutable std::atomic<bool> m_hasListMarkerAtStart;
     mutable int m_indexInParent { -1 };
-    mutable Lock m_rootLock;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -22,6 +22,7 @@
 
 #if ENABLE(ACCESSIBILITY) && USE(ATSPI)
 #include "AXIsolatedObject.h"
+#include "AccessibilityAtspi.h"
 #include "AccessibilityAtspiEnums.h"
 #include "AccessibilityObjectInterface.h"
 #include "Document.h"
@@ -47,7 +48,7 @@
             uint32_t coordinateType;
             g_variant_get(parameters, "(iiu)", &x, &y, &coordinateType);
             auto* wrapper = atspiObject->hitTest({ x, y }, coordinateType);
-            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->reference() : atspiObject->m_root.atspi().nullReference()));
+            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->reference() : AccessibilityAtspi::singleton().nullReference()));
         } else if (!g_strcmp0(methodName, "GetExtents")) {
             uint32_t coordinateType;
             g_variant_get(parameters, "(u)", &coordinateType);

Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -22,7 +22,7 @@
 
 #if ENABLE(ACCESSIBILITY) && USE(ATSPI)
 
-#include "AccessibilityRootAtspi.h"
+#include "AccessibilityAtspi.h"
 #include <gio/gio.h>
 #include <wtf/URL.h>
 #include <wtf/unicode/CharacterNames.h>
@@ -39,7 +39,7 @@
         if (!g_strcmp0(methodName, "GetObject")) {
             int index;
             g_variant_get(parameters, "(i)", &index);
-            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", !index ? atspiObject->reference() : atspiObject->m_root.atspi().nullReference()));
+            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", !index ? atspiObject->reference() : AccessibilityAtspi::singleton().nullReference()));
         } else if (!g_strcmp0(methodName, "GetURI")) {
             int index;
             g_variant_get(parameters, "(i)", &index);

Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -22,7 +22,7 @@
 
 #if ENABLE(ACCESSIBILITY) && USE(ATSPI)
 
-#include "AccessibilityRootAtspi.h"
+#include "AccessibilityAtspi.h"
 #include <gio/gio.h>
 #include <wtf/unicode/CharacterNames.h>
 
@@ -41,7 +41,7 @@
             int index;
             g_variant_get(parameters, "(i)", &index);
             auto* wrapper = index >= 0 ? atspiObject->hyperlink(index) : nullptr;
-            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->hyperlinkReference() : atspiObject->m_root.atspi().nullReference()));
+            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->hyperlinkReference() : AccessibilityAtspi::singleton().nullReference()));
         } else if (!g_strcmp0(methodName, "GetLinkIndex")) {
             int offset;
             g_variant_get(parameters, "(i)", &offset);

Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -22,7 +22,7 @@
 
 #if ENABLE(ACCESSIBILITY) && USE(ATSPI)
 
-#include "AccessibilityRootAtspi.h"
+#include "AccessibilityAtspi.h"
 
 namespace WebCore {
 
@@ -37,7 +37,7 @@
             int index;
             g_variant_get(parameters, "(i)", &index);
             auto* child = index >= 0 ? atspiObject->selectedChild(index) : nullptr;
-            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", child ? child->reference() : atspiObject->m_root.atspi().nullReference()));
+            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", child ? child->reference() : AccessibilityAtspi::singleton().nullReference()));
         } else if (!g_strcmp0(methodName, "SelectChild")) {
             int index;
             g_variant_get(parameters, "(i)", &index);
@@ -233,7 +233,7 @@
         return;
 
     m_lastSelectionChangedTime = sourceTime;
-    m_root.atspi().selectionChanged(*this);
+    AccessibilityAtspi::singleton().selectionChanged(*this);
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableAtspi.cpp (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableAtspi.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableAtspi.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -22,7 +22,7 @@
 
 #if ENABLE(ACCESSIBILITY) && USE(ATSPI)
 
-#include "AccessibilityRootAtspi.h"
+#include "AccessibilityAtspi.h"
 #include "HTMLTableCaptionElement.h"
 #include "HTMLTableElement.h"
 #include "RenderElement.h"
@@ -42,7 +42,7 @@
             int row, column;
             g_variant_get(parameters, "(ii)", &row, &column);
             auto* cell = row >= 0 && column >= 0 ? atspiObject->cell(row, column) : nullptr;
-            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", cell ? cell->reference() : atspiObject->m_root.atspi().nullReference()));
+            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", cell ? cell->reference() : AccessibilityAtspi::singleton().nullReference()));
         } else if (!g_strcmp0(methodName, "GetIndexAt")) {
             int row, column;
             g_variant_get(parameters, "(ii)", &row, &column);
@@ -75,12 +75,12 @@
             int row;
             g_variant_get(parameters, "(i)", &row);
             auto* header = row >= 0 ? atspiObject->rowHeader(row) : nullptr;
-            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", header ? header->reference() : atspiObject->m_root.atspi().nullReference()));
+            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", header ? header->reference() : AccessibilityAtspi::singleton().nullReference()));
         } else if (!g_strcmp0(methodName, "GetColumnHeader")) {
             int column;
             g_variant_get(parameters, "(i)", &column);
             auto* header = column >= 0 ? atspiObject->columnHeader(column) : nullptr;
-            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", header ? header->reference() : atspiObject->m_root.atspi().nullReference()));
+            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", header ? header->reference() : AccessibilityAtspi::singleton().nullReference()));
         } else if (!g_strcmp0(methodName, "GetRowColumnExtentsAtIndex")) {
             int index;
             g_variant_get(parameters, "(i)", &index);
@@ -118,10 +118,10 @@
             return g_variant_new_int32(atspiObject->columnCount());
         if (!g_strcmp0(propertyName, "Caption")) {
             auto* caption = atspiObject->tableCaption();
-            return caption ? caption->reference() : atspiObject->m_root.atspi().nullReference();
+            return caption ? caption->reference() : AccessibilityAtspi::singleton().nullReference();
         }
         if (!g_strcmp0(propertyName, "Summary"))
-            return atspiObject->m_root.atspi().nullReference();
+            return AccessibilityAtspi::singleton().nullReference();
         if (!g_strcmp0(propertyName, "NSelectedRows"))
             return g_variant_new_int32(0);
         if (!g_strcmp0(propertyName, "NSelectedColumns"))

Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -22,8 +22,8 @@
 
 #if ENABLE(ACCESSIBILITY) && USE(ATSPI)
 
+#include "AccessibilityAtspi.h"
 #include "AccessibilityAtspiEnums.h"
-#include "AccessibilityRootAtspi.h"
 #include <gio/gio.h>
 
 namespace WebCore {
@@ -67,7 +67,7 @@
         if (!g_strcmp0(propertyName, "Table")) {
             auto* axObject = atspiObject->m_axObject;
             if (!axObject || !axObject->isTableCell())
-                return atspiObject->m_root.atspi().nullReference();
+                return AccessibilityAtspi::singleton().nullReference();
 
             AccessibilityObjectAtspi* wrapper = atspiObject.ptr();
             while (auto parent = wrapper->parent()) {
@@ -80,7 +80,7 @@
                 if (axObject && axObject->isTable())
                     break;
             }
-            return wrapper ? wrapper->reference() : atspiObject->m_root.atspi().nullReference();
+            return wrapper ? wrapper->reference() : AccessibilityAtspi::singleton().nullReference();
         }
 
         g_set_error(error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "Unknown property '%s'", propertyName);

Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -22,10 +22,10 @@
 
 #if ENABLE(ACCESSIBILITY) && USE(ATSPI)
 #include "AXObjectCache.h"
+#include "AccessibilityAtspi.h"
 #include "AccessibilityAtspiEnums.h"
 #include "AccessibilityObject.h"
 #include "AccessibilityObjectInterface.h"
-#include "AccessibilityRootAtspi.h"
 #include "Editing.h"
 #include "PlatformScreen.h"
 #include "RenderLayer.h"
@@ -381,7 +381,7 @@
     auto offset = UTF16OffsetToUTF8(mapping, utf16Offset);
     auto utf8InsertedText = insertedText.utf8();
     auto insertedTextLength = g_utf8_strlen(utf8InsertedText.data(), -1);
-    m_root.atspi().textChanged(*this, "insert", WTFMove(utf8InsertedText), offset - insertedTextLength, insertedTextLength);
+    AccessibilityAtspi::singleton().textChanged(*this, "insert", WTFMove(utf8InsertedText), offset - insertedTextLength, insertedTextLength);
 }
 
 void AccessibilityObjectAtspi::textDeleted(const String& deletedText, const VisiblePosition& position)
@@ -397,7 +397,7 @@
     auto offset = UTF16OffsetToUTF8(mapping, utf16Offset);
     auto utf8DeletedText = deletedText.utf8();
     auto deletedTextLength = g_utf8_strlen(utf8DeletedText.data(), -1);
-    m_root.atspi().textChanged(*this, "delete", WTFMove(utf8DeletedText), offset, deletedTextLength);
+    AccessibilityAtspi::singleton().textChanged(*this, "delete", WTFMove(utf8DeletedText), offset, deletedTextLength);
 }
 
 IntPoint AccessibilityObjectAtspi::boundaryOffset(unsigned utf16Offset, TextGranularity granularity) const
@@ -798,10 +798,10 @@
     auto mapping = offsetMapping(utf16Text);
     auto caretOffset = UTF16OffsetToUTF8(mapping, bounds.y());
     if (caretOffset <= length)
-        m_root.atspi().textCaretMoved(*this, caretOffset);
+        AccessibilityAtspi::singleton().textCaretMoved(*this, caretOffset);
 
     if (selection.isRange())
-        m_root.atspi().textSelectionChanged(*this);
+        AccessibilityAtspi::singleton().textSelectionChanged(*this);
 }
 
 AccessibilityObjectAtspi::TextAttributes AccessibilityObjectAtspi::textAttributes(std::optional<unsigned> utf16Offset, bool includeDefault) const
@@ -990,7 +990,7 @@
     if (!m_interfaces.contains(Interface::Text))
         return;
 
-    m_root.atspi().textAttributesChanged(*this);
+    AccessibilityAtspi::singleton().textAttributesChanged(*this);
 }
 
 bool AccessibilityObjectAtspi::scrollToMakeVisible(int startOffset, int endOffset, uint32_t scrollType) const

Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectValueAtspi.cpp (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectValueAtspi.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectValueAtspi.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -22,8 +22,8 @@
 
 #if ENABLE(ACCESSIBILITY) && USE(ATSPI)
 
+#include "AccessibilityAtspi.h"
 #include "AccessibilityObject.h"
-#include "AccessibilityRootAtspi.h"
 #include <gio/gio.h>
 
 namespace WebCore {
@@ -134,7 +134,7 @@
 void AccessibilityObjectAtspi::valueChanged(double value)
 {
     RELEASE_ASSERT(isMainThread());
-    m_root.atspi().valueChanged(*this, value);
+    AccessibilityAtspi::singleton().valueChanged(*this, value);
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -34,14 +34,13 @@
 
 namespace WebCore {
 
-Ref<AccessibilityRootAtspi> AccessibilityRootAtspi::create(Page& page, AccessibilityAtspi& atspi)
+Ref<AccessibilityRootAtspi> AccessibilityRootAtspi::create(Page& page)
 {
-    return adoptRef(*new AccessibilityRootAtspi(page, atspi));
+    return adoptRef(*new AccessibilityRootAtspi(page));
 }
 
-AccessibilityRootAtspi::AccessibilityRootAtspi(Page& page, AccessibilityAtspi& atspi)
-    : m_atspi(atspi)
-    , m_page(page)
+AccessibilityRootAtspi::AccessibilityRootAtspi(Page& page)
+    : m_page(page)
 {
     RELEASE_ASSERT(isMainThread());
 }
@@ -92,7 +91,7 @@
                     return;
                 }
             }
-            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", rootObject.atspi().nullReference()));
+            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", AccessibilityAtspi::singleton().nullReference()));
         } else if (!g_strcmp0(methodName, "GetChildren")) {
             GVariantBuilder builder = G_VARIANT_BUILDER_INIT(G_VARIANT_TYPE("a(so)"));
             auto* child = Accessibility::retrieveValueFromMainThread<AccessibilityObjectAtspi*>([&rootObject]() -> AccessibilityObjectAtspi* {
@@ -174,13 +173,13 @@
     interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_accessible_interface), &s_accessibleFunctions });
     interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_socket_interface), &s_socketFunctions });
     interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_component_interface), &s_componentFunctions });
-    m_atspi.registerRoot(*this, WTFMove(interfaces), WTFMove(completionHandler));
+    AccessibilityAtspi::singleton().registerRoot(*this, WTFMove(interfaces), WTFMove(completionHandler));
 }
 
 void AccessibilityRootAtspi::unregisterObject()
 {
     RELEASE_ASSERT(isMainThread());
-    m_atspi.unregisterRoot(*this);
+    AccessibilityAtspi::singleton().unregisterRoot(*this);
 
     if (m_page)
         m_page->setAccessibilityRootObject(nullptr);
@@ -222,8 +221,8 @@
     RELEASE_ASSERT(!isMainThread());
     m_parentUniqueName = parentUniqueName;
     m_parentPath = parentPath;
-    m_atspi.parentChanged(*this);
-    if (!m_isTreeRegistered.load() && m_atspi.hasEventListeners())
+    AccessibilityAtspi::singleton().parentChanged(*this);
+    if (!m_isTreeRegistered.load() && AccessibilityAtspi::singleton().hasEventListeners())
         registerTree();
 }
 
@@ -231,7 +230,7 @@
 {
     RELEASE_ASSERT(!isMainThread());
     if (m_parentUniqueName.isNull())
-        return m_atspi.nullReference();
+        return AccessibilityAtspi::singleton().nullReference();
     return g_variant_new("(so)", m_parentUniqueName.utf8().data(), "/org/a11y/atspi/accessible/root");
 }
 
@@ -238,7 +237,7 @@
 GVariant* AccessibilityRootAtspi::reference() const
 {
     RELEASE_ASSERT(!isMainThread());
-    return g_variant_new("(so)", m_atspi.uniqueName(), m_path.utf8().data());
+    return g_variant_new("(so)", AccessibilityAtspi::singleton().uniqueName(), m_path.utf8().data());
 }
 
 GVariant* AccessibilityRootAtspi::parentReference() const
@@ -268,18 +267,18 @@
 
 void AccessibilityRootAtspi::childAdded(AccessibilityObjectAtspi& child)
 {
-    m_atspi.childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added);
+    AccessibilityAtspi::singleton().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added);
 }
 
 void AccessibilityRootAtspi::childRemoved(AccessibilityObjectAtspi& child)
 {
-    m_atspi.childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Removed);
+    AccessibilityAtspi::singleton().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Removed);
 }
 
 void AccessibilityRootAtspi::serialize(GVariantBuilder* builder) const
 {
     RELEASE_ASSERT(!isMainThread());
-    g_variant_builder_add(builder, "(so)", m_atspi.uniqueName(), m_path.utf8().data());
+    g_variant_builder_add(builder, "(so)", AccessibilityAtspi::singleton().uniqueName(), m_path.utf8().data());
     g_variant_builder_add(builder, "@(so)", applicationReference());
     g_variant_builder_add(builder, "@(so)", parentReference());
 

Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h (287875 => 287876)


--- trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h	2022-01-11 14:07:38 UTC (rev 287876)
@@ -20,7 +20,6 @@
 #pragma once
 
 #if ENABLE(ACCESSIBILITY) && USE(ATSPI)
-#include "AccessibilityAtspi.h"
 #include "IntRect.h"
 #include <wtf/Atomics.h>
 #include <wtf/FastMalloc.h>
@@ -27,6 +26,7 @@
 #include <wtf/ThreadSafeRefCounted.h>
 #include <wtf/WeakPtr.h>
 
+typedef struct _GDBusInterfaceVTable GDBusInterfaceVTable;
 typedef struct _GVariant GVariant;
 
 namespace WebCore {
@@ -36,7 +36,7 @@
 class AccessibilityRootAtspi final : public ThreadSafeRefCounted<AccessibilityRootAtspi, WTF::DestructionThread::Main> {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    static Ref<AccessibilityRootAtspi> create(Page&, AccessibilityAtspi&);
+    static Ref<AccessibilityRootAtspi> create(Page&);
     ~AccessibilityRootAtspi() = default;
 
     void registerObject(CompletionHandler<void(const String&)>&&);
@@ -49,7 +49,6 @@
     GVariant* reference() const;
     GVariant* parentReference() const;
     GVariant* applicationReference() const;
-    AccessibilityAtspi& atspi() const { return m_atspi; }
     AccessibilityObjectAtspi* child() const;
     void childAdded(AccessibilityObjectAtspi&);
     void childRemoved(AccessibilityObjectAtspi&);
@@ -57,7 +56,7 @@
     void serialize(GVariantBuilder*) const;
 
 private:
-    AccessibilityRootAtspi(Page&, AccessibilityAtspi&);
+    explicit AccessibilityRootAtspi(Page&);
 
     void embedded(const char* parentUniqueName, const char* parentPath);
     IntRect frameRect(uint32_t) const;
@@ -66,7 +65,6 @@
     static GDBusInterfaceVTable s_socketFunctions;
     static GDBusInterfaceVTable s_componentFunctions;
 
-    AccessibilityAtspi& m_atspi;
     WeakPtr<Page> m_page;
     String m_path;
     String m_parentUniqueName;

Modified: trunk/Source/WebKit/ChangeLog (287875 => 287876)


--- trunk/Source/WebKit/ChangeLog	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebKit/ChangeLog	2022-01-11 14:07:38 UTC (rev 287876)
@@ -1,3 +1,19 @@
+2022-01-11  Carlos Garcia Campos  <[email protected]>
+
+        [GTK][a11y] Web process crashes in some sites having SVG images
+        https://bugs.webkit.org/show_bug.cgi?id=234737
+
+        Reviewed by Adrian Perez de Castro.
+
+        Use AccessibilityAtspi::singleton().
+
+        * WebProcess/WebPage/gtk/WebPageGtk.cpp:
+        (WebKit::WebPage::platformInitialize):
+        * WebProcess/WebProcess.h:
+        (WebKit::WebProcess::accessibilityAtspi const): Deleted.
+        * WebProcess/glib/WebProcessGLib.cpp:
+        (WebKit::WebProcess::platformInitializeWebProcess):
+
 2022-01-10  Wenson Hsieh  <[email protected]>
 
         Followup to r287863 - adjust line wrapping behavior in image overlays

Modified: trunk/Source/WebKit/WebProcess/WebPage/gtk/WebPageGtk.cpp (287875 => 287876)


--- trunk/Source/WebKit/WebProcess/WebPage/gtk/WebPageGtk.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebKit/WebProcess/WebPage/gtk/WebPageGtk.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -70,7 +70,7 @@
     // FIXME: we need a way to connect DOM and app a11y tree in GTK4.
 #else
     if (auto* page = corePage()) {
-        m_accessibilityRootObject = AccessibilityRootAtspi::create(*page, WebProcess::singleton().accessibilityAtspi());
+        m_accessibilityRootObject = AccessibilityRootAtspi::create(*page);
         m_accessibilityRootObject->registerObject([&](const String& plugID) {
             send(Messages::WebPageProxy::BindAccessibilityTree(plugID));
         });

Modified: trunk/Source/WebKit/WebProcess/WebProcess.h (287875 => 287876)


--- trunk/Source/WebKit/WebProcess/WebProcess.h	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebKit/WebProcess/WebProcess.h	2022-01-11 14:07:38 UTC (rev 287876)
@@ -75,10 +75,6 @@
 #include <WebCore/CaptionUserPreferences.h>
 #endif
 
-#if USE(ATSPI)
-#include <WebCore/AccessibilityAtspi.h>
-#endif
-
 namespace API {
 class Object;
 }
@@ -399,10 +395,6 @@
     SpeechRecognitionRealtimeMediaSourceManager& ensureSpeechRecognitionRealtimeMediaSourceManager();
 #endif
 
-#if USE(ATSPI)
-    WebCore::AccessibilityAtspi& accessibilityAtspi() const { return *m_accessibility; }
-#endif
-
     bool isCaptivePortalModeEnabled() const { return m_isCaptivePortalModeEnabled; }
 
 private:
@@ -778,10 +770,6 @@
 #if ENABLE(MEDIA_STREAM)
     std::unique_ptr<SpeechRecognitionRealtimeMediaSourceManager> m_speechRecognitionRealtimeMediaSourceManager;
 #endif
-
-#if USE(ATSPI)
-    std::unique_ptr<WebCore::AccessibilityAtspi> m_accessibility;
-#endif
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/glib/WebProcessGLib.cpp (287875 => 287876)


--- trunk/Source/WebKit/WebProcess/glib/WebProcessGLib.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Source/WebKit/WebProcess/glib/WebProcessGLib.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -59,6 +59,10 @@
 #include <wtf/linux/RealTimeThreads.h>
 #endif
 
+#if USE(ATSPI)
+#include <WebCore/AccessibilityAtspi.h>
+#endif
+
 namespace WebKit {
 
 using namespace WebCore;
@@ -129,7 +133,7 @@
         WebCore::setApplicationName(parameters.applicationName);
 
 #if USE(ATSPI)
-    m_accessibility = makeUnique<AccessibilityAtspi>(parameters.accessibilityBusAddress);
+    AccessibilityAtspi::singleton().connect(parameters.accessibilityBusAddress);
 #endif
 }
 

Modified: trunk/Tools/ChangeLog (287875 => 287876)


--- trunk/Tools/ChangeLog	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Tools/ChangeLog	2022-01-11 14:07:38 UTC (rev 287876)
@@ -1,5 +1,20 @@
 2022-01-11  Carlos Garcia Campos  <[email protected]>
 
+        [GTK][a11y] Web process crashes in some sites having SVG images
+        https://bugs.webkit.org/show_bug.cgi?id=234737
+
+        Reviewed by Adrian Perez de Castro.
+
+        Use AccessibilityAtspi::singleton().
+
+        * WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp:
+        (WTR::AccessibilityController::axRunLoop):
+        * WebKitTestRunner/InjectedBundle/atspi/AccessibilityNotificationHandler.cpp:
+        (WTR::AccessibilityNotificationHandler::AccessibilityNotificationHandler):
+        (WTR::AccessibilityNotificationHandler::~AccessibilityNotificationHandler):
+
+2022-01-11  Carlos Garcia Campos  <[email protected]>
+
         [GTK][a11y] WTR: do not immediately process main thread events while waiting for ax thread task
         https://bugs.webkit.org/show_bug.cgi?id=234950
 

Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp (287875 => 287876)


--- trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -138,7 +138,7 @@
         WKBundlePageRef page = InjectedBundle::singleton().page()->page();
         auto* element = static_cast<WebCore::AccessibilityObjectAtspi*>(WKAccessibilityRootObject(page));
         RELEASE_ASSERT(element);
-        m_axRunLoop = &element->root().atspi().runLoop();
+        m_axRunLoop = &WebCore::AccessibilityAtspi::singleton().runLoop();
     }
 
     return *m_axRunLoop;

Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityNotificationHandler.cpp (287875 => 287876)


--- trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityNotificationHandler.cpp	2022-01-11 13:45:53 UTC (rev 287875)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityNotificationHandler.cpp	2022-01-11 14:07:38 UTC (rev 287876)
@@ -33,7 +33,6 @@
 #include "JSWrapper.h"
 #include <_javascript_Core/OpaqueJSString.h>
 #include <WebCore/AccessibilityObjectAtspi.h>
-#include <WebCore/AccessibilityRootAtspi.h>
 #include <WebKit/WKBundleFrame.h>
 #include <WebKit/WKBundlePage.h>
 #include <WebKit/WKBundlePagePrivate.h>
@@ -44,13 +43,11 @@
     : m_callback(callback)
     , m_element(element)
 {
-    WKBundlePageRef page = InjectedBundle::singleton().page()->page();
-    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(page);
+    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::singleton().page()->page());
     JSContextRef jsContext = WKBundleFrameGetJavaScriptContext(mainFrame);
     JSValueProtect(jsContext, m_callback);
 
-    auto& atspi = m_element ? m_element->root().atspi() : static_cast<WebCore::AccessibilityObjectAtspi*>(WKAccessibilityRootObject(page))->root().atspi();
-    atspi.addNotificationObserver(this, [this](WebCore::AccessibilityObjectAtspi& element, const char* notificationName, WebCore::AccessibilityAtspi::NotificationObserverParameter parameter) {
+    WebCore::AccessibilityAtspi::singleton().addNotificationObserver(this, [this](WebCore::AccessibilityObjectAtspi& element, const char* notificationName, WebCore::AccessibilityAtspi::NotificationObserverParameter parameter) {
         if (m_element && m_element.get() != &element)
             return;
 
@@ -95,11 +92,9 @@
 
 AccessibilityNotificationHandler::~AccessibilityNotificationHandler()
 {
-    WKBundlePageRef page = InjectedBundle::singleton().page()->page();
-    auto& atspi = m_element ? m_element->root().atspi() : static_cast<WebCore::AccessibilityObjectAtspi*>(WKAccessibilityRootObject(page))->root().atspi();
-    atspi.removeNotificationObserver(this);
+    WebCore::AccessibilityAtspi::singleton().removeNotificationObserver(this);
 
-    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(page);
+    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::singleton().page()->page());
     JSContextRef jsContext = WKBundleFrameGetJavaScriptContext(mainFrame);
     JSValueUnprotect(jsContext, m_callback);
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to