2001-10-09 21:52:36 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 11:12:37 +00:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
2001-10-09 21:52:36 +00:00
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
#include "XULFormControlAccessible.h"
|
2010-04-27 06:52:03 +00:00
|
|
|
|
2012-04-13 14:17:03 +00:00
|
|
|
#include "Accessible-inl.h"
|
2012-04-12 11:11:40 +00:00
|
|
|
#include "HTMLFormControlAccessible.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"
|
2012-05-27 09:01:40 +00:00
|
|
|
#include "DocAccessible.h"
|
2012-04-12 11:11:40 +00:00
|
|
|
#include "nsIAccessibleRelation.h"
|
|
|
|
#include "nsXULMenuAccessible.h"
|
2011-08-10 01:44:00 +00:00
|
|
|
#include "Relation.h"
|
2012-01-12 03:07:35 +00:00
|
|
|
#include "Role.h"
|
2011-04-09 23:38:06 +00:00
|
|
|
#include "States.h"
|
2010-04-27 06:52:03 +00:00
|
|
|
|
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"
|
2011-09-28 01:46:11 +00:00
|
|
|
#include "nsMenuPopupFrame.h"
|
2001-10-09 21:52:36 +00:00
|
|
|
|
2011-07-27 12:43:01 +00:00
|
|
|
using namespace mozilla::a11y;
|
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULButtonAccessible
|
2009-11-10 05:58:52 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2002-01-09 10:02:29 +00:00
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
XULButtonAccessible::
|
2012-05-27 09:01:40 +00:00
|
|
|
XULButtonAccessible(nsIContent* aContent, DocAccessible* aDoc) :
|
2012-05-29 01:18:45 +00:00
|
|
|
AccessibleWrap(aContent, aDoc)
|
2009-11-10 05:58:52 +00:00
|
|
|
{
|
2011-09-28 01:46:11 +00:00
|
|
|
if (ContainsMenu())
|
|
|
|
mFlags |= eMenuButtonAccessible;
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULButtonAccessible: nsISupports
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2012-05-29 01:18:45 +00:00
|
|
|
NS_IMPL_ISUPPORTS_INHERITED0(XULButtonAccessible, Accessible)
|
2009-11-10 05:58:52 +00:00
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULButtonAccessible: nsIAccessible
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2011-06-05 19:35:43 +00:00
|
|
|
PRUint8
|
2012-04-12 11:11:40 +00:00
|
|
|
XULButtonAccessible::ActionCount()
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2011-06-05 19:35:43 +00:00
|
|
|
return 1;
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
NS_IMETHODIMP
|
2012-04-12 11:11:40 +00:00
|
|
|
XULButtonAccessible::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
|
2012-04-12 11:11:40 +00:00
|
|
|
XULButtonAccessible::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
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-05-29 01:18:45 +00:00
|
|
|
// XULButtonAccessible: Accessible
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2012-01-12 03:07:35 +00:00
|
|
|
role
|
2012-04-12 11:11:40 +00:00
|
|
|
XULButtonAccessible::NativeRole()
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2012-01-12 03:07:35 +00:00
|
|
|
return roles::PUSHBUTTON;
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
PRUint64
|
2012-04-12 11:11:40 +00:00
|
|
|
XULButtonAccessible::NativeState()
|
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
|
2012-05-29 01:18:45 +00:00
|
|
|
PRUint64 state = Accessible::NativeState();
|
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")) {
|
2011-04-09 23:38:06 +00:00
|
|
|
state |= states::CHECKABLE;
|
2011-09-29 06:19:26 +00:00
|
|
|
bool checked = false;
|
2007-05-06 14:50:03 +00:00
|
|
|
PRInt32 checkState = 0;
|
|
|
|
xulButtonElement->GetChecked(&checked);
|
|
|
|
if (checked) {
|
2011-04-09 23:38:06 +00:00
|
|
|
state |= states::PRESSED;
|
2007-05-06 14:50:03 +00:00
|
|
|
xulButtonElement->GetCheckState(&checkState);
|
|
|
|
if (checkState == nsIDOMXULButtonElement::CHECKSTATE_MIXED) {
|
2011-04-09 23:38:06 +00:00
|
|
|
state |= states::MIXED;
|
2007-05-06 14:50:03 +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
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
if (ContainsMenu())
|
2011-04-09 23:38:06 +00:00
|
|
|
state |= states::HASPOPUP;
|
2005-04-02 01:00:20 +00:00
|
|
|
|
2011-06-03 21:35:17 +00:00
|
|
|
if (mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::_default))
|
2011-04-09 23:38:06 +00:00
|
|
|
state |= states::DEFAULT;
|
2002-03-10 05:14:24 +00:00
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
return state;
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2011-09-28 01:46:11 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULButtonAccessible: Widgets
|
2011-09-28 01:46:11 +00:00
|
|
|
|
|
|
|
bool
|
2012-04-12 11:11:40 +00:00
|
|
|
XULButtonAccessible::IsWidget() const
|
2011-09-28 01:46:11 +00:00
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2012-04-12 11:11:40 +00:00
|
|
|
XULButtonAccessible::IsActiveWidget() const
|
2011-09-28 01:46:11 +00:00
|
|
|
{
|
|
|
|
return FocusMgr()->HasDOMFocus(mContent);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2012-04-12 11:11:40 +00:00
|
|
|
XULButtonAccessible::AreItemsOperable() const
|
2011-09-28 01:46:11 +00:00
|
|
|
{
|
|
|
|
if (IsMenuButton()) {
|
2012-05-29 01:18:45 +00:00
|
|
|
Accessible* menuPopup = mChildren.SafeElementAt(0, nsnull);
|
2011-09-28 01:46:11 +00:00
|
|
|
if (menuPopup) {
|
|
|
|
nsMenuPopupFrame* menuPopupFrame = do_QueryFrame(menuPopup->GetFrame());
|
|
|
|
return menuPopupFrame->IsOpen();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false; // no items
|
|
|
|
}
|
|
|
|
|
2012-05-29 01:18:45 +00:00
|
|
|
Accessible*
|
2012-04-12 11:11:40 +00:00
|
|
|
XULButtonAccessible::ContainerWidget() const
|
2011-09-28 01:46:11 +00:00
|
|
|
{
|
|
|
|
if (IsMenuButton() && mParent && mParent->IsAutoComplete())
|
|
|
|
return mParent;
|
|
|
|
return nsnull;
|
|
|
|
}
|
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-05-29 01:18:45 +00:00
|
|
|
// XULButtonAccessible: Accessible protected
|
2009-11-10 05:58:52 +00:00
|
|
|
|
|
|
|
void
|
2012-04-12 11:11:40 +00:00
|
|
|
XULButtonAccessible::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.
|
2011-09-29 06:19:26 +00:00
|
|
|
bool isMenu = mContent->AttrValueIs(kNameSpaceID_None,
|
2011-06-03 21:35:17 +00:00
|
|
|
nsGkAtoms::type,
|
|
|
|
nsGkAtoms::menu,
|
2009-12-10 19:12:19 +00:00
|
|
|
eCaseMatters);
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool isMenuButton = isMenu ?
|
2011-10-17 14:59:28 +00:00
|
|
|
false :
|
2011-06-03 21:35:17 +00:00
|
|
|
mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type,
|
|
|
|
nsGkAtoms::menuButton, eCaseMatters);
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2012-02-07 22:38:54 +00:00
|
|
|
NS_ENSURE_TRUE(mDoc,);
|
2009-12-10 19:12:19 +00:00
|
|
|
if (!isMenu && !isMenuButton)
|
|
|
|
return;
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2012-05-29 01:18:45 +00:00
|
|
|
Accessible* menupopup = nsnull;
|
|
|
|
Accessible* button = nsnull;
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2012-02-09 16:49:17 +00:00
|
|
|
nsAccTreeWalker walker(mDoc, mContent, true);
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2012-05-29 01:18:45 +00:00
|
|
|
Accessible* child = nsnull;
|
2011-03-31 09:30:58 +00:00
|
|
|
while ((child = walker.NextChild())) {
|
2012-01-12 03:07:35 +00:00
|
|
|
roles::Role role = child->Role();
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2012-01-12 03:07:35 +00:00
|
|
|
if (role == roles::MENUPOPUP) {
|
2011-03-31 09:30:58 +00:00
|
|
|
// Get an accessible for menupopup or panel elements.
|
|
|
|
menupopup = child;
|
2009-11-19 16:35:38 +00:00
|
|
|
|
2012-01-12 03:07:35 +00:00
|
|
|
} else if (isMenuButton && role == roles::PUSHBUTTON) {
|
2009-12-10 19:12:19 +00:00
|
|
|
// Button type="menu-button" contains a real button. Get an accessible
|
2011-03-31 09:30:58 +00:00
|
|
|
// for it. Ignore dropmarker button which is placed as a last child.
|
|
|
|
button = child;
|
2009-12-10 19:12:19 +00:00
|
|
|
break;
|
2010-11-12 19:00:55 +00:00
|
|
|
|
|
|
|
} else {
|
|
|
|
// Unbind rejected accessible from document.
|
2011-11-09 22:52:00 +00:00
|
|
|
Document()->UnbindFromDocument(child);
|
2004-06-25 20:27:29 +00:00
|
|
|
}
|
2009-12-10 19:12:19 +00:00
|
|
|
}
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2011-03-31 09:30:58 +00:00
|
|
|
if (!menupopup)
|
2009-12-10 19:12:19 +00:00
|
|
|
return;
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2011-03-31 09:30:58 +00:00
|
|
|
AppendChild(menupopup);
|
|
|
|
if (button)
|
|
|
|
AppendChild(button);
|
2002-01-09 10:02:29 +00:00
|
|
|
}
|
|
|
|
|
2009-11-10 05:58:52 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULButtonAccessible protected
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool
|
2012-04-12 11:11:40 +00:00
|
|
|
XULButtonAccessible::ContainsMenu()
|
2009-11-10 05:58:52 +00:00
|
|
|
{
|
|
|
|
static nsIContent::AttrValuesArray strings[] =
|
2011-06-03 21:35:17 +00:00
|
|
|
{&nsGkAtoms::menu, &nsGkAtoms::menuButton, nsnull};
|
2009-11-10 05:58:52 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
return mContent->FindAttrValueIn(kNameSpaceID_None,
|
2011-06-03 21:35:17 +00:00
|
|
|
nsGkAtoms::type,
|
2010-06-11 08:23:18 +00:00
|
|
|
strings, eCaseMatters) >= 0;
|
2009-11-10 05:58:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULDropmarkerAccessible
|
2009-11-10 05:58:52 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2002-01-09 10:02:29 +00:00
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
XULDropmarkerAccessible::
|
2012-05-27 09:01:40 +00:00
|
|
|
XULDropmarkerAccessible(nsIContent* aContent, DocAccessible* aDoc) :
|
2012-04-12 11:11:40 +00:00
|
|
|
nsLeafAccessible(aContent, aDoc)
|
2010-06-11 08:23:18 +00:00
|
|
|
{
|
2002-01-09 10:02:29 +00:00
|
|
|
}
|
|
|
|
|
2011-06-05 19:35:43 +00:00
|
|
|
PRUint8
|
2012-04-12 11:11:40 +00:00
|
|
|
XULDropmarkerAccessible::ActionCount()
|
2002-01-09 10:02:29 +00:00
|
|
|
{
|
2011-06-05 19:35:43 +00:00
|
|
|
return 1;
|
2002-01-09 10:02:29 +00:00
|
|
|
}
|
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
bool
|
|
|
|
XULDropmarkerAccessible::DropmarkerOpen(bool aToggleOpen)
|
2002-01-09 10:02:29 +00:00
|
|
|
{
|
2011-09-29 06:19:26 +00:00
|
|
|
bool isOpen = false;
|
2002-01-09 10:02:29 +00:00
|
|
|
|
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
|
|
|
|
*/
|
2012-04-12 11:11:40 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
XULDropmarkerAccessible::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) {
|
2011-10-17 14:59:28 +00:00
|
|
|
if (DropmarkerOpen(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
|
|
|
*/
|
2012-04-12 11:11:40 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
XULDropmarkerAccessible::DoAction(PRUint8 index)
|
2002-01-09 10:02:29 +00:00
|
|
|
{
|
|
|
|
if (index == eAction_Click) {
|
2011-10-17 14:59:28 +00:00
|
|
|
DropmarkerOpen(true); // Reverse the open attribute
|
2002-01-09 10:02:29 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
2012-01-12 03:07:35 +00:00
|
|
|
role
|
2012-04-12 11:11:40 +00:00
|
|
|
XULDropmarkerAccessible::NativeRole()
|
2002-01-09 10:02:29 +00:00
|
|
|
{
|
2012-01-12 03:07:35 +00:00
|
|
|
return roles::PUSHBUTTON;
|
2002-01-09 10:02:29 +00:00
|
|
|
}
|
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
PRUint64
|
2012-04-12 11:11:40 +00:00
|
|
|
XULDropmarkerAccessible::NativeState()
|
2002-01-09 10:02:29 +00:00
|
|
|
{
|
2011-10-17 14:59:28 +00:00
|
|
|
return DropmarkerOpen(false) ? states::PRESSED : 0;
|
2002-01-09 10:02:29 +00:00
|
|
|
}
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULCheckboxAccessible
|
2010-06-11 08:23:18 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2001-10-09 21:52:36 +00:00
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
XULCheckboxAccessible::
|
2012-05-27 09:01:40 +00:00
|
|
|
XULCheckboxAccessible(nsIContent* aContent, DocAccessible* aDoc) :
|
2012-04-12 11:11:40 +00:00
|
|
|
nsLeafAccessible(aContent, aDoc)
|
2010-06-11 08:23:18 +00:00
|
|
|
{
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2012-01-12 03:07:35 +00:00
|
|
|
role
|
2012-04-12 11:11:40 +00:00
|
|
|
XULCheckboxAccessible::NativeRole()
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2012-01-12 03:07:35 +00:00
|
|
|
return roles::CHECKBUTTON;
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2011-06-05 19:35:43 +00:00
|
|
|
PRUint8
|
2012-04-12 11:11:40 +00:00
|
|
|
XULCheckboxAccessible::ActionCount()
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2011-06-05 19:35:43 +00:00
|
|
|
return 1;
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2001-11-07 00:12:16 +00:00
|
|
|
/**
|
|
|
|
* Return the name of our only action
|
|
|
|
*/
|
2012-04-12 11:11:40 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
XULCheckboxAccessible::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
|
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
if (NativeState() & states::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
|
2012-04-12 11:11:40 +00:00
|
|
|
XULCheckboxAccessible::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
|
|
|
}
|
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
PRUint64
|
2012-04-12 11:11:40 +00:00
|
|
|
XULCheckboxAccessible::NativeState()
|
2001-10-09 21:52:36 +00:00
|
|
|
{
|
2011-04-09 23:38:06 +00:00
|
|
|
// Possible states: focused, focusable, unavailable(disabled), checked
|
2001-11-07 00:12:16 +00:00
|
|
|
// Get focus and disable status from base class
|
2012-04-12 11:11:40 +00:00
|
|
|
PRUint64 state = nsLeafAccessible::NativeState();
|
2007-05-06 14:50:03 +00:00
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
state |= states::CHECKABLE;
|
2007-05-06 14:50:03 +00:00
|
|
|
|
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) {
|
2011-09-29 06:19:26 +00:00
|
|
|
bool checked = false;
|
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
|
|
|
xulCheckboxElement->GetChecked(&checked);
|
|
|
|
if (checked) {
|
2011-04-09 23:38:06 +00:00
|
|
|
state |= states::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)
|
2011-04-09 23:38:06 +00:00
|
|
|
state |= states::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
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
return state;
|
2001-10-09 21:52:36 +00:00
|
|
|
}
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULGroupboxAccessible
|
2010-06-11 08:23:18 +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
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
XULGroupboxAccessible::
|
2012-05-27 09:01:40 +00:00
|
|
|
XULGroupboxAccessible(nsIContent* aContent, DocAccessible* aDoc) :
|
2012-05-29 01:18:45 +00:00
|
|
|
AccessibleWrap(aContent, aDoc)
|
2010-06-11 08:23:18 +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
|
|
|
}
|
|
|
|
|
2012-01-12 03:07:35 +00:00
|
|
|
role
|
2012-04-12 11:11:40 +00:00
|
|
|
XULGroupboxAccessible::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
|
|
|
{
|
2012-01-12 03:07:35 +00:00
|
|
|
return roles::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
|
2012-04-12 11:11:40 +00:00
|
|
|
XULGroupboxAccessible::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.
|
2012-05-29 01:18:45 +00:00
|
|
|
Accessible* label =
|
2011-08-10 01:44:00 +00:00
|
|
|
RelationByType(nsIAccessibleRelation::RELATION_LABELLED_BY).Next();
|
|
|
|
if (label)
|
2007-06-30 20:06:13 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2011-08-10 01:44:00 +00:00
|
|
|
Relation
|
2012-04-12 11:11:40 +00:00
|
|
|
XULGroupboxAccessible::RelationByType(PRUint32 aType)
|
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
|
|
|
{
|
2012-05-29 01:18:45 +00:00
|
|
|
Relation rel = AccessibleWrap::RelationByType(aType);
|
2011-08-10 01:44:00 +00:00
|
|
|
if (aType != nsIAccessibleRelation::RELATION_LABELLED_BY)
|
|
|
|
return rel;
|
|
|
|
|
|
|
|
// 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
|
2012-05-25 10:53:45 +00:00
|
|
|
PRUint32 childCount = ChildCount();
|
|
|
|
for (PRUint32 childIdx = 0; childIdx < childCount; childIdx++) {
|
2012-05-29 01:18:45 +00:00
|
|
|
Accessible* childAcc = GetChildAt(childIdx);
|
2012-01-12 03:07:35 +00:00
|
|
|
if (childAcc->Role() == roles::LABEL) {
|
2011-08-10 01:44:00 +00:00
|
|
|
// Ensure that it's our label
|
|
|
|
Relation reverseRel =
|
|
|
|
childAcc->RelationByType(nsIAccessibleRelation::RELATION_LABEL_FOR);
|
2012-05-29 01:18:45 +00:00
|
|
|
Accessible* testGroupbox = nsnull;
|
2011-08-10 01:44:00 +00:00
|
|
|
while ((testGroupbox = reverseRel.Next()))
|
|
|
|
if (testGroupbox == this) {
|
2007-06-30 20:06:13 +00:00
|
|
|
// The <label> points back to this groupbox
|
2011-08-10 01:44:00 +00:00
|
|
|
rel.AppendTarget(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
|
|
|
|
2011-08-10 01:44:00 +00:00
|
|
|
return rel;
|
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-01-06 10:36:50 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULRadioButtonAccessible
|
2010-01-06 10:36:50 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2001-12-11 20:49:49 +00:00
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
XULRadioButtonAccessible::
|
2012-05-27 09:01:40 +00:00
|
|
|
XULRadioButtonAccessible(nsIContent* aContent, DocAccessible* aDoc) :
|
2012-04-12 11:11:40 +00:00
|
|
|
RadioButtonAccessible(aContent, aDoc)
|
2010-06-11 08:23:18 +00:00
|
|
|
{
|
2001-12-11 20:49:49 +00:00
|
|
|
}
|
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
PRUint64
|
2012-04-12 11:11:40 +00:00
|
|
|
XULRadioButtonAccessible::NativeState()
|
2001-12-11 20:49:49 +00:00
|
|
|
{
|
2012-04-12 11:11:40 +00:00
|
|
|
PRUint64 state = nsLeafAccessible::NativeState();
|
2011-04-09 23:38:06 +00:00
|
|
|
state |= states::CHECKABLE;
|
2011-09-28 01:46:11 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> radioButton =
|
|
|
|
do_QueryInterface(mContent);
|
2004-07-01 20:43:03 +00:00
|
|
|
if (radioButton) {
|
2011-09-29 06:19:26 +00:00
|
|
|
bool selected = false; // Radio buttons can be selected
|
2001-12-11 20:49:49 +00:00
|
|
|
radioButton->GetSelected(&selected);
|
2004-07-01 20:43:03 +00:00
|
|
|
if (selected) {
|
2011-04-09 23:38:06 +00:00
|
|
|
state |= states::CHECKED;
|
2002-06-21 04:54:34 +00:00
|
|
|
}
|
|
|
|
}
|
2001-12-11 20:49:49 +00:00
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
return state;
|
2001-12-11 20:49:49 +00:00
|
|
|
}
|
|
|
|
|
2012-06-04 05:41:06 +00:00
|
|
|
PRUint64
|
|
|
|
XULRadioButtonAccessible::NativeInteractiveState() const
|
|
|
|
{
|
|
|
|
return NativelyUnavailable() ? states::UNAVAILABLE : states::FOCUSABLE;
|
|
|
|
}
|
|
|
|
|
2011-09-28 01:46:11 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULRadioButtonAccessible: Widgets
|
2011-09-28 01:46:11 +00:00
|
|
|
|
2012-05-29 01:18:45 +00:00
|
|
|
Accessible*
|
2012-04-12 11:11:40 +00:00
|
|
|
XULRadioButtonAccessible::ContainerWidget() const
|
2011-09-28 01:46:11 +00:00
|
|
|
{
|
|
|
|
return mParent;
|
|
|
|
}
|
|
|
|
|
2007-03-27 12:17:11 +00:00
|
|
|
|
2010-01-06 10:36:50 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULRadioGroupAccessible
|
2010-01-06 10:36:50 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
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.
|
|
|
|
*/
|
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
XULRadioGroupAccessible::
|
2012-05-27 09:01:40 +00:00
|
|
|
XULRadioGroupAccessible(nsIContent* aContent, DocAccessible* aDoc) :
|
2012-02-07 22:38:54 +00:00
|
|
|
XULSelectControlAccessible(aContent, aDoc)
|
2001-12-11 20:49:49 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2012-01-12 03:07:35 +00:00
|
|
|
role
|
2012-04-12 11:11:40 +00:00
|
|
|
XULRadioGroupAccessible::NativeRole()
|
2002-06-21 04:54:34 +00:00
|
|
|
{
|
2012-01-12 03:07:35 +00:00
|
|
|
return roles::GROUPING;
|
2002-06-21 04:54:34 +00:00
|
|
|
}
|
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
PRUint64
|
2012-06-04 05:41:06 +00:00
|
|
|
XULRadioGroupAccessible::NativeInteractiveState() const
|
2002-06-21 04:54:34 +00:00
|
|
|
{
|
2008-11-27 04:04:05 +00:00
|
|
|
// 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.
|
2012-06-04 05:41:06 +00:00
|
|
|
return NativelyUnavailable() ? states::UNAVAILABLE : 0;
|
2002-06-21 04:54:34 +00:00
|
|
|
}
|
2002-01-09 10:02:29 +00:00
|
|
|
|
2011-09-28 01:46:11 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULRadioGroupAccessible: Widgets
|
2011-09-28 01:46:11 +00:00
|
|
|
|
|
|
|
bool
|
2012-04-12 11:11:40 +00:00
|
|
|
XULRadioGroupAccessible::IsWidget() const
|
2011-09-28 01:46:11 +00:00
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2012-04-12 11:11:40 +00:00
|
|
|
XULRadioGroupAccessible::IsActiveWidget() const
|
2011-09-28 01:46:11 +00:00
|
|
|
{
|
|
|
|
return FocusMgr()->HasDOMFocus(mContent);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2012-04-12 11:11:40 +00:00
|
|
|
XULRadioGroupAccessible::AreItemsOperable() const
|
2011-09-28 01:46:11 +00:00
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULStatusBarAccessible
|
2010-06-11 08:23:18 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
XULStatusBarAccessible::
|
2012-05-27 09:01:40 +00:00
|
|
|
XULStatusBarAccessible(nsIContent* aContent, DocAccessible* aDoc) :
|
2012-05-29 01:18:45 +00:00
|
|
|
AccessibleWrap(aContent, aDoc)
|
2010-06-11 08:23:18 +00:00
|
|
|
{
|
2002-01-09 10:02:29 +00:00
|
|
|
}
|
|
|
|
|
2012-01-12 03:07:35 +00:00
|
|
|
role
|
2012-04-12 11:11:40 +00:00
|
|
|
XULStatusBarAccessible::NativeRole()
|
2002-01-09 10:02:29 +00:00
|
|
|
{
|
2012-01-12 03:07:35 +00:00
|
|
|
return roles::STATUSBAR;
|
2002-01-09 10:02:29 +00:00
|
|
|
}
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULToolbarButtonAccessible
|
2010-06-11 08:23:18 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
XULToolbarButtonAccessible::
|
2012-05-27 09:01:40 +00:00
|
|
|
XULToolbarButtonAccessible(nsIContent* aContent, DocAccessible* aDoc) :
|
2012-04-12 11:11:40 +00:00
|
|
|
XULButtonAccessible(aContent, aDoc)
|
2007-07-11 07:58:50 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2010-01-06 10:36:50 +00:00
|
|
|
void
|
2012-04-12 11:11:40 +00:00
|
|
|
XULToolbarButtonAccessible::GetPositionAndSizeInternal(PRInt32* aPosInSet,
|
|
|
|
PRInt32* aSetSize)
|
2007-07-11 07:58:50 +00:00
|
|
|
{
|
|
|
|
PRInt32 setSize = 0;
|
|
|
|
PRInt32 posInSet = 0;
|
|
|
|
|
2012-05-29 01:18:45 +00:00
|
|
|
Accessible* parent = Parent();
|
2011-07-23 08:38:33 +00:00
|
|
|
if (!parent)
|
|
|
|
return;
|
2010-01-11 14:14:06 +00:00
|
|
|
|
2012-05-25 10:53:45 +00:00
|
|
|
PRUint32 childCount = parent->ChildCount();
|
|
|
|
for (PRUint32 childIdx = 0; childIdx < childCount; childIdx++) {
|
2012-05-29 01:18:45 +00:00
|
|
|
Accessible* child = parent->GetChildAt(childIdx);
|
2010-01-11 14:14:06 +00:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool
|
2012-05-29 01:18:45 +00:00
|
|
|
XULToolbarButtonAccessible::IsSeparator(Accessible* aAccessible)
|
2007-07-11 07:58:50 +00:00
|
|
|
{
|
2012-02-07 13:18:33 +00:00
|
|
|
nsIContent* content = aAccessible->GetContent();
|
|
|
|
return content && ((content->Tag() == nsGkAtoms::toolbarseparator) ||
|
|
|
|
(content->Tag() == nsGkAtoms::toolbarspacer) ||
|
|
|
|
(content->Tag() == nsGkAtoms::toolbarspring)); }
|
2007-07-11 07:58:50 +00:00
|
|
|
|
2002-11-06 01:29:58 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULToolbarAccessible
|
2010-06-11 08:23:18 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
XULToolbarAccessible::
|
2012-05-27 09:01:40 +00:00
|
|
|
XULToolbarAccessible(nsIContent* aContent, DocAccessible* aDoc) :
|
2012-05-29 01:18:45 +00:00
|
|
|
AccessibleWrap(aContent, aDoc)
|
2010-06-11 08:23:18 +00:00
|
|
|
{
|
2002-11-06 01:29:58 +00:00
|
|
|
}
|
|
|
|
|
2012-01-12 03:07:35 +00:00
|
|
|
role
|
2012-04-12 11:11:40 +00:00
|
|
|
XULToolbarAccessible::NativeRole()
|
2002-11-06 01:29:58 +00:00
|
|
|
{
|
2012-01-12 03:07:35 +00:00
|
|
|
return roles::TOOLBAR;
|
2002-11-06 01:29:58 +00:00
|
|
|
}
|
|
|
|
|
2010-05-12 07:29:51 +00:00
|
|
|
nsresult
|
2012-04-12 11:11:40 +00:00
|
|
|
XULToolbarAccessible::GetNameInternal(nsAString& aName)
|
2010-05-12 07:29:51 +00:00
|
|
|
{
|
|
|
|
nsAutoString name;
|
2011-06-03 21:35:17 +00:00
|
|
|
if (mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::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
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULToolbarAccessible
|
2010-06-11 08:23:18 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
XULToolbarSeparatorAccessible::
|
2012-05-27 09:01:40 +00:00
|
|
|
XULToolbarSeparatorAccessible(nsIContent* aContent, DocAccessible* aDoc) :
|
2012-02-07 22:38:54 +00:00
|
|
|
nsLeafAccessible(aContent, aDoc)
|
2010-06-11 08:23:18 +00:00
|
|
|
{
|
2002-11-06 01:29:58 +00:00
|
|
|
}
|
|
|
|
|
2012-01-12 03:07:35 +00:00
|
|
|
role
|
2012-04-12 11:11:40 +00:00
|
|
|
XULToolbarSeparatorAccessible::NativeRole()
|
2002-11-06 01:29:58 +00:00
|
|
|
{
|
2012-01-12 03:07:35 +00:00
|
|
|
return roles::SEPARATOR;
|
2002-11-06 01:29:58 +00:00
|
|
|
}
|
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
PRUint64
|
2012-04-12 11:11:40 +00:00
|
|
|
XULToolbarSeparatorAccessible::NativeState()
|
2002-11-06 01:29:58 +00:00
|
|
|
{
|
2011-04-12 06:18:42 +00:00
|
|
|
return 0;
|
2002-11-06 01:29:58 +00:00
|
|
|
}
|
2004-06-02 04:06:28 +00:00
|
|
|
|
2010-02-01 15:22:35 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULTextFieldAccessible
|
2010-02-01 15:22:35 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2004-06-02 04:06:28 +00:00
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
XULTextFieldAccessible::
|
2012-05-27 09:01:40 +00:00
|
|
|
XULTextFieldAccessible(nsIContent* aContent, DocAccessible* aDoc) :
|
2012-05-31 08:04:41 +00:00
|
|
|
HyperTextAccessibleWrap(aContent, aDoc)
|
2006-07-12 13:14:53 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
NS_IMPL_ISUPPORTS_INHERITED3(XULTextFieldAccessible,
|
2012-05-29 01:18:45 +00:00
|
|
|
Accessible,
|
2012-05-31 08:04:41 +00:00
|
|
|
HyperTextAccessible,
|
2012-04-12 11:11:40 +00:00
|
|
|
nsIAccessibleText,
|
|
|
|
nsIAccessibleEditableText)
|
2007-11-09 19:27:07 +00:00
|
|
|
|
2010-02-01 15:22:35 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULTextFieldAccessible: nsIAccessible
|
2010-02-01 15:22:35 +00:00
|
|
|
|
2012-04-09 09:48:41 +00:00
|
|
|
void
|
2012-04-12 11:11:40 +00:00
|
|
|
XULTextFieldAccessible::Value(nsString& aValue)
|
2004-06-02 04:06:28 +00:00
|
|
|
{
|
2012-04-09 09:48:41 +00:00
|
|
|
aValue.Truncate();
|
|
|
|
if (NativeRole() == roles::PASSWORD_TEXT) // Don't return password text!
|
|
|
|
return;
|
2005-01-19 07:10:38 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIDOMXULTextBoxElement> textBox(do_QueryInterface(mContent));
|
2004-06-02 04:06:28 +00:00
|
|
|
if (textBox) {
|
2012-04-09 09:48:41 +00:00
|
|
|
textBox->GetValue(aValue);
|
|
|
|
return;
|
2004-06-02 04:06:28 +00:00
|
|
|
}
|
2012-04-09 09:48:41 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIDOMXULMenuListElement> menuList(do_QueryInterface(mContent));
|
2012-04-09 09:48:41 +00:00
|
|
|
if (menuList)
|
|
|
|
menuList->GetLabel(aValue);
|
2004-06-02 04:06:28 +00:00
|
|
|
}
|
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
void
|
2012-05-17 09:37:37 +00:00
|
|
|
XULTextFieldAccessible::ApplyARIAState(PRUint64* aState) const
|
2009-06-25 02:12:38 +00:00
|
|
|
{
|
2012-05-31 08:04:41 +00:00
|
|
|
HyperTextAccessibleWrap::ApplyARIAState(aState);
|
2009-06-25 02:12:38 +00:00
|
|
|
|
2012-04-05 16:23:30 +00:00
|
|
|
aria::MapToState(aria::eARIAAutoComplete, mContent->AsElement(), aState);
|
2009-06-25 02:12:38 +00:00
|
|
|
}
|
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
PRUint64
|
2012-04-12 11:11:40 +00:00
|
|
|
XULTextFieldAccessible::NativeState()
|
2004-06-02 04:06:28 +00:00
|
|
|
{
|
2012-05-31 08:04:41 +00:00
|
|
|
PRUint64 state = HyperTextAccessibleWrap::NativeState();
|
2004-06-02 04:06:28 +00:00
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
nsCOMPtr<nsIContent> inputField(GetInputField());
|
2011-04-09 23:38:06 +00:00
|
|
|
NS_ENSURE_TRUE(inputField, state);
|
2007-04-02 15:56:24 +00:00
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
// Create a temporary accessible from the HTML text field to get
|
|
|
|
// the accessible state from. Doesn't add to cache into document cache.
|
2012-04-12 11:11:40 +00:00
|
|
|
nsRefPtr<HTMLTextFieldAccessible> tempAccessible =
|
|
|
|
new HTMLTextFieldAccessible(inputField, mDoc);
|
2007-04-23 15:37:55 +00:00
|
|
|
if (!tempAccessible)
|
2011-04-09 23:38:06 +00:00
|
|
|
return state;
|
2011-04-09 23:37:04 +00:00
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
state |= tempAccessible->NativeState();
|
2007-04-02 15:56:24 +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,
|
2011-06-03 21:35:17 +00:00
|
|
|
nsGkAtoms::editable,
|
|
|
|
nsGkAtoms::_true, eIgnoreCase)) {
|
2011-04-09 23:38:06 +00:00
|
|
|
state |= states::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
|
|
|
|
2011-04-09 23:38:06 +00:00
|
|
|
return state;
|
2004-06-02 04:06:28 +00:00
|
|
|
}
|
|
|
|
|
2012-01-12 03:07:35 +00:00
|
|
|
role
|
2012-04-12 11:11:40 +00:00
|
|
|
XULTextFieldAccessible::NativeRole()
|
2006-06-16 17:13:37 +00:00
|
|
|
{
|
2011-06-03 21:35:17 +00:00
|
|
|
if (mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type,
|
|
|
|
nsGkAtoms::password, eIgnoreCase))
|
2012-01-12 03:07:35 +00:00
|
|
|
return roles::PASSWORD_TEXT;
|
|
|
|
|
|
|
|
return roles::ENTRY;
|
2006-06-16 17:13:37 +00:00
|
|
|
}
|
|
|
|
|
2005-04-05 11:16:34 +00:00
|
|
|
/**
|
|
|
|
* Only one actions available
|
|
|
|
*/
|
2011-06-05 19:35:43 +00:00
|
|
|
PRUint8
|
2012-04-12 11:11:40 +00:00
|
|
|
XULTextFieldAccessible::ActionCount()
|
2005-04-05 11:16:34 +00:00
|
|
|
{
|
2011-06-05 19:35:43 +00:00
|
|
|
return 1;
|
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
|
|
|
|
*/
|
2012-04-12 11:11:40 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
XULTextFieldAccessible::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
|
|
|
*/
|
2012-04-12 11:11:40 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
XULTextFieldAccessible::DoAction(PRUint8 index)
|
2005-04-05 11:16:34 +00:00
|
|
|
{
|
|
|
|
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
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool
|
2012-04-12 11:11:40 +00:00
|
|
|
XULTextFieldAccessible::CanHaveAnonChildren()
|
2006-10-30 03:05:43 +00:00
|
|
|
{
|
2011-10-17 14:59:28 +00:00
|
|
|
return false;
|
2006-10-30 03:05:43 +00:00
|
|
|
}
|
|
|
|
|
2012-03-08 03:28:38 +00:00
|
|
|
already_AddRefed<nsIEditor>
|
2012-04-12 11:11:40 +00:00
|
|
|
XULTextFieldAccessible::GetEditor() const
|
2006-07-12 13:14:53 +00:00
|
|
|
{
|
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));
|
2012-03-08 03:28:38 +00:00
|
|
|
if (!editableElt)
|
|
|
|
return nsnull;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIEditor> editor;
|
|
|
|
editableElt->GetEditor(getter_AddRefs(editor));
|
|
|
|
return editor.forget();
|
2006-07-12 13:14:53 +00:00
|
|
|
}
|
2010-02-01 15:22:35 +00:00
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-05-29 01:18:45 +00:00
|
|
|
// XULTextFieldAccessible: Accessible protected
|
2010-02-01 15:22:35 +00:00
|
|
|
|
|
|
|
void
|
2012-04-12 11:11:40 +00:00
|
|
|
XULTextFieldAccessible::CacheChildren()
|
2010-02-01 15:22:35 +00:00
|
|
|
{
|
2012-02-07 22:38:54 +00:00
|
|
|
NS_ENSURE_TRUE(mDoc,);
|
2010-02-01 15:22:35 +00:00
|
|
|
// 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;
|
|
|
|
|
2012-02-09 16:49:17 +00:00
|
|
|
nsAccTreeWalker walker(mDoc, inputContent, false);
|
2010-02-01 15:22:35 +00:00
|
|
|
|
2012-05-29 01:18:45 +00:00
|
|
|
Accessible* child = nsnull;
|
2011-03-31 09:30:58 +00:00
|
|
|
while ((child = walker.NextChild()) && AppendChild(child));
|
2010-02-01 15:22:35 +00:00
|
|
|
}
|
2010-06-11 08:23:18 +00:00
|
|
|
|
2011-10-12 07:39:58 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-05-31 08:04:41 +00:00
|
|
|
// XULTextFieldAccessible: HyperTextAccessible protected
|
2011-10-12 07:39:58 +00:00
|
|
|
|
|
|
|
already_AddRefed<nsFrameSelection>
|
2012-04-12 11:11:40 +00:00
|
|
|
XULTextFieldAccessible::FrameSelection()
|
2011-10-12 07:39:58 +00:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIContent> inputContent(GetInputField());
|
|
|
|
nsIFrame* frame = inputContent->GetPrimaryFrame();
|
2011-10-18 08:45:31 +00:00
|
|
|
return frame ? frame->GetFrameSelection() : nsnull;
|
2011-10-12 07:39:58 +00:00
|
|
|
}
|
|
|
|
|
2010-06-11 08:23:18 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2012-04-12 11:11:40 +00:00
|
|
|
// XULTextFieldAccessible protected
|
2010-06-11 08:23:18 +00:00
|
|
|
|
|
|
|
already_AddRefed<nsIContent>
|
2012-04-12 11:11:40 +00:00
|
|
|
XULTextFieldAccessible::GetInputField() const
|
2010-06-11 08:23:18 +00:00
|
|
|
{
|
|
|
|
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));
|
|
|
|
}
|
|
|
|
|
2012-04-12 11:11:40 +00:00
|
|
|
NS_ASSERTION(inputFieldDOMNode, "No input field for XULTextFieldAccessible");
|
2010-06-11 08:23:18 +00:00
|
|
|
|
|
|
|
nsIContent* inputField = nsnull;
|
|
|
|
if (inputFieldDOMNode)
|
|
|
|
CallQueryInterface(inputFieldDOMNode, &inputField);
|
|
|
|
|
|
|
|
return inputField;
|
|
|
|
}
|