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);
}