Bug 1954896 - Use weak reference in RemoteAccessible::GetCachedARIAAttributes. r=Jamie,geckoview-reviewers,m_kato

Differential Revision: https://phabricator.services.mozilla.com/D242955
This commit is contained in:
Eitan Isaacson
2025-04-01 15:09:34 +00:00
parent e0bc79cb9d
commit 1e2e799eb5
4 changed files with 22 additions and 5 deletions

View File

@@ -182,6 +182,17 @@ class AccAttributes {
return nullptr; return nullptr;
} }
template <typename T>
const T* GetAttributeWeakPtr(nsAtom* aAttrName) const {
if (auto value = mData.Lookup(aAttrName)) {
if (value->is<RefPtr<T>>()) {
const T* ref = value->as<RefPtr<T>>();
return ref;
}
}
return nullptr;
}
template <typename T> template <typename T>
Maybe<T&> GetMutableAttribute(nsAtom* aAttrName) const { Maybe<T&> GetMutableAttribute(nsAtom* aAttrName) const {
static_assert(std::is_same_v<nsTArray<int32_t>, T> || static_assert(std::is_same_v<nsTArray<int32_t>, T> ||

View File

@@ -1544,10 +1544,10 @@ already_AddRefed<AccAttributes> RemoteAccessible::DefaultTextAttributes() {
return result.forget(); return result.forget();
} }
RefPtr<const AccAttributes> RemoteAccessible::GetCachedARIAAttributes() const { const AccAttributes* RemoteAccessible::GetCachedARIAAttributes() const {
ASSERT_DOMAINS_ACTIVE(CacheDomain::ARIA); ASSERT_DOMAINS_ACTIVE(CacheDomain::ARIA);
if (mCachedFields) { if (mCachedFields) {
auto attrs = mCachedFields->GetAttributeRefPtr<AccAttributes>( auto attrs = mCachedFields->GetAttributeWeakPtr<AccAttributes>(
CacheKey::ARIAAttributes); CacheKey::ARIAAttributes);
VERIFY_CACHE(CacheDomain::ARIA); VERIFY_CACHE(CacheDomain::ARIA);
return attrs; return attrs;
@@ -1845,7 +1845,7 @@ void RemoteAccessible::LiveRegionAttributes(nsAString* aLive,
if (!mCachedFields) { if (!mCachedFields) {
return; return;
} }
RefPtr<const AccAttributes> attrs = GetCachedARIAAttributes(); auto attrs = GetCachedARIAAttributes();
if (!attrs) { if (!attrs) {
return; return;
} }
@@ -2329,7 +2329,7 @@ Maybe<int32_t> RemoteAccessible::GetIntARIAAttr(nsAtom* aAttrName) const {
if (RequestDomainsIfInactive(CacheDomain::ARIA)) { if (RequestDomainsIfInactive(CacheDomain::ARIA)) {
return Nothing(); return Nothing();
} }
if (RefPtr<const AccAttributes> attrs = GetCachedARIAAttributes()) { if (auto attrs = GetCachedARIAAttributes()) {
if (auto val = attrs->GetAttribute<int32_t>(aAttrName)) { if (auto val = attrs->GetAttribute<int32_t>(aAttrName)) {
return val; return val;
} }

View File

@@ -354,7 +354,7 @@ class RemoteAccessible : public Accessible, public HyperTextAccessibleBase {
Maybe<const nsTArray<int32_t>&> GetCachedTextLines(); Maybe<const nsTArray<int32_t>&> GetCachedTextLines();
nsRect GetCachedCharRect(int32_t aOffset); nsRect GetCachedCharRect(int32_t aOffset);
RefPtr<const AccAttributes> GetCachedTextAttributes(); RefPtr<const AccAttributes> GetCachedTextAttributes();
RefPtr<const AccAttributes> GetCachedARIAAttributes() const; const AccAttributes* GetCachedARIAAttributes() const;
nsString GetCachedHTMLNameAttribute() const; nsString GetCachedHTMLNameAttribute() const;

View File

@@ -1109,6 +1109,12 @@ class AccessibilityTest : BaseSessionTest() {
loadTestPage("test-live-region") loadTestPage("test-live-region")
waitForInitialFocus() waitForInitialFocus()
val rootNode = createNodeInfo(View.NO_ID)
assertThat("Document has 1 child", rootNode.childCount, equalTo(1))
val liveRegion = createNodeInfo(rootNode.getChildId(0))
assertThat("First node is a label", liveRegion.viewIdResourceName.toString(), equalTo("to_change"))
mainSession.evaluateJS("document.querySelector('#to_change').textContent = 'Hello';") mainSession.evaluateJS("document.querySelector('#to_change').textContent = 'Hello';")
sessionRule.waitUntilCalled(object : EventDelegate { sessionRule.waitUntilCalled(object : EventDelegate {
@AssertCalled(count = 1) @AssertCalled(count = 1)