diff --git a/accessible/base/AccAttributes.h b/accessible/base/AccAttributes.h index bc9ce71ad0ed..88c79bfa229d 100644 --- a/accessible/base/AccAttributes.h +++ b/accessible/base/AccAttributes.h @@ -182,6 +182,17 @@ class AccAttributes { return nullptr; } + template + const T* GetAttributeWeakPtr(nsAtom* aAttrName) const { + if (auto value = mData.Lookup(aAttrName)) { + if (value->is>()) { + const T* ref = value->as>(); + return ref; + } + } + return nullptr; + } + template Maybe GetMutableAttribute(nsAtom* aAttrName) const { static_assert(std::is_same_v, T> || diff --git a/accessible/ipc/RemoteAccessible.cpp b/accessible/ipc/RemoteAccessible.cpp index af58db6c3251..09eec6ae74ab 100644 --- a/accessible/ipc/RemoteAccessible.cpp +++ b/accessible/ipc/RemoteAccessible.cpp @@ -1544,10 +1544,10 @@ already_AddRefed RemoteAccessible::DefaultTextAttributes() { return result.forget(); } -RefPtr RemoteAccessible::GetCachedARIAAttributes() const { +const AccAttributes* RemoteAccessible::GetCachedARIAAttributes() const { ASSERT_DOMAINS_ACTIVE(CacheDomain::ARIA); if (mCachedFields) { - auto attrs = mCachedFields->GetAttributeRefPtr( + auto attrs = mCachedFields->GetAttributeWeakPtr( CacheKey::ARIAAttributes); VERIFY_CACHE(CacheDomain::ARIA); return attrs; @@ -1845,7 +1845,7 @@ void RemoteAccessible::LiveRegionAttributes(nsAString* aLive, if (!mCachedFields) { return; } - RefPtr attrs = GetCachedARIAAttributes(); + auto attrs = GetCachedARIAAttributes(); if (!attrs) { return; } @@ -2329,7 +2329,7 @@ Maybe RemoteAccessible::GetIntARIAAttr(nsAtom* aAttrName) const { if (RequestDomainsIfInactive(CacheDomain::ARIA)) { return Nothing(); } - if (RefPtr attrs = GetCachedARIAAttributes()) { + if (auto attrs = GetCachedARIAAttributes()) { if (auto val = attrs->GetAttribute(aAttrName)) { return val; } diff --git a/accessible/ipc/RemoteAccessible.h b/accessible/ipc/RemoteAccessible.h index 2623869ce0f9..17392a84c9ac 100644 --- a/accessible/ipc/RemoteAccessible.h +++ b/accessible/ipc/RemoteAccessible.h @@ -354,7 +354,7 @@ class RemoteAccessible : public Accessible, public HyperTextAccessibleBase { Maybe&> GetCachedTextLines(); nsRect GetCachedCharRect(int32_t aOffset); RefPtr GetCachedTextAttributes(); - RefPtr GetCachedARIAAttributes() const; + const AccAttributes* GetCachedARIAAttributes() const; nsString GetCachedHTMLNameAttribute() const; diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AccessibilityTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AccessibilityTest.kt index d0f71842dca3..a821783cf9a9 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AccessibilityTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AccessibilityTest.kt @@ -1109,6 +1109,12 @@ class AccessibilityTest : BaseSessionTest() { loadTestPage("test-live-region") 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';") sessionRule.waitUntilCalled(object : EventDelegate { @AssertCalled(count = 1)