Diff
Modified: trunk/Source/WebCore/ChangeLog (286766 => 286767)
--- trunk/Source/WebCore/ChangeLog 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/ChangeLog 2021-12-09 08:26:34 UTC (rev 286767)
@@ -1,3 +1,70 @@
+2021-12-09 Carlos Garcia Campos <[email protected]>
+
+ [GTK][a11y] Ensure atspi wrappers have root set at construction time
+ https://bugs.webkit.org/show_bug.cgi?id=233804
+
+ Reviewed by Joanmarie Diggs.
+
+ Pass the AccessibilityRootAtspi as a parameter to AccessibilityObjectAtspi constructor and store it as a
+ reference. A pointer to the AccessibilityRootAtspi object is now set in Page so that it can be accessed from the
+ AXObjectCache. Also remove setRoot() and use m_root directly instead of root() accessor.
+
+ * accessibility/atspi/AXObjectCacheAtspi.cpp:
+ (WebCore::AXObjectCache::attachWrapper): Get the AccessibilityRootAtspi from the page and pass it to the wrapper
+ constructor. Also set the parent of the dom root element wrapper to the atspi root element.
+ * accessibility/atspi/AccessibilityAtspi.cpp:
+ (WebCore::AccessibilityAtspi::childrenChanged):
+ * accessibility/atspi/AccessibilityObjectAtspi.cpp:
+ (WebCore::AccessibilityObjectAtspi::create):
+ (WebCore::AccessibilityObjectAtspi::AccessibilityObjectAtspi):
+ (WebCore::AccessibilityObjectAtspi::cacheDestroyed):
+ (WebCore::AccessibilityObjectAtspi::elementDestroyed):
+ (WebCore::AccessibilityObjectAtspi::path):
+ (WebCore::AccessibilityObjectAtspi::reference):
+ (WebCore::AccessibilityObjectAtspi::hyperlinkReference):
+ (WebCore::AccessibilityObjectAtspi::parentReference const):
+ (WebCore::AccessibilityObjectAtspi::childAt const):
+ (WebCore::AccessibilityObjectAtspi::wrapperVector const):
+ (WebCore::AccessibilityObjectAtspi::buildRelationSet const):
+ (WebCore::AccessibilityObjectAtspi::serialize const):
+ (WebCore::AccessibilityObjectAtspi::childAdded):
+ (WebCore::AccessibilityObjectAtspi::childRemoved):
+ (WebCore::AccessibilityObjectAtspi::stateChanged):
+ (WebCore::AccessibilityObjectAtspi::setRoot): Deleted.
+ (WebCore::AccessibilityObjectAtspi::root const): Deleted.
+ * accessibility/atspi/AccessibilityObjectAtspi.h:
+ * accessibility/atspi/AccessibilityObjectComponentAtspi.cpp:
+ * accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp:
+ * accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp:
+ (WebCore::AccessibilityObjectAtspi::hyperlink const):
+ * accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp:
+ (WebCore::AccessibilityObjectAtspi::selectedChild const):
+ (WebCore::AccessibilityObjectAtspi::selectionChanged):
+ * accessibility/atspi/AccessibilityObjectTableAtspi.cpp:
+ (WebCore::AccessibilityObjectAtspi::cell const):
+ (WebCore::AccessibilityObjectAtspi::tableCaption const):
+ (WebCore::AccessibilityObjectAtspi::rowHeader const):
+ (WebCore::AccessibilityObjectAtspi::columnHeader const):
+ * accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp:
+ (WebCore::AccessibilityObjectAtspi::cellRowHeaders const):
+ (WebCore::AccessibilityObjectAtspi::cellColumnHeaders const):
+ * accessibility/atspi/AccessibilityObjectTextAtspi.cpp:
+ (WebCore::AccessibilityObjectAtspi::textInserted):
+ (WebCore::AccessibilityObjectAtspi::textDeleted):
+ (WebCore::AccessibilityObjectAtspi::selectionChanged):
+ (WebCore::AccessibilityObjectAtspi::textAttributesChanged):
+ * accessibility/atspi/AccessibilityObjectValueAtspi.cpp:
+ (WebCore::AccessibilityObjectAtspi::valueChanged):
+ * accessibility/atspi/AccessibilityRootAtspi.cpp:
+ (WebCore::AccessibilityRootAtspi::registerObject):
+ (WebCore::AccessibilityRootAtspi::unregisterObject):
+ (WebCore::AccessibilityRootAtspi::child const):
+ (WebCore::AccessibilityRootAtspi::focusedObject const): Deleted.
+ * accessibility/atspi/AccessibilityRootAtspi.h:
+ * page/Page.h:
+ (WebCore::Page::accessibilityRootObject const):
+ (WebCore::Page::setAccessibilityRootObject):
+
2021-12-08 Myles C. Maxfield <[email protected]>
Fix build after r286759
Modified: trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp (286766 => 286767)
--- trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp 2021-12-09 08:26:34 UTC (rev 286767)
@@ -35,12 +35,19 @@
void AXObjectCache::attachWrapper(AXCoreObject* axObject)
{
- auto wrapper = AccessibilityObjectAtspi::create(axObject);
+ auto* rootWrapper = document().page()->accessibilityRootObject();
+ if (!rootWrapper)
+ return;
+
+ auto wrapper = AccessibilityObjectAtspi::create(axObject, *rootWrapper);
axObject->setWrapper(wrapper.ptr());
auto* axParent = axObject->parentObjectUnignored();
- if (!axParent)
+ if (!axParent) {
+ if (axObject->isScrollView() && axObject->scrollView() == document().view())
+ wrapper->setParent(nullptr); // nullptr parent means root.
return;
+ }
auto* axParentWrapper = axParent->wrapper();
if (!axParentWrapper)
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp (286766 => 286767)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp 2021-12-09 08:26:34 UTC (rev 286767)
@@ -177,7 +177,6 @@
if (!m_connection)
return;
- child->setRoot(atspiObject->root());
g_dbus_connection_emit_signal(m_connection.get(), nullptr, atspiObject->path().utf8().data(), "org.a11y.atspi.Event.Object", "ChildrenChanged",
g_variant_new("(siiv(so))", change == ChildrenChanged::Added ? "add" : "remove", child->indexInParentForChildrenChanged(change),
0, g_variant_new("(so)", uniqueName(), child->path().utf8().data()), uniqueName(), atspiObject->path().utf8().data()), nullptr);
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp (286766 => 286767)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp 2021-12-09 08:26:34 UTC (rev 286767)
@@ -37,9 +37,9 @@
namespace WebCore {
-Ref<AccessibilityObjectAtspi> AccessibilityObjectAtspi::create(AXCoreObject* coreObject)
+Ref<AccessibilityObjectAtspi> AccessibilityObjectAtspi::create(AXCoreObject* coreObject, AccessibilityRootAtspi& root)
{
- return adoptRef(*new AccessibilityObjectAtspi(coreObject));
+ return adoptRef(*new AccessibilityObjectAtspi(coreObject, root));
}
static inline bool roleIsTextType(AccessibilityRole role)
@@ -112,9 +112,10 @@
return interfaces;
}
-AccessibilityObjectAtspi::AccessibilityObjectAtspi(AXCoreObject* coreObject)
+AccessibilityObjectAtspi::AccessibilityObjectAtspi(AXCoreObject* coreObject, AccessibilityRootAtspi& root)
: m_coreObject(coreObject)
, m_interfaces(interfacesForObject(*m_coreObject))
+ , m_root(root)
{
RELEASE_ASSERT(isMainThread());
}
@@ -137,7 +138,7 @@
if (!m_isRegistered.load())
return;
- root()->atspi().unregisterObject(*this);
+ m_root.atspi().unregisterObject(*this);
}
void AccessibilityObjectAtspi::elementDestroyed()
@@ -150,7 +151,7 @@
if (m_parent && *m_parent)
m_parent.value()->childRemoved(*this);
- root()->atspi().unregisterObject(*this);
+ m_root.atspi().unregisterObject(*this);
}
static unsigned atspiRole(AccessibilityRole role)
@@ -429,12 +430,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->root()->applicationReference()));
+ g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", atspiObject->m_root.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->root()->atspi().nullReference()));
+ g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->reference() : atspiObject->m_root.atspi().nullReference()));
} else if (!g_strcmp0(methodName, "GetChildren")) {
GVariantBuilder builder = G_VARIANT_BUILDER_INIT(G_VARIANT_TYPE("a(so)"));
for (const auto& wrapper : atspiObject->children())
@@ -484,8 +485,6 @@
{
RELEASE_ASSERT(!isMainThread());
if (m_path.isNull()) {
- auto* atspiRoot = root();
- RELEASE_ASSERT(atspiRoot);
m_isRegistered.store(true);
Vector<std::pair<GDBusInterfaceInfo*, GDBusInterfaceVTable*>> interfaces;
@@ -513,7 +512,7 @@
interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_table_interface), &s_tableFunctions });
if (m_interfaces.contains(Interface::TableCell))
interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_table_cell_interface), &s_tableCellFunctions });
- m_path = atspiRoot->atspi().registerObject(*this, WTFMove(interfaces));
+ m_path = m_root.atspi().registerObject(*this, WTFMove(interfaces));
}
return m_path;
@@ -522,7 +521,7 @@
GVariant* AccessibilityObjectAtspi::reference()
{
RELEASE_ASSERT(!isMainThread());
- return g_variant_new("(so)", root()->atspi().uniqueName(), path().utf8().data());
+ return g_variant_new("(so)", m_root.atspi().uniqueName(), path().utf8().data());
}
GVariant* AccessibilityObjectAtspi::hyperlinkReference()
@@ -530,24 +529,12 @@
RELEASE_ASSERT(!isMainThread());
if (m_hyperlinkPath.isNull()) {
path();
- m_hyperlinkPath = root()->atspi().registerHyperlink(*this, { { const_cast<GDBusInterfaceInfo*>(&webkit_hyperlink_interface), &s_hyperlinkFunctions } });
+ m_hyperlinkPath = m_root.atspi().registerHyperlink(*this, { { const_cast<GDBusInterfaceInfo*>(&webkit_hyperlink_interface), &s_hyperlinkFunctions } });
}
- return g_variant_new("(so)", root()->atspi().uniqueName(), m_hyperlinkPath.utf8().data());
+ return g_variant_new("(so)", m_root.atspi().uniqueName(), m_hyperlinkPath.utf8().data());
}
-void AccessibilityObjectAtspi::setRoot(AccessibilityRootAtspi* root)
-{
- Locker locker { m_rootLock };
- m_root = root;
-}
-
-AccessibilityRootAtspi* AccessibilityObjectAtspi::root() const
-{
- Locker locker { m_rootLock };
- return m_root;
-}
-
void AccessibilityObjectAtspi::setParent(std::optional<AccessibilityObjectAtspi*> atspiParent)
{
RELEASE_ASSERT(isMainThread());
@@ -569,10 +556,8 @@
if (!axParent)
return nullptr;
- if (auto* atspiParent = axParent->wrapper()) {
- atspiParent->setRoot(root());
+ if (auto* atspiParent = axParent->wrapper())
return atspiParent;
- }
return std::nullopt;
}
@@ -581,10 +566,10 @@
{
auto parentAtspi = parent();
if (!parentAtspi)
- return root()->atspi().nullReference();
+ return m_root.atspi().nullReference();
if (!parentAtspi.value())
- return root()->reference();
+ return m_root.reference();
return parentAtspi.value()->reference();
}
@@ -608,9 +593,7 @@
if (index >= children.size())
return nullptr;
- auto* wrapper = children[index]->wrapper();
- wrapper->setRoot(root());
- return wrapper;
+ return children[index]->wrapper();
}
Vector<RefPtr<AccessibilityObjectAtspi>> AccessibilityObjectAtspi::wrapperVector(const Vector<RefPtr<AXCoreObject>>& elements) const
@@ -617,12 +600,9 @@
{
Vector<RefPtr<AccessibilityObjectAtspi>> wrappers;
wrappers.reserveInitialCapacity(elements.size());
- auto* root = this->root();
for (const auto& element : elements) {
- if (auto* wrapper = element->wrapper()) {
- wrapper->setRoot(root);
+ if (auto* wrapper = element->wrapper())
wrappers.uncheckedAppend(wrapper);
- }
}
return wrappers;
}
@@ -1140,10 +1120,8 @@
for (const auto& it : relationMap) {
GVariantBuilder arrayBuilder = G_VARIANT_BUILDER_INIT(G_VARIANT_TYPE("a(so)"));
- for (const auto& atspiObject : it.value) {
- atspiObject->setRoot(root());
+ for (const auto& atspiObject : it.value)
g_variant_builder_add(&arrayBuilder, "@(so)", atspiObject->reference());
- }
g_variant_builder_add(builder, "(ua(so))", it.key, &arrayBuilder);
}
}
@@ -1180,9 +1158,8 @@
void AccessibilityObjectAtspi::serialize(GVariantBuilder* builder) const
{
RELEASE_ASSERT(!isMainThread());
- auto* atspiRoot = root();
- g_variant_builder_add(builder, "(so)", atspiRoot->atspi().uniqueName(), m_path.utf8().data());
- g_variant_builder_add(builder, "(so)", atspiRoot->parentUniqueName().utf8().data(), "/org/a11y/atspi/accessible/root");
+ g_variant_builder_add(builder, "(so)", m_root.atspi().uniqueName(), m_path.utf8().data());
+ g_variant_builder_add(builder, "(so)", m_root.parentUniqueName().utf8().data(), "/org/a11y/atspi/accessible/root");
g_variant_builder_add(builder, "@(so)", parentReference());
g_variant_builder_add(builder, "i", indexInParent());
@@ -1214,7 +1191,7 @@
RunLoop::main().dispatch([this, protectedThis = Ref { *this }, child = Ref { child }] {
if (!m_coreObject)
return;
- root()->atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added);
+ m_root.atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added);
});
}
@@ -1224,7 +1201,7 @@
if (!m_isRegistered.load())
return;
- root()->atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Removed);
+ m_root.atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Removed);
}
void AccessibilityObjectAtspi::stateChanged(const char* name, bool value)
@@ -1233,7 +1210,7 @@
if (!m_isRegistered.load())
return;
- root()->atspi().stateChanged(*this, name, value);
+ m_root.atspi().stateChanged(*this, name, value);
}
unsigned AccessibilityObjectAtspi::role() const
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h (286766 => 286767)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h 2021-12-09 08:26:34 UTC (rev 286767)
@@ -24,7 +24,6 @@
#include "AccessibilityObjectInterface.h"
#include "IntRect.h"
#include <wtf/Atomics.h>
-#include <wtf/Lock.h>
#include <wtf/OptionSet.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/text/CString.h>
@@ -39,7 +38,7 @@
class AccessibilityObjectAtspi final : public ThreadSafeRefCounted<AccessibilityObjectAtspi> {
public:
- static Ref<AccessibilityObjectAtspi> create(AXCoreObject*);
+ static Ref<AccessibilityObjectAtspi> create(AXCoreObject*, AccessibilityRootAtspi&);
~AccessibilityObjectAtspi() = default;
enum class Interface : uint16_t {
@@ -58,8 +57,7 @@
};
const OptionSet<Interface>& interfaces() const { return m_interfaces; }
- void setRoot(AccessibilityRootAtspi*);
- WEBCORE_EXPORT AccessibilityRootAtspi* root() const;
+ const AccessibilityRootAtspi& root() const { return m_root; }
void setParent(std::optional<AccessibilityObjectAtspi*>);
WEBCORE_EXPORT std::optional<AccessibilityObjectAtspi*> parent() const;
WEBCORE_EXPORT void updateBackingStore();
@@ -155,7 +153,7 @@
WEBCORE_EXPORT std::pair<std::optional<unsigned>, std::optional<unsigned>> cellPosition() const;
private:
- explicit AccessibilityObjectAtspi(AXCoreObject*);
+ explicit AccessibilityObjectAtspi(AXCoreObject*, AccessibilityRootAtspi&);
Vector<RefPtr<AccessibilityObjectAtspi>> wrapperVector(const Vector<RefPtr<AXCoreObject>>&) const;
int indexInParent() const;
@@ -236,7 +234,7 @@
AXCoreObject* m_axObject { nullptr };
AXCoreObject* m_coreObject { nullptr };
OptionSet<Interface> m_interfaces;
- AccessibilityRootAtspi* m_root WTF_GUARDED_BY_LOCK(m_rootLock) { nullptr };
+ AccessibilityRootAtspi& m_root;
std::optional<AccessibilityObjectAtspi*> m_parent;
Atomic<bool> m_isRegistered { false };
String m_path;
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp (286766 => 286767)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp 2021-12-09 08:26:34 UTC (rev 286767)
@@ -47,7 +47,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->root()->atspi().nullReference()));
+ g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->reference() : atspiObject->m_root.atspi().nullReference()));
} else if (!g_strcmp0(methodName, "GetExtents")) {
uint32_t coordinateType;
g_variant_get(parameters, "(u)", &coordinateType);
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp (286766 => 286767)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp 2021-12-09 08:26:34 UTC (rev 286767)
@@ -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->root()->atspi().nullReference()));
+ g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", !index ? atspiObject->reference() : atspiObject->m_root.atspi().nullReference()));
} else if (!g_strcmp0(methodName, "GetURI")) {
int index;
g_variant_get(parameters, "(i)", &index);
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp (286766 => 286767)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp 2021-12-09 08:26:34 UTC (rev 286767)
@@ -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->root()->atspi().nullReference()));
+ g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->hyperlinkReference() : atspiObject->m_root.atspi().nullReference()));
} else if (!g_strcmp0(methodName, "GetLinkIndex")) {
int offset;
g_variant_get(parameters, "(i)", &offset);
@@ -102,10 +102,8 @@
if (!wrapper || !wrapper->interfaces().contains(Interface::Hyperlink))
continue;
- if (static_cast<unsigned>(++linkIndex) == index) {
- wrapper->setRoot(root());
+ if (static_cast<unsigned>(++linkIndex) == index)
return wrapper;
- }
}
return nullptr;
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp (286766 => 286767)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp 2021-12-09 08:26:34 UTC (rev 286767)
@@ -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->root()->atspi().nullReference()));
+ g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", child ? child->reference() : atspiObject->m_root.atspi().nullReference()));
} else if (!g_strcmp0(methodName, "SelectChild")) {
int index;
g_variant_get(parameters, "(i)", &index);
@@ -110,9 +110,6 @@
return selectedItems[index]->wrapper();
});
- if (wrapper)
- wrapper->setRoot(root());
-
return wrapper;
}
@@ -230,7 +227,7 @@
if (!m_isRegistered.load())
return;
- root()->atspi().selectionChanged(*this);
+ m_root.atspi().selectionChanged(*this);
}
} // namespace WebCore
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableAtspi.cpp (286766 => 286767)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableAtspi.cpp 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableAtspi.cpp 2021-12-09 08:26:34 UTC (rev 286767)
@@ -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->root()->atspi().nullReference()));
+ g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", cell ? cell->reference() : atspiObject->m_root.atspi().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->root()->atspi().nullReference()));
+ g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", header ? header->reference() : atspiObject->m_root.atspi().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->root()->atspi().nullReference()));
+ g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", header ? header->reference() : atspiObject->m_root.atspi().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->root()->atspi().nullReference();
+ return caption ? caption->reference() : atspiObject->m_root.atspi().nullReference();
}
if (!g_strcmp0(propertyName, "Summary"))
- return atspiObject->root()->atspi().nullReference();
+ return atspiObject->m_root.atspi().nullReference();
if (!g_strcmp0(propertyName, "NSelectedRows"))
return g_variant_new_int32(0);
if (!g_strcmp0(propertyName, "NSelectedColumns"))
@@ -160,12 +160,8 @@
if (!m_axObject)
return nullptr;
- if (auto* tableCell = m_axObject->cellForColumnAndRow(column, row)) {
- if (auto* wrapper = tableCell->wrapper()) {
- wrapper->setRoot(root());
- return wrapper;
- }
- }
+ if (auto* tableCell = m_axObject->cellForColumnAndRow(column, row))
+ return tableCell->wrapper();
return nullptr;
}
@@ -185,12 +181,8 @@
if (auto caption = downcast<HTMLTableElement>(*node).caption()) {
if (auto* renderer = caption->renderer()) {
- if (auto* element = AccessibilityObject::firstAccessibleObjectFromNode(renderer->element())) {
- if (auto* wrapper = element->wrapper()) {
- wrapper->setRoot(root());
- return wrapper;
- }
- }
+ if (auto* element = AccessibilityObject::firstAccessibleObjectFromNode(renderer->element()))
+ return element->wrapper();
}
}
}
@@ -253,10 +245,8 @@
for (const auto& header : headers) {
auto range = header->rowIndexRange();
if (range.first <= row && row < range.first + range.second) {
- if (auto* wrapper = header->wrapper()) {
- wrapper->setRoot(root());
+ if (auto* wrapper = header->wrapper())
return wrapper;
- }
}
}
@@ -273,10 +263,8 @@
for (const auto& header : headers) {
auto range = header->columnIndexRange();
if (range.first <= column && column < range.first + range.second) {
- if (auto* wrapper = header->wrapper()) {
- wrapper->setRoot(root());
+ if (auto* wrapper = header->wrapper())
return wrapper;
- }
}
}
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp (286766 => 286767)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp 2021-12-09 08:26:34 UTC (rev 286767)
@@ -67,7 +67,7 @@
if (!g_strcmp0(propertyName, "Table")) {
auto* axObject = atspiObject->m_axObject;
if (!axObject || !axObject->isTableCell())
- return atspiObject->root()->atspi().nullReference();
+ return atspiObject->m_root.atspi().nullReference();
AccessibilityObjectAtspi* wrapper = atspiObject.ptr();
while (auto parent = wrapper->parent()) {
@@ -80,7 +80,7 @@
if (axObject && axObject->isTable())
break;
}
- return wrapper ? wrapper->reference() : atspiObject->root()->atspi().nullReference();
+ return wrapper ? wrapper->reference() : atspiObject->m_root.atspi().nullReference();
}
g_set_error(error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "Unknown property '%s'", propertyName);
@@ -102,17 +102,7 @@
if (role() != Atspi::Role::TableCell)
return { };
- auto headers = m_axObject->rowHeaders();
- Vector<RefPtr<AccessibilityObjectAtspi>> wrappers;
- wrappers.reserveInitialCapacity(headers.size());
- auto* root = this->root();
- for (const auto& header : headers) {
- if (auto* wrapper = header->wrapper()) {
- wrapper->setRoot(root);
- wrappers.uncheckedAppend(wrapper);
- }
- }
- return wrappers;
+ return wrapperVector(m_axObject->rowHeaders());
}
Vector<RefPtr<AccessibilityObjectAtspi>> AccessibilityObjectAtspi::cellColumnHeaders() const
@@ -125,17 +115,7 @@
if (role() != Atspi::Role::TableCell)
return { };
- auto headers = m_axObject->columnHeaders();
- Vector<RefPtr<AccessibilityObjectAtspi>> wrappers;
- wrappers.reserveInitialCapacity(headers.size());
- auto* root = this->root();
- for (const auto& header : headers) {
- if (auto* wrapper = header->wrapper()) {
- wrapper->setRoot(root);
- wrappers.uncheckedAppend(wrapper);
- }
- }
- return wrappers;
+ return wrapperVector(m_axObject->columnHeaders());
}
unsigned AccessibilityObjectAtspi::rowSpan() const
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp (286766 => 286767)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp 2021-12-09 08:26:34 UTC (rev 286767)
@@ -361,7 +361,7 @@
auto offset = UTF16OffsetToUTF8(mapping, utf16Offset);
auto utf8InsertedText = insertedText.utf8();
auto insertedTextLength = g_utf8_strlen(utf8InsertedText.data(), -1);
- root()->atspi().textChanged(*this, "insert", WTFMove(utf8InsertedText), offset - insertedTextLength, insertedTextLength);
+ m_root.atspi().textChanged(*this, "insert", WTFMove(utf8InsertedText), offset - insertedTextLength, insertedTextLength);
}
void AccessibilityObjectAtspi::textDeleted(const String& deletedText, const VisiblePosition& position)
@@ -380,7 +380,7 @@
auto offset = UTF16OffsetToUTF8(mapping, utf16Offset);
auto utf8DeletedText = deletedText.utf8();
auto deletedTextLength = g_utf8_strlen(utf8DeletedText.data(), -1);
- root()->atspi().textChanged(*this, "delete", WTFMove(utf8DeletedText), offset, deletedTextLength);
+ m_root.atspi().textChanged(*this, "delete", WTFMove(utf8DeletedText), offset, deletedTextLength);
}
IntPoint AccessibilityObjectAtspi::boundaryOffset(unsigned utf16Offset, TextGranularity granularity) const
@@ -773,10 +773,10 @@
auto mapping = offsetMapping(utf16Text);
auto caretOffset = UTF16OffsetToUTF8(mapping, bounds.y());
if (caretOffset <= length)
- root()->atspi().textCaretMoved(*this, caretOffset);
+ m_root.atspi().textCaretMoved(*this, caretOffset);
if (selection.isRange())
- root()->atspi().textSelectionChanged(*this);
+ m_root.atspi().textSelectionChanged(*this);
}
AccessibilityObjectAtspi::TextAttributes AccessibilityObjectAtspi::textAttributes(std::optional<unsigned> utf16Offset, bool includeDefault) const
@@ -949,7 +949,7 @@
if (!m_interfaces.contains(Interface::Text))
return;
- root()->atspi().textAttributesChanged(*this);
+ m_root.atspi().textAttributesChanged(*this);
}
bool AccessibilityObjectAtspi::scrollToMakeVisible(int startOffset, int endOffset, uint32_t scrollType) const
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectValueAtspi.cpp (286766 => 286767)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectValueAtspi.cpp 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectValueAtspi.cpp 2021-12-09 08:26:34 UTC (rev 286767)
@@ -137,7 +137,7 @@
if (!m_isRegistered.load())
return;
- root()->atspi().valueChanged(*this, value);
+ m_root.atspi().valueChanged(*this, value);
}
} // namespace WebCore
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp (286766 => 286767)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp 2021-12-09 08:26:34 UTC (rev 286767)
@@ -157,6 +157,9 @@
void AccessibilityRootAtspi::registerObject(CompletionHandler<void(const String&)>&& completionHandler)
{
RELEASE_ASSERT(isMainThread());
+ if (m_page)
+ m_page->setAccessibilityRootObject(this);
+
Vector<std::pair<GDBusInterfaceInfo*, GDBusInterfaceVTable*>> interfaces;
interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_accessible_interface), &s_accessibleFunctions });
interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_component_interface), &s_componentFunctions });
@@ -167,6 +170,9 @@
{
RELEASE_ASSERT(isMainThread());
m_atspi.unregisterRoot(*this);
+
+ if (m_page)
+ m_page->setAccessibilityRootObject(nullptr);
}
void AccessibilityRootAtspi::setPath(String&& path)
@@ -198,9 +204,6 @@
AccessibilityObjectAtspi* AccessibilityRootAtspi::child() const
{
RELEASE_ASSERT(isMainThread());
- if (!AXObjectCache::accessibilityEnabled())
- AXObjectCache::enableAccessibility();
-
if (!m_page)
return nullptr;
@@ -208,54 +211,15 @@
if (!frame.document())
return nullptr;
+ AXObjectCache::enableAccessibility();
AXObjectCache* cache = frame.document()->axObjectCache();
if (!cache)
return nullptr;
AXCoreObject* rootObject = cache->rootObject();
- if (!rootObject)
- return nullptr;
-
- auto* wrapper = rootObject->wrapper();
- if (!wrapper)
- return nullptr;
-
- wrapper->setRoot(const_cast<AccessibilityRootAtspi*>(this));
- wrapper->setParent(nullptr); // nullptr parent means root.
-
- return wrapper;
+ return rootObject ? rootObject->wrapper() : nullptr;
}
-AccessibilityObjectAtspi* AccessibilityRootAtspi::focusedObject() const
-{
- RELEASE_ASSERT(isMainThread());
- if (!AXObjectCache::accessibilityEnabled())
- AXObjectCache::enableAccessibility();
-
- if (!m_page)
- return nullptr;
-
- auto* focusedDocument = m_page->focusController().focusedOrMainFrame().document();
- if (!focusedDocument)
- return nullptr;
-
- auto* cache = focusedDocument->axObjectCache();
- if (!cache)
- return nullptr;
-
- auto* focusedObject = cache->focusedObjectForPage(m_page.get());
- if (!focusedObject)
- return nullptr;
-
- auto* wrapper = focusedObject->wrapper();
- if (!wrapper)
- return nullptr;
-
- wrapper->setRoot(const_cast<AccessibilityRootAtspi*>(this));
-
- return wrapper;
-}
-
void AccessibilityRootAtspi::serialize(GVariantBuilder* builder) const
{
RELEASE_ASSERT(!isMainThread());
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h (286766 => 286767)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h 2021-12-09 08:26:34 UTC (rev 286767)
@@ -49,7 +49,6 @@
GVariant* applicationReference() const;
AccessibilityAtspi& atspi() const { return m_atspi; }
AccessibilityObjectAtspi* child() const;
- AccessibilityObjectAtspi* focusedObject() const;
void serialize(GVariantBuilder*) const;
Modified: trunk/Source/WebCore/page/Page.h (286766 => 286767)
--- trunk/Source/WebCore/page/Page.h 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebCore/page/Page.h 2021-12-09 08:26:34 UTC (rev 286767)
@@ -91,6 +91,7 @@
class IDBConnectionToServer;
}
+class AccessibilityRootAtspi;
class ApplePayAMSUIPaymentHandler;
class ActivityStateChangeObserver;
class AlternativeTextClient;
@@ -916,6 +917,11 @@
ModelPlayerProvider& modelPlayerProvider();
+#if ENABLE(ACCESSIBILITY) && USE(ATSPI)
+ AccessibilityRootAtspi* accessibilityRootObject() const { return m_accessibilityRootObject; }
+ void setAccessibilityRootObject(AccessibilityRootAtspi* rootObject) { m_accessibilityRootObject = rootObject; }
+#endif
+
private:
struct Navigation {
RegistrableDomain domain;
@@ -1263,6 +1269,10 @@
using CachedTextRecognitionResult = std::pair<TextRecognitionResult, IntRect>;
WeakHashMap<HTMLElement, CachedTextRecognitionResult> m_textRecognitionResults;
#endif
+
+#if ENABLE(ACCESSIBILITY) && USE(ATSPI)
+ AccessibilityRootAtspi* m_accessibilityRootObject { nullptr };
+#endif
};
inline PageGroup& Page::group()
Modified: trunk/Source/WebKit/ChangeLog (286766 => 286767)
--- trunk/Source/WebKit/ChangeLog 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebKit/ChangeLog 2021-12-09 08:26:34 UTC (rev 286767)
@@ -1,3 +1,16 @@
+2021-12-09 Carlos Garcia Campos <[email protected]>
+
+ [GTK][a11y] Ensure atspi wrappers have root set at construction time
+ https://bugs.webkit.org/show_bug.cgi?id=233804
+
+ Reviewed by Joanmarie Diggs.
+
+ * WebProcess/InjectedBundle/API/c/WKBundlePage.cpp:
+ (WKAccessibilityRootObject): Remove ATSPI specific code.
+ (WKAccessibilityFocusedObject): Ditto.
+ * WebProcess/WebPage/WebPage.h:
+ (WebKit::WebPage::accessibilityRootObject const): Deleted.
+
2021-12-08 Brady Eidson <[email protected]>
Add ability to inject messages into webpushd
Modified: trunk/Source/WebKit/WebProcess/InjectedBundle/API/c/WKBundlePage.cpp (286766 => 286767)
--- trunk/Source/WebKit/WebProcess/InjectedBundle/API/c/WKBundlePage.cpp 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebKit/WebProcess/InjectedBundle/API/c/WKBundlePage.cpp 2021-12-09 08:26:34 UTC (rev 286767)
@@ -247,10 +247,6 @@
if (!pageRef)
return 0;
-#if USE(ATSPI)
- return WebKit::toImpl(pageRef)->accessibilityRootObject().child();
-#endif
-
WebCore::Page* page = WebKit::toImpl(pageRef)->corePage();
if (!page)
return 0;
@@ -278,10 +274,6 @@
if (!pageRef)
return 0;
-#if USE(ATSPI)
- return WebKit::toImpl(pageRef)->accessibilityRootObject().focusedObject();
-#endif
-
WebCore::Page* page = WebKit::toImpl(pageRef)->corePage();
if (!page)
return 0;
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (286766 => 286767)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2021-12-09 08:26:34 UTC (rev 286767)
@@ -1497,10 +1497,6 @@
void prepareToRunModalJavaScriptDialog();
-#if USE(ATSPI)
- const WebCore::AccessibilityRootAtspi& accessibilityRootObject() const { return *m_accessibilityRootObject; }
-#endif
-
#if ENABLE(ARKIT_INLINE_PREVIEW)
bool useARKitForModel() const { return m_useARKitForModel; };
#endif
Modified: trunk/Tools/ChangeLog (286766 => 286767)
--- trunk/Tools/ChangeLog 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Tools/ChangeLog 2021-12-09 08:26:34 UTC (rev 286767)
@@ -1,3 +1,13 @@
+2021-12-09 Carlos Garcia Campos <[email protected]>
+
+ [GTK][a11y] Ensure atspi wrappers have root set at construction time
+ https://bugs.webkit.org/show_bug.cgi?id=233804
+
+ Reviewed by Joanmarie Diggs.
+
+ * WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp:
+ (WTR::AccessibilityController::axRunLoop):
+
2021-12-08 Brady Eidson <[email protected]>
Add ability to inject messages into webpushd
Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp (286766 => 286767)
--- trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp 2021-12-09 07:09:19 UTC (rev 286766)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp 2021-12-09 08:26:34 UTC (rev 286767)
@@ -123,7 +123,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 = &element->root().atspi().runLoop();
}
return *m_axRunLoop;