tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }