Commit 16128a26 authored by surkov.alexander@gmail.com's avatar surkov.alexander@gmail.com
Browse files

Bug 378042 - expose group position for toolbarbuttons,...

Bug 378042 - expose group position for toolbarbuttons, patch=vasiliy.potapenko, r=me, aaronlev, sr=neil
parent 2fdd4870
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ interface nsIAccessibleProvider : nsISupports
  const long XULToolbar          = 0x00001029;
  const long XULToolbarSeparator = 0x00001030;
  const long XULTooltip          = 0x00001031;
  const long XULToolbarButton    = 0x00001032;


  /**
+3 −0
Original line number Diff line number Diff line
@@ -132,6 +132,9 @@ ACCESSIBILITY_ATOM(thead, "thead")
ACCESSIBILITY_ATOM(textarea, "textarea") // XForms
ACCESSIBILITY_ATOM(textbox, "textbox")   // XUL
ACCESSIBILITY_ATOM(toolbaritem, "toolbaritem")   // XUL
ACCESSIBILITY_ATOM(toolbarseparator, "toolbarseparator")   // XUL
ACCESSIBILITY_ATOM(toolbarspring, "toolbarspring")   // XUL
ACCESSIBILITY_ATOM(toolbarspacer, "toolbarspacer")   // XUL
ACCESSIBILITY_ATOM(tooltip, "tooltip")   // XUL
ACCESSIBILITY_ATOM(tr, "tr")
ACCESSIBILITY_ATOM(ul, "ul")
+3 −0
Original line number Diff line number Diff line
@@ -1642,6 +1642,9 @@ nsresult nsAccessibilityService::GetAccessibleByType(nsIDOMNode *aNode,
    case nsIAccessibleProvider::XULTooltip:
      *aAccessible = new nsXULTooltipAccessible(aNode, weakShell);
      break;
    case nsIAccessibleProvider::XULToolbarButton:
      *aAccessible = new nsXULToolbarButtonAccessible(aNode, weakShell);
      break;
#endif // MOZ_XUL

#ifndef DISABLE_XFORMS_HOOKS
+61 −0
Original line number Diff line number Diff line
@@ -642,6 +642,67 @@ NS_IMETHODIMP nsXULStatusBarAccessible::GetRole(PRUint32 *_retval)
  return NS_OK;
}

/**
  * XUL Toolbar Button
  */
nsXULToolbarButtonAccessible::nsXULToolbarButtonAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell):
nsXULButtonAccessible(aNode, aShell)
{
}

nsresult
nsXULToolbarButtonAccessible::GetAttributesInternal(nsIPersistentProperties *aAttributes)
{
  NS_ENSURE_ARG_POINTER(aAttributes);
  NS_ENSURE_TRUE(mDOMNode, NS_ERROR_FAILURE);

  nsresult rv = nsXULButtonAccessible::GetAttributesInternal(aAttributes);
  NS_ENSURE_SUCCESS(rv, rv);

  nsCOMPtr<nsIAccessible> parent(GetParent());
  PRInt32 setSize = 0;
  PRInt32 posInSet = 0;

  if (parent) {
    nsCOMPtr<nsIAccessible> sibling;
    nsCOMPtr<nsIAccessible> tempSibling;
    parent->GetFirstChild(getter_AddRefs(sibling));
    while (sibling) {
      if (IsSeparator(sibling)) { // end of a group of buttons
        if (posInSet)
          break; // we've found our group, so we're done
        setSize = 0; // not our group, so start a new group
      } else {
        setSize++; // another button in the group
        if (sibling == this)
          posInSet = setSize; // we've found our button
      }
      sibling->GetNextSibling(getter_AddRefs(tempSibling));
      sibling.swap(tempSibling);
    }
  }
  
  nsAccUtils::SetAccGroupAttrs(aAttributes, 0, posInSet, setSize);

  return NS_OK;
}

PRBool
nsXULToolbarButtonAccessible::IsSeparator(nsIAccessible *aAccessible)
{
  nsCOMPtr<nsIDOMNode> domNode;
  nsCOMPtr<nsIAccessNode> accessNode(do_QueryInterface(aAccessible));
  accessNode->GetDOMNode(getter_AddRefs(domNode));
  nsCOMPtr<nsIContent> contentDomNode(do_QueryInterface(domNode));

  if (!contentDomNode)
    return PR_FALSE;

  return (contentDomNode->Tag() == nsAccessibilityAtoms::toolbarseparator) ||
         (contentDomNode->Tag() == nsAccessibilityAtoms::toolbarspacer) ||
         (contentDomNode->Tag() == nsAccessibilityAtoms::toolbarspring);
}

/**
  * XUL ToolBar
  */
+8 −0
Original line number Diff line number Diff line
@@ -132,6 +132,14 @@ public:
  NS_IMETHOD GetRole(PRUint32 *aRole);
};

class nsXULToolbarButtonAccessible : public nsXULButtonAccessible
{
public:
  nsXULToolbarButtonAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell);
  virtual nsresult GetAttributesInternal(nsIPersistentProperties *aAttributes);
  static PRBool IsSeparator(nsIAccessible *aAccessible);
};

class nsXULToolbarAccessible : public nsAccessibleWrap
{
public:
Loading