diff --git a/accessible/basetypes/Accessible.h b/accessible/basetypes/Accessible.h index dbd9d17ed489..789422b5b57f 100644 --- a/accessible/basetypes/Accessible.h +++ b/accessible/basetypes/Accessible.h @@ -168,6 +168,11 @@ class Accessible { */ virtual void Description(nsString& aDescription) const = 0; + /** + * Get the value of this accessible. + */ + virtual void Value(nsString& aValue) const = 0; + virtual double CurValue() const = 0; virtual double MinValue() const = 0; virtual double MaxValue() const = 0; diff --git a/accessible/generic/LocalAccessible.h b/accessible/generic/LocalAccessible.h index deb1cd8bb31b..c806530e55ce 100644 --- a/accessible/generic/LocalAccessible.h +++ b/accessible/generic/LocalAccessible.h @@ -137,7 +137,7 @@ class LocalAccessible : public nsISupports, public Accessible { /** * Get the value of this accessible. */ - virtual void Value(nsString& aValue) const; + virtual void Value(nsString& aValue) const override; /** * Get help string for the accessible. diff --git a/accessible/ipc/RemoteAccessibleBase.cpp b/accessible/ipc/RemoteAccessibleBase.cpp index 4be4bf6ce69b..959fd643308e 100644 --- a/accessible/ipc/RemoteAccessibleBase.cpp +++ b/accessible/ipc/RemoteAccessibleBase.cpp @@ -4,6 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "ARIAMap.h" #include "DocAccessible.h" #include "mozilla/a11y/DocAccessibleParent.h" #include "mozilla/a11y/DocManager.h" @@ -206,6 +207,47 @@ void RemoteAccessibleBase::Description(nsString& aDescription) const { } } +template +void RemoteAccessibleBase::Value(nsString& aValue) const { + if (mCachedFields) { + if (mCachedFields->HasAttribute(nsGkAtoms::aria_valuetext)) { + mCachedFields->GetAttribute(nsGkAtoms::aria_valuetext, aValue); + VERIFY_CACHE(CacheDomain::Value); + return; + } + + if (HasNumericValue()) { + double checkValue = CurValue(); + if (!IsNaN(checkValue)) { + aValue.AppendFloat(checkValue); + } + return; + } + + const nsRoleMapEntry* roleMapEntry = ARIARoleMap(); + // Value of textbox is a textified subtree. + if (roleMapEntry && roleMapEntry->Is(nsGkAtoms::textbox)) { + // XXX: nsTextEquivUtils::GetTextEquivFromSubtree(this, aValue); + return; + } + + if (IsCombobox()) { + Pivot p = Pivot(const_cast*>(this)); + PivotStateRule rule(states::ACTIVE); + Accessible* option = p.First(rule); + if (!option) { + option = + const_cast*>(this)->GetSelectedItem( + 0); + } + + if (option) { + option->Name(aValue); + } + } + } +} + template double RemoteAccessibleBase::CurValue() const { if (mCachedFields) { diff --git a/accessible/ipc/RemoteAccessibleBase.h b/accessible/ipc/RemoteAccessibleBase.h index fd60a0ec6236..2cd22f0e3a43 100644 --- a/accessible/ipc/RemoteAccessibleBase.h +++ b/accessible/ipc/RemoteAccessibleBase.h @@ -166,6 +166,7 @@ class RemoteAccessibleBase : public Accessible, public HyperTextAccessibleBase { virtual ENameValueFlag Name(nsString& aName) const override; virtual void Description(nsString& aDescription) const override; + virtual void Value(nsString& aValue) const override; virtual double CurValue() const override; virtual double MinValue() const override; diff --git a/accessible/ipc/RemoteAccessibleShared.h b/accessible/ipc/RemoteAccessibleShared.h index 75362c2389e0..4d4e7333f22b 100644 --- a/accessible/ipc/RemoteAccessibleShared.h +++ b/accessible/ipc/RemoteAccessibleShared.h @@ -31,7 +31,7 @@ ENameValueFlag Name(nsString& aName) const override; /* * Set aValue to the value of the proxied accessible. */ -void Value(nsString& aValue) const; +void Value(nsString& aValue) const override; /* * Set aHelp to the help string of the proxied accessible. diff --git a/accessible/ipc/other/RemoteAccessible.cpp b/accessible/ipc/other/RemoteAccessible.cpp index 810715b91806..6ae9c4deb536 100644 --- a/accessible/ipc/other/RemoteAccessible.cpp +++ b/accessible/ipc/other/RemoteAccessible.cpp @@ -46,6 +46,11 @@ ENameValueFlag RemoteAccessible::Name(nsString& aName) const { } void RemoteAccessible::Value(nsString& aValue) const { + if (StaticPrefs::accessibility_cache_enabled_AtStartup()) { + RemoteAccessibleBase::Value(aValue); + return; + } + Unused << mDoc->SendValue(mID, &aValue); } diff --git a/accessible/ipc/win/RemoteAccessible.cpp b/accessible/ipc/win/RemoteAccessible.cpp index b2f927b48cb5..a692be4e2657 100644 --- a/accessible/ipc/win/RemoteAccessible.cpp +++ b/accessible/ipc/win/RemoteAccessible.cpp @@ -151,6 +151,11 @@ ENameValueFlag RemoteAccessible::Name(nsString& aName) const { } void RemoteAccessible::Value(nsString& aValue) const { + if (StaticPrefs::accessibility_cache_enabled_AtStartup()) { + RemoteAccessibleBase::Value(aValue); + return; + } + aValue.Truncate(); RefPtr acc; if (!GetCOMInterface((void**)getter_AddRefs(acc))) { diff --git a/accessible/mac/mozAccessible.mm b/accessible/mac/mozAccessible.mm index 8e1ba175b954..8423085b159c 100644 --- a/accessible/mac/mozAccessible.mm +++ b/accessible/mac/mozAccessible.mm @@ -612,11 +612,7 @@ struct RoleDescrComparator { NS_OBJC_BEGIN_TRY_BLOCK_RETURN; nsAutoString value; - if (LocalAccessible* acc = mGeckoAccessible->AsLocal()) { - acc->Value(value); - } else { - mGeckoAccessible->AsRemote()->Value(value); - } + mGeckoAccessible->Value(value); return nsCocoaUtils::ToNSString(value); diff --git a/accessible/mac/mozHTMLAccessible.mm b/accessible/mac/mozHTMLAccessible.mm index f0c9c5576d61..5465f578a8a5 100644 --- a/accessible/mac/mozHTMLAccessible.mm +++ b/accessible/mac/mozHTMLAccessible.mm @@ -48,11 +48,7 @@ using namespace mozilla::a11y; - (NSURL*)moxURL { nsAutoString value; - if (LocalAccessible* acc = mGeckoAccessible->AsLocal()) { - acc->Value(value); - } else if (RemoteAccessible* proxy = mGeckoAccessible->AsRemote()) { - proxy->Value(value); - } + mGeckoAccessible->Value(value); NSString* urlString = value.IsEmpty() ? nil : nsCocoaUtils::ToNSString(value); if (!urlString) return nil; diff --git a/accessible/windows/msaa/MsaaAccessible.cpp b/accessible/windows/msaa/MsaaAccessible.cpp index 45306c523903..3a0f7ac37718 100644 --- a/accessible/windows/msaa/MsaaAccessible.cpp +++ b/accessible/windows/msaa/MsaaAccessible.cpp @@ -1005,12 +1005,9 @@ MsaaAccessible::get_accValue( if (accessible) { return accessible->get_accValue(kVarChildIdSelf, pszValue); } - if (mAcc->IsRemote()) { - return E_NOTIMPL; // XXX Not supported for RemoteAccessible yet. - } nsAutoString value; - LocalAcc()->Value(value); + Acc()->Value(value); // See bug 438784: need to expose URL on doc's value attribute. For this, // reverting part of fix for bug 425693 to make this MSAA method behave diff --git a/accessible/xpcom/xpcAccessible.cpp b/accessible/xpcom/xpcAccessible.cpp index cb1e519e9017..4e02d358df8c 100644 --- a/accessible/xpcom/xpcAccessible.cpp +++ b/accessible/xpcom/xpcAccessible.cpp @@ -282,11 +282,7 @@ xpcAccessible::GetValue(nsAString& aValue) { if (!IntlGeneric()) return NS_ERROR_FAILURE; nsAutoString value; - if (RemoteAccessible* proxy = IntlGeneric()->AsRemote()) { - proxy->Value(value); - } else { - Intl()->Value(value); - } + IntlGeneric()->Value(value); aValue.Assign(value);