/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Aaron Leventhal (aaronl@netscape.com) * Kyle Yuan (kyle.yuan@sun.com) * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "nsHTMLTextAccessible.h" #include "nsAccessibleTreeWalker.h" #include "nsIAccessibleDocument.h" #include "nsIAccessibleEvent.h" #include "nsIFrame.h" #include "nsPresContext.h" #include "nsIPresShell.h" #include "nsISelection.h" #include "nsISelectionController.h" #include "nsComponentManagerUtils.h" nsHTMLTextAccessible::nsHTMLTextAccessible(nsIDOMNode* aDomNode, nsIWeakReference* aShell): nsTextAccessibleWrap(aDomNode, aShell) { } NS_IMETHODIMP nsHTMLTextAccessible::GetName(nsAString& aName) { aName.Truncate(); return AppendTextTo(aName, 0, PR_UINT32_MAX); } NS_IMETHODIMP nsHTMLTextAccessible::GetRole(PRUint32 *aRole) { nsIFrame *frame = GetFrame(); // Don't return on null frame -- we still return a role // after accessible is shutdown/DEFUNCT if (frame && frame->IsGeneratedContentFrame()) { *aRole = nsIAccessibleRole::ROLE_STATICTEXT; return NS_OK; } return nsTextAccessible::GetRole(aRole); } NS_IMETHODIMP nsHTMLTextAccessible::GetState(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsTextAccessible::GetState(aState, aExtraState); NS_ENSURE_SUCCESS(rv, rv); if (!mDOMNode) return NS_OK; nsCOMPtr docAccessible = do_QueryInterface(nsCOMPtr(GetDocAccessible())); if (docAccessible) { PRUint32 state, extState; docAccessible->GetFinalState(&state, &extState); if (0 == (extState & nsIAccessibleStates::EXT_STATE_EDITABLE)) { *aState |= nsIAccessibleStates::STATE_READONLY; // Links not focusable in editor } } return NS_OK; } nsresult nsHTMLTextAccessible::GetAttributesInternal(nsIPersistentProperties *aAttributes) { if (!mDOMNode) { return NS_ERROR_FAILURE; // Node already shut down } PRUint32 role; GetRole(&role); if (role == nsIAccessibleRole::ROLE_STATICTEXT) { nsAutoString oldValueUnused; aAttributes->SetStringProperty(NS_LITERAL_CSTRING("static"), NS_LITERAL_STRING("true"), oldValueUnused); } return NS_OK; } nsHTMLHRAccessible::nsHTMLHRAccessible(nsIDOMNode* aDomNode, nsIWeakReference* aShell): nsLeafAccessible(aDomNode, aShell) { } NS_IMETHODIMP nsHTMLHRAccessible::GetRole(PRUint32 *aRole) { *aRole = nsIAccessibleRole::ROLE_SEPARATOR; return NS_OK; } nsHTMLBRAccessible::nsHTMLBRAccessible(nsIDOMNode* aDomNode, nsIWeakReference* aShell): nsLeafAccessible(aDomNode, aShell) { } NS_IMETHODIMP nsHTMLBRAccessible::GetRole(PRUint32 *aRole) { *aRole = nsIAccessibleRole::ROLE_WHITESPACE; return NS_OK; } NS_IMETHODIMP nsHTMLBRAccessible::GetState(PRUint32 *aState, PRUint32 *aExtraState) { *aState = nsIAccessibleStates::STATE_READONLY; if (aExtraState) { *aExtraState = mDOMNode ? 0 : nsIAccessibleStates::EXT_STATE_DEFUNCT; } return NS_OK; } NS_IMETHODIMP nsHTMLBRAccessible::GetName(nsAString& aName) { aName = static_cast('\n'); // Newline char return NS_OK; } // A label is an element (not a leaf) and thus can support advanced interfaces. // We need to skip over nsTextAccessible QI which prevents that NS_IMPL_ISUPPORTS_INHERITED0(nsHTMLLabelAccessible, nsLinkableAccessible) nsHTMLLabelAccessible::nsHTMLLabelAccessible(nsIDOMNode* aDomNode, nsIWeakReference* aShell): nsTextAccessible(aDomNode, aShell) { } NS_IMETHODIMP nsHTMLLabelAccessible::GetName(nsAString& aReturn) { nsresult rv = NS_ERROR_FAILURE; nsCOMPtr content(do_QueryInterface(mDOMNode)); nsAutoString name; if (content) rv = AppendFlatStringFromSubtree(content, &name); if (NS_SUCCEEDED(rv)) { // Temp var needed until CompressWhitespace built for nsAString name.CompressWhitespace(); aReturn = name; } return rv; } NS_IMETHODIMP nsHTMLLabelAccessible::GetRole(PRUint32 *aRole) { *aRole = nsIAccessibleRole::ROLE_LABEL; return NS_OK; } NS_IMETHODIMP nsHTMLLabelAccessible::GetState(PRUint32 *aState, PRUint32 *aExtraState) { nsresult rv = nsTextAccessible::GetState(aState, aExtraState); NS_ENSURE_SUCCESS(rv, rv); if (mDOMNode) { *aState &= (nsIAccessibleStates::STATE_LINKED | nsIAccessibleStates::STATE_TRAVERSED); // Only use link states } return NS_OK; } NS_IMETHODIMP nsHTMLLabelAccessible::GetFirstChild(nsIAccessible **aFirstChild) { // A