MsaaXULMenuAccessible.cpp (2380B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #include "MsaaXULMenuAccessible.h" 7 #include "mozilla/dom/NameSpaceConstants.h" 8 #include "mozilla/dom/Element.h" 9 #include "mozilla/a11y/AccessibleWrap.h" 10 #include "LocalAccessible-inl.h" 11 #include "nsGkAtoms.h" 12 13 using namespace mozilla::a11y; 14 15 //////////////////////////////////////////////////////////////////////////////// 16 // MsaaXULMenuitemAccessible 17 //////////////////////////////////////////////////////////////////////////////// 18 19 STDMETHODIMP 20 MsaaXULMenuitemAccessible::get_accKeyboardShortcut( 21 /* [optional][in] */ VARIANT varChild, 22 /* [retval][out] */ BSTR __RPC_FAR* pszKeyboardShortcut) { 23 if (!pszKeyboardShortcut) return E_INVALIDARG; 24 *pszKeyboardShortcut = nullptr; 25 26 if (varChild.vt != VT_I4 || varChild.lVal != CHILDID_SELF) { 27 return MsaaAccessible::get_accKeyboardShortcut(varChild, 28 pszKeyboardShortcut); 29 } 30 31 LocalAccessible* acc = LocalAcc(); 32 if (!acc) { 33 return CO_E_OBJNOTCONNECTED; 34 } 35 36 KeyBinding keyBinding = acc->AccessKey(); 37 if (keyBinding.IsEmpty()) { 38 return S_FALSE; 39 } 40 41 nsAutoString shortcut; 42 keyBinding.ToString(shortcut); 43 44 *pszKeyboardShortcut = ::SysAllocStringLen(shortcut.get(), shortcut.Length()); 45 return *pszKeyboardShortcut ? S_OK : E_OUTOFMEMORY; 46 } 47 48 STDMETHODIMP 49 MsaaXULMenuitemAccessible::get_accName( 50 /* [optional][in] */ VARIANT varChild, 51 /* [retval][out] */ BSTR __RPC_FAR* pszName) { 52 if (varChild.vt != VT_I4 || varChild.lVal != CHILDID_SELF) { 53 return MsaaAccessible::get_accName(varChild, pszName); 54 } 55 if (!pszName) { 56 return E_INVALIDARG; 57 } 58 LocalAccessible* acc = LocalAcc(); 59 if (!acc) { 60 return CO_E_OBJNOTCONNECTED; 61 } 62 63 *pszName = nullptr; 64 nsAutoString name; 65 acc->Name(name); 66 if (name.IsVoid()) { 67 return S_FALSE; 68 } 69 70 nsAutoString accel; 71 if (dom::Element* el = acc->Elm()) { 72 el->GetAttr(nsGkAtoms::acceltext, accel); 73 } 74 if (!accel.IsEmpty()) { 75 name += u"\t"_ns + accel; 76 } 77 78 *pszName = ::SysAllocStringLen(name.get(), name.Length()); 79 if (!*pszName) { 80 return E_OUTOFMEMORY; 81 } 82 return S_OK; 83 }