mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 02:14:43 +00:00
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:
parent
65cbecf6ad
commit
c36ade2bea
@ -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) {
|
||||
|
@ -59,6 +59,8 @@ class MsaaAccessible : public ia2Accessible,
|
||||
*/
|
||||
static ITypeInfo* GetTI(LCID lcid);
|
||||
|
||||
static Accessible* GetAccessibleFrom(IUnknown* aUnknown);
|
||||
|
||||
DECL_IUNKNOWN
|
||||
|
||||
// IAccessible
|
||||
|
Loading…
Reference in New Issue
Block a user