static const gchar* getKeyBindingCB(AtkAction *aAction, gint aActionIndex) { AccessibleWrap* acc = GetAccessibleWrap(ATK_OBJECT(aAction)); if (!acc) return nullptr; // Return all key bindings including access key and keyboard shortcut. nsAutoString keyBindingsStr; // Get access key. KeyBinding keyBinding = acc->AccessKey(); if (!keyBinding.IsEmpty()) { keyBinding.AppendToString(keyBindingsStr, KeyBinding::eAtkFormat); Accessible* parent = acc->Parent(); roles::Role role = parent ? parent->Role() : roles::NOTHING; if (role == roles::PARENT_MENUITEM || role == roles::MENUITEM || role == roles::RADIO_MENU_ITEM || role == roles::CHECK_MENU_ITEM) { // It is submenu, expose keyboard shortcuts from menu hierarchy like // "s;<Alt>f:s" nsAutoString keysInHierarchyStr = keyBindingsStr; do { KeyBinding parentKeyBinding = parent->AccessKey(); if (!parentKeyBinding.IsEmpty()) { nsAutoString str; parentKeyBinding.ToString(str, KeyBinding::eAtkFormat); str.Append(':'); keysInHierarchyStr.Insert(str, 0); } } while ((parent = parent->Parent()) && parent->Role() != roles::MENUBAR); keyBindingsStr.Append(';'); keyBindingsStr.Append(keysInHierarchyStr); } } else { // No access key, add ';' to point this. keyBindingsStr.Append(';'); } // Get keyboard shortcut. keyBindingsStr.Append(';'); keyBinding = acc->KeyboardShortcut(); if (!keyBinding.IsEmpty()) { keyBinding.AppendToString(keyBindingsStr, KeyBinding::eAtkFormat); } return AccessibleWrap::ReturnString(keyBindingsStr); }