Title: [287456] trunk
Revision
287456
Author
[email protected]
Date
2021-12-26 23:37:13 -0800 (Sun, 26 Dec 2021)

Log Message

[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.

Source/WebCore:

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:

Tools:

Update the unit test to remove the ATSPI ifdef.

* TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp:
(testAccessibleBasicHierarchy):

Modified Paths

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()));
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to