mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-16 23:05:42 +00:00
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:
parent
935107258c
commit
d06ad7cd3c
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user