Diff
Modified: trunk/Source/WebCore/ChangeLog (287455 => 287456)
--- trunk/Source/WebCore/ChangeLog 2021-12-27 07:36:06 UTC (rev 287455)
+++ trunk/Source/WebCore/ChangeLog 2021-12-27 07:37:13 UTC (rev 287456)
@@ -1,5 +1,32 @@
2021-12-26 Carlos Garcia Campos <[email protected]>
+ [GTK][a11y] Stop setting manages-descendants on web process root object with ATSPI
+ https://bugs.webkit.org/show_bug.cgi?id=234663
+
+ Reviewed by Adrian Perez de Castro.
+
+ Emit parent-changed and children-changed signals instead, like all other objects, to properly update the ATSPI
+ cache.
+
+ * accessibility/atspi/AccessibilityAtspi.cpp:
+ (WebCore::AccessibilityAtspi::parentChanged): Emit the signal for the root object.
+ (WebCore::AccessibilityAtspi::childrenChanged): Ditto.
+ * accessibility/atspi/AccessibilityAtspi.h:
+ * accessibility/atspi/AccessibilityObjectAtspi.cpp:
+ (WebCore::AccessibilityObjectAtspi::cacheDestroyed): Notify the root object too.
+ (WebCore::AccessibilityObjectAtspi::elementDestroyed): Ditto.
+ (WebCore::AccessibilityObjectAtspi::setParent): Ditto.
+ (WebCore::AccessibilityObjectAtspi::serialize const): Use AccessibilityRootAtspi::applicationReference().
+ * accessibility/atspi/AccessibilityRootAtspi.cpp:
+ (WebCore::AccessibilityRootAtspi::embedded): Call AccessibilityAtspi::parentChanged().
+ (WebCore::AccessibilityRootAtspi::parentReference const): Added.
+ (WebCore::AccessibilityRootAtspi::childAdded): Call AccessibilityAtspi::childrenChanged().
+ (WebCore::AccessibilityRootAtspi::childRemoved): Ditto.
+ (WebCore::AccessibilityRootAtspi::serialize const): Do not set manages-descendants state.
+ * accessibility/atspi/AccessibilityRootAtspi.h:
+
+2021-12-26 Carlos Garcia Campos <[email protected]>
+
[GTK][a11y] Test /webkit/WebKitAccessibility/selection/listbox is flaky with ATSPI
https://bugs.webkit.org/show_bug.cgi?id=234665
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp (287455 => 287456)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp 2021-12-27 07:36:06 UTC (rev 287455)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp 2021-12-27 07:37:13 UTC (rev 287456)
@@ -342,6 +342,16 @@
});
}
+void AccessibilityAtspi::parentChanged(AccessibilityRootAtspi& rootObject)
+{
+ RELEASE_ASSERT(!isMainThread());
+ if (!m_connection)
+ return;
+
+ g_dbus_connection_emit_signal(m_connection.get(), nullptr, rootObject.path().utf8().data(), "org.a11y.atspi.Event.Object", "PropertyChange",
+ g_variant_new("(siiva{sv})", "accessible-parent", 0, 0, rootObject.parentReference(), nullptr), nullptr);
+}
+
void AccessibilityAtspi::childrenChanged(AccessibilityObjectAtspi& atspiObject, AccessibilityObjectAtspi& child, ChildrenChanged change)
{
RELEASE_ASSERT(isMainThread());
@@ -364,6 +374,20 @@
});
}
+void AccessibilityAtspi::childrenChanged(AccessibilityRootAtspi& rootObject, AccessibilityObjectAtspi& child, ChildrenChanged change)
+{
+ RELEASE_ASSERT(isMainThread());
+
+ m_queue->dispatch([this, rootObject = Ref { rootObject }, child = Ref { child }, change] {
+ if (!m_connection)
+ return;
+
+ g_dbus_connection_emit_signal(m_connection.get(), nullptr, rootObject->path().utf8().data(), "org.a11y.atspi.Event.Object", "ChildrenChanged",
+ g_variant_new("(siiv(so))", change == ChildrenChanged::Added ? "add" : "remove", 0,
+ 0, g_variant_new("(so)", uniqueName(), child->path().utf8().data()), uniqueName(), rootObject->path().utf8().data()), nullptr);
+ });
+}
+
void AccessibilityAtspi::stateChanged(AccessibilityObjectAtspi& atspiObject, const char* name, bool value)
{
RELEASE_ASSERT(isMainThread());
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.h (287455 => 287456)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.h 2021-12-27 07:36:06 UTC (rev 287455)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.h 2021-12-27 07:37:13 UTC (rev 287456)
@@ -58,8 +58,10 @@
String registerHyperlink(AccessibilityObjectAtspi&, Vector<std::pair<GDBusInterfaceInfo*, GDBusInterfaceVTable*>>&&);
void parentChanged(AccessibilityObjectAtspi&);
+ void parentChanged(AccessibilityRootAtspi&);
enum class ChildrenChanged { Added, Removed };
void childrenChanged(AccessibilityObjectAtspi&, AccessibilityObjectAtspi&, ChildrenChanged);
+ void childrenChanged(AccessibilityRootAtspi&, AccessibilityObjectAtspi&, ChildrenChanged);
void stateChanged(AccessibilityObjectAtspi&, const char*, bool);
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp (287455 => 287456)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp 2021-12-27 07:36:06 UTC (rev 287455)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp 2021-12-27 07:37:13 UTC (rev 287456)
@@ -136,6 +136,7 @@
if (!m_isRegistered.load())
return;
+ m_root.childRemoved(*this);
m_root.atspi().unregisterObject(*this);
}
@@ -146,8 +147,12 @@
if (!m_isRegistered.load())
return;
- if (m_parent && *m_parent)
- m_parent.value()->childRemoved(*this);
+ if (m_parent) {
+ if (*m_parent)
+ m_parent.value()->childRemoved(*this);
+ else
+ m_root.childRemoved(*this);
+ }
m_root.atspi().unregisterObject(*this);
}
@@ -558,8 +563,12 @@
return;
m_root.atspi().parentChanged(*this);
- if (m_parent && *m_parent)
- m_parent.value()->childAdded(*this);
+ if (m_parent) {
+ if (*m_parent)
+ m_parent.value()->childAdded(*this);
+ else
+ m_root.childAdded(*this);
+ }
}
std::optional<AccessibilityObjectAtspi*> AccessibilityObjectAtspi::parent() const
@@ -1207,7 +1216,7 @@
{
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.parentUniqueName().utf8().data(), "/org/a11y/atspi/accessible/root");
+ g_variant_builder_add(builder, "@(so)", m_root.applicationReference());
g_variant_builder_add(builder, "@(so)", parentReference());
g_variant_builder_add(builder, "i", indexInParent());
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp (287455 => 287456)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp 2021-12-27 07:36:06 UTC (rev 287455)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp 2021-12-27 07:37:13 UTC (rev 287456)
@@ -60,10 +60,9 @@
else if (!g_strcmp0(methodName, "GetState")) {
GVariantBuilder builder = G_VARIANT_BUILDER_INIT(G_VARIANT_TYPE("(au)"));
- uint64_t atspiStates = (G_GUINT64_CONSTANT(1) << Atspi::State::ManagesDescendants);
g_variant_builder_open(&builder, G_VARIANT_TYPE("au"));
- g_variant_builder_add(&builder, "u", static_cast<uint32_t>(atspiStates & 0xffffffff));
- g_variant_builder_add(&builder, "u", static_cast<uint32_t>(atspiStates >> 32));
+ g_variant_builder_add(&builder, "u", 0);
+ g_variant_builder_add(&builder, "u", 0);
g_variant_builder_close(&builder);
g_dbus_method_invocation_return_value(invocation, g_variant_builder_end(&builder));
@@ -128,7 +127,7 @@
if (!g_strcmp0(propertyName, "AccessibleId"))
return g_variant_new_string("");
if (!g_strcmp0(propertyName, "Parent"))
- return g_variant_new("(so)", rootObject.m_parentUniqueName.utf8().data(), rootObject.m_parentPath.utf8().data());
+ return rootObject.parentReference();
if (!g_strcmp0(propertyName, "ChildCount")) {
auto childCount = Accessibility::retrieveValueFromMainThread<int32_t>([&rootObject]() -> int32_t {
return rootObject.child() ? 1 : 0;
@@ -223,6 +222,7 @@
RELEASE_ASSERT(!isMainThread());
m_parentUniqueName = parentUniqueName;
m_parentPath = parentPath;
+ m_atspi.parentChanged(*this);
if (!m_isTreeRegistered.load() && m_atspi.hasEventListeners())
registerTree();
}
@@ -241,6 +241,12 @@
return g_variant_new("(so)", m_atspi.uniqueName(), m_path.utf8().data());
}
+GVariant* AccessibilityRootAtspi::parentReference() const
+{
+ RELEASE_ASSERT(!isMainThread());
+ return g_variant_new("(so)", m_parentUniqueName.utf8().data(), m_parentPath.utf8().data());
+}
+
AccessibilityObjectAtspi* AccessibilityRootAtspi::child() const
{
RELEASE_ASSERT(isMainThread());
@@ -260,12 +266,22 @@
return rootObject ? rootObject->wrapper() : nullptr;
}
+void AccessibilityRootAtspi::childAdded(AccessibilityObjectAtspi& child)
+{
+ m_atspi.childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added);
+}
+
+void AccessibilityRootAtspi::childRemoved(AccessibilityObjectAtspi& child)
+{
+ m_atspi.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)", m_parentUniqueName.utf8().data(), "/org/a11y/atspi/accessible/root");
- g_variant_builder_add(builder, "(so)", m_parentUniqueName.utf8().data(), m_parentPath.utf8().data());
+ g_variant_builder_add(builder, "@(so)", applicationReference());
+ g_variant_builder_add(builder, "@(so)", parentReference());
g_variant_builder_add(builder, "i", 0);
g_variant_builder_add(builder, "i", Accessibility::retrieveValueFromMainThread<int32_t>([this]() -> int32_t {
@@ -284,9 +300,8 @@
g_variant_builder_add(builder, "s", "");
GVariantBuilder states = G_VARIANT_BUILDER_INIT(G_VARIANT_TYPE("au"));
- uint64_t atspiStates = (G_GUINT64_CONSTANT(1) << Atspi::State::ManagesDescendants);
- g_variant_builder_add(&states, "u", static_cast<uint32_t>(atspiStates & 0xffffffff));
- g_variant_builder_add(&states, "u", static_cast<uint32_t>(atspiStates >> 32));
+ g_variant_builder_add(&states, "u", 0);
+ g_variant_builder_add(&states, "u", 0);
g_variant_builder_add(builder, "@au", g_variant_builder_end(&states));
}
Modified: trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h (287455 => 287456)
--- trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h 2021-12-27 07:36:06 UTC (rev 287455)
+++ trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h 2021-12-27 07:37:13 UTC (rev 287456)
@@ -46,11 +46,13 @@
void setPath(String&&);
const String& path() const { return m_path; }
- const String& parentUniqueName() const { return m_parentUniqueName; }
GVariant* reference() const;
+ GVariant* parentReference() const;
GVariant* applicationReference() const;
AccessibilityAtspi& atspi() const { return m_atspi; }
AccessibilityObjectAtspi* child() const;
+ void childAdded(AccessibilityObjectAtspi&);
+ void childRemoved(AccessibilityObjectAtspi&);
void serialize(GVariantBuilder*) const;
Modified: trunk/Tools/ChangeLog (287455 => 287456)
--- trunk/Tools/ChangeLog 2021-12-27 07:36:06 UTC (rev 287455)
+++ trunk/Tools/ChangeLog 2021-12-27 07:37:13 UTC (rev 287456)
@@ -1,5 +1,17 @@
2021-12-26 Carlos Garcia Campos <[email protected]>
+ [GTK][a11y] Stop setting manages-descendants on web process root object with ATSPI
+ https://bugs.webkit.org/show_bug.cgi?id=234663
+
+ Reviewed by Adrian Perez de Castro.
+
+ Update the unit test to remove the ATSPI ifdef.
+
+ * TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp:
+ (testAccessibleBasicHierarchy):
+
+2021-12-26 Carlos Garcia Campos <[email protected]>
+
[GTK][a11y] WTR: handle xml-roles attributes to return the right role for landmark with ATSPI
https://bugs.webkit.org/show_bug.cgi?id=234638
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp (287455 => 287456)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp 2021-12-27 07:36:06 UTC (rev 287455)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp 2021-12-27 07:37:13 UTC (rev 287456)
@@ -259,15 +259,9 @@
" </body>"
"</html>",
nullptr);
-#if USE(ATSPI)
- // In atspi implementation the root object doesn't emit children-changed because it
- // always has ManagesDescendants in state.
- test->waitUntilLoadFinished();
-#else
// Check that children-changed::remove is emitted on the root object on navigation,
// and the a11y hierarchy is updated.
test->waitUntilChildrenRemoved(rootObject.get());
-#endif
documentWeb = test->findDocumentWeb(testApp.get());
g_assert_true(ATSPI_IS_ACCESSIBLE(documentWeb.get()));