Changeset 286767 in webkit
- Timestamp:
- Dec 9, 2021, 12:26:34 AM (4 years ago)
- Location:
- trunk
- Files:
-
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r286766 r286767 1 2021-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 1 68 2021-12-08 Myles C. Maxfield <mmaxfield@apple.com> 2 69 -
trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp
r286189 r286767 36 36 void AXObjectCache::attachWrapper(AXCoreObject* axObject) 37 37 { 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); 39 43 axObject->setWrapper(wrapper.ptr()); 40 44 41 45 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 } 44 51 45 52 auto* axParentWrapper = axParent->wrapper(); -
trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp
r286173 r286767 178 178 return; 179 179 180 child->setRoot(atspiObject->root());181 180 g_dbus_connection_emit_signal(m_connection.get(), nullptr, atspiObject->path().utf8().data(), "org.a11y.atspi.Event.Object", "ChildrenChanged", 182 181 g_variant_new("(siiv(so))", change == ChildrenChanged::Added ? "add" : "remove", child->indexInParentForChildrenChanged(change), -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp
r286416 r286767 38 38 namespace WebCore { 39 39 40 Ref<AccessibilityObjectAtspi> AccessibilityObjectAtspi::create(AXCoreObject* coreObject )41 { 42 return adoptRef(*new AccessibilityObjectAtspi(coreObject ));40 Ref<AccessibilityObjectAtspi> AccessibilityObjectAtspi::create(AXCoreObject* coreObject, AccessibilityRootAtspi& root) 41 { 42 return adoptRef(*new AccessibilityObjectAtspi(coreObject, root)); 43 43 } 44 44 … … 113 113 } 114 114 115 AccessibilityObjectAtspi::AccessibilityObjectAtspi(AXCoreObject* coreObject )115 AccessibilityObjectAtspi::AccessibilityObjectAtspi(AXCoreObject* coreObject, AccessibilityRootAtspi& root) 116 116 : m_coreObject(coreObject) 117 117 , m_interfaces(interfacesForObject(*m_coreObject)) 118 , m_root(root) 118 119 { 119 120 RELEASE_ASSERT(isMainThread()); … … 138 139 return; 139 140 140 root()->atspi().unregisterObject(*this);141 m_root.atspi().unregisterObject(*this); 141 142 } 142 143 … … 151 152 m_parent.value()->childRemoved(*this); 152 153 153 root()->atspi().unregisterObject(*this);154 m_root.atspi().unregisterObject(*this); 154 155 } 155 156 … … 430 431 g_dbus_method_invocation_return_value(invocation, g_variant_builder_end(&builder)); 431 432 } 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())); 433 434 else if (!g_strcmp0(methodName, "GetChildAtIndex")) { 434 435 int index; 435 436 g_variant_get(parameters, "(i)", &index); 436 437 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())); 438 439 } else if (!g_strcmp0(methodName, "GetChildren")) { 439 440 GVariantBuilder builder = G_VARIANT_BUILDER_INIT(G_VARIANT_TYPE("a(so)")); … … 485 486 RELEASE_ASSERT(!isMainThread()); 486 487 if (m_path.isNull()) { 487 auto* atspiRoot = root();488 RELEASE_ASSERT(atspiRoot);489 488 m_isRegistered.store(true); 490 489 … … 514 513 if (m_interfaces.contains(Interface::TableCell)) 515 514 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)); 517 516 } 518 517 … … 523 522 { 524 523 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()); 526 525 } 527 526 … … 531 530 if (m_hyperlinkPath.isNull()) { 532 531 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()); 549 536 } 550 537 … … 570 557 return nullptr; 571 558 572 if (auto* atspiParent = axParent->wrapper()) { 573 atspiParent->setRoot(root()); 559 if (auto* atspiParent = axParent->wrapper()) 574 560 return atspiParent; 575 }576 561 577 562 return std::nullopt; … … 582 567 auto parentAtspi = parent(); 583 568 if (!parentAtspi) 584 return root()->atspi().nullReference();569 return m_root.atspi().nullReference(); 585 570 586 571 if (!parentAtspi.value()) 587 return root()->reference();572 return m_root.reference(); 588 573 589 574 return parentAtspi.value()->reference(); … … 609 594 return nullptr; 610 595 611 auto* wrapper = children[index]->wrapper(); 612 wrapper->setRoot(root()); 613 return wrapper; 596 return children[index]->wrapper(); 614 597 } 615 598 … … 618 601 Vector<RefPtr<AccessibilityObjectAtspi>> wrappers; 619 602 wrappers.reserveInitialCapacity(elements.size()); 620 auto* root = this->root();621 603 for (const auto& element : elements) { 622 if (auto* wrapper = element->wrapper()) { 623 wrapper->setRoot(root); 604 if (auto* wrapper = element->wrapper()) 624 605 wrappers.uncheckedAppend(wrapper); 625 }626 606 } 627 607 return wrappers; … … 1141 1121 for (const auto& it : relationMap) { 1142 1122 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) 1145 1124 g_variant_builder_add(&arrayBuilder, "@(so)", atspiObject->reference()); 1146 }1147 1125 g_variant_builder_add(builder, "(ua(so))", it.key, &arrayBuilder); 1148 1126 } … … 1181 1159 { 1182 1160 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"); 1186 1163 g_variant_builder_add(builder, "@(so)", parentReference()); 1187 1164 … … 1215 1192 if (!m_coreObject) 1216 1193 return; 1217 root()->atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added);1194 m_root.atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added); 1218 1195 }); 1219 1196 } … … 1225 1202 return; 1226 1203 1227 root()->atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Removed);1204 m_root.atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Removed); 1228 1205 } 1229 1206 … … 1234 1211 return; 1235 1212 1236 root()->atspi().stateChanged(*this, name, value);1213 m_root.atspi().stateChanged(*this, name, value); 1237 1214 } 1238 1215 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h
r286416 r286767 25 25 #include "IntRect.h" 26 26 #include <wtf/Atomics.h> 27 #include <wtf/Lock.h>28 27 #include <wtf/OptionSet.h> 29 28 #include <wtf/ThreadSafeRefCounted.h> … … 40 39 class AccessibilityObjectAtspi final : public ThreadSafeRefCounted<AccessibilityObjectAtspi> { 41 40 public: 42 static Ref<AccessibilityObjectAtspi> create(AXCoreObject* );41 static Ref<AccessibilityObjectAtspi> create(AXCoreObject*, AccessibilityRootAtspi&); 43 42 ~AccessibilityObjectAtspi() = default; 44 43 … … 59 58 const OptionSet<Interface>& interfaces() const { return m_interfaces; } 60 59 61 void setRoot(AccessibilityRootAtspi*); 62 WEBCORE_EXPORT AccessibilityRootAtspi* root() const; 60 const AccessibilityRootAtspi& root() const { return m_root; } 63 61 void setParent(std::optional<AccessibilityObjectAtspi*>); 64 62 WEBCORE_EXPORT std::optional<AccessibilityObjectAtspi*> parent() const; … … 156 154 157 155 private: 158 explicit AccessibilityObjectAtspi(AXCoreObject* );156 explicit AccessibilityObjectAtspi(AXCoreObject*, AccessibilityRootAtspi&); 159 157 160 158 Vector<RefPtr<AccessibilityObjectAtspi>> wrapperVector(const Vector<RefPtr<AXCoreObject>>&) const; … … 237 235 AXCoreObject* m_coreObject { nullptr }; 238 236 OptionSet<Interface> m_interfaces; 239 AccessibilityRootAtspi * m_root WTF_GUARDED_BY_LOCK(m_rootLock) { nullptr };237 AccessibilityRootAtspi& m_root; 240 238 std::optional<AccessibilityObjectAtspi*> m_parent; 241 239 Atomic<bool> m_isRegistered { false }; -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp
r284367 r286767 48 48 g_variant_get(parameters, "(iiu)", &x, &y, &coordinateType); 49 49 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())); 51 51 } else if (!g_strcmp0(methodName, "GetExtents")) { 52 52 uint32_t coordinateType; -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp
r286050 r286767 40 40 int index; 41 41 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())); 43 43 } else if (!g_strcmp0(methodName, "GetURI")) { 44 44 int index; -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp
r286055 r286767 42 42 g_variant_get(parameters, "(i)", &index); 43 43 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())); 45 45 } else if (!g_strcmp0(methodName, "GetLinkIndex")) { 46 46 int offset; … … 103 103 continue; 104 104 105 if (static_cast<unsigned>(++linkIndex) == index) { 106 wrapper->setRoot(root()); 105 if (static_cast<unsigned>(++linkIndex) == index) 107 106 return wrapper; 108 }109 107 } 110 108 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp
r286173 r286767 38 38 g_variant_get(parameters, "(i)", &index); 39 39 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())); 41 41 } else if (!g_strcmp0(methodName, "SelectChild")) { 42 42 int index; … … 111 111 }); 112 112 113 if (wrapper)114 wrapper->setRoot(root());115 116 113 return wrapper; 117 114 } … … 231 228 return; 232 229 233 root()->atspi().selectionChanged(*this);230 m_root.atspi().selectionChanged(*this); 234 231 } 235 232 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableAtspi.cpp
r286416 r286767 43 43 g_variant_get(parameters, "(ii)", &row, &column); 44 44 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())); 46 46 } else if (!g_strcmp0(methodName, "GetIndexAt")) { 47 47 int row, column; … … 76 76 g_variant_get(parameters, "(i)", &row); 77 77 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())); 79 79 } else if (!g_strcmp0(methodName, "GetColumnHeader")) { 80 80 int column; 81 81 g_variant_get(parameters, "(i)", &column); 82 82 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())); 84 84 } else if (!g_strcmp0(methodName, "GetRowColumnExtentsAtIndex")) { 85 85 int index; … … 119 119 if (!g_strcmp0(propertyName, "Caption")) { 120 120 auto* caption = atspiObject->tableCaption(); 121 return caption ? caption->reference() : atspiObject-> root()->atspi().nullReference();121 return caption ? caption->reference() : atspiObject->m_root.atspi().nullReference(); 122 122 } 123 123 if (!g_strcmp0(propertyName, "Summary")) 124 return atspiObject-> root()->atspi().nullReference();124 return atspiObject->m_root.atspi().nullReference(); 125 125 if (!g_strcmp0(propertyName, "NSelectedRows")) 126 126 return g_variant_new_int32(0); … … 161 161 return nullptr; 162 162 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(); 169 165 170 166 return nullptr; … … 186 182 if (auto caption = downcast<HTMLTableElement>(*node).caption()) { 187 183 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(); 194 186 } 195 187 } … … 254 246 auto range = header->rowIndexRange(); 255 247 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()) 258 249 return wrapper; 259 }260 250 } 261 251 } … … 274 264 auto range = header->columnIndexRange(); 275 265 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()) 278 267 return wrapper; 279 }280 268 } 281 269 } -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp
r286416 r286767 68 68 auto* axObject = atspiObject->m_axObject; 69 69 if (!axObject || !axObject->isTableCell()) 70 return atspiObject-> root()->atspi().nullReference();70 return atspiObject->m_root.atspi().nullReference(); 71 71 72 72 AccessibilityObjectAtspi* wrapper = atspiObject.ptr(); … … 81 81 break; 82 82 } 83 return wrapper ? wrapper->reference() : atspiObject-> root()->atspi().nullReference();83 return wrapper ? wrapper->reference() : atspiObject->m_root.atspi().nullReference(); 84 84 } 85 85 … … 103 103 return { }; 104 104 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()); 116 106 } 117 107 … … 126 116 return { }; 127 117 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()); 139 119 } 140 120 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp
r286055 r286767 362 362 auto utf8InsertedText = insertedText.utf8(); 363 363 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); 365 365 } 366 366 … … 381 381 auto utf8DeletedText = deletedText.utf8(); 382 382 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); 384 384 } 385 385 … … 774 774 auto caretOffset = UTF16OffsetToUTF8(mapping, bounds.y()); 775 775 if (caretOffset <= length) 776 root()->atspi().textCaretMoved(*this, caretOffset);776 m_root.atspi().textCaretMoved(*this, caretOffset); 777 777 778 778 if (selection.isRange()) 779 root()->atspi().textSelectionChanged(*this);779 m_root.atspi().textSelectionChanged(*this); 780 780 } 781 781 … … 950 950 return; 951 951 952 root()->atspi().textAttributesChanged(*this);952 m_root.atspi().textAttributesChanged(*this); 953 953 } 954 954 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectValueAtspi.cpp
r285997 r286767 138 138 return; 139 139 140 root()->atspi().valueChanged(*this, value);140 m_root.atspi().valueChanged(*this, value); 141 141 } 142 142 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp
r285997 r286767 158 158 { 159 159 RELEASE_ASSERT(isMainThread()); 160 if (m_page) 161 m_page->setAccessibilityRootObject(this); 162 160 163 Vector<std::pair<GDBusInterfaceInfo*, GDBusInterfaceVTable*>> interfaces; 161 164 interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_accessible_interface), &s_accessibleFunctions }); … … 168 171 RELEASE_ASSERT(isMainThread()); 169 172 m_atspi.unregisterRoot(*this); 173 174 if (m_page) 175 m_page->setAccessibilityRootObject(nullptr); 170 176 } 171 177 … … 199 205 { 200 206 RELEASE_ASSERT(isMainThread()); 201 if (!AXObjectCache::accessibilityEnabled())202 AXObjectCache::enableAccessibility();203 204 207 if (!m_page) 205 208 return nullptr; … … 209 212 return nullptr; 210 213 214 AXObjectCache::enableAccessibility(); 211 215 AXObjectCache* cache = frame.document()->axObjectCache(); 212 216 if (!cache) … … 214 218 215 219 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; 257 221 } 258 222 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h
r285996 r286767 50 50 AccessibilityAtspi& atspi() const { return m_atspi; } 51 51 AccessibilityObjectAtspi* child() const; 52 AccessibilityObjectAtspi* focusedObject() const;53 52 54 53 void serialize(GVariantBuilder*) const; -
trunk/Source/WebCore/page/Page.h
r286455 r286767 92 92 } 93 93 94 class AccessibilityRootAtspi; 94 95 class ApplePayAMSUIPaymentHandler; 95 96 class ActivityStateChangeObserver; … … 917 918 ModelPlayerProvider& modelPlayerProvider(); 918 919 920 #if ENABLE(ACCESSIBILITY) && USE(ATSPI) 921 AccessibilityRootAtspi* accessibilityRootObject() const { return m_accessibilityRootObject; } 922 void setAccessibilityRootObject(AccessibilityRootAtspi* rootObject) { m_accessibilityRootObject = rootObject; } 923 #endif 924 919 925 private: 920 926 struct Navigation { … … 1264 1270 WeakHashMap<HTMLElement, CachedTextRecognitionResult> m_textRecognitionResults; 1265 1271 #endif 1272 1273 #if ENABLE(ACCESSIBILITY) && USE(ATSPI) 1274 AccessibilityRootAtspi* m_accessibilityRootObject { nullptr }; 1275 #endif 1266 1276 }; 1267 1277 -
trunk/Source/WebKit/ChangeLog
r286764 r286767 1 2021-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 1 14 2021-12-08 Brady Eidson <beidson@apple.com> 2 15 -
trunk/Source/WebKit/WebProcess/InjectedBundle/API/c/WKBundlePage.cpp
r285996 r286767 248 248 return 0; 249 249 250 #if USE(ATSPI)251 return WebKit::toImpl(pageRef)->accessibilityRootObject().child();252 #endif253 254 250 WebCore::Page* page = WebKit::toImpl(pageRef)->corePage(); 255 251 if (!page) … … 278 274 if (!pageRef) 279 275 return 0; 280 281 #if USE(ATSPI)282 return WebKit::toImpl(pageRef)->accessibilityRootObject().focusedObject();283 #endif284 276 285 277 WebCore::Page* page = WebKit::toImpl(pageRef)->corePage(); -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.h
r286762 r286767 1498 1498 void prepareToRunModalJavaScriptDialog(); 1499 1499 1500 #if USE(ATSPI)1501 const WebCore::AccessibilityRootAtspi& accessibilityRootObject() const { return *m_accessibilityRootObject; }1502 #endif1503 1504 1500 #if ENABLE(ARKIT_INLINE_PREVIEW) 1505 1501 bool useARKitForModel() const { return m_useARKitForModel; }; -
trunk/Tools/ChangeLog
r286764 r286767 1 2021-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 1 11 2021-12-08 Brady Eidson <beidson@apple.com> 2 12 -
trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp
r285996 r286767 124 124 auto* element = static_cast<WebCore::AccessibilityObjectAtspi*>(WKAccessibilityRootObject(page)); 125 125 RELEASE_ASSERT(element); 126 m_axRunLoop = &element->root() ->atspi().runLoop();126 m_axRunLoop = &element->root().atspi().runLoop(); 127 127 } 128 128
Note:
See TracChangeset
for help on using the changeset viewer.