Bug 1737944 - P6: Put AccGroupInfo getter/creator in Accessible. r=Jamie

Changed the methods a bit, instead of a HasDirty boolean method, I went
with a getter and a get-and-creator. This will lend better to remote
accessibles where we won't have a dirty flag.

Differential Revision: https://phabricator.services.mozilla.com/D134209
This commit is contained in:
Eitan Isaacson 2022-01-04 21:01:36 +00:00
parent 935107258c
commit d06ad7cd3c
4 changed files with 46 additions and 30 deletions

View File

@ -45,11 +45,11 @@ void AccGroupInfo::Update() {
if (BaseRole(siblingRole) != mRole) {
continue;
}
bool siblingHasGroupInfo =
sibling->mBits.groupInfo && !sibling->HasDirtyGroupInfo();
AccGroupInfo* siblingGroupInfo = sibling->GetGroupInfo();
// Skip invisible siblings.
// If the sibling has calculated group info, that means it's visible.
if (!siblingHasGroupInfo && sibling->State() & states::INVISIBLE) {
if (!siblingGroupInfo && sibling->State() & states::INVISIBLE) {
continue;
}
@ -68,10 +68,10 @@ void AccGroupInfo::Update() {
// If the previous item in the group has calculated group information then
// build group information for this item based on found one.
if (siblingHasGroupInfo) {
mPosInSet += sibling->mBits.groupInfo->mPosInSet;
mParent = sibling->mBits.groupInfo->mParent;
mSetSize = sibling->mBits.groupInfo->mSetSize;
if (siblingGroupInfo) {
mPosInSet += siblingGroupInfo->mPosInSet;
mParent = siblingGroupInfo->mParent;
mSetSize = siblingGroupInfo->mSetSize;
return;
}
@ -92,11 +92,10 @@ void AccGroupInfo::Update() {
if (BaseRole(siblingRole) != mRole) {
continue;
}
bool siblingHasGroupInfo =
sibling->mBits.groupInfo && !sibling->HasDirtyGroupInfo();
AccGroupInfo* siblingGroupInfo = sibling->GetGroupInfo();
// Skip invisible siblings.
// If the sibling has calculated group info, that means it's visible.
if (!siblingHasGroupInfo && sibling->State() & states::INVISIBLE) {
if (!siblingGroupInfo && sibling->State() & states::INVISIBLE) {
continue;
}
@ -109,9 +108,9 @@ void AccGroupInfo::Update() {
// If the next item in the group has calculated group information then
// build group information for this item based on found one.
if (siblingHasGroupInfo) {
mParent = sibling->mBits.groupInfo->mParent;
mSetSize = sibling->mBits.groupInfo->mSetSize;
if (siblingGroupInfo) {
mParent = siblingGroupInfo->mParent;
mSetSize = siblingGroupInfo->mSetSize;
return;
}
@ -183,7 +182,7 @@ LocalAccessible* AccGroupInfo::FirstItemOf(const LocalAccessible* aContainer) {
}
if (item) {
AccGroupInfo* itemGroupInfo = item->GetGroupInfo();
AccGroupInfo* itemGroupInfo = item->GetOrCreateGroupInfo();
if (itemGroupInfo && itemGroupInfo->ConceptualParent() == aContainer) {
return item;
}
@ -200,7 +199,7 @@ LocalAccessible* AccGroupInfo::FirstItemOf(const LocalAccessible* aContainer) {
containerRole == roles::OUTLINEITEM)) {
item = item->LocalFirstChild();
if (item) {
AccGroupInfo* itemGroupInfo = item->GetGroupInfo();
AccGroupInfo* itemGroupInfo = item->GetOrCreateGroupInfo();
if (itemGroupInfo && itemGroupInfo->ConceptualParent() == aContainer) {
return item;
}
@ -293,7 +292,7 @@ LocalAccessible* AccGroupInfo::NextItemTo(LocalAccessible* aItem) {
uint32_t childCount = parent->ChildCount();
for (uint32_t idx = aItem->IndexInParent() + 1; idx < childCount; idx++) {
LocalAccessible* nextItem = parent->LocalChildAt(idx);
AccGroupInfo* nextGroupInfo = nextItem->GetGroupInfo();
AccGroupInfo* nextGroupInfo = nextItem->GetOrCreateGroupInfo();
if (nextGroupInfo &&
nextGroupInfo->ConceptualParent() == groupInfo->ConceptualParent()) {
return nextItem;

View File

@ -19,6 +19,7 @@ namespace mozilla {
namespace a11y {
class AccAttributes;
class AccGroupInfo;
class HyperTextAccessibleBase;
class LocalAccessible;
class RemoteAccessible;
@ -300,6 +301,16 @@ class Accessible {
virtual void ARIAGroupPosition(int32_t* aLevel, int32_t* aSetSize,
int32_t* aPosInSet) const = 0;
/**
* Return group info if there is an up-to-date version.
*/
virtual AccGroupInfo* GetGroupInfo() const { return nullptr; }
/**
* Return group info or create and update.
*/
virtual AccGroupInfo* GetOrCreateGroupInfo() { return nullptr; }
/*
* Return calculated group level based on accessible hierarchy.
*
@ -320,6 +331,7 @@ class Accessible {
uint8_t mRoleMapEntryIndex;
friend class DocAccessibleChildBase;
friend class AccGroupInfo;
};
} // namespace a11y

View File

@ -2016,7 +2016,12 @@ Relation LocalAccessible::RelationByType(RelationType aType) const {
if (roleMapEntry && (roleMapEntry->role == roles::OUTLINEITEM ||
roleMapEntry->role == roles::LISTITEM ||
roleMapEntry->role == roles::ROW)) {
rel.AppendTarget(GetGroupInfo()->ConceptualParent());
LocalAccessible* parent = const_cast<LocalAccessible*>(this)
->GetOrCreateGroupInfo()
->ConceptualParent();
if (parent) {
rel.AppendTarget(parent);
}
}
// If this is an OOP iframe document, we can't support NODE_CHILD_OF
@ -3127,10 +3132,18 @@ uint32_t LocalAccessible::GetActionRule() const {
}
AccGroupInfo* LocalAccessible::GetGroupInfo() const {
if (mBits.groupInfo && !(mStateFlags & eGroupInfoDirty)) {
return mBits.groupInfo;
}
return nullptr;
}
AccGroupInfo* LocalAccessible::GetOrCreateGroupInfo() {
if (IsProxy()) MOZ_CRASH("This should never be called on proxy wrappers");
if (mBits.groupInfo) {
if (HasDirtyGroupInfo()) {
if (mStateFlags & eGroupInfoDirty) {
mBits.groupInfo->Update();
mStateFlags &= ~eGroupInfoDirty;
}
@ -3311,7 +3324,7 @@ already_AddRefed<AccAttributes> LocalAccessible::BundleFieldsForCache(
void LocalAccessible::GetPositionAndSizeInternal(int32_t* aPosInSet,
int32_t* aSetSize) {
AccGroupInfo* groupInfo = GetGroupInfo();
AccGroupInfo* groupInfo = GetOrCreateGroupInfo();
if (groupInfo) {
*aPosInSet = groupInfo->PosInSet();
*aSetSize = groupInfo->SetSize();

View File

@ -731,13 +731,6 @@ class LocalAccessible : public nsISupports, public Accessible {
return HasOwnContent() && !(mStateFlags & eNotNodeMapEntry);
}
/**
* Return true if the accessible's group info needs to be updated.
*/
inline bool HasDirtyGroupInfo() const {
return mStateFlags & eGroupInfoDirty;
}
/**
* Return true if the accessible has associated DOM content.
*/
@ -1024,10 +1017,9 @@ class LocalAccessible : public nsISupports, public Accessible {
*/
uint32_t GetActionRule() const;
/**
* Return group info.
*/
AccGroupInfo* GetGroupInfo() const;
virtual AccGroupInfo* GetGroupInfo() const override;
virtual AccGroupInfo* GetOrCreateGroupInfo() override;
virtual void ARIAGroupPosition(int32_t* aLevel, int32_t* aSetSize,
int32_t* aPosInSet) const override;