static gunichar
getCharacterAtOffsetCB(AtkText* aText, gint aOffset)
{
  AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText));
  if (!accWrap)
    return 0;

  HyperTextAccessible* text = accWrap->AsHyperText();
  if (!text || !text->IsTextRole())
    return 0;

  // PRUnichar is unsigned short in Mozilla
  // gnuichar is guint32 in glib
  PRUnichar uniChar = 0;
  nsresult rv = text->GetCharacterAtOffset(aOffset, &uniChar);
  if (NS_FAILED(rv))
    return 0;

  // Convert char to "*" when it's "password text".
  if (accWrap->NativeRole() == roles::PASSWORD_TEXT)
    uniChar = '*';

  return static_cast<gunichar>(uniChar);
}