/** * Possible states: focused, focusable, unavailable(disabled), checked */ nsresult nsXULCheckboxAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { // Get focus and disable status from base class nsresult rv = nsFormControlAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); *aState |= nsIAccessibleStates::STATE_CHECKABLE; // Determine Checked state nsCOMPtr<nsIDOMXULCheckboxElement> xulCheckboxElement = do_QueryInterface(mContent); if (xulCheckboxElement) { PRBool checked = PR_FALSE; xulCheckboxElement->GetChecked(&checked); if (checked) { *aState |= nsIAccessibleStates::STATE_CHECKED; PRInt32 checkState = 0; xulCheckboxElement->GetCheckState(&checkState); if (checkState == nsIDOMXULCheckboxElement::CHECKSTATE_MIXED) *aState |= nsIAccessibleStates::STATE_MIXED; } } return NS_OK; }
nsresult nsXULComboboxAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { // As a nsComboboxAccessible we can have the following states: // STATE_FOCUSED // STATE_FOCUSABLE // STATE_HASPOPUP // STATE_EXPANDED // STATE_COLLAPSED // Get focus status from base class nsresult rv = nsAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); nsCOMPtr<nsIDOMXULMenuListElement> menuList(do_QueryInterface(mDOMNode)); if (menuList) { PRBool isOpen; menuList->GetOpen(&isOpen); if (isOpen) { *aState |= nsIAccessibleStates::STATE_EXPANDED; } else { *aState |= nsIAccessibleStates::STATE_COLLAPSED; } } *aState |= nsIAccessibleStates::STATE_HASPOPUP | nsIAccessibleStates::STATE_FOCUSABLE; return NS_OK; }
nsresult nsXULColorPickerTileAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { // Possible states: focused, focusable, selected. // get focus and disable status from base class nsresult rv = nsAccessibleWrap::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); *aState |= nsIAccessibleStates::STATE_FOCUSABLE; // Focused? PRBool isFocused = mContent->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::hover); if (isFocused) *aState |= nsIAccessibleStates::STATE_FOCUSED; PRBool isSelected = mContent->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::selected); if (isSelected) *aState |= nsIAccessibleStates::STATE_SELECTED; return NS_OK; }
/** * As a nsHTMLComboboxButtonAccessible we can have the following states: * STATE_PRESSED * STATE_FOCUSED * STATE_FOCUSABLE * STATE_INVISIBLE */ nsresult nsHTMLComboboxButtonAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { // Get focus status from base class nsresult rv = nsAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); nsIFrame *boundsFrame = GetBoundsFrame(); nsIComboboxControlFrame* comboFrame = nsnull; if (boundsFrame) boundsFrame->QueryInterface(NS_GET_IID(nsIComboboxControlFrame), (void**)&comboFrame); if (!comboFrame) { *aState |= nsIAccessibleStates::STATE_INVISIBLE; } else { *aState |= nsIAccessibleStates::STATE_FOCUSABLE; if (comboFrame->IsDroppedDown()) { *aState |= nsIAccessibleStates::STATE_PRESSED; } } return NS_OK; }
nsresult nsXULTreeAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { // Get focus status from base class. nsresult rv = nsAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); // readonly state *aState |= nsIAccessibleStates::STATE_READONLY; // remove focusable and focused states since tree items are focusable for AT *aState &= ~nsIAccessibleStates::STATE_FOCUSABLE; *aState &= ~nsIAccessibleStates::STATE_FOCUSED; // multiselectable state. nsCOMPtr<nsITreeSelection> selection; mTreeView->GetSelection(getter_AddRefs(selection)); NS_ENSURE_STATE(selection); PRBool isSingle = PR_FALSE; rv = selection->GetSingle(&isSingle); NS_ENSURE_SUCCESS(rv, rv); if (!isSingle) *aState |= nsIAccessibleStates::STATE_MULTISELECTABLE; return NS_OK; }
/** * As a nsHTMLSelectListAccessible we can have the following states: * nsIAccessibleStates::STATE_MULTISELECTABLE * nsIAccessibleStates::STATE_EXTSELECTABLE */ nsresult nsHTMLSelectListAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsHTMLSelectableAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); nsCOMPtr<nsIDOMHTMLSelectElement> select (do_QueryInterface(mDOMNode)); if (select) { if (*aState & nsIAccessibleStates::STATE_FOCUSED) { // Treat first focusable option node as actual focus, in order // to avoid confusing JAWS, which needs focus on the option nsCOMPtr<nsIDOMNode> focusedOption; nsHTMLSelectOptionAccessible::GetFocusedOptionNode(mDOMNode, getter_AddRefs(focusedOption)); if (focusedOption) { // Clear focused state since it is on option *aState &= ~nsIAccessibleStates::STATE_FOCUSED; } } PRBool multiple; select->GetMultiple(&multiple); if ( multiple ) *aState |= nsIAccessibleStates::STATE_MULTISELECTABLE | nsIAccessibleStates::STATE_EXTSELECTABLE; } return NS_OK; }
nsresult nsHTMLCheckboxAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsFormControlAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); *aState |= nsIAccessibleStates::STATE_CHECKABLE; PRBool state = PR_FALSE; // Radio buttons and check boxes can be checked or mixed nsCOMPtr<nsIDOMHTMLInputElement> htmlCheckboxElement = do_QueryInterface(mContent); if (htmlCheckboxElement) { htmlCheckboxElement->GetIndeterminate(&state); if (state) { *aState |= nsIAccessibleStates::STATE_MIXED; } else { // indeterminate can't be checked at the same time. htmlCheckboxElement->GetChecked(&state); if (state) *aState |= nsIAccessibleStates::STATE_CHECKED; } } return NS_OK; }
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 nsXULTabAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { // Possible states: focused, focusable, unavailable(disabled), offscreen. // get focus and disable status from base class nsresult rv = nsAccessibleWrap::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); // In the past, tabs have been focusable in classic theme // They may be again in the future // Check style for -moz-user-focus: normal to see if it's focusable *aState &= ~nsIAccessibleStates::STATE_FOCUSABLE; nsIFrame *frame = mContent->GetPrimaryFrame(); if (frame) { const nsStyleUserInterface* ui = frame->GetStyleUserInterface(); if (ui->mUserFocus == NS_STYLE_USER_FOCUS_NORMAL) *aState |= nsIAccessibleStates::STATE_FOCUSABLE; } // Check whether the tab is selected *aState |= nsIAccessibleStates::STATE_SELECTABLE; *aState &= ~nsIAccessibleStates::STATE_SELECTED; nsCOMPtr<nsIDOMXULSelectControlItemElement> tab(do_QueryInterface(mContent)); if (tab) { PRBool selected = PR_FALSE; if (NS_SUCCEEDED(tab->GetSelected(&selected)) && selected) *aState |= nsIAccessibleStates::STATE_SELECTED; } return NS_OK; }
nsresult nsOuterDocAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); *aState &= ~nsIAccessibleStates::STATE_FOCUSABLE; return NS_OK; }
nsresult nsHTMLTableAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv= nsAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); *aState |= nsIAccessibleStates::STATE_READONLY; return NS_OK; }
nsresult nsXFormsSecretAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsXFormsInputAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); *aState |= nsIAccessibleStates::STATE_PROTECTED; return NS_OK; }
nsresult nsXULLinkAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsHyperTextAccessibleWrap::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); *aState |= nsIAccessibleStates::STATE_LINKED; return NS_OK; }
nsresult nsHTMLListBulletAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsLeafAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); *aState &= ~nsIAccessibleStates::STATE_FOCUSABLE; *aState |= nsIAccessibleStates::STATE_READONLY; return NS_OK; }
nsresult nsXULMenubarAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); // Menu bar iteself is not actually focusable *aState &= ~nsIAccessibleStates::STATE_FOCUSABLE; return rv; }
nsresult nsXULTextAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsHyperTextAccessibleWrap::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); // Labels and description have read only state // They are not focusable or selectable *aState |= nsIAccessibleStates::STATE_READONLY; return NS_OK; }
nsresult nsXFormsItemRadiogroupAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsXFormsSelectableItemAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); if (IsItemSelected()) *aState |= nsIAccessibleStates::STATE_CHECKED; return NS_OK; }
nsresult nsHTMLSelectOptGroupAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsHTMLSelectOptionAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); *aState &= ~(nsIAccessibleStates::STATE_FOCUSABLE | nsIAccessibleStates::STATE_SELECTABLE); return NS_OK; }
nsresult nsXULMenuSeparatorAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { // Isn't focusable, but can be offscreen/invisible -- only copy those states nsresult rv = nsXULMenuitemAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); *aState &= (nsIAccessibleStates::STATE_OFFSCREEN | nsIAccessibleStates::STATE_INVISIBLE); return NS_OK; }
nsresult nsHTMLButtonAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsHyperTextAccessibleWrap::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); if (mContent->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::type, nsAccessibilityAtoms::submit, eIgnoreCase)) *aState |= nsIAccessibleStates::STATE_DEFAULT; return NS_OK; }
nsresult nsXULRadioGroupAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); // The radio group is not focusable. Sometimes the focus controller will // report that it is focused. That means that the actual selected radio button // should be considered focused. *aState &= ~(nsIAccessibleStates::STATE_FOCUSABLE | nsIAccessibleStates::STATE_FOCUSED); return NS_OK; }
nsresult nsXULColorPickerAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { // Possible states: focused, focusable, unavailable(disabled). // get focus and disable status from base class nsresult rv = nsAccessibleWrap::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); *aState |= nsIAccessibleStates::STATE_FOCUSABLE | nsIAccessibleStates::STATE_HASPOPUP; return NS_OK; }
nsresult nsXFormsRangeAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsXFormsAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); PRUint32 isInRange = nsIXFormsUtilityService::STATE_NOT_A_RANGE; rv = sXFormsService->IsInRange(mDOMNode, &isInRange); NS_ENSURE_SUCCESS(rv, rv); if (isInRange == nsIXFormsUtilityService::STATE_OUT_OF_RANGE) *aState |= nsIAccessibleStates::STATE_INVALID; return NS_OK; }
nsresult nsLinkableAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsHyperTextAccessibleWrap::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); if (mIsLink) { *aState |= nsIAccessibleStates::STATE_LINKED; nsCOMPtr<nsIAccessible> actionAcc = GetActionAccessible(); if (nsAccUtils::State(actionAcc) & nsIAccessibleStates::STATE_TRAVERSED) *aState |= nsIAccessibleStates::STATE_TRAVERSED; } return NS_OK; }
nsresult nsXFormsInputBooleanAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsXFormsAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); nsAutoString value; rv = sXFormsService->GetValue(mDOMNode, value); NS_ENSURE_SUCCESS(rv, rv); if (value.EqualsLiteral("true")) *aState |= nsIAccessibleStates::STATE_CHECKED; return NS_OK; }
nsresult nsXULButtonAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { // Possible states: focused, focusable, unavailable(disabled). // get focus and disable status from base class nsresult rv = nsAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); PRBool disabled = PR_FALSE; nsCOMPtr<nsIDOMXULControlElement> xulFormElement(do_QueryInterface(mContent)); if (xulFormElement) { xulFormElement->GetDisabled(&disabled); if (disabled) *aState |= nsIAccessibleStates::STATE_UNAVAILABLE; else *aState |= nsIAccessibleStates::STATE_FOCUSABLE; } // Buttons can be checked -- they simply appear pressed in rather than checked nsCOMPtr<nsIDOMXULButtonElement> xulButtonElement(do_QueryInterface(mContent)); if (xulButtonElement) { nsAutoString type; xulButtonElement->GetType(type); if (type.EqualsLiteral("checkbox") || type.EqualsLiteral("radio")) { *aState |= nsIAccessibleStates::STATE_CHECKABLE; PRBool checked = PR_FALSE; PRInt32 checkState = 0; xulButtonElement->GetChecked(&checked); if (checked) { *aState |= nsIAccessibleStates::STATE_PRESSED; xulButtonElement->GetCheckState(&checkState); if (checkState == nsIDOMXULButtonElement::CHECKSTATE_MIXED) { *aState |= nsIAccessibleStates::STATE_MIXED; } } } } if (ContainsMenu()) *aState |= nsIAccessibleStates::STATE_HASPOPUP; if (mContent->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::_default)) *aState |= nsIAccessibleStates::STATE_DEFAULT; return NS_OK; }
nsresult nsHTMLTextAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsTextAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); nsDocAccessible *docAccessible = GetDocAccessible(); if (docAccessible) { PRUint32 state, extState; docAccessible->GetState(&state, &extState); if (0 == (extState & nsIAccessibleStates::EXT_STATE_EDITABLE)) { *aState |= nsIAccessibleStates::STATE_READONLY; // Links not focusable in editor } } return NS_OK; }
/** * As a nsHTMLComboboxListAccessible we can have the following states: * STATE_FOCUSED * STATE_FOCUSABLE * STATE_INVISIBLE * STATE_FLOATING */ nsresult nsHTMLComboboxListAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { // Get focus status from base class nsresult rv = nsAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); nsIFrame *boundsFrame = GetBoundsFrame(); nsIComboboxControlFrame* comboFrame = do_QueryFrame(boundsFrame); if (comboFrame && comboFrame->IsDroppedDown()) *aState |= nsIAccessibleStates::STATE_FLOATING; else *aState |= nsIAccessibleStates::STATE_INVISIBLE; return NS_OK; }
nsresult nsXFormsItemComboboxAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsXFormsSelectableItemAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); if (*aState & nsIAccessibleStates::STATE_UNAVAILABLE) return NS_OK; *aState |= nsIAccessibleStates::STATE_SELECTABLE; if (IsItemSelected()) *aState |= nsIAccessibleStates::STATE_SELECTED; return NS_OK; }
nsresult nsXFormsSelectAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsXFormsContainerAccessible::GetStateInternal(aState, aExtraState); NS_ENSURE_A11Y_SUCCESS(rv, rv); PRUint32 isInRange = nsIXFormsUtilityService::STATE_NOT_A_RANGE; nsCOMPtr<nsIDOMNode> DOMNode(do_QueryInterface(mContent)); rv = sXFormsService->IsInRange(DOMNode, &isInRange); NS_ENSURE_SUCCESS(rv, rv); if (isInRange == nsIXFormsUtilityService::STATE_OUT_OF_RANGE) *aState |= nsIAccessibleStates::STATE_INVALID; return NS_OK; }