nsresult nsXULMenupopupAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); #ifdef DEBUG_A11Y // We are onscreen if our parent is active PRBool isActive = PR_FALSE; nsCOMPtr<nsIDOMElement> element(do_QueryInterface(mDOMNode)); element->HasAttribute(NS_LITERAL_STRING("menuactive"), &isActive); if (!isActive) { nsCOMPtr<nsIAccessible> parent(GetParent()); nsCOMPtr<nsIDOMNode> parentNode; nsCOMPtr<nsIAccessNode> accessNode(do_QueryInterface(parent)); if (accessNode) accessNode->GetDOMNode(getter_AddRefs(parentNode)); element = do_QueryInterface(parentNode); if (element) element->HasAttribute(NS_LITERAL_STRING("open"), &isActive); } NS_ASSERTION(isActive || *aState & nsIAccessibleStates::STATE_INVISIBLE, "XULMenupopup doesn't have STATE_INVISIBLE when it's inactive"); #endif if (*aState & nsIAccessibleStates::STATE_INVISIBLE) *aState |= (nsIAccessibleStates::STATE_OFFSCREEN | nsIAccessibleStates::STATE_COLLAPSED); return NS_OK; }
nsresult nsTextEquivUtils::GetNameFromSubtree(nsIAccessible *aAccessible, nsAString& aName) { aName.Truncate(); if (gInitiatorAcc) return NS_OK; gInitiatorAcc = aAccessible; PRUint32 role = nsAccUtils::Role(aAccessible); PRUint32 nameRule = gRoleToNameRulesMap[role]; if (nameRule == eFromSubtree) { nsCOMPtr<nsIAccessNode> accessNode(do_QueryInterface(aAccessible)); nsCOMPtr<nsIDOMNode> DOMNode; accessNode->GetDOMNode(getter_AddRefs(DOMNode)); nsCOMPtr<nsIContent> content(do_QueryInterface(DOMNode)); if (content) { nsAutoString name; AppendFromAccessibleChildren(aAccessible, &name); name.CompressWhitespace(); if (!IsWhitespaceString(name)) aName = name; } } gInitiatorAcc = nsnull; return NS_OK; }
nsresult nsTextEquivUtils::AppendFromAccessible(nsIAccessible *aAccessible, nsAString *aString) { nsCOMPtr<nsIAccessNode> accessNode(do_QueryInterface(aAccessible)); nsCOMPtr<nsIDOMNode> DOMNode; accessNode->GetDOMNode(getter_AddRefs(DOMNode)); nsCOMPtr<nsIContent> content(do_QueryInterface(DOMNode)); NS_ASSERTION(content, "There is no content!"); if (content) { nsresult rv = AppendTextEquivFromTextContent(content, aString); if (rv != NS_OK_NO_NAME_CLAUSE_HANDLED) return rv; } nsAutoString text; nsresult rv = aAccessible->GetName(text); NS_ENSURE_SUCCESS(rv, rv); PRBool isEmptyTextEquiv = PR_TRUE; // If the name is from tooltip then append it to result string in the end // (see h. step of name computation guide). if (rv != NS_OK_NAME_FROM_TOOLTIP) isEmptyTextEquiv = !AppendString(aString, text); // Implementation of f. step. rv = AppendFromValue(aAccessible, aString); NS_ENSURE_SUCCESS(rv, rv); if (rv != NS_OK_NO_NAME_CLAUSE_HANDLED) isEmptyTextEquiv = PR_FALSE; // Implementation of g) step of text equivalent computation guide. Go down // into subtree if accessible allows "text equivalent from subtree rule" or // it's not root and not control. if (isEmptyTextEquiv) { PRUint32 role = nsAccUtils::Role(aAccessible); PRUint32 nameRule = gRoleToNameRulesMap[role]; if (nameRule & eFromSubtreeIfRec) { rv = AppendFromAccessibleChildren(aAccessible, aString); NS_ENSURE_SUCCESS(rv, rv); if (rv != NS_OK_NO_NAME_CLAUSE_HANDLED) isEmptyTextEquiv = PR_FALSE; } } // Implementation of h. step if (isEmptyTextEquiv && !text.IsEmpty()) { AppendString(aString, text); return NS_OK; } return rv; }
NS_IMETHODIMP nsHTMLSelectOptionAccessible::DoAction(PRUint8 index) { if (index == eAction_Select) { // default action nsCOMPtr<nsIDOMHTMLOptionElement> newHTMLOption(do_QueryInterface(mDOMNode)); if (!newHTMLOption) return NS_ERROR_FAILURE; // Clear old selection nsCOMPtr<nsIDOMNode> oldHTMLOptionNode, selectNode; nsCOMPtr<nsIAccessible> parent(GetParent()); nsCOMPtr<nsIAccessNode> accessNode(do_QueryInterface(parent)); NS_ASSERTION(accessNode, "Unable to QI to nsIAccessNode"); accessNode->GetDOMNode(getter_AddRefs(selectNode)); GetFocusedOptionNode(selectNode, getter_AddRefs(oldHTMLOptionNode)); nsCOMPtr<nsIDOMHTMLOptionElement> oldHTMLOption(do_QueryInterface(oldHTMLOptionNode)); if (oldHTMLOption) oldHTMLOption->SetSelected(PR_FALSE); // Set new selection newHTMLOption->SetSelected(PR_TRUE); // If combo box, and open, close it // First, get the <select> widgets list control frame nsCOMPtr<nsIDOMNode> testSelectNode; nsCOMPtr<nsIDOMNode> thisNode(do_QueryInterface(mDOMNode)); do { thisNode->GetParentNode(getter_AddRefs(testSelectNode)); nsCOMPtr<nsIDOMHTMLSelectElement> selectControl(do_QueryInterface(testSelectNode)); if (selectControl) break; thisNode = testSelectNode; } while (testSelectNode); nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(mWeakShell)); nsCOMPtr<nsIContent> selectContent(do_QueryInterface(testSelectNode)); nsCOMPtr<nsIDOMHTMLOptionElement> option(do_QueryInterface(mDOMNode)); if (!testSelectNode || !selectContent || !presShell || !option) return NS_ERROR_FAILURE; nsIFrame *selectFrame = presShell->GetPrimaryFrameFor(selectContent); nsIComboboxControlFrame *comboBoxFrame = do_QueryFrame(selectFrame); if (comboBoxFrame) { nsIFrame *listFrame = comboBoxFrame->GetDropDown(); if (comboBoxFrame->IsDroppedDown() && listFrame) { // use this list control frame to roll up the list nsIListControlFrame *listControlFrame = do_QueryFrame(listFrame); if (listControlFrame) { PRInt32 newIndex = 0; option->GetIndex(&newIndex); listControlFrame->ComboboxFinish(newIndex); } } } return NS_OK; } return NS_ERROR_INVALID_ARG; }
NS_IMETHODIMP nsAccEvent::GetDOMNode(nsIDOMNode **aDOMNode) { NS_ENSURE_ARG_POINTER(aDOMNode); *aDOMNode = nsnull; if (!mDOMNode) { nsCOMPtr<nsIAccessNode> accessNode(do_QueryInterface(mAccessible)); NS_ENSURE_TRUE(accessNode, NS_ERROR_FAILURE); accessNode->GetDOMNode(getter_AddRefs(mDOMNode)); } NS_IF_ADDREF(*aDOMNode = mDOMNode); return NS_OK; }
nsresult nsTextEquivUtils::GetTextEquivFromIDRefs(nsIAccessible *aAccessible, nsIAtom *aIDRefsAttr, nsAString& aTextEquiv) { aTextEquiv.Truncate(); nsCOMPtr<nsIAccessNode> accessNode(do_QueryInterface(aAccessible)); nsCOMPtr<nsIDOMNode> DOMNode; accessNode->GetDOMNode(getter_AddRefs(DOMNode)); nsCOMPtr<nsIContent> content = nsCoreUtils::GetRoleContent(DOMNode); if (!content) return NS_OK; nsCOMPtr<nsIArray> refElms; nsCoreUtils::GetElementsByIDRefsAttr(content, aIDRefsAttr, getter_AddRefs(refElms)); if (!refElms) return NS_OK; PRUint32 count = 0; nsresult rv = refElms->GetLength(&count); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIContent> refContent; for (PRUint32 idx = 0; idx < count; idx++) { refContent = do_QueryElementAt(refElms, idx, &rv); NS_ENSURE_SUCCESS(rv, rv); if (!aTextEquiv.IsEmpty()) aTextEquiv += ' '; rv = AppendTextEquivFromContent(aAccessible, refContent, &aTextEquiv); NS_ENSURE_SUCCESS(rv, rv); } return NS_OK; }