Changeset 286767 in webkit


Ignore:
Timestamp:
Dec 9, 2021, 12:26:34 AM (4 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK][a11y] Ensure atspi wrappers have root set at construction time
https://bugs.webkit.org/show_bug.cgi?id=233804

Reviewed by Joanmarie Diggs.

Source/WebCore:

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):

Source/WebKit:

  • WebProcess/InjectedBundle/API/c/WKBundlePage.cpp:

(WKAccessibilityRootObject): Remove ATSPI specific code.
(WKAccessibilityFocusedObject): Ditto.

  • WebProcess/WebPage/WebPage.h:

(WebKit::WebPage::accessibilityRootObject const): Deleted.

Tools:

  • WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp:

(WTR::AccessibilityController::axRunLoop):

Location:
trunk
Files:
21 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r286766 r286767  
     12021-12-09  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK][a11y] Ensure atspi wrappers have root set at construction time
     4        https://bugs.webkit.org/show_bug.cgi?id=233804
     5
     6        Reviewed by Joanmarie Diggs.
     7
     8        Pass the AccessibilityRootAtspi as a parameter to AccessibilityObjectAtspi constructor and store it as a
     9        reference. A pointer to the AccessibilityRootAtspi object is now set in Page so that it can be accessed from the
     10        AXObjectCache. Also remove setRoot() and use m_root directly instead of root() accessor.
     11
     12        * accessibility/atspi/AXObjectCacheAtspi.cpp:
     13        (WebCore::AXObjectCache::attachWrapper): Get the AccessibilityRootAtspi from the page and pass it to the wrapper
     14        constructor. Also set the parent of the dom root element wrapper to the atspi root element.
     15        * accessibility/atspi/AccessibilityAtspi.cpp:
     16        (WebCore::AccessibilityAtspi::childrenChanged):
     17        * accessibility/atspi/AccessibilityObjectAtspi.cpp:
     18        (WebCore::AccessibilityObjectAtspi::create):
     19        (WebCore::AccessibilityObjectAtspi::AccessibilityObjectAtspi):
     20        (WebCore::AccessibilityObjectAtspi::cacheDestroyed):
     21        (WebCore::AccessibilityObjectAtspi::elementDestroyed):
     22        (WebCore::AccessibilityObjectAtspi::path):
     23        (WebCore::AccessibilityObjectAtspi::reference):
     24        (WebCore::AccessibilityObjectAtspi::hyperlinkReference):
     25        (WebCore::AccessibilityObjectAtspi::parentReference const):
     26        (WebCore::AccessibilityObjectAtspi::childAt const):
     27        (WebCore::AccessibilityObjectAtspi::wrapperVector const):
     28        (WebCore::AccessibilityObjectAtspi::buildRelationSet const):
     29        (WebCore::AccessibilityObjectAtspi::serialize const):
     30        (WebCore::AccessibilityObjectAtspi::childAdded):
     31        (WebCore::AccessibilityObjectAtspi::childRemoved):
     32        (WebCore::AccessibilityObjectAtspi::stateChanged):
     33        (WebCore::AccessibilityObjectAtspi::setRoot): Deleted.
     34        (WebCore::AccessibilityObjectAtspi::root const): Deleted.
     35        * accessibility/atspi/AccessibilityObjectAtspi.h:
     36        * accessibility/atspi/AccessibilityObjectComponentAtspi.cpp:
     37        * accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp:
     38        * accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp:
     39        (WebCore::AccessibilityObjectAtspi::hyperlink const):
     40        * accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp:
     41        (WebCore::AccessibilityObjectAtspi::selectedChild const):
     42        (WebCore::AccessibilityObjectAtspi::selectionChanged):
     43        * accessibility/atspi/AccessibilityObjectTableAtspi.cpp:
     44        (WebCore::AccessibilityObjectAtspi::cell const):
     45        (WebCore::AccessibilityObjectAtspi::tableCaption const):
     46        (WebCore::AccessibilityObjectAtspi::rowHeader const):
     47        (WebCore::AccessibilityObjectAtspi::columnHeader const):
     48        * accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp:
     49        (WebCore::AccessibilityObjectAtspi::cellRowHeaders const):
     50        (WebCore::AccessibilityObjectAtspi::cellColumnHeaders const):
     51        * accessibility/atspi/AccessibilityObjectTextAtspi.cpp:
     52        (WebCore::AccessibilityObjectAtspi::textInserted):
     53        (WebCore::AccessibilityObjectAtspi::textDeleted):
     54        (WebCore::AccessibilityObjectAtspi::selectionChanged):
     55        (WebCore::AccessibilityObjectAtspi::textAttributesChanged):
     56        * accessibility/atspi/AccessibilityObjectValueAtspi.cpp:
     57        (WebCore::AccessibilityObjectAtspi::valueChanged):
     58        * accessibility/atspi/AccessibilityRootAtspi.cpp:
     59        (WebCore::AccessibilityRootAtspi::registerObject):
     60        (WebCore::AccessibilityRootAtspi::unregisterObject):
     61        (WebCore::AccessibilityRootAtspi::child const):
     62        (WebCore::AccessibilityRootAtspi::focusedObject const): Deleted.
     63        * accessibility/atspi/AccessibilityRootAtspi.h:
     64        * page/Page.h:
     65        (WebCore::Page::accessibilityRootObject const):
     66        (WebCore::Page::setAccessibilityRootObject):
     67
    1682021-12-08  Myles C. Maxfield  <mmaxfield@apple.com>
    269
  • trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp

    r286189 r286767  
    3636void AXObjectCache::attachWrapper(AXCoreObject* axObject)
    3737{
    38     auto wrapper = AccessibilityObjectAtspi::create(axObject);
     38    auto* rootWrapper = document().page()->accessibilityRootObject();
     39    if (!rootWrapper)
     40        return;
     41
     42    auto wrapper = AccessibilityObjectAtspi::create(axObject, *rootWrapper);
    3943    axObject->setWrapper(wrapper.ptr());
    4044
    4145    auto* axParent = axObject->parentObjectUnignored();
    42     if (!axParent)
    43         return;
     46    if (!axParent) {
     47        if (axObject->isScrollView() && axObject->scrollView() == document().view())
     48            wrapper->setParent(nullptr); // nullptr parent means root.
     49        return;
     50    }
    4451
    4552    auto* axParentWrapper = axParent->wrapper();
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp

    r286173 r286767  
    178178            return;
    179179
    180         child->setRoot(atspiObject->root());
    181180        g_dbus_connection_emit_signal(m_connection.get(), nullptr, atspiObject->path().utf8().data(), "org.a11y.atspi.Event.Object", "ChildrenChanged",
    182181            g_variant_new("(siiv(so))", change == ChildrenChanged::Added ? "add" : "remove", child->indexInParentForChildrenChanged(change),
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp

    r286416 r286767  
    3838namespace WebCore {
    3939
    40 Ref<AccessibilityObjectAtspi> AccessibilityObjectAtspi::create(AXCoreObject* coreObject)
    41 {
    42     return adoptRef(*new AccessibilityObjectAtspi(coreObject));
     40Ref<AccessibilityObjectAtspi> AccessibilityObjectAtspi::create(AXCoreObject* coreObject, AccessibilityRootAtspi& root)
     41{
     42    return adoptRef(*new AccessibilityObjectAtspi(coreObject, root));
    4343}
    4444
     
    113113}
    114114
    115 AccessibilityObjectAtspi::AccessibilityObjectAtspi(AXCoreObject* coreObject)
     115AccessibilityObjectAtspi::AccessibilityObjectAtspi(AXCoreObject* coreObject, AccessibilityRootAtspi& root)
    116116    : m_coreObject(coreObject)
    117117    , m_interfaces(interfacesForObject(*m_coreObject))
     118    , m_root(root)
    118119{
    119120    RELEASE_ASSERT(isMainThread());
     
    138139        return;
    139140
    140     root()->atspi().unregisterObject(*this);
     141    m_root.atspi().unregisterObject(*this);
    141142}
    142143
     
    151152        m_parent.value()->childRemoved(*this);
    152153
    153     root()->atspi().unregisterObject(*this);
     154    m_root.atspi().unregisterObject(*this);
    154155}
    155156
     
    430431            g_dbus_method_invocation_return_value(invocation, g_variant_builder_end(&builder));
    431432        } else if (!g_strcmp0(methodName, "GetApplication"))
    432             g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", atspiObject->root()->applicationReference()));
     433            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", atspiObject->m_root.applicationReference()));
    433434        else if (!g_strcmp0(methodName, "GetChildAtIndex")) {
    434435            int index;
    435436            g_variant_get(parameters, "(i)", &index);
    436437            auto* wrapper = index >= 0 ? atspiObject->childAt(index) : nullptr;
    437             g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->reference() : atspiObject->root()->atspi().nullReference()));
     438            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->reference() : atspiObject->m_root.atspi().nullReference()));
    438439        } else if (!g_strcmp0(methodName, "GetChildren")) {
    439440            GVariantBuilder builder = G_VARIANT_BUILDER_INIT(G_VARIANT_TYPE("a(so)"));
     
    485486    RELEASE_ASSERT(!isMainThread());
    486487    if (m_path.isNull()) {
    487         auto* atspiRoot = root();
    488         RELEASE_ASSERT(atspiRoot);
    489488        m_isRegistered.store(true);
    490489
     
    514513        if (m_interfaces.contains(Interface::TableCell))
    515514            interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_table_cell_interface), &s_tableCellFunctions });
    516         m_path = atspiRoot->atspi().registerObject(*this, WTFMove(interfaces));
     515        m_path = m_root.atspi().registerObject(*this, WTFMove(interfaces));
    517516    }
    518517
     
    523522{
    524523    RELEASE_ASSERT(!isMainThread());
    525     return g_variant_new("(so)", root()->atspi().uniqueName(), path().utf8().data());
     524    return g_variant_new("(so)", m_root.atspi().uniqueName(), path().utf8().data());
    526525}
    527526
     
    531530    if (m_hyperlinkPath.isNull()) {
    532531        path();
    533         m_hyperlinkPath = root()->atspi().registerHyperlink(*this, { { const_cast<GDBusInterfaceInfo*>(&webkit_hyperlink_interface), &s_hyperlinkFunctions } });
    534     }
    535 
    536     return g_variant_new("(so)", root()->atspi().uniqueName(), m_hyperlinkPath.utf8().data());
    537 }
    538 
    539 void AccessibilityObjectAtspi::setRoot(AccessibilityRootAtspi* root)
    540 {
    541     Locker locker { m_rootLock };
    542     m_root = root;
    543 }
    544 
    545 AccessibilityRootAtspi* AccessibilityObjectAtspi::root() const
    546 {
    547     Locker locker { m_rootLock };
    548     return m_root;
     532        m_hyperlinkPath = m_root.atspi().registerHyperlink(*this, { { const_cast<GDBusInterfaceInfo*>(&webkit_hyperlink_interface), &s_hyperlinkFunctions } });
     533    }
     534
     535    return g_variant_new("(so)", m_root.atspi().uniqueName(), m_hyperlinkPath.utf8().data());
    549536}
    550537
     
    570557        return nullptr;
    571558
    572     if (auto* atspiParent = axParent->wrapper()) {
    573         atspiParent->setRoot(root());
     559    if (auto* atspiParent = axParent->wrapper())
    574560        return atspiParent;
    575     }
    576561
    577562    return std::nullopt;
     
    582567    auto parentAtspi = parent();
    583568    if (!parentAtspi)
    584         return root()->atspi().nullReference();
     569        return m_root.atspi().nullReference();
    585570
    586571    if (!parentAtspi.value())
    587         return root()->reference();
     572        return m_root.reference();
    588573
    589574    return parentAtspi.value()->reference();
     
    609594        return nullptr;
    610595
    611     auto* wrapper = children[index]->wrapper();
    612     wrapper->setRoot(root());
    613     return wrapper;
     596    return children[index]->wrapper();
    614597}
    615598
     
    618601    Vector<RefPtr<AccessibilityObjectAtspi>> wrappers;
    619602    wrappers.reserveInitialCapacity(elements.size());
    620     auto* root = this->root();
    621603    for (const auto& element : elements) {
    622         if (auto* wrapper = element->wrapper()) {
    623             wrapper->setRoot(root);
     604        if (auto* wrapper = element->wrapper())
    624605            wrappers.uncheckedAppend(wrapper);
    625         }
    626606    }
    627607    return wrappers;
     
    11411121    for (const auto& it : relationMap) {
    11421122        GVariantBuilder arrayBuilder = G_VARIANT_BUILDER_INIT(G_VARIANT_TYPE("a(so)"));
    1143         for (const auto& atspiObject : it.value) {
    1144             atspiObject->setRoot(root());
     1123        for (const auto& atspiObject : it.value)
    11451124            g_variant_builder_add(&arrayBuilder, "@(so)", atspiObject->reference());
    1146         }
    11471125        g_variant_builder_add(builder, "(ua(so))", it.key, &arrayBuilder);
    11481126    }
     
    11811159{
    11821160    RELEASE_ASSERT(!isMainThread());
    1183     auto* atspiRoot = root();
    1184     g_variant_builder_add(builder, "(so)", atspiRoot->atspi().uniqueName(), m_path.utf8().data());
    1185     g_variant_builder_add(builder, "(so)", atspiRoot->parentUniqueName().utf8().data(), "/org/a11y/atspi/accessible/root");
     1161    g_variant_builder_add(builder, "(so)", m_root.atspi().uniqueName(), m_path.utf8().data());
     1162    g_variant_builder_add(builder, "(so)", m_root.parentUniqueName().utf8().data(), "/org/a11y/atspi/accessible/root");
    11861163    g_variant_builder_add(builder, "@(so)", parentReference());
    11871164
     
    12151192        if (!m_coreObject)
    12161193            return;
    1217         root()->atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added);
     1194        m_root.atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added);
    12181195    });
    12191196}
     
    12251202        return;
    12261203
    1227     root()->atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Removed);
     1204    m_root.atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Removed);
    12281205}
    12291206
     
    12341211        return;
    12351212
    1236     root()->atspi().stateChanged(*this, name, value);
     1213    m_root.atspi().stateChanged(*this, name, value);
    12371214}
    12381215
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h

    r286416 r286767  
    2525#include "IntRect.h"
    2626#include <wtf/Atomics.h>
    27 #include <wtf/Lock.h>
    2827#include <wtf/OptionSet.h>
    2928#include <wtf/ThreadSafeRefCounted.h>
     
    4039class AccessibilityObjectAtspi final : public ThreadSafeRefCounted<AccessibilityObjectAtspi> {
    4140public:
    42     static Ref<AccessibilityObjectAtspi> create(AXCoreObject*);
     41    static Ref<AccessibilityObjectAtspi> create(AXCoreObject*, AccessibilityRootAtspi&);
    4342    ~AccessibilityObjectAtspi() = default;
    4443
     
    5958    const OptionSet<Interface>& interfaces() const { return m_interfaces; }
    6059
    61     void setRoot(AccessibilityRootAtspi*);
    62     WEBCORE_EXPORT AccessibilityRootAtspi* root() const;
     60    const AccessibilityRootAtspi& root() const { return m_root; }
    6361    void setParent(std::optional<AccessibilityObjectAtspi*>);
    6462    WEBCORE_EXPORT std::optional<AccessibilityObjectAtspi*> parent() const;
     
    156154
    157155private:
    158     explicit AccessibilityObjectAtspi(AXCoreObject*);
     156    explicit AccessibilityObjectAtspi(AXCoreObject*, AccessibilityRootAtspi&);
    159157
    160158    Vector<RefPtr<AccessibilityObjectAtspi>> wrapperVector(const Vector<RefPtr<AXCoreObject>>&) const;
     
    237235    AXCoreObject* m_coreObject { nullptr };
    238236    OptionSet<Interface> m_interfaces;
    239     AccessibilityRootAtspi* m_root WTF_GUARDED_BY_LOCK(m_rootLock) { nullptr };
     237    AccessibilityRootAtspi& m_root;
    240238    std::optional<AccessibilityObjectAtspi*> m_parent;
    241239    Atomic<bool> m_isRegistered { false };
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp

    r284367 r286767  
    4848            g_variant_get(parameters, "(iiu)", &x, &y, &coordinateType);
    4949            auto* wrapper = atspiObject->hitTest({ x, y }, coordinateType);
    50             g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->reference() : atspiObject->root()->atspi().nullReference()));
     50            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->reference() : atspiObject->m_root.atspi().nullReference()));
    5151        } else if (!g_strcmp0(methodName, "GetExtents")) {
    5252            uint32_t coordinateType;
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp

    r286050 r286767  
    4040            int index;
    4141            g_variant_get(parameters, "(i)", &index);
    42             g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", !index ? atspiObject->reference() : atspiObject->root()->atspi().nullReference()));
     42            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", !index ? atspiObject->reference() : atspiObject->m_root.atspi().nullReference()));
    4343        } else if (!g_strcmp0(methodName, "GetURI")) {
    4444            int index;
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp

    r286055 r286767  
    4242            g_variant_get(parameters, "(i)", &index);
    4343            auto* wrapper = index >= 0 ? atspiObject->hyperlink(index) : nullptr;
    44             g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->hyperlinkReference() : atspiObject->root()->atspi().nullReference()));
     44            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->hyperlinkReference() : atspiObject->m_root.atspi().nullReference()));
    4545        } else if (!g_strcmp0(methodName, "GetLinkIndex")) {
    4646            int offset;
     
    103103                continue;
    104104
    105             if (static_cast<unsigned>(++linkIndex) == index) {
    106                 wrapper->setRoot(root());
     105            if (static_cast<unsigned>(++linkIndex) == index)
    107106                return wrapper;
    108             }
    109107        }
    110108
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp

    r286173 r286767  
    3838            g_variant_get(parameters, "(i)", &index);
    3939            auto* child = index >= 0 ? atspiObject->selectedChild(index) : nullptr;
    40             g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", child ? child->reference() : atspiObject->root()->atspi().nullReference()));
     40            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", child ? child->reference() : atspiObject->m_root.atspi().nullReference()));
    4141        } else if (!g_strcmp0(methodName, "SelectChild")) {
    4242            int index;
     
    111111    });
    112112
    113     if (wrapper)
    114         wrapper->setRoot(root());
    115 
    116113    return wrapper;
    117114}
     
    231228        return;
    232229
    233     root()->atspi().selectionChanged(*this);
     230    m_root.atspi().selectionChanged(*this);
    234231}
    235232
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableAtspi.cpp

    r286416 r286767  
    4343            g_variant_get(parameters, "(ii)", &row, &column);
    4444            auto* cell = row >= 0 && column >= 0 ? atspiObject->cell(row, column) : nullptr;
    45             g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", cell ? cell->reference() : atspiObject->root()->atspi().nullReference()));
     45            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", cell ? cell->reference() : atspiObject->m_root.atspi().nullReference()));
    4646        } else if (!g_strcmp0(methodName, "GetIndexAt")) {
    4747            int row, column;
     
    7676            g_variant_get(parameters, "(i)", &row);
    7777            auto* header = row >= 0 ? atspiObject->rowHeader(row) : nullptr;
    78             g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", header ? header->reference() : atspiObject->root()->atspi().nullReference()));
     78            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", header ? header->reference() : atspiObject->m_root.atspi().nullReference()));
    7979        } else if (!g_strcmp0(methodName, "GetColumnHeader")) {
    8080            int column;
    8181            g_variant_get(parameters, "(i)", &column);
    8282            auto* header = column >= 0 ? atspiObject->columnHeader(column) : nullptr;
    83             g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", header ? header->reference() : atspiObject->root()->atspi().nullReference()));
     83            g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", header ? header->reference() : atspiObject->m_root.atspi().nullReference()));
    8484        } else if (!g_strcmp0(methodName, "GetRowColumnExtentsAtIndex")) {
    8585            int index;
     
    119119        if (!g_strcmp0(propertyName, "Caption")) {
    120120            auto* caption = atspiObject->tableCaption();
    121             return caption ? caption->reference() : atspiObject->root()->atspi().nullReference();
     121            return caption ? caption->reference() : atspiObject->m_root.atspi().nullReference();
    122122        }
    123123        if (!g_strcmp0(propertyName, "Summary"))
    124             return atspiObject->root()->atspi().nullReference();
     124            return atspiObject->m_root.atspi().nullReference();
    125125        if (!g_strcmp0(propertyName, "NSelectedRows"))
    126126            return g_variant_new_int32(0);
     
    161161        return nullptr;
    162162
    163     if (auto* tableCell = m_axObject->cellForColumnAndRow(column, row)) {
    164         if (auto* wrapper = tableCell->wrapper()) {
    165             wrapper->setRoot(root());
    166             return wrapper;
    167         }
    168     }
     163    if (auto* tableCell = m_axObject->cellForColumnAndRow(column, row))
     164        return tableCell->wrapper();
    169165
    170166    return nullptr;
     
    186182            if (auto caption = downcast<HTMLTableElement>(*node).caption()) {
    187183                if (auto* renderer = caption->renderer()) {
    188                     if (auto* element = AccessibilityObject::firstAccessibleObjectFromNode(renderer->element())) {
    189                         if (auto* wrapper = element->wrapper()) {
    190                             wrapper->setRoot(root());
    191                             return wrapper;
    192                         }
    193                     }
     184                    if (auto* element = AccessibilityObject::firstAccessibleObjectFromNode(renderer->element()))
     185                        return element->wrapper();
    194186                }
    195187            }
     
    254246        auto range = header->rowIndexRange();
    255247        if (range.first <= row && row < range.first + range.second) {
    256             if (auto* wrapper = header->wrapper()) {
    257                 wrapper->setRoot(root());
     248            if (auto* wrapper = header->wrapper())
    258249                return wrapper;
    259             }
    260250        }
    261251    }
     
    274264        auto range = header->columnIndexRange();
    275265        if (range.first <= column && column < range.first + range.second) {
    276             if (auto* wrapper = header->wrapper()) {
    277                 wrapper->setRoot(root());
     266            if (auto* wrapper = header->wrapper())
    278267                return wrapper;
    279             }
    280268        }
    281269    }
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp

    r286416 r286767  
    6868            auto* axObject = atspiObject->m_axObject;
    6969            if (!axObject || !axObject->isTableCell())
    70                 return atspiObject->root()->atspi().nullReference();
     70                return atspiObject->m_root.atspi().nullReference();
    7171
    7272            AccessibilityObjectAtspi* wrapper = atspiObject.ptr();
     
    8181                    break;
    8282            }
    83             return wrapper ? wrapper->reference() : atspiObject->root()->atspi().nullReference();
     83            return wrapper ? wrapper->reference() : atspiObject->m_root.atspi().nullReference();
    8484        }
    8585
     
    103103        return { };
    104104
    105     auto headers = m_axObject->rowHeaders();
    106     Vector<RefPtr<AccessibilityObjectAtspi>> wrappers;
    107     wrappers.reserveInitialCapacity(headers.size());
    108     auto* root = this->root();
    109     for (const auto& header : headers) {
    110         if (auto* wrapper = header->wrapper()) {
    111             wrapper->setRoot(root);
    112             wrappers.uncheckedAppend(wrapper);
    113         }
    114     }
    115     return wrappers;
     105    return wrapperVector(m_axObject->rowHeaders());
    116106}
    117107
     
    126116        return { };
    127117
    128     auto headers = m_axObject->columnHeaders();
    129     Vector<RefPtr<AccessibilityObjectAtspi>> wrappers;
    130     wrappers.reserveInitialCapacity(headers.size());
    131     auto* root = this->root();
    132     for (const auto& header : headers) {
    133         if (auto* wrapper = header->wrapper()) {
    134             wrapper->setRoot(root);
    135             wrappers.uncheckedAppend(wrapper);
    136         }
    137     }
    138     return wrappers;
     118    return wrapperVector(m_axObject->columnHeaders());
    139119}
    140120
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp

    r286055 r286767  
    362362    auto utf8InsertedText = insertedText.utf8();
    363363    auto insertedTextLength = g_utf8_strlen(utf8InsertedText.data(), -1);
    364     root()->atspi().textChanged(*this, "insert", WTFMove(utf8InsertedText), offset - insertedTextLength, insertedTextLength);
     364    m_root.atspi().textChanged(*this, "insert", WTFMove(utf8InsertedText), offset - insertedTextLength, insertedTextLength);
    365365}
    366366
     
    381381    auto utf8DeletedText = deletedText.utf8();
    382382    auto deletedTextLength = g_utf8_strlen(utf8DeletedText.data(), -1);
    383     root()->atspi().textChanged(*this, "delete", WTFMove(utf8DeletedText), offset, deletedTextLength);
     383    m_root.atspi().textChanged(*this, "delete", WTFMove(utf8DeletedText), offset, deletedTextLength);
    384384}
    385385
     
    774774    auto caretOffset = UTF16OffsetToUTF8(mapping, bounds.y());
    775775    if (caretOffset <= length)
    776         root()->atspi().textCaretMoved(*this, caretOffset);
     776        m_root.atspi().textCaretMoved(*this, caretOffset);
    777777
    778778    if (selection.isRange())
    779         root()->atspi().textSelectionChanged(*this);
     779        m_root.atspi().textSelectionChanged(*this);
    780780}
    781781
     
    950950        return;
    951951
    952     root()->atspi().textAttributesChanged(*this);
     952    m_root.atspi().textAttributesChanged(*this);
    953953}
    954954
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectValueAtspi.cpp

    r285997 r286767  
    138138        return;
    139139
    140     root()->atspi().valueChanged(*this, value);
     140    m_root.atspi().valueChanged(*this, value);
    141141}
    142142
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp

    r285997 r286767  
    158158{
    159159    RELEASE_ASSERT(isMainThread());
     160    if (m_page)
     161        m_page->setAccessibilityRootObject(this);
     162
    160163    Vector<std::pair<GDBusInterfaceInfo*, GDBusInterfaceVTable*>> interfaces;
    161164    interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_accessible_interface), &s_accessibleFunctions });
     
    168171    RELEASE_ASSERT(isMainThread());
    169172    m_atspi.unregisterRoot(*this);
     173
     174    if (m_page)
     175        m_page->setAccessibilityRootObject(nullptr);
    170176}
    171177
     
    199205{
    200206    RELEASE_ASSERT(isMainThread());
    201     if (!AXObjectCache::accessibilityEnabled())
    202         AXObjectCache::enableAccessibility();
    203 
    204207    if (!m_page)
    205208        return nullptr;
     
    209212        return nullptr;
    210213
     214    AXObjectCache::enableAccessibility();
    211215    AXObjectCache* cache = frame.document()->axObjectCache();
    212216    if (!cache)
     
    214218
    215219    AXCoreObject* rootObject = cache->rootObject();
    216     if (!rootObject)
    217         return nullptr;
    218 
    219     auto* wrapper = rootObject->wrapper();
    220     if (!wrapper)
    221         return nullptr;
    222 
    223     wrapper->setRoot(const_cast<AccessibilityRootAtspi*>(this));
    224     wrapper->setParent(nullptr); // nullptr parent means root.
    225 
    226     return wrapper;
    227 }
    228 
    229 AccessibilityObjectAtspi* AccessibilityRootAtspi::focusedObject() const
    230 {
    231     RELEASE_ASSERT(isMainThread());
    232     if (!AXObjectCache::accessibilityEnabled())
    233         AXObjectCache::enableAccessibility();
    234 
    235     if (!m_page)
    236         return nullptr;
    237 
    238     auto* focusedDocument = m_page->focusController().focusedOrMainFrame().document();
    239     if (!focusedDocument)
    240         return nullptr;
    241 
    242     auto* cache = focusedDocument->axObjectCache();
    243     if (!cache)
    244         return nullptr;
    245 
    246     auto* focusedObject = cache->focusedObjectForPage(m_page.get());
    247     if (!focusedObject)
    248         return nullptr;
    249 
    250     auto* wrapper = focusedObject->wrapper();
    251     if (!wrapper)
    252         return nullptr;
    253 
    254     wrapper->setRoot(const_cast<AccessibilityRootAtspi*>(this));
    255 
    256     return wrapper;
     220    return rootObject ? rootObject->wrapper() : nullptr;
    257221}
    258222
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h

    r285996 r286767  
    5050    AccessibilityAtspi& atspi() const { return m_atspi; }
    5151    AccessibilityObjectAtspi* child() const;
    52     AccessibilityObjectAtspi* focusedObject() const;
    5352
    5453    void serialize(GVariantBuilder*) const;
  • trunk/Source/WebCore/page/Page.h

    r286455 r286767  
    9292}
    9393
     94class AccessibilityRootAtspi;
    9495class ApplePayAMSUIPaymentHandler;
    9596class ActivityStateChangeObserver;
     
    917918    ModelPlayerProvider& modelPlayerProvider();
    918919
     920#if ENABLE(ACCESSIBILITY) && USE(ATSPI)
     921    AccessibilityRootAtspi* accessibilityRootObject() const { return m_accessibilityRootObject; }
     922    void setAccessibilityRootObject(AccessibilityRootAtspi* rootObject) { m_accessibilityRootObject = rootObject; }
     923#endif
     924
    919925private:
    920926    struct Navigation {
     
    12641270    WeakHashMap<HTMLElement, CachedTextRecognitionResult> m_textRecognitionResults;
    12651271#endif
     1272
     1273#if ENABLE(ACCESSIBILITY) && USE(ATSPI)
     1274    AccessibilityRootAtspi* m_accessibilityRootObject { nullptr };
     1275#endif
    12661276};
    12671277
  • trunk/Source/WebKit/ChangeLog

    r286764 r286767  
     12021-12-09  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK][a11y] Ensure atspi wrappers have root set at construction time
     4        https://bugs.webkit.org/show_bug.cgi?id=233804
     5
     6        Reviewed by Joanmarie Diggs.
     7
     8        * WebProcess/InjectedBundle/API/c/WKBundlePage.cpp:
     9        (WKAccessibilityRootObject): Remove ATSPI specific code.
     10        (WKAccessibilityFocusedObject): Ditto.
     11        * WebProcess/WebPage/WebPage.h:
     12        (WebKit::WebPage::accessibilityRootObject const): Deleted.
     13
    1142021-12-08  Brady Eidson  <beidson@apple.com>
    215
  • trunk/Source/WebKit/WebProcess/InjectedBundle/API/c/WKBundlePage.cpp

    r285996 r286767  
    248248        return 0;
    249249
    250 #if USE(ATSPI)
    251     return WebKit::toImpl(pageRef)->accessibilityRootObject().child();
    252 #endif
    253 
    254250    WebCore::Page* page = WebKit::toImpl(pageRef)->corePage();
    255251    if (!page)
     
    278274    if (!pageRef)
    279275        return 0;
    280 
    281 #if USE(ATSPI)
    282     return WebKit::toImpl(pageRef)->accessibilityRootObject().focusedObject();
    283 #endif
    284276
    285277    WebCore::Page* page = WebKit::toImpl(pageRef)->corePage();
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.h

    r286762 r286767  
    14981498    void prepareToRunModalJavaScriptDialog();
    14991499
    1500 #if USE(ATSPI)
    1501     const WebCore::AccessibilityRootAtspi& accessibilityRootObject() const { return *m_accessibilityRootObject; }
    1502 #endif
    1503 
    15041500#if ENABLE(ARKIT_INLINE_PREVIEW)
    15051501    bool useARKitForModel() const { return m_useARKitForModel; };
  • trunk/Tools/ChangeLog

    r286764 r286767  
     12021-12-09  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK][a11y] Ensure atspi wrappers have root set at construction time
     4        https://bugs.webkit.org/show_bug.cgi?id=233804
     5
     6        Reviewed by Joanmarie Diggs.
     7
     8        * WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp:
     9        (WTR::AccessibilityController::axRunLoop):
     10
    1112021-12-08  Brady Eidson  <beidson@apple.com>
    212
  • trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp

    r285996 r286767  
    124124        auto* element = static_cast<WebCore::AccessibilityObjectAtspi*>(WKAccessibilityRootObject(page));
    125125        RELEASE_ASSERT(element);
    126         m_axRunLoop = &element->root()->atspi().runLoop();
     126        m_axRunLoop = &element->root().atspi().runLoop();
    127127    }
    128128
Note: See TracChangeset for help on using the changeset viewer.