nsresult RuleCache::ApplyFilter(Accessible* aAccessible, uint16_t* aResult) { *aResult = nsIAccessibleTraversalRule::FILTER_IGNORE; if (!mAcceptRoles) { nsresult rv = mRule->GetMatchRoles(&mAcceptRoles, &mAcceptRolesLength); NS_ENSURE_SUCCESS(rv, rv); rv = mRule->GetPreFilter(&mPreFilter); NS_ENSURE_SUCCESS(rv, rv); } if (mPreFilter) { uint64_t state = aAccessible->State(); if ((nsIAccessibleTraversalRule::PREFILTER_INVISIBLE & mPreFilter) && (state & states::INVISIBLE)) return NS_OK; if ((nsIAccessibleTraversalRule::PREFILTER_OFFSCREEN & mPreFilter) && (state & states::OFFSCREEN)) return NS_OK; if ((nsIAccessibleTraversalRule::PREFILTER_NOT_FOCUSABLE & mPreFilter) && !(state & states::FOCUSABLE)) return NS_OK; if (nsIAccessibleTraversalRule::PREFILTER_ARIA_HIDDEN & mPreFilter) { if (aAccessible->IsARIAHidden()) { *aResult |= nsIAccessibleTraversalRule::FILTER_IGNORE_SUBTREE; return NS_OK; } } if ((nsIAccessibleTraversalRule::PREFILTER_TRANSPARENT & mPreFilter) && !(state & states::OPAQUE1)) { nsIFrame* frame = aAccessible->GetFrame(); if (frame->StyleDisplay()->mOpacity == 0.0f) { *aResult |= nsIAccessibleTraversalRule::FILTER_IGNORE_SUBTREE; return NS_OK; } } } if (mAcceptRolesLength > 0) { uint32_t accessibleRole = aAccessible->Role(); bool matchesRole = false; for (uint32_t idx = 0; idx < mAcceptRolesLength; idx++) { matchesRole = mAcceptRoles[idx] == accessibleRole; if (matchesRole) break; } if (!matchesRole) return NS_OK; } return mRule->Match(ToXPC(aAccessible), aResult); }
nsresult RuleCache::ApplyFilter(Accessible* aAccessible, uint16_t* aResult) { *aResult = nsIAccessibleTraversalRule::FILTER_IGNORE; if (!mAcceptRoles) { nsresult rv = mRule->GetMatchRoles(&mAcceptRoles, &mAcceptRolesLength); NS_ENSURE_SUCCESS(rv, rv); rv = mRule->GetPreFilter(&mPreFilter); NS_ENSURE_SUCCESS(rv, rv); } if (mPreFilter) { uint64_t state = aAccessible->State(); if ((nsIAccessibleTraversalRule::PREFILTER_INVISIBLE & mPreFilter) && (state & states::INVISIBLE)) return NS_OK; if ((nsIAccessibleTraversalRule::PREFILTER_OFFSCREEN & mPreFilter) && (state & states::OFFSCREEN)) return NS_OK; if ((nsIAccessibleTraversalRule::PREFILTER_NOT_FOCUSABLE & mPreFilter) && !(state & states::FOCUSABLE)) return NS_OK; if (nsIAccessibleTraversalRule::PREFILTER_ARIA_HIDDEN & mPreFilter) { nsIContent* content = aAccessible->GetContent(); if (content && nsAccUtils::HasDefinedARIAToken(content, nsGkAtoms::aria_hidden) && !content->AttrValueIs(kNameSpaceID_None, nsGkAtoms::aria_hidden, nsGkAtoms::_false, eCaseMatters)) { *aResult |= nsIAccessibleTraversalRule::FILTER_IGNORE_SUBTREE; return NS_OK; } } } if (mAcceptRolesLength > 0) { uint32_t accessibleRole = aAccessible->Role(); bool matchesRole = false; for (uint32_t idx = 0; idx < mAcceptRolesLength; idx++) { matchesRole = mAcceptRoles[idx] == accessibleRole; if (matchesRole) break; } if (!matchesRole) return NS_OK; } return mRule->Match(aAccessible, aResult); }