2001-10-09 21:52:36 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
2004-04-17 21:52:36 +00:00
|
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
2001-10-09 21:52:36 +00:00
|
|
|
*
|
2004-04-17 21:52:36 +00:00
|
|
|
* 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/
|
2001-10-09 21:52:36 +00:00
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
2004-04-17 21:52:36 +00:00
|
|
|
* The Initial Developer of the Original Code is
|
2001-10-09 21:52:36 +00:00
|
|
|
* Netscape Communications Corporation.
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s):
|
2002-11-06 01:29:58 +00:00
|
|
|
* Aaron Leventhal (aaronl@netscape.com)
|
|
|
|
* Kyle Yuan (kyle.yuan@sun.com)
|
2001-10-09 21:52:36 +00:00
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
2004-04-17 21:52:36 +00:00
|
|
|
* 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"),
|
2001-10-09 21:52:36 +00:00
|
|
|
* 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
|
2004-04-17 21:52:36 +00:00
|
|
|
* use your version of this file under the terms of the MPL, indicate your
|
2001-10-09 21:52:36 +00:00
|
|
|
* 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
|
2004-04-17 21:52:36 +00:00
|
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
2001-10-09 21:52:36 +00:00
|
|
|
*
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
|
2003-04-15 08:45:55 +00:00
|
|
|
#include "nsXULFormControlAccessible.h"
|
2010-04-27 06:52:03 +00:00
|
|
|
|
2005-03-14 23:10:53 +00:00
|
|
|
#include "nsAccessibilityAtoms.h"
|
2010-04-27 06:52:03 +00:00
|
|
|
#include "nsAccUtils.h"
|
2010-02-21 00:55:04 +00:00
|
|
|
#include "nsAccTreeWalker.h"
|
2010-04-27 06:52:03 +00:00
|
|
|
#include "nsCoreUtils.h"
|
|
|
|
#include "nsRelUtils.h"
|
|
|
|
|
|
|
|
// NOTE: alphabetically ordered
|
|
|
|
#include "nsHTMLFormControlAccessible.h"
|
2007-02-09 02:03:08 +00:00
|
|
|
#include "nsXULMenuAccessible.h"
|
2004-06-02 04:06:28 +00:00
|
|
|
#include "nsIDOMHTMLInputElement.h"
|
2006-11-29 16:10:31 +00:00
|
|
|
#include "nsIDOMNSEditableElement.h"
|
2001-10-09 21:52:36 +00:00
|
|
|
#include "nsIDOMXULButtonElement.h"
|
|
|
|
#include "nsIDOMXULCheckboxElement.h"
|
2002-01-11 03:48:02 +00:00
|
|
|
#include "nsIDOMXULMenuListElement.h"
|
2001-11-07 00:12:16 +00:00
|
|
|
#include "nsIDOMXULSelectCntrlItemEl.h"
|
2004-06-02 05:32:45 +00:00
|
|
|
#include "nsIDOMXULTextboxElement.h"
|
2007-08-14 16:25:24 +00:00
|
|
|
#include "nsIEditor.h"
|
2006-07-12 13:14:53 +00:00
|
|
|
#include "nsIFrame.h"
|
2005-03-14 23:10:53 +00:00
|
|
|
#include "nsINameSpaceManager.h"
|
2006-07-12 13:14:53 +00:00
|
|
|
#include "nsITextControlFrame.h"
|
2001-10-09 21:52:36 +00:00
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULButtonAccessible
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2002-01-09 10:02:29 +00:00
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
nsXULButtonAccessible::
|
2010-06-11 08:23:18 +00:00
|
|
|
nsXULButtonAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsAccessibleWrap(aContent, aShell)
|
2009-11-10 05:58:52 +00:00
|
|
|
{
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULButtonAccessible: nsISupports
|
|
|
|
|
|
|
|
NS_IMPL_ISUPPORTS_INHERITED0(nsXULButtonAccessible, nsAccessible)
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULButtonAccessible: nsIAccessible
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULButtonAccessible::GetNumActions(PRUint8 *aCount)
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2009-11-10 05:58:52 +00:00
|
|
|
NS_ENSURE_ARG_POINTER(aCount);
|
|
|
|
|
|
|
|
*aCount = 1;
|
2006-07-12 13:14:53 +00:00
|
|
|
return NS_OK;
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULButtonAccessible::GetActionName(PRUint8 aIndex, nsAString& aName)
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2007-02-25 03:43:20 +00:00
|
|
|
if (aIndex == eAction_Click) {
|
|
|
|
aName.AssignLiteral("press");
|
2001-10-09 21:52:36 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULButtonAccessible::DoAction(PRUint8 aIndex)
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2010-01-25 15:09:25 +00:00
|
|
|
if (aIndex != 0)
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2010-01-25 15:09:25 +00:00
|
|
|
DoCommand();
|
|
|
|
return NS_OK;
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULButtonAccessible: nsAccessNode
|
|
|
|
|
2010-06-12 04:04:35 +00:00
|
|
|
PRBool
|
2009-11-10 05:58:52 +00:00
|
|
|
nsXULButtonAccessible::Init()
|
|
|
|
{
|
2010-06-12 04:04:35 +00:00
|
|
|
if (!nsAccessibleWrap::Init())
|
|
|
|
return PR_FALSE;
|
2009-11-10 05:58:52 +00:00
|
|
|
|
|
|
|
if (ContainsMenu())
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCoreUtils::GeneratePopupTree(mContent);
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2010-06-12 04:04:35 +00:00
|
|
|
return PR_TRUE;
|
2009-11-10 05:58:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULButtonAccessible: nsAccessible
|
|
|
|
|
2010-09-05 02:14:01 +00:00
|
|
|
PRUint32
|
|
|
|
nsXULButtonAccessible::NativeRole()
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2010-09-05 02:14:01 +00:00
|
|
|
return nsIAccessibleRole::ROLE_PUSHBUTTON;
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2008-11-04 03:37:46 +00:00
|
|
|
nsresult
|
|
|
|
nsXULButtonAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState)
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2009-11-10 05:58:52 +00:00
|
|
|
// Possible states: focused, focusable, unavailable(disabled).
|
|
|
|
|
2001-11-07 00:12:16 +00:00
|
|
|
// get focus and disable status from base class
|
2008-11-04 03:37:46 +00:00
|
|
|
nsresult rv = nsAccessible::GetStateInternal(aState, aExtraState);
|
2008-11-27 04:04:05 +00:00
|
|
|
NS_ENSURE_A11Y_SUCCESS(rv, rv);
|
2002-01-09 10:02:29 +00:00
|
|
|
|
|
|
|
PRBool disabled = PR_FALSE;
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIDOMXULControlElement> xulFormElement(do_QueryInterface(mContent));
|
2002-01-09 10:02:29 +00:00
|
|
|
if (xulFormElement) {
|
|
|
|
xulFormElement->GetDisabled(&disabled);
|
|
|
|
if (disabled)
|
2007-03-15 14:18:33 +00:00
|
|
|
*aState |= nsIAccessibleStates::STATE_UNAVAILABLE;
|
2002-01-09 10:02:29 +00:00
|
|
|
else
|
2007-03-15 14:18:33 +00:00
|
|
|
*aState |= nsIAccessibleStates::STATE_FOCUSABLE;
|
2002-01-09 10:02:29 +00:00
|
|
|
}
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
|
|
|
|
// Buttons can be checked -- they simply appear pressed in rather than checked
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIDOMXULButtonElement> xulButtonElement(do_QueryInterface(mContent));
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
if (xulButtonElement) {
|
2007-05-06 14:50:03 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
if (ContainsMenu())
|
|
|
|
*aState |= nsIAccessibleStates::STATE_HASPOPUP;
|
2005-04-02 01:00:20 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
if (mContent->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::_default))
|
2009-11-10 05:58:52 +00:00
|
|
|
*aState |= nsIAccessibleStates::STATE_DEFAULT;
|
2002-03-10 05:14:24 +00:00
|
|
|
|
2001-10-09 21:52:36 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULButtonAccessible: nsAccessible protected
|
|
|
|
|
|
|
|
void
|
|
|
|
nsXULButtonAccessible::CacheChildren()
|
2002-01-09 10:02:29 +00:00
|
|
|
{
|
2009-11-10 05:58:52 +00:00
|
|
|
// In general XUL button has not accessible children. Nevertheless menu
|
|
|
|
// buttons can have button (@type="menu-button") and popup accessibles
|
|
|
|
// (@type="menu-button" or @type="menu").
|
|
|
|
|
2009-12-10 19:12:19 +00:00
|
|
|
// XXX: no children until the button is menu button. Probably it's not
|
|
|
|
// totally correct but in general AT wants to have leaf buttons.
|
2010-06-11 08:23:18 +00:00
|
|
|
PRBool isMenu = mContent->AttrValueIs(kNameSpaceID_None,
|
2009-12-10 19:12:19 +00:00
|
|
|
nsAccessibilityAtoms::type,
|
|
|
|
nsAccessibilityAtoms::menu,
|
|
|
|
eCaseMatters);
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2009-12-10 19:12:19 +00:00
|
|
|
PRBool isMenuButton = isMenu ?
|
|
|
|
PR_FALSE :
|
2010-06-11 08:23:18 +00:00
|
|
|
mContent->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::type,
|
|
|
|
nsAccessibilityAtoms::menuButton, eCaseMatters);
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2009-12-10 19:12:19 +00:00
|
|
|
if (!isMenu && !isMenuButton)
|
|
|
|
return;
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2010-02-21 00:56:35 +00:00
|
|
|
nsRefPtr<nsAccessible> menupopupAccessible;
|
|
|
|
nsRefPtr<nsAccessible> buttonAccessible;
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsAccTreeWalker walker(mWeakShell, mContent, PR_TRUE);
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2010-02-21 00:56:35 +00:00
|
|
|
nsRefPtr<nsAccessible> child;
|
2010-02-21 00:55:04 +00:00
|
|
|
while ((child = walker.GetNextChild())) {
|
|
|
|
PRUint32 role = nsAccUtils::Role(child);
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2009-12-10 19:12:19 +00:00
|
|
|
if (role == nsIAccessibleRole::ROLE_MENUPOPUP) {
|
|
|
|
// Get an accessbile for menupopup or panel elements.
|
2010-02-21 00:56:35 +00:00
|
|
|
menupopupAccessible.swap(child);
|
2009-11-19 16:35:38 +00:00
|
|
|
|
2009-12-10 19:12:19 +00:00
|
|
|
} else if (isMenuButton && role == nsIAccessibleRole::ROLE_PUSHBUTTON) {
|
|
|
|
// Button type="menu-button" contains a real button. Get an accessible
|
|
|
|
// for it. Ignore dropmarker button what is placed as a last child.
|
2010-02-21 00:56:35 +00:00
|
|
|
buttonAccessible.swap(child);
|
2009-12-10 19:12:19 +00:00
|
|
|
break;
|
2004-06-25 20:27:29 +00:00
|
|
|
}
|
2009-12-10 19:12:19 +00:00
|
|
|
}
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2009-12-10 19:12:19 +00:00
|
|
|
if (!menupopupAccessible)
|
|
|
|
return;
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2010-07-02 01:22:41 +00:00
|
|
|
AppendChild(menupopupAccessible);
|
|
|
|
if (buttonAccessible)
|
|
|
|
AppendChild(buttonAccessible);
|
2002-01-09 10:02:29 +00:00
|
|
|
}
|
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULButtonAccessible protected
|
|
|
|
|
|
|
|
PRBool
|
|
|
|
nsXULButtonAccessible::ContainsMenu()
|
|
|
|
{
|
|
|
|
static nsIContent::AttrValuesArray strings[] =
|
|
|
|
{&nsAccessibilityAtoms::menu, &nsAccessibilityAtoms::menuButton, nsnull};
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
return mContent->FindAttrValueIn(kNameSpaceID_None,
|
|
|
|
nsAccessibilityAtoms::type,
|
|
|
|
strings, eCaseMatters) >= 0;
|
2009-11-10 05:58:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULDropmarkerAccessible
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2002-01-09 10:02:29 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsXULDropmarkerAccessible::
|
|
|
|
nsXULDropmarkerAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsFormControlAccessible(aContent, aShell)
|
|
|
|
{
|
2002-01-09 10:02:29 +00:00
|
|
|
}
|
|
|
|
|
2003-07-31 08:09:39 +00:00
|
|
|
NS_IMETHODIMP nsXULDropmarkerAccessible::GetNumActions(PRUint8 *aResult)
|
2002-01-09 10:02:29 +00:00
|
|
|
{
|
2006-07-31 04:31:13 +00:00
|
|
|
*aResult = 1;
|
2006-07-12 13:14:53 +00:00
|
|
|
return NS_OK;
|
2002-01-09 10:02:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
PRBool nsXULDropmarkerAccessible::DropmarkerOpen(PRBool aToggleOpen)
|
|
|
|
{
|
|
|
|
PRBool isOpen = PR_FALSE;
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIDOMXULButtonElement> parentButtonElement =
|
|
|
|
do_QueryInterface(mContent->GetParent());
|
2002-01-09 10:02:29 +00:00
|
|
|
|
|
|
|
if (parentButtonElement) {
|
|
|
|
parentButtonElement->GetOpen(&isOpen);
|
|
|
|
if (aToggleOpen)
|
|
|
|
parentButtonElement->SetOpen(!isOpen);
|
|
|
|
}
|
2002-01-11 03:48:02 +00:00
|
|
|
else {
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIDOMXULMenuListElement> parentMenuListElement =
|
|
|
|
do_QueryInterface(parentButtonElement);
|
2002-01-11 03:48:02 +00:00
|
|
|
if (parentMenuListElement) {
|
|
|
|
parentMenuListElement->GetOpen(&isOpen);
|
|
|
|
if (aToggleOpen)
|
|
|
|
parentMenuListElement->SetOpen(!isOpen);
|
|
|
|
}
|
|
|
|
}
|
2002-01-09 10:02:29 +00:00
|
|
|
|
|
|
|
return isOpen;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return the name of our only action
|
|
|
|
*/
|
2007-02-25 03:43:20 +00:00
|
|
|
NS_IMETHODIMP nsXULDropmarkerAccessible::GetActionName(PRUint8 aIndex, nsAString& aName)
|
2002-01-09 10:02:29 +00:00
|
|
|
{
|
2007-02-25 03:43:20 +00:00
|
|
|
if (aIndex == eAction_Click) {
|
2002-01-09 10:02:29 +00:00
|
|
|
if (DropmarkerOpen(PR_FALSE))
|
2007-02-25 03:43:20 +00:00
|
|
|
aName.AssignLiteral("close");
|
2002-01-09 10:02:29 +00:00
|
|
|
else
|
2007-02-25 03:43:20 +00:00
|
|
|
aName.AssignLiteral("open");
|
2002-01-09 10:02:29 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2008-10-02 06:49:45 +00:00
|
|
|
* Tell the Dropmarker to do its action
|
2002-01-09 10:02:29 +00:00
|
|
|
*/
|
2003-07-31 08:09:39 +00:00
|
|
|
NS_IMETHODIMP nsXULDropmarkerAccessible::DoAction(PRUint8 index)
|
2002-01-09 10:02:29 +00:00
|
|
|
{
|
|
|
|
if (index == eAction_Click) {
|
|
|
|
DropmarkerOpen(PR_TRUE); // Reverse the open attribute
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
2010-09-05 02:14:01 +00:00
|
|
|
PRUint32
|
|
|
|
nsXULDropmarkerAccessible::NativeRole()
|
2002-01-09 10:02:29 +00:00
|
|
|
{
|
2010-09-05 02:14:01 +00:00
|
|
|
return nsIAccessibleRole::ROLE_PUSHBUTTON;
|
2002-01-09 10:02:29 +00:00
|
|
|
}
|
|
|
|
|
2008-11-04 03:37:46 +00:00
|
|
|
nsresult
|
|
|
|
nsXULDropmarkerAccessible::GetStateInternal(PRUint32 *aState,
|
|
|
|
PRUint32 *aExtraState)
|
2002-01-09 10:02:29 +00:00
|
|
|
{
|
2007-04-02 15:56:24 +00:00
|
|
|
*aState = 0;
|
2008-11-27 04:04:05 +00:00
|
|
|
|
|
|
|
if (IsDefunct()) {
|
|
|
|
if (aExtraState)
|
2007-11-15 19:53:40 +00:00
|
|
|
*aExtraState = nsIAccessibleStates::EXT_STATE_DEFUNCT;
|
2008-11-27 04:04:05 +00:00
|
|
|
|
|
|
|
return NS_OK_DEFUNCT_OBJECT;
|
2007-11-15 19:53:40 +00:00
|
|
|
}
|
2008-11-27 04:04:05 +00:00
|
|
|
|
2007-04-02 15:56:24 +00:00
|
|
|
if (aExtraState)
|
|
|
|
*aExtraState = 0;
|
|
|
|
|
2002-01-09 10:02:29 +00:00
|
|
|
if (DropmarkerOpen(PR_FALSE))
|
2007-04-02 15:56:24 +00:00
|
|
|
*aState = nsIAccessibleStates::STATE_PRESSED;
|
2002-01-09 10:02:29 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULCheckboxAccessible
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2001-10-09 21:52:36 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsXULCheckboxAccessible::
|
|
|
|
nsXULCheckboxAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsFormControlAccessible(aContent, aShell)
|
|
|
|
{
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2010-09-05 02:14:01 +00:00
|
|
|
PRUint32
|
|
|
|
nsXULCheckboxAccessible::NativeRole()
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2010-09-05 02:14:01 +00:00
|
|
|
return nsIAccessibleRole::ROLE_CHECKBUTTON;
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2003-07-31 08:09:39 +00:00
|
|
|
NS_IMETHODIMP nsXULCheckboxAccessible::GetNumActions(PRUint8 *_retval)
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2006-07-31 04:31:13 +00:00
|
|
|
*_retval = 1;
|
2001-10-09 21:52:36 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2001-11-07 00:12:16 +00:00
|
|
|
/**
|
|
|
|
* Return the name of our only action
|
|
|
|
*/
|
2007-02-25 03:43:20 +00:00
|
|
|
NS_IMETHODIMP nsXULCheckboxAccessible::GetActionName(PRUint8 aIndex, nsAString& aName)
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2007-02-25 03:43:20 +00:00
|
|
|
if (aIndex == eAction_Click) {
|
2001-10-09 21:52:36 +00:00
|
|
|
// check or uncheck
|
|
|
|
PRUint32 state;
|
2008-11-04 03:37:46 +00:00
|
|
|
nsresult rv = GetStateInternal(&state, nsnull);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2001-10-09 21:52:36 +00:00
|
|
|
|
2007-03-15 14:18:33 +00:00
|
|
|
if (state & nsIAccessibleStates::STATE_CHECKED)
|
2007-02-25 03:43:20 +00:00
|
|
|
aName.AssignLiteral("uncheck");
|
2001-10-09 21:52:36 +00:00
|
|
|
else
|
2007-02-25 03:43:20 +00:00
|
|
|
aName.AssignLiteral("check");
|
2001-10-09 21:52:36 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
2001-11-07 00:12:16 +00:00
|
|
|
/**
|
|
|
|
* Tell the checkbox to do its only action -- check( or uncheck) itself
|
|
|
|
*/
|
2010-01-25 15:09:25 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULCheckboxAccessible::DoAction(PRUint8 aIndex)
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2010-01-25 15:09:25 +00:00
|
|
|
if (aIndex != eAction_Click)
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
|
|
|
|
DoCommand();
|
|
|
|
return NS_OK;
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2001-11-07 00:12:16 +00:00
|
|
|
/**
|
|
|
|
* Possible states: focused, focusable, unavailable(disabled), checked
|
|
|
|
*/
|
2008-11-04 03:37:46 +00:00
|
|
|
nsresult
|
|
|
|
nsXULCheckboxAccessible::GetStateInternal(PRUint32 *aState,
|
|
|
|
PRUint32 *aExtraState)
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2001-11-07 00:12:16 +00:00
|
|
|
// Get focus and disable status from base class
|
2008-11-04 03:37:46 +00:00
|
|
|
nsresult rv = nsFormControlAccessible::GetStateInternal(aState, aExtraState);
|
2008-11-27 04:04:05 +00:00
|
|
|
NS_ENSURE_A11Y_SUCCESS(rv, rv);
|
2007-05-06 14:50:03 +00:00
|
|
|
|
|
|
|
*aState |= nsIAccessibleStates::STATE_CHECKABLE;
|
|
|
|
|
2001-10-09 21:52:36 +00:00
|
|
|
// Determine Checked state
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIDOMXULCheckboxElement> xulCheckboxElement =
|
|
|
|
do_QueryInterface(mContent);
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
if (xulCheckboxElement) {
|
|
|
|
PRBool checked = PR_FALSE;
|
|
|
|
xulCheckboxElement->GetChecked(&checked);
|
|
|
|
if (checked) {
|
2007-04-02 15:56:24 +00:00
|
|
|
*aState |= nsIAccessibleStates::STATE_CHECKED;
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
PRInt32 checkState = 0;
|
|
|
|
xulCheckboxElement->GetCheckState(&checkState);
|
2007-04-02 15:56:24 +00:00
|
|
|
if (checkState == nsIDOMXULCheckboxElement::CHECKSTATE_MIXED)
|
|
|
|
*aState |= nsIAccessibleStates::STATE_MIXED;
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
}
|
|
|
|
}
|
2007-04-02 15:56:24 +00:00
|
|
|
|
2001-10-09 21:52:36 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULGroupboxAccessible
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsXULGroupboxAccessible::
|
|
|
|
nsXULGroupboxAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsAccessibleWrap(aContent, aShell)
|
|
|
|
{
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
}
|
|
|
|
|
2010-09-05 02:14:01 +00:00
|
|
|
PRUint32
|
|
|
|
nsXULGroupboxAccessible::NativeRole()
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
{
|
2010-09-05 02:14:01 +00:00
|
|
|
return nsIAccessibleRole::ROLE_GROUPING;
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
}
|
|
|
|
|
2008-10-10 12:26:55 +00:00
|
|
|
nsresult
|
|
|
|
nsXULGroupboxAccessible::GetNameInternal(nsAString& aName)
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
{
|
2009-02-10 10:03:30 +00:00
|
|
|
// XXX: we use the first related accessible only.
|
|
|
|
nsCOMPtr<nsIAccessible> label =
|
|
|
|
nsRelUtils::GetRelatedAccessible(this, nsIAccessibleRelation::RELATION_LABELLED_BY);
|
|
|
|
|
2007-06-30 20:06:13 +00:00
|
|
|
if (label) {
|
|
|
|
return label->GetName(aName);
|
|
|
|
}
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2007-06-30 20:06:13 +00:00
|
|
|
NS_IMETHODIMP
|
2009-02-10 10:03:30 +00:00
|
|
|
nsXULGroupboxAccessible::GetRelationByType(PRUint32 aRelationType,
|
|
|
|
nsIAccessibleRelation **aRelation)
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
{
|
2009-02-10 10:03:30 +00:00
|
|
|
nsresult rv = nsAccessibleWrap::GetRelationByType(aRelationType, aRelation);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2007-06-30 20:06:13 +00:00
|
|
|
|
|
|
|
if (aRelationType == nsIAccessibleRelation::RELATION_LABELLED_BY) {
|
|
|
|
// The label for xul:groupbox is generated from xul:label that is
|
|
|
|
// inside the anonymous content of the xul:caption.
|
|
|
|
// The xul:label has an accessible object but the xul:caption does not
|
2010-04-19 13:39:57 +00:00
|
|
|
PRInt32 childCount = GetChildCount();
|
|
|
|
for (PRInt32 childIdx = 0; childIdx < childCount; childIdx++) {
|
|
|
|
nsAccessible *childAcc = GetChildAt(childIdx);
|
|
|
|
if (nsAccUtils::Role(childAcc) == nsIAccessibleRole::ROLE_LABEL) {
|
2007-06-30 20:06:13 +00:00
|
|
|
// Ensure that it's our label
|
2009-02-10 10:03:30 +00:00
|
|
|
// XXX: we'll fail if group accessible expose more than one relation
|
|
|
|
// targets.
|
|
|
|
nsCOMPtr<nsIAccessible> testGroupboxAccessible =
|
2010-04-19 13:39:57 +00:00
|
|
|
nsRelUtils::GetRelatedAccessible(childAcc,
|
2009-02-10 10:03:30 +00:00
|
|
|
nsIAccessibleRelation::RELATION_LABEL_FOR);
|
|
|
|
|
2007-06-30 20:06:13 +00:00
|
|
|
if (testGroupboxAccessible == this) {
|
|
|
|
// The <label> points back to this groupbox
|
2009-02-10 10:03:30 +00:00
|
|
|
return nsRelUtils::
|
2010-04-19 13:39:57 +00:00
|
|
|
AddTarget(aRelationType, aRelation, childAcc);
|
2007-06-30 20:06:13 +00:00
|
|
|
}
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2007-06-30 20:06:13 +00:00
|
|
|
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2009-04-25 03:32:47 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULProgressMeterAccessible
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
|
2009-04-25 03:32:47 +00:00
|
|
|
nsXULProgressMeterAccessible::
|
2010-06-11 08:23:18 +00:00
|
|
|
nsXULProgressMeterAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsFormControlAccessible(aContent, aShell)
|
2009-04-25 03:32:47 +00:00
|
|
|
{
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
}
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
NS_IMPL_ISUPPORTS_INHERITED1(nsXULProgressMeterAccessible,
|
|
|
|
nsFormControlAccessible,
|
|
|
|
nsIAccessibleValue)
|
|
|
|
|
2009-04-25 03:32:47 +00:00
|
|
|
// nsAccessible
|
|
|
|
|
2010-09-05 02:14:01 +00:00
|
|
|
PRUint32
|
|
|
|
nsXULProgressMeterAccessible::NativeRole()
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
{
|
2010-09-05 02:14:01 +00:00
|
|
|
return nsIAccessibleRole::ROLE_PROGRESSBAR;
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
}
|
|
|
|
|
2009-04-25 03:32:47 +00:00
|
|
|
// nsIAccessibleValue
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULProgressMeterAccessible::GetValue(nsAString& aValue)
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
{
|
2009-04-25 03:32:47 +00:00
|
|
|
nsresult rv = nsFormControlAccessible::GetValue(aValue);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
if (!aValue.IsEmpty())
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
double maxValue = 0;
|
|
|
|
rv = GetMaximumValue(&maxValue);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
if (maxValue != 1) {
|
|
|
|
double curValue = 0;
|
|
|
|
rv = GetCurrentValue(&curValue);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
double percentValue = (curValue / maxValue) * 100;
|
|
|
|
nsAutoString value;
|
|
|
|
value.AppendFloat(percentValue); // AppendFloat isn't available on nsAString
|
|
|
|
value.AppendLiteral("%");
|
|
|
|
aValue = value;
|
2006-06-15 16:55:32 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2009-04-25 03:32:47 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
mContent->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::value, aValue);
|
2009-04-25 03:32:47 +00:00
|
|
|
if (aValue.IsEmpty())
|
2007-05-09 13:25:52 +00:00
|
|
|
aValue.AppendLiteral("0"); // Empty value for progress meter = 0%
|
2009-04-25 03:32:47 +00:00
|
|
|
|
2007-05-09 13:25:52 +00:00
|
|
|
aValue.AppendLiteral("%");
|
2006-06-15 16:55:32 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2009-04-25 03:32:47 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULProgressMeterAccessible::GetMaximumValue(double *aMaximumValue)
|
2006-06-15 16:55:32 +00:00
|
|
|
{
|
2009-04-25 03:32:47 +00:00
|
|
|
nsresult rv = nsFormControlAccessible::GetMaximumValue(aMaximumValue);
|
|
|
|
if (rv != NS_OK_NO_ARIA_VALUE)
|
|
|
|
return rv;
|
|
|
|
|
|
|
|
nsAutoString value;
|
2010-06-11 08:23:18 +00:00
|
|
|
if (mContent->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::max, value)) {
|
2009-04-25 03:32:47 +00:00
|
|
|
PRInt32 result = NS_OK;
|
|
|
|
*aMaximumValue = value.ToFloat(&result);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2006-06-15 16:55:32 +00:00
|
|
|
*aMaximumValue = 1; // 100% = 1;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2009-04-25 03:32:47 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULProgressMeterAccessible::GetMinimumValue(double *aMinimumValue)
|
2006-06-15 16:55:32 +00:00
|
|
|
{
|
2009-04-25 03:32:47 +00:00
|
|
|
nsresult rv = nsFormControlAccessible::GetMinimumValue(aMinimumValue);
|
|
|
|
if (rv != NS_OK_NO_ARIA_VALUE)
|
|
|
|
return rv;
|
|
|
|
|
2006-06-15 16:55:32 +00:00
|
|
|
*aMinimumValue = 0;
|
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2001-12-11 20:49:49 +00:00
|
|
|
|
2009-04-25 03:32:47 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULProgressMeterAccessible::GetMinimumIncrement(double *aMinimumIncrement)
|
2006-06-15 16:55:32 +00:00
|
|
|
{
|
2009-04-25 03:32:47 +00:00
|
|
|
nsresult rv = nsFormControlAccessible::GetMinimumIncrement(aMinimumIncrement);
|
|
|
|
if (rv != NS_OK_NO_ARIA_VALUE)
|
|
|
|
return rv;
|
|
|
|
|
2006-06-15 16:55:32 +00:00
|
|
|
*aMinimumIncrement = 0;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2009-04-25 03:32:47 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULProgressMeterAccessible::GetCurrentValue(double *aCurrentValue)
|
2006-06-15 16:55:32 +00:00
|
|
|
{
|
2009-04-25 03:32:47 +00:00
|
|
|
nsresult rv = nsFormControlAccessible::GetCurrentValue(aCurrentValue);
|
|
|
|
if (rv != NS_OK_NO_ARIA_VALUE)
|
|
|
|
return rv;
|
|
|
|
|
2009-05-06 03:16:36 +00:00
|
|
|
nsAutoString attrValue;
|
2010-06-11 08:23:18 +00:00
|
|
|
mContent->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::value, attrValue);
|
2007-05-09 13:25:52 +00:00
|
|
|
|
2009-05-06 03:16:36 +00:00
|
|
|
// Return zero value if there is no attribute or its value is empty.
|
|
|
|
if (attrValue.IsEmpty())
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
PRInt32 error = NS_OK;
|
|
|
|
double value = attrValue.ToFloat(&error);
|
|
|
|
if (NS_FAILED(error))
|
|
|
|
return NS_OK; // Zero value because of wrong markup.
|
2009-04-25 03:32:47 +00:00
|
|
|
|
2009-05-06 03:16:36 +00:00
|
|
|
// If no max value then value is between 0 and 1 (refer to GetMaximumValue()
|
|
|
|
// method where max value is assumed to be equal to 1 in this case).
|
2010-06-11 08:23:18 +00:00
|
|
|
if (!mContent->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::max))
|
2009-05-06 03:16:36 +00:00
|
|
|
value /= 100;
|
|
|
|
|
|
|
|
*aCurrentValue = value;
|
|
|
|
return NS_OK;
|
2006-06-15 16:55:32 +00:00
|
|
|
}
|
|
|
|
|
2009-04-25 03:32:47 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULProgressMeterAccessible::SetCurrentValue(double aValue)
|
2006-06-15 16:55:32 +00:00
|
|
|
{
|
|
|
|
return NS_ERROR_FAILURE; // Progress meters are readonly!
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-01-06 10:36:50 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULRadioButtonAccessible
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2001-12-11 20:49:49 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsXULRadioButtonAccessible::
|
|
|
|
nsXULRadioButtonAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsRadioButtonAccessible(aContent, aShell)
|
|
|
|
{
|
2001-12-11 20:49:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/** We are Focusable and can be Checked and focused */
|
2008-11-04 03:37:46 +00:00
|
|
|
nsresult
|
|
|
|
nsXULRadioButtonAccessible::GetStateInternal(PRUint32 *aState,
|
|
|
|
PRUint32 *aExtraState)
|
2001-12-11 20:49:49 +00:00
|
|
|
{
|
2008-11-04 03:37:46 +00:00
|
|
|
nsresult rv = nsFormControlAccessible::GetStateInternal(aState, aExtraState);
|
2008-11-27 04:04:05 +00:00
|
|
|
NS_ENSURE_A11Y_SUCCESS(rv, rv);
|
2007-04-02 15:56:24 +00:00
|
|
|
|
2007-05-06 14:50:03 +00:00
|
|
|
*aState |= nsIAccessibleStates::STATE_CHECKABLE;
|
|
|
|
|
2001-12-11 20:49:49 +00:00
|
|
|
PRBool selected = PR_FALSE; // Radio buttons can be selected
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> radioButton =
|
|
|
|
do_QueryInterface(mContent);
|
2004-07-01 20:43:03 +00:00
|
|
|
if (radioButton) {
|
2001-12-11 20:49:49 +00:00
|
|
|
radioButton->GetSelected(&selected);
|
2004-07-01 20:43:03 +00:00
|
|
|
if (selected) {
|
2007-04-02 15:56:24 +00:00
|
|
|
*aState |= nsIAccessibleStates::STATE_CHECKED;
|
2002-06-21 04:54:34 +00:00
|
|
|
}
|
|
|
|
}
|
2001-12-11 20:49:49 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2010-01-06 10:36:50 +00:00
|
|
|
void
|
|
|
|
nsXULRadioButtonAccessible::GetPositionAndSizeInternal(PRInt32 *aPosInSet,
|
|
|
|
PRInt32 *aSetSize)
|
2007-03-27 12:17:11 +00:00
|
|
|
{
|
2010-06-11 08:23:18 +00:00
|
|
|
nsAccUtils::GetPositionAndSizeForXULSelectControlItem(mContent, aPosInSet,
|
2010-01-06 10:36:50 +00:00
|
|
|
aSetSize);
|
|
|
|
}
|
2007-03-27 12:17:11 +00:00
|
|
|
|
|
|
|
|
2010-01-06 10:36:50 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULRadioGroupAccessible
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2007-03-27 12:17:11 +00:00
|
|
|
|
2001-12-11 20:49:49 +00:00
|
|
|
/**
|
|
|
|
* XUL Radio Group
|
|
|
|
* The Radio Group proxies for the Radio Buttons themselves. The Group gets
|
|
|
|
* focus whereas the Buttons do not. So we only have an accessible object for
|
|
|
|
* this for the purpose of getting the proper RadioButton. Need this here to
|
|
|
|
* avoid circular reference problems when navigating the accessible tree and
|
|
|
|
* for getting to the radiobuttons.
|
|
|
|
*/
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsXULRadioGroupAccessible::
|
|
|
|
nsXULRadioGroupAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsXULSelectableAccessible(aContent, aShell)
|
2001-12-11 20:49:49 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2010-09-05 02:14:01 +00:00
|
|
|
PRUint32
|
|
|
|
nsXULRadioGroupAccessible::NativeRole()
|
2002-06-21 04:54:34 +00:00
|
|
|
{
|
2010-09-05 02:14:01 +00:00
|
|
|
return nsIAccessibleRole::ROLE_GROUPING;
|
2002-06-21 04:54:34 +00:00
|
|
|
}
|
|
|
|
|
2008-11-04 03:37:46 +00:00
|
|
|
nsresult
|
|
|
|
nsXULRadioGroupAccessible::GetStateInternal(PRUint32 *aState,
|
|
|
|
PRUint32 *aExtraState)
|
2002-06-21 04:54:34 +00:00
|
|
|
{
|
2008-11-04 03:37:46 +00:00
|
|
|
nsresult rv = nsAccessible::GetStateInternal(aState, aExtraState);
|
2008-11-27 04:04:05 +00:00
|
|
|
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);
|
2007-04-02 15:56:24 +00:00
|
|
|
|
2002-06-21 04:54:34 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2002-01-09 10:02:29 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULStatusBarAccessible
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
nsXULStatusBarAccessible::
|
|
|
|
nsXULStatusBarAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsAccessibleWrap(aContent, aShell)
|
|
|
|
{
|
2002-01-09 10:02:29 +00:00
|
|
|
}
|
|
|
|
|
2010-09-05 02:14:01 +00:00
|
|
|
PRUint32
|
|
|
|
nsXULStatusBarAccessible::NativeRole()
|
2002-01-09 10:02:29 +00:00
|
|
|
{
|
2010-09-05 02:14:01 +00:00
|
|
|
return nsIAccessibleRole::ROLE_STATUSBAR;
|
2002-01-09 10:02:29 +00:00
|
|
|
}
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULToolbarButtonAccessible
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
nsXULToolbarButtonAccessible::
|
|
|
|
nsXULToolbarButtonAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsXULButtonAccessible(aContent, aShell)
|
2007-07-11 07:58:50 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2010-01-06 10:36:50 +00:00
|
|
|
void
|
|
|
|
nsXULToolbarButtonAccessible::GetPositionAndSizeInternal(PRInt32 *aPosInSet,
|
|
|
|
PRInt32 *aSetSize)
|
2007-07-11 07:58:50 +00:00
|
|
|
{
|
|
|
|
PRInt32 setSize = 0;
|
|
|
|
PRInt32 posInSet = 0;
|
|
|
|
|
2010-01-11 14:14:06 +00:00
|
|
|
nsAccessible* parent(GetParent());
|
|
|
|
NS_ENSURE_TRUE(parent,);
|
|
|
|
|
|
|
|
PRInt32 childCount = parent->GetChildCount();
|
|
|
|
for (PRInt32 childIdx = 0; childIdx < childCount; childIdx++) {
|
|
|
|
nsAccessible* child = parent->GetChildAt(childIdx);
|
|
|
|
if (IsSeparator(child)) { // 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 (child == this)
|
|
|
|
posInSet = setSize; // we've found our button
|
2007-07-11 07:58:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-06 10:36:50 +00:00
|
|
|
*aPosInSet = posInSet;
|
|
|
|
*aSetSize = setSize;
|
2007-07-11 07:58:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
PRBool
|
2010-01-11 14:14:06 +00:00
|
|
|
nsXULToolbarButtonAccessible::IsSeparator(nsAccessible *aAccessible)
|
2007-07-11 07:58:50 +00:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIDOMNode> domNode;
|
2010-01-11 14:14:06 +00:00
|
|
|
aAccessible->GetDOMNode(getter_AddRefs(domNode));
|
2007-07-11 07:58:50 +00:00
|
|
|
nsCOMPtr<nsIContent> contentDomNode(do_QueryInterface(domNode));
|
|
|
|
|
|
|
|
if (!contentDomNode)
|
|
|
|
return PR_FALSE;
|
|
|
|
|
|
|
|
return (contentDomNode->Tag() == nsAccessibilityAtoms::toolbarseparator) ||
|
|
|
|
(contentDomNode->Tag() == nsAccessibilityAtoms::toolbarspacer) ||
|
|
|
|
(contentDomNode->Tag() == nsAccessibilityAtoms::toolbarspring);
|
|
|
|
}
|
|
|
|
|
2002-11-06 01:29:58 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULToolbarAccessible
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
nsXULToolbarAccessible::
|
|
|
|
nsXULToolbarAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsAccessibleWrap(aContent, aShell)
|
|
|
|
{
|
2002-11-06 01:29:58 +00:00
|
|
|
}
|
|
|
|
|
2010-09-05 02:14:01 +00:00
|
|
|
PRUint32
|
|
|
|
nsXULToolbarAccessible::NativeRole()
|
2002-11-06 01:29:58 +00:00
|
|
|
{
|
2010-09-05 02:14:01 +00:00
|
|
|
return nsIAccessibleRole::ROLE_TOOLBAR;
|
2002-11-06 01:29:58 +00:00
|
|
|
}
|
|
|
|
|
2010-05-12 07:29:51 +00:00
|
|
|
nsresult
|
|
|
|
nsXULToolbarAccessible::GetNameInternal(nsAString& aName)
|
|
|
|
{
|
|
|
|
nsAutoString name;
|
2010-06-11 08:23:18 +00:00
|
|
|
if (mContent->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::toolbarname,
|
|
|
|
name)) {
|
2010-05-12 07:29:51 +00:00
|
|
|
name.CompressWhitespace();
|
|
|
|
aName = name;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-11-06 01:29:58 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULToolbarAccessible
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
nsXULToolbarSeparatorAccessible::
|
|
|
|
nsXULToolbarSeparatorAccessible(nsIContent *aContent,
|
|
|
|
nsIWeakReference *aShell) :
|
|
|
|
nsLeafAccessible(aContent, aShell)
|
|
|
|
{
|
2002-11-06 01:29:58 +00:00
|
|
|
}
|
|
|
|
|
2010-09-05 02:14:01 +00:00
|
|
|
PRUint32
|
|
|
|
nsXULToolbarSeparatorAccessible::NativeRole()
|
2002-11-06 01:29:58 +00:00
|
|
|
{
|
2010-09-05 02:14:01 +00:00
|
|
|
return nsIAccessibleRole::ROLE_SEPARATOR;
|
2002-11-06 01:29:58 +00:00
|
|
|
}
|
|
|
|
|
2008-11-04 03:37:46 +00:00
|
|
|
nsresult
|
|
|
|
nsXULToolbarSeparatorAccessible::GetStateInternal(PRUint32 *aState,
|
|
|
|
PRUint32 *aExtraState)
|
2002-11-06 01:29:58 +00:00
|
|
|
{
|
2007-04-02 15:56:24 +00:00
|
|
|
*aState = 0; // no special state flags for toolbar separator
|
2008-11-27 04:04:05 +00:00
|
|
|
|
|
|
|
if (IsDefunct()) {
|
|
|
|
if (aExtraState)
|
|
|
|
*aExtraState = nsIAccessibleStates::EXT_STATE_DEFUNCT;
|
|
|
|
|
|
|
|
return NS_OK_DEFUNCT_OBJECT;
|
2007-11-15 19:53:40 +00:00
|
|
|
}
|
2008-11-27 04:04:05 +00:00
|
|
|
|
|
|
|
if (aExtraState)
|
|
|
|
*aExtraState = 0;
|
|
|
|
|
2002-11-06 01:29:58 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2004-06-02 04:06:28 +00:00
|
|
|
|
2010-02-01 15:22:35 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULTextFieldAccessible
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2004-06-02 04:06:28 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsXULTextFieldAccessible::
|
|
|
|
nsXULTextFieldAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsHyperTextAccessibleWrap(aContent, aShell)
|
2006-07-12 13:14:53 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2007-11-09 19:27:07 +00:00
|
|
|
NS_IMPL_ISUPPORTS_INHERITED3(nsXULTextFieldAccessible, nsAccessible, nsHyperTextAccessible, nsIAccessibleText, nsIAccessibleEditableText)
|
|
|
|
|
2010-02-01 15:22:35 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULTextFieldAccessible: nsIAccessible
|
|
|
|
|
2004-06-02 04:06:28 +00:00
|
|
|
NS_IMETHODIMP nsXULTextFieldAccessible::GetValue(nsAString& aValue)
|
|
|
|
{
|
2005-01-19 07:10:38 +00:00
|
|
|
PRUint32 state;
|
2008-11-04 03:37:46 +00:00
|
|
|
nsresult rv = GetStateInternal(&state, nsnull);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2007-03-15 14:18:33 +00:00
|
|
|
if (state & nsIAccessibleStates::STATE_PROTECTED) // Don't return password text!
|
2005-01-19 07:10:38 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIDOMXULTextBoxElement> textBox(do_QueryInterface(mContent));
|
2004-06-02 04:06:28 +00:00
|
|
|
if (textBox) {
|
|
|
|
return textBox->GetValue(aValue);
|
|
|
|
}
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIDOMXULMenuListElement> menuList(do_QueryInterface(mContent));
|
2007-02-09 02:03:08 +00:00
|
|
|
if (menuList) {
|
|
|
|
return menuList->GetLabel(aValue);
|
|
|
|
}
|
2004-06-02 04:06:28 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2009-06-25 02:12:38 +00:00
|
|
|
nsresult
|
|
|
|
nsXULTextFieldAccessible::GetARIAState(PRUint32 *aState, PRUint32 *aExtraState)
|
|
|
|
{
|
|
|
|
nsresult rv = nsHyperTextAccessibleWrap::GetARIAState(aState, aExtraState);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsStateMapEntry::MapToStates(mContent, aState, aExtraState, eARIAAutoComplete);
|
2009-06-25 02:12:38 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2008-11-04 03:37:46 +00:00
|
|
|
nsresult
|
|
|
|
nsXULTextFieldAccessible::GetStateInternal(PRUint32 *aState,
|
|
|
|
PRUint32 *aExtraState)
|
2004-06-02 04:06:28 +00:00
|
|
|
{
|
2008-11-04 03:37:46 +00:00
|
|
|
nsresult rv = nsHyperTextAccessibleWrap::GetStateInternal(aState,
|
|
|
|
aExtraState);
|
2008-11-27 04:04:05 +00:00
|
|
|
NS_ENSURE_A11Y_SUCCESS(rv, rv);
|
2004-06-02 04:06:28 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIContent> inputField(GetInputField());
|
2007-04-02 15:56:24 +00:00
|
|
|
NS_ENSURE_TRUE(inputField, NS_ERROR_FAILURE);
|
|
|
|
|
2004-06-02 04:06:28 +00:00
|
|
|
// Create a temporary accessible from the HTML text field
|
|
|
|
// to get the accessible state from. Doesn't add to cache
|
|
|
|
// because Init() is not called.
|
2007-04-23 15:37:55 +00:00
|
|
|
nsHTMLTextFieldAccessible* tempAccessible =
|
|
|
|
new nsHTMLTextFieldAccessible(inputField, mWeakShell);
|
|
|
|
if (!tempAccessible)
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
nsCOMPtr<nsIAccessible> kungFuDeathGrip = tempAccessible;
|
2008-11-04 03:37:46 +00:00
|
|
|
rv = tempAccessible->GetStateInternal(aState, nsnull);
|
2007-04-02 15:56:24 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
if (gLastFocusedNode == mContent)
|
2007-03-15 14:18:33 +00:00
|
|
|
*aState |= nsIAccessibleStates::STATE_FOCUSED;
|
2006-06-16 17:13:37 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIDOMXULMenuListElement> menuList(do_QueryInterface(mContent));
|
2007-02-09 02:03:08 +00:00
|
|
|
if (menuList) {
|
|
|
|
// <xul:menulist droppable="false">
|
2010-06-11 08:23:18 +00:00
|
|
|
if (!mContent->AttrValueIs(kNameSpaceID_None,
|
|
|
|
nsAccessibilityAtoms::editable,
|
|
|
|
nsAccessibilityAtoms::_true, eIgnoreCase)) {
|
2007-03-15 14:18:33 +00:00
|
|
|
*aState |= nsIAccessibleStates::STATE_READONLY;
|
2007-02-09 02:03:08 +00:00
|
|
|
}
|
2006-06-16 17:13:37 +00:00
|
|
|
}
|
2007-02-09 02:03:08 +00:00
|
|
|
else {
|
|
|
|
// <xul:textbox>
|
2010-06-11 08:23:18 +00:00
|
|
|
if (mContent->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::type,
|
|
|
|
nsAccessibilityAtoms::password, eIgnoreCase)) {
|
2007-03-15 14:18:33 +00:00
|
|
|
*aState |= nsIAccessibleStates::STATE_PROTECTED;
|
2007-02-09 02:03:08 +00:00
|
|
|
}
|
2010-06-11 08:23:18 +00:00
|
|
|
if (mContent->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::readonly,
|
|
|
|
nsAccessibilityAtoms::_true, eIgnoreCase)) {
|
2007-03-15 14:18:33 +00:00
|
|
|
*aState |= nsIAccessibleStates::STATE_READONLY;
|
2007-02-09 02:03:08 +00:00
|
|
|
}
|
2006-06-16 17:13:37 +00:00
|
|
|
}
|
|
|
|
|
2007-04-02 15:56:24 +00:00
|
|
|
if (!aExtraState)
|
|
|
|
return NS_OK;
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
PRBool isMultiLine = mContent->HasAttr(kNameSpaceID_None,
|
|
|
|
nsAccessibilityAtoms::multiline);
|
2007-04-02 15:56:24 +00:00
|
|
|
|
2007-06-04 08:16:04 +00:00
|
|
|
if (isMultiLine) {
|
|
|
|
*aExtraState |= nsIAccessibleStates::EXT_STATE_MULTI_LINE;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
*aExtraState |= nsIAccessibleStates::EXT_STATE_SINGLE_LINE;
|
|
|
|
}
|
2007-04-02 15:56:24 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
2004-06-02 04:06:28 +00:00
|
|
|
}
|
|
|
|
|
2010-09-05 02:14:01 +00:00
|
|
|
PRUint32
|
|
|
|
nsXULTextFieldAccessible::NativeRole()
|
2006-06-16 17:13:37 +00:00
|
|
|
{
|
2010-06-11 08:23:18 +00:00
|
|
|
if (mContent->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::type,
|
|
|
|
nsAccessibilityAtoms::password, eIgnoreCase))
|
2010-09-05 02:14:01 +00:00
|
|
|
return nsIAccessibleRole::ROLE_PASSWORD_TEXT;
|
|
|
|
return nsIAccessibleRole::ROLE_ENTRY;
|
2006-06-16 17:13:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-04-05 11:16:34 +00:00
|
|
|
/**
|
|
|
|
* Only one actions available
|
|
|
|
*/
|
|
|
|
NS_IMETHODIMP nsXULTextFieldAccessible::GetNumActions(PRUint8 *_retval)
|
|
|
|
{
|
2006-07-31 04:31:13 +00:00
|
|
|
*_retval = 1;
|
2006-07-12 13:14:53 +00:00
|
|
|
return NS_OK;
|
2005-04-05 11:16:34 +00:00
|
|
|
}
|
2004-06-02 04:06:28 +00:00
|
|
|
|
2005-04-05 11:16:34 +00:00
|
|
|
/**
|
|
|
|
* Return the name of our only action
|
|
|
|
*/
|
2007-02-25 03:43:20 +00:00
|
|
|
NS_IMETHODIMP nsXULTextFieldAccessible::GetActionName(PRUint8 aIndex, nsAString& aName)
|
2005-04-05 11:16:34 +00:00
|
|
|
{
|
2007-02-25 03:43:20 +00:00
|
|
|
if (aIndex == eAction_Click) {
|
|
|
|
aName.AssignLiteral("activate");
|
2005-04-05 11:16:34 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2008-10-02 06:49:45 +00:00
|
|
|
* Tell the button to do its action
|
2005-04-05 11:16:34 +00:00
|
|
|
*/
|
|
|
|
NS_IMETHODIMP nsXULTextFieldAccessible::DoAction(PRUint8 index)
|
|
|
|
{
|
|
|
|
if (index == 0) {
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIDOMXULElement> element(do_QueryInterface(mContent));
|
2005-04-05 11:16:34 +00:00
|
|
|
if (element)
|
|
|
|
{
|
|
|
|
element->Focus();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
2006-07-12 13:14:53 +00:00
|
|
|
|
2009-06-18 07:37:38 +00:00
|
|
|
PRBool
|
|
|
|
nsXULTextFieldAccessible::GetAllowsAnonChildAccessibles()
|
2006-10-30 03:05:43 +00:00
|
|
|
{
|
2009-06-18 07:37:38 +00:00
|
|
|
return PR_FALSE;
|
2006-10-30 03:05:43 +00:00
|
|
|
}
|
|
|
|
|
2007-08-14 16:25:24 +00:00
|
|
|
NS_IMETHODIMP nsXULTextFieldAccessible::GetAssociatedEditor(nsIEditor **aEditor)
|
2006-07-12 13:14:53 +00:00
|
|
|
{
|
2007-08-14 16:25:24 +00:00
|
|
|
*aEditor = nsnull;
|
2010-06-11 08:23:18 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIContent> inputField = GetInputField();
|
2006-11-29 16:10:31 +00:00
|
|
|
nsCOMPtr<nsIDOMNSEditableElement> editableElt(do_QueryInterface(inputField));
|
2007-08-14 16:25:24 +00:00
|
|
|
NS_ENSURE_TRUE(editableElt, NS_ERROR_FAILURE);
|
|
|
|
return editableElt->GetEditor(aEditor);
|
2006-07-12 13:14:53 +00:00
|
|
|
}
|
2010-02-01 15:22:35 +00:00
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULTextFieldAccessible: nsAccessible protected
|
|
|
|
|
|
|
|
void
|
|
|
|
nsXULTextFieldAccessible::CacheChildren()
|
|
|
|
{
|
|
|
|
// Create child accessibles for native anonymous content of underlying HTML
|
|
|
|
// input element.
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIContent> inputContent(GetInputField());
|
2010-02-01 15:22:35 +00:00
|
|
|
if (!inputContent)
|
|
|
|
return;
|
|
|
|
|
2010-02-21 00:55:04 +00:00
|
|
|
nsAccTreeWalker walker(mWeakShell, inputContent, PR_FALSE);
|
2010-02-01 15:22:35 +00:00
|
|
|
|
2010-02-21 00:56:35 +00:00
|
|
|
nsRefPtr<nsAccessible> child;
|
2010-07-02 01:22:41 +00:00
|
|
|
while ((child = walker.GetNextChild()) && AppendChild(child));
|
2010-02-01 15:22:35 +00:00
|
|
|
}
|
2010-06-11 08:23:18 +00:00
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULTextFieldAccessible protected
|
|
|
|
|
|
|
|
already_AddRefed<nsIContent>
|
|
|
|
nsXULTextFieldAccessible::GetInputField() const
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIDOMNode> inputFieldDOMNode;
|
|
|
|
nsCOMPtr<nsIDOMXULTextBoxElement> textBox = do_QueryInterface(mContent);
|
|
|
|
if (textBox) {
|
|
|
|
textBox->GetInputField(getter_AddRefs(inputFieldDOMNode));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
// <xul:menulist droppable="false">
|
|
|
|
nsCOMPtr<nsIDOMXULMenuListElement> menuList = do_QueryInterface(mContent);
|
|
|
|
if (menuList)
|
|
|
|
menuList->GetInputField(getter_AddRefs(inputFieldDOMNode));
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_ASSERTION(inputFieldDOMNode, "No input field for nsXULTextFieldAccessible");
|
|
|
|
|
|
|
|
nsIContent* inputField = nsnull;
|
|
|
|
if (inputFieldDOMNode)
|
|
|
|
CallQueryInterface(inputFieldDOMNode, &inputField);
|
|
|
|
|
|
|
|
return inputField;
|
|
|
|
}
|