Relation XULGroupboxAccessible::RelationByType(RelationType aType) { Relation rel = AccessibleWrap::RelationByType(aType); if (aType != RelationType::LABELLED_BY) return rel; // The label for xul:groupbox is generated from xul:label that is // inside the anonymous content of the xul:caption. // The xul:label has an accessible object but the xul:caption does not uint32_t childCount = ChildCount(); for (uint32_t childIdx = 0; childIdx < childCount; childIdx++) { Accessible* childAcc = GetChildAt(childIdx); if (childAcc->Role() == roles::LABEL) { // Ensure that it's our label Relation reverseRel = childAcc->RelationByType(RelationType::LABEL_FOR); Accessible* testGroupbox = nullptr; while ((testGroupbox = reverseRel.Next())) if (testGroupbox == this) { // The <label> points back to this groupbox rel.AppendTarget(childAcc); } } } return rel; }
bool DocAccessibleChild::RecvRelationByType(const uint64_t& aID, const uint32_t& aType, nsTArray<uint64_t>* aTargets) { Accessible* acc = mDoc->GetAccessibleByUniqueID((void*)aID); if (!acc) return false; auto type = static_cast<RelationType>(aType); Relation rel = acc->RelationByType(type); while (Accessible* target = rel.Next()) aTargets->AppendElement(reinterpret_cast<uintptr_t>(target)); return true; }