Bug 1846660 part 3: Provide a way to safely get an Accessible from a COM pointer provided to us by a client. r=nlapre

IAccessibleTextSelectionContainer::setSelections passes us IAccessibleText COM pointers to identify the target Accessibles.
We need to safely get a Gecko Accessible from such a COM pointer.
The client could hand us anything, so it's not safe to just static_cast without being certain that it's one of our Accessibles.
Instead, we use an internal IID to validate that it's an MsaaAccessible and return the correct pointer, after which we can easily get the Accessible.

Differential Revision: https://phabricator.services.mozilla.com/D185134
This commit is contained in:
James Teh 2023-08-04 02:51:42 +00:00
parent 65cbecf6ad
commit c36ade2bea
2 changed files with 23 additions and 0 deletions

View File

@ -34,6 +34,15 @@ using namespace mozilla::a11y;
static const VARIANT kVarChildIdSelf = {{{VT_I4}}};
// Used internally to safely get an MsaaAccessible from a COM pointer provided
// to us by a client.
static const GUID IID_MsaaAccessible = {
/* a94aded3-1a9c-4afc-a32c-d6b5c010046b */
0xa94aded3,
0x1a9c,
0x4afc,
{0xa3, 0x2c, 0xd6, 0xb5, 0xc0, 0x10, 0x04, 0x6b}};
MsaaIdGenerator MsaaAccessible::sIDGen;
ITypeInfo* MsaaAccessible::gTypeInfo = nullptr;
@ -470,6 +479,16 @@ MsaaAccessible* MsaaAccessible::GetFrom(Accessible* aAcc) {
return static_cast<AccessibleWrap*>(aAcc)->GetMsaa();
}
/* static */
Accessible* MsaaAccessible::GetAccessibleFrom(IUnknown* aUnknown) {
RefPtr<MsaaAccessible> msaa;
aUnknown->QueryInterface(IID_MsaaAccessible, getter_AddRefs(msaa));
if (!msaa) {
return nullptr;
}
return msaa->Acc();
}
// IUnknown methods
STDMETHODIMP
MsaaAccessible::QueryInterface(REFIID iid, void** ppv) {
@ -489,6 +508,8 @@ MsaaAccessible::QueryInterface(REFIID iid, void** ppv) {
// even if the Accessible is dead.
if (IID_IUnknown == iid) {
*ppv = static_cast<IAccessible*>(this);
} else if (IID_MsaaAccessible == iid) {
*ppv = static_cast<MsaaAccessible*>(this);
} else if (IID_IDispatch == iid || IID_IAccessible == iid) {
*ppv = static_cast<IAccessible*>(this);
} else if (IID_IServiceProvider == iid) {

View File

@ -59,6 +59,8 @@ class MsaaAccessible : public ia2Accessible,
*/
static ITypeInfo* GetTI(LCID lcid);
static Accessible* GetAccessibleFrom(IUnknown* aUnknown);
DECL_IUNKNOWN
// IAccessible