зеркало из https://github.com/mozilla/pjs.git
bug 102021, xul menulist accessibility support for aaronl
r=jgaunt, sr=hyatt bug 109227, xul tabbox accessibility support r=aaronl, sr=hewitt bug 110800, improper event firing in selects r=dcone, sr=attinasi
This commit is contained in:
Родитель
768d9f413c
Коммит
732bf72a9d
|
@ -56,8 +56,10 @@ interface nsIAccessibilityService : nsISupports
|
||||||
nsIAccessible createXULCheckboxAccessible(in nsIDOMNode aNode);
|
nsIAccessible createXULCheckboxAccessible(in nsIDOMNode aNode);
|
||||||
nsIAccessible createXULColorPickerAccessible(in nsIDOMNode aNode);
|
nsIAccessible createXULColorPickerAccessible(in nsIDOMNode aNode);
|
||||||
nsIAccessible createXULColorPickerTileAccessible(in nsIDOMNode aNode);
|
nsIAccessible createXULColorPickerTileAccessible(in nsIDOMNode aNode);
|
||||||
|
nsIAccessible createXULComboboxAccessible(in nsIDOMNode aNode);
|
||||||
nsIAccessible createXULGroupboxAccessible(in nsIDOMNode aNode);
|
nsIAccessible createXULGroupboxAccessible(in nsIDOMNode aNode);
|
||||||
nsIAccessible createXULImageAccessible(in nsIDOMNode aNode);
|
nsIAccessible createXULImageAccessible(in nsIDOMNode aNode);
|
||||||
|
nsIAccessible createXULListboxAccessible(in nsIDOMNode aNode);
|
||||||
nsIAccessible createXULMenubarAccessible(in nsIDOMNode aNode);
|
nsIAccessible createXULMenubarAccessible(in nsIDOMNode aNode);
|
||||||
nsIAccessible createXULMenuitemAccessible(in nsIDOMNode aNode);
|
nsIAccessible createXULMenuitemAccessible(in nsIDOMNode aNode);
|
||||||
nsIAccessible createXULMenupopupAccessible(in nsIDOMNode aNode);
|
nsIAccessible createXULMenupopupAccessible(in nsIDOMNode aNode);
|
||||||
|
@ -65,6 +67,12 @@ interface nsIAccessibilityService : nsISupports
|
||||||
nsIAccessible createXULProgressMeterAccessible(in nsIDOMNode aNode);
|
nsIAccessible createXULProgressMeterAccessible(in nsIDOMNode aNode);
|
||||||
nsIAccessible createXULRadioButtonAccessible(in nsIDOMNode aNode);
|
nsIAccessible createXULRadioButtonAccessible(in nsIDOMNode aNode);
|
||||||
nsIAccessible createXULRadioGroupAccessible(in nsIDOMNode aNode);
|
nsIAccessible createXULRadioGroupAccessible(in nsIDOMNode aNode);
|
||||||
|
nsIAccessible createXULSelectOptionAccessible(in nsIDOMNode aNode);
|
||||||
|
nsIAccessible createXULSelectListAccessible(in nsIDOMNode aNode);
|
||||||
|
nsIAccessible createXULTabAccessible(in nsIDOMNode aNode);
|
||||||
|
nsIAccessible createXULTabBoxAccessible(in nsIDOMNode aNode);
|
||||||
|
nsIAccessible createXULTabPanelsAccessible(in nsIDOMNode aNode);
|
||||||
|
nsIAccessible createXULTabsAccessible(in nsIDOMNode aNode);
|
||||||
nsIAccessible createXULTextAccessible(in nsIDOMNode aNode);
|
nsIAccessible createXULTextAccessible(in nsIDOMNode aNode);
|
||||||
|
|
||||||
nsIAccessible getAccessibleFor(in nsIDOMNode aNode);
|
nsIAccessible getAccessibleFor(in nsIDOMNode aNode);
|
||||||
|
|
|
@ -38,40 +38,43 @@
|
||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
#include "nsIAccessibilityService.h"
|
// NOTE: alphabetically ordered
|
||||||
#include "nsAccessibilityService.h"
|
#include "nsAccessibilityService.h"
|
||||||
#include "nsAccessible.h"
|
#include "nsAccessible.h"
|
||||||
#include "nsCOMPtr.h"
|
#include "nsCOMPtr.h"
|
||||||
#include "nsIDocument.h"
|
|
||||||
#include "nsIPresShell.h"
|
|
||||||
#include "nsIPresContext.h"
|
|
||||||
#include "nsIContent.h"
|
|
||||||
#include "nsIFrame.h"
|
|
||||||
#include "nsRootAccessible.h"
|
|
||||||
#include "nsINameSpaceManager.h"
|
|
||||||
#include "nsLayoutAtoms.h"
|
|
||||||
#include "nsIDOMNode.h"
|
|
||||||
#include "nsHTMLTextAccessible.h"
|
|
||||||
#include "nsITextContent.h"
|
|
||||||
#include "nsTextFragment.h"
|
|
||||||
#include "nsHTMLTableAccessible.h"
|
|
||||||
#include "nsHTMLImageAccessible.h"
|
|
||||||
#include "nsHTMLAreaAccessible.h"
|
#include "nsHTMLAreaAccessible.h"
|
||||||
|
#include "nsHTMLFormControlAccessible.h"
|
||||||
|
#include "nsHTMLImageAccessible.h"
|
||||||
#include "nsHTMLLinkAccessible.h"
|
#include "nsHTMLLinkAccessible.h"
|
||||||
#include "nsHTMLSelectAccessible.h"
|
#include "nsHTMLSelectAccessible.h"
|
||||||
#include "nsIDOMHTMLAreaElement.h"
|
#include "nsHTMLTableAccessible.h"
|
||||||
#include "nsHTMLFormControlAccessible.h"
|
#include "nsHTMLTextAccessible.h"
|
||||||
|
#include "nsIAccessibilityService.h"
|
||||||
#include "nsIAccessibleProvider.h"
|
#include "nsIAccessibleProvider.h"
|
||||||
#include "nsILink.h"
|
#include "nsIContent.h"
|
||||||
#include "nsIDocShellTreeItem.h"
|
#include "nsIDocShellTreeItem.h"
|
||||||
|
#include "nsIDocument.h"
|
||||||
#include "nsIDOMDocument.h"
|
#include "nsIDOMDocument.h"
|
||||||
|
#include "nsIDOMHTMLAreaElement.h"
|
||||||
#include "nsIDOMHTMLOptionElement.h"
|
#include "nsIDOMHTMLOptionElement.h"
|
||||||
|
#include "nsIDOMNode.h"
|
||||||
#include "nsIDOMXULCheckboxElement.h"
|
#include "nsIDOMXULCheckboxElement.h"
|
||||||
#include "nsXULFormControlAccessible.h"
|
#include "nsIFrame.h"
|
||||||
#include "nsXULColorPickerAccessible.h"
|
#include "nsILink.h"
|
||||||
#include "nsXULTextAccessible.h"
|
#include "nsINameSpaceManager.h"
|
||||||
#include "nsXULMenuAccessible.h"
|
#include "nsIPresContext.h"
|
||||||
|
#include "nsIPresShell.h"
|
||||||
|
#include "nsITextContent.h"
|
||||||
|
#include "nsLayoutAtoms.h"
|
||||||
|
#include "nsRootAccessible.h"
|
||||||
#include "nsString.h"
|
#include "nsString.h"
|
||||||
|
#include "nsTextFragment.h"
|
||||||
|
#include "nsXULColorPickerAccessible.h"
|
||||||
|
#include "nsXULFormControlAccessible.h"
|
||||||
|
#include "nsXULMenuAccessible.h"
|
||||||
|
#include "nsXULSelectAccessible.h"
|
||||||
|
#include "nsXULTabAccessible.h"
|
||||||
|
#include "nsXULTextAccessible.h"
|
||||||
|
|
||||||
// IFrame
|
// IFrame
|
||||||
#include "nsIDocShell.h"
|
#include "nsIDocShell.h"
|
||||||
|
@ -688,6 +691,24 @@ nsAccessibilityService::CreateXULColorPickerTileAccessible(nsIDOMNode *aNode, ns
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsAccessibilityService::CreateXULComboboxAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
|
||||||
|
{
|
||||||
|
#ifdef MOZ_XUL
|
||||||
|
nsCOMPtr<nsIWeakReference> weakShell;
|
||||||
|
GetShellFromNode(aNode, getter_AddRefs(weakShell));
|
||||||
|
|
||||||
|
*_retval = new nsXULComboboxAccessible(aNode, weakShell);
|
||||||
|
if (! *_retval)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
NS_ADDREF(*_retval);
|
||||||
|
#else
|
||||||
|
*_retval = nsnull;
|
||||||
|
#endif // MOZ_XUL
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsAccessibilityService::CreateXULGroupboxAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
|
nsAccessibilityService::CreateXULGroupboxAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
|
||||||
{
|
{
|
||||||
|
@ -737,6 +758,24 @@ nsAccessibilityService::CreateXULImageAccessible(nsIDOMNode *aNode, nsIAccessibl
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsAccessibilityService::CreateXULListboxAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
|
||||||
|
{
|
||||||
|
#ifdef MOZ_XUL
|
||||||
|
nsCOMPtr<nsIWeakReference> weakShell;
|
||||||
|
GetShellFromNode(aNode, getter_AddRefs(weakShell));
|
||||||
|
|
||||||
|
*_retval = new nsXULListboxAccessible(aNode, weakShell);
|
||||||
|
if (! *_retval)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
NS_ADDREF(*_retval);
|
||||||
|
#else
|
||||||
|
*_retval = nsnull;
|
||||||
|
#endif // MOZ_XUL
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsAccessibilityService::CreateXULMenubarAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
|
nsAccessibilityService::CreateXULMenubarAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
|
||||||
{
|
{
|
||||||
|
@ -863,6 +902,42 @@ nsAccessibilityService::CreateXULRadioGroupAccessible(nsIDOMNode *aNode, nsIAcce
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsAccessibilityService::CreateXULSelectListAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
|
||||||
|
{
|
||||||
|
#ifdef MOZ_XUL
|
||||||
|
nsCOMPtr<nsIWeakReference> weakShell;
|
||||||
|
GetShellFromNode(aNode, getter_AddRefs(weakShell));
|
||||||
|
|
||||||
|
*_retval = new nsXULSelectListAccessible(aNode, weakShell);
|
||||||
|
if (! *_retval)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
NS_ADDREF(*_retval);
|
||||||
|
#else
|
||||||
|
*_retval = nsnull;
|
||||||
|
#endif // MOZ_XUL
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsAccessibilityService::CreateXULSelectOptionAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
|
||||||
|
{
|
||||||
|
#ifdef MOZ_XUL
|
||||||
|
nsCOMPtr<nsIWeakReference> weakShell;
|
||||||
|
GetShellFromNode(aNode, getter_AddRefs(weakShell));
|
||||||
|
|
||||||
|
*_retval = new nsXULSelectOptionAccessible(aNode, weakShell);
|
||||||
|
if (! *_retval)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
NS_ADDREF(*_retval);
|
||||||
|
#else
|
||||||
|
*_retval = nsnull;
|
||||||
|
#endif // MOZ_XUL
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsAccessibilityService::CreateXULTextAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
|
nsAccessibilityService::CreateXULTextAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
|
||||||
{
|
{
|
||||||
|
@ -882,6 +957,63 @@ nsAccessibilityService::CreateXULTextAccessible(nsIDOMNode *aNode, nsIAccessible
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** The single tab in a dialog or tabbrowser/editor interface */
|
||||||
|
NS_IMETHODIMP nsAccessibilityService::CreateXULTabAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIWeakReference> weakShell;
|
||||||
|
GetShellFromNode(aNode, getter_AddRefs(weakShell));
|
||||||
|
|
||||||
|
*_retval = new nsXULTabAccessible(aNode, weakShell);
|
||||||
|
if (! *_retval)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
NS_ADDREF(*_retval);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** A combination of a tabs object and a tabpanels object */
|
||||||
|
NS_IMETHODIMP nsAccessibilityService::CreateXULTabBoxAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIWeakReference> weakShell;
|
||||||
|
GetShellFromNode(aNode, getter_AddRefs(weakShell));
|
||||||
|
|
||||||
|
*_retval = new nsXULTabBoxAccessible(aNode, weakShell);
|
||||||
|
if (! *_retval)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
NS_ADDREF(*_retval);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** The display area for a dialog or tabbrowser interface */
|
||||||
|
NS_IMETHODIMP nsAccessibilityService::CreateXULTabPanelsAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIWeakReference> weakShell;
|
||||||
|
GetShellFromNode(aNode, getter_AddRefs(weakShell));
|
||||||
|
|
||||||
|
*_retval = new nsXULTabPanelsAccessible(aNode, weakShell);
|
||||||
|
if (! *_retval)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
NS_ADDREF(*_retval);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** The collection of tab objects, useable in the TabBox and independant of as well */
|
||||||
|
NS_IMETHODIMP nsAccessibilityService::CreateXULTabsAccessible(nsIDOMNode *aNode, nsIAccessible **_retval)
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIWeakReference> weakShell;
|
||||||
|
GetShellFromNode(aNode, getter_AddRefs(weakShell));
|
||||||
|
|
||||||
|
*_retval = new nsXULTabsAccessible(aNode, weakShell);
|
||||||
|
if (! *_retval)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
NS_ADDREF(*_retval);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GetAccessibleFor - get an nsIAccessible from a DOM node
|
* GetAccessibleFor - get an nsIAccessible from a DOM node
|
||||||
*/
|
*/
|
||||||
|
@ -901,7 +1033,7 @@ NS_IMETHODIMP nsAccessibilityService::GetAccessibleFor(nsIDOMNode *aNode,
|
||||||
// Please leave this in for now, it's a convenient debugging method
|
// Please leave this in for now, it's a convenient debugging method
|
||||||
nsAutoString name;
|
nsAutoString name;
|
||||||
aNode->GetLocalName(name);
|
aNode->GetLocalName(name);
|
||||||
if (name.Equals(NS_LITERAL_STRING("browser")))
|
if (name.Equals(NS_LITERAL_STRING("menulist")))
|
||||||
printf("## aaronl debugging\n");
|
printf("## aaronl debugging\n");
|
||||||
#endif
|
#endif
|
||||||
nsCOMPtr<nsIAccessibleProvider> accProv(do_QueryInterface(aNode));
|
nsCOMPtr<nsIAccessibleProvider> accProv(do_QueryInterface(aNode));
|
||||||
|
@ -1031,3 +1163,4 @@ NS_NewAccessibilityService(nsIAccessibilityService** aResult)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -54,14 +54,14 @@
|
||||||
*
|
*
|
||||||
* Listbox:
|
* Listbox:
|
||||||
* - nsHTMLListboxAccessible
|
* - nsHTMLListboxAccessible
|
||||||
* - nsHTMLSelctListAccessible
|
* - nsHTMLSelectListAccessible
|
||||||
* - nsHTMLSelectOptionAccessible
|
* - nsHTMLSelectOptionAccessible
|
||||||
*
|
*
|
||||||
* Comboboxes:
|
* Comboboxes:
|
||||||
* - nsHTMLComboboxAccessilbe
|
* - nsHTMLComboboxAccessible
|
||||||
* - nsHTMLComboboxTextFieldAccessible
|
* - nsHTMLComboboxTextFieldAccessible
|
||||||
* - nsHTMLComboboxButtonAccessible
|
* - nsHTMLComboboxButtonAccessible
|
||||||
* - nsHTMLComboboxWindowAccessilbe
|
* - nsHTMLComboboxWindowAccessible
|
||||||
* - nsHTMLSelectListAccessible
|
* - nsHTMLSelectListAccessible
|
||||||
* - nsHTMLSelectOptionAccessible(s)
|
* - nsHTMLSelectOptionAccessible(s)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -53,6 +53,8 @@ CPPSRCS = \
|
||||||
nsXULColorPickerAccessible.cpp \
|
nsXULColorPickerAccessible.cpp \
|
||||||
nsXULFormControlAccessible.cpp \
|
nsXULFormControlAccessible.cpp \
|
||||||
nsXULMenuAccessible.cpp \
|
nsXULMenuAccessible.cpp \
|
||||||
|
nsXULSelectAccessible.cpp \
|
||||||
|
nsXULTabAccessible.cpp \
|
||||||
nsXULTextAccessible.cpp \
|
nsXULTextAccessible.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,8 @@ CPP_OBJS = \
|
||||||
.\$(OBJDIR)\nsXULColorPickerAccessible.obj \
|
.\$(OBJDIR)\nsXULColorPickerAccessible.obj \
|
||||||
.\$(OBJDIR)\nsXULFormControlAccessible.obj \
|
.\$(OBJDIR)\nsXULFormControlAccessible.obj \
|
||||||
.\$(OBJDIR)\nsXULMenuAccessible.obj \
|
.\$(OBJDIR)\nsXULMenuAccessible.obj \
|
||||||
|
.\$(OBJDIR)\nsXULSelectAccessible.obj \
|
||||||
|
.\$(OBJDIR)\nsXULTabAccessible.obj \
|
||||||
.\$(OBJDIR)\nsXULTextAccessible.obj \
|
.\$(OBJDIR)\nsXULTextAccessible.obj \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,307 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape 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/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is mozilla.org code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Netscape Communications Corporation.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Original Author: Eric Vaughan (evaughan@netscape.com)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the NPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#include "nsCOMPtr.h"
|
||||||
|
#include "nsXULSelectAccessible.h"
|
||||||
|
#include "nsIAccessibilityService.h"
|
||||||
|
#include "nsIFrame.h"
|
||||||
|
#include "nsIComboboxControlFrame.h"
|
||||||
|
#include "nsIDOMEventReceiver.h"
|
||||||
|
#include "nsIListControlFrame.h"
|
||||||
|
#include "nsIDOMXULSelectCntrlItemEl.h"
|
||||||
|
#include "nsIDOMXULSelectCntrlEl.h"
|
||||||
|
#include "nsIServiceManager.h"
|
||||||
|
#include "nsLayoutAtoms.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selects, Listboxes and Comboboxes, are made up of a number of different
|
||||||
|
* widgets, some of which are shared between the two. This file contains
|
||||||
|
* all of the widgets for both of the Selects, for XUL only. Some of them
|
||||||
|
* extend classes from nsSelectAccessible.cpp, which contains base classes
|
||||||
|
* that are also extended by the XUL Select Accessibility support.
|
||||||
|
*
|
||||||
|
* Listbox:
|
||||||
|
* - nsXULListboxAccessible
|
||||||
|
* - nsXULSelectListAccessible
|
||||||
|
* - nsXULSelectOptionAccessible
|
||||||
|
*
|
||||||
|
* Comboboxes:
|
||||||
|
* - nsXULComboboxAccessible
|
||||||
|
* - nsHTMLTextFieldAccessible (editable) or nsTextAccessible (readonly)
|
||||||
|
* - nsXULComboboxButtonAccessible
|
||||||
|
* - nsXULSelectListAccessible
|
||||||
|
* - nsXULSelectOptionAccessible
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** ------------------------------------------------------ */
|
||||||
|
/** First, the common widgets */
|
||||||
|
/** ------------------------------------------------------ */
|
||||||
|
|
||||||
|
/** ----- nsXULSelectListAccessible ----- */
|
||||||
|
|
||||||
|
/** Default Constructor */
|
||||||
|
nsXULSelectListAccessible::nsXULSelectListAccessible(nsIDOMNode* aDOMNode,
|
||||||
|
nsIWeakReference* aShell)
|
||||||
|
:nsAccessible(aDOMNode, aShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP nsXULSelectListAccessible::GetAccRole(PRUint32 *_retval)
|
||||||
|
{
|
||||||
|
*_retval = ROLE_LIST;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* As a nsXULSelectListAccessible we can have the following states:
|
||||||
|
* STATE_MULTISELECTABLE
|
||||||
|
* STATE_EXTSELECTABLE
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP nsXULSelectListAccessible::GetAccState(PRUint32 *_retval)
|
||||||
|
{
|
||||||
|
*_retval = 0;
|
||||||
|
nsAutoString selectionTypeString;
|
||||||
|
nsCOMPtr<nsIDOMElement> element(do_QueryInterface(mDOMNode));
|
||||||
|
NS_ASSERTION(element, "No nsIDOMElement for caption node!");
|
||||||
|
element->GetAttribute(NS_LITERAL_STRING("seltype"), selectionTypeString) ;
|
||||||
|
if (selectionTypeString.EqualsIgnoreCase("multiple"))
|
||||||
|
*_retval |= STATE_MULTISELECTABLE | STATE_EXTSELECTABLE;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** ----- nsXULSelectOptionAccessible ----- */
|
||||||
|
|
||||||
|
/** Default Constructor */
|
||||||
|
nsXULSelectOptionAccessible::nsXULSelectOptionAccessible(nsIDOMNode* aDOMNode, nsIWeakReference* aShell):
|
||||||
|
nsXULMenuitemAccessible(aDOMNode, aShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP nsXULSelectOptionAccessible::GetAccRole(PRUint32 *_retval)
|
||||||
|
{
|
||||||
|
*_retval = ROLE_LISTITEM;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* As a nsXULSelectOptionAccessible we can have the following states:
|
||||||
|
* STATE_SELECTABLE
|
||||||
|
* STATE_SELECTED
|
||||||
|
* STATE_FOCUSED
|
||||||
|
* STATE_FOCUSABLE
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP nsXULSelectOptionAccessible::GetAccState(PRUint32 *_retval)
|
||||||
|
{
|
||||||
|
nsXULMenuitemAccessible::GetAccState(_retval);
|
||||||
|
|
||||||
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> item(do_QueryInterface(mDOMNode));
|
||||||
|
PRBool isSelected = PR_FALSE;
|
||||||
|
item->GetSelected(&isSelected);
|
||||||
|
if (isSelected)
|
||||||
|
*_retval |= STATE_SELECTED;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** ------------------------------------------------------ */
|
||||||
|
/** Secondly, the Listbox widget */
|
||||||
|
/** ------------------------------------------------------ */
|
||||||
|
|
||||||
|
/** ----- nsXULListboxAccessible ----- */
|
||||||
|
|
||||||
|
/** Constructor */
|
||||||
|
nsXULListboxAccessible::nsXULListboxAccessible(nsIDOMNode* aDOMNode, nsIWeakReference* aShell):
|
||||||
|
nsListboxAccessible(aDOMNode, aShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Inherit the ISupports impl from nsAccessible, we handle nsIAccessibleSelectable */
|
||||||
|
NS_IMPL_ISUPPORTS_INHERITED1(nsXULListboxAccessible, nsListboxAccessible, nsIAccessibleSelectable)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Our value is the value of our ( first ) selected child. nsIDOMXULSelectElement
|
||||||
|
* returns this by default with GetValue().
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP nsXULListboxAccessible::GetAccValue(nsAWritableString& _retval)
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIDOMXULSelectControlElement> select(do_QueryInterface(mDOMNode));
|
||||||
|
if (select) {
|
||||||
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> selectedItem;
|
||||||
|
select->GetSelectedItem(getter_AddRefs(selectedItem));
|
||||||
|
return selectedItem->GetValue(_retval);
|
||||||
|
}
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nsIAccessibleSelectable method.
|
||||||
|
* - gets from the Select DOMNode the list of all Select Options
|
||||||
|
* - iterates through all of the options looking for selected Options
|
||||||
|
* - creates IAccessible objects for selected Options
|
||||||
|
* - Returns the IAccessibles for selected Options in the nsISupportsArray
|
||||||
|
*
|
||||||
|
* retval will be nsnull if:
|
||||||
|
* - there are no Options in the Select Element
|
||||||
|
* - there are Options but none are selected
|
||||||
|
* - the DOMNode is not a nsIDOMXULSelectControlElement ( shouldn't happen )
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP nsXULListboxAccessible::GetSelectedChildren(nsISupportsArray **_retval)
|
||||||
|
{
|
||||||
|
*_retval = nsnull;
|
||||||
|
|
||||||
|
nsCOMPtr<nsIAccessibilityService> accService(do_GetService("@mozilla.org/accessibilityService;1"));
|
||||||
|
nsCOMPtr<nsISupportsArray> selectedAccessibles;
|
||||||
|
NS_NewISupportsArray(getter_AddRefs(selectedAccessibles));
|
||||||
|
if (!selectedAccessibles || !accService)
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
nsCOMPtr<nsIDOMNode> optionNode, nextOptionNode;
|
||||||
|
mDOMNode->GetFirstChild(getter_AddRefs(optionNode));
|
||||||
|
|
||||||
|
while (PR_TRUE) {
|
||||||
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> option(do_QueryInterface(optionNode));
|
||||||
|
if (!option)
|
||||||
|
break;
|
||||||
|
PRBool isSelected = PR_FALSE;
|
||||||
|
option->GetSelected(&isSelected);
|
||||||
|
if (isSelected) {
|
||||||
|
nsCOMPtr<nsIAccessible> tempAccessible;
|
||||||
|
accService->CreateXULSelectOptionAccessible(optionNode, getter_AddRefs(tempAccessible));
|
||||||
|
if (tempAccessible)
|
||||||
|
selectedAccessibles->AppendElement(tempAccessible);
|
||||||
|
}
|
||||||
|
|
||||||
|
optionNode->GetNextSibling(getter_AddRefs(nextOptionNode));
|
||||||
|
optionNode = nextOptionNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRUint32 length = 0;
|
||||||
|
selectedAccessibles->Count(&length); // reusing length
|
||||||
|
if ( length != 0 ) { // length of nsISupportsArray containing selected options
|
||||||
|
*_retval = selectedAccessibles;
|
||||||
|
NS_IF_ADDREF(*_retval);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// no options, not a select or none of the options are selected
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** ------------------------------------------------------ */
|
||||||
|
/** Finally, the Combobox widgets */
|
||||||
|
/** ------------------------------------------------------ */
|
||||||
|
|
||||||
|
/** ----- nsXULComboboxAccessible ----- */
|
||||||
|
|
||||||
|
/** Constructor */
|
||||||
|
nsXULComboboxAccessible::nsXULComboboxAccessible(nsIDOMNode* aDOMNode, nsIWeakReference* aShell):
|
||||||
|
nsComboboxAccessible(aDOMNode, aShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Our value is the value of our ( first ) selected child. nsIDOMXULSelectElement
|
||||||
|
* returns this by default with GetValue().
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP nsXULComboboxAccessible::GetAccValue(nsAWritableString& _retval)
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIDOMXULSelectControlElement> select(do_QueryInterface(mDOMNode));
|
||||||
|
if (select) {
|
||||||
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> selectedItem;
|
||||||
|
select->GetSelectedItem(getter_AddRefs(selectedItem));
|
||||||
|
return selectedItem->GetValue(_retval);
|
||||||
|
}
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** -----ComboboxButtonAccessible ----- */
|
||||||
|
|
||||||
|
/** Constructor -- cache our parent */
|
||||||
|
nsXULComboboxButtonAccessible::nsXULComboboxButtonAccessible(nsIAccessible* aParent,
|
||||||
|
nsIDOMNode* aDOMNode,
|
||||||
|
nsIWeakReference* aShell):
|
||||||
|
nsComboboxButtonAccessible(aParent, aDOMNode, aShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Programmaticaly click on the button, causing either the display or
|
||||||
|
* the hiding of the drop down box ( window ).
|
||||||
|
* Walks the Frame tree and checks for proper frames.
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP nsXULComboboxButtonAccessible::AccDoAction(PRUint8 index)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
nsIFrame* frame = nsAccessible::GetBoundsFrame();
|
||||||
|
nsCOMPtr<nsIPresContext> context;
|
||||||
|
GetPresContext(context);
|
||||||
|
if (!context)
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
frame->FirstChild(context, nsnull, &frame);
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (! nsAccessible::IsCorrectFrameType(frame, nsLayoutAtoms::blockFrame))
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
frame->GetNextSibling(&frame);
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (! nsAccessible::IsCorrectFrameType(frame, nsLayoutAtoms::gfxButtonControlFrame))
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
nsCOMPtr<nsIContent> content;
|
||||||
|
frame->GetContent(getter_AddRefs(content));
|
||||||
|
|
||||||
|
// We only have one action, click. Any other index is meaningless(wrong)
|
||||||
|
if (index == eAction_Click) {
|
||||||
|
nsCOMPtr<nsIDOMXULInputElement> element(do_QueryInterface(content));
|
||||||
|
if (element)
|
||||||
|
{
|
||||||
|
element->Click();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,165 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape 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/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is mozilla.org code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Netscape Communications Corporation.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Original Author: Eric Vaughan (evaughan@netscape.com)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the NPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
#ifndef __nsXULSelectAccessible_h__
|
||||||
|
#define __nsXULSelectAccessible_h__
|
||||||
|
|
||||||
|
#include "nsCOMPtr.h"
|
||||||
|
#include "nsIAccessibleSelectable.h"
|
||||||
|
#include "nsIDOMNode.h"
|
||||||
|
#include "nsIWeakReference.h"
|
||||||
|
#include "nsSelectAccessible.h"
|
||||||
|
#include "nsXULMenuAccessible.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selects, Listboxes and Comboboxes, are made up of a number of different
|
||||||
|
* widgets, some of which are shared between the two. This file contains
|
||||||
|
* all of the widgets for both of the Selects, for XUL only. Some of them
|
||||||
|
* extend classes from nsSelectAccessible.cpp, which contains base classes
|
||||||
|
* that are also extended by the XUL Select Accessibility support.
|
||||||
|
*
|
||||||
|
* Listbox:
|
||||||
|
* - nsXULListboxAccessible
|
||||||
|
* - nsXULSelectListAccessible
|
||||||
|
* - nsXULSelectOptionAccessible
|
||||||
|
*
|
||||||
|
* Comboboxes:
|
||||||
|
* - nsXULComboboxAccessible <menulist />
|
||||||
|
* - nsHTMLTextFieldAccessible
|
||||||
|
* - nsXULComboboxButtonAccessible
|
||||||
|
* - nsXULSelectListAccessible <menupopup />
|
||||||
|
* - nsXULSelectOptionAccessible(s) <menuitem />
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** ------------------------------------------------------ */
|
||||||
|
/** First, the common widgets */
|
||||||
|
/** ------------------------------------------------------ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The list that contains all the options in the select.
|
||||||
|
*/
|
||||||
|
class nsXULSelectListAccessible : public nsAccessible
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
nsXULSelectListAccessible(nsIDOMNode* aDOMNode, nsIWeakReference* aShell);
|
||||||
|
virtual ~nsXULSelectListAccessible() {}
|
||||||
|
|
||||||
|
/* ----- nsIAccessible ----- */
|
||||||
|
NS_IMETHOD GetAccRole(PRUint32 *_retval);
|
||||||
|
NS_IMETHOD GetAccState(PRUint32 *_retval);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Options inside the select, contained within the list
|
||||||
|
*/
|
||||||
|
class nsXULSelectOptionAccessible : public nsXULMenuitemAccessible
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
nsXULSelectOptionAccessible(nsIDOMNode* aDOMNode, nsIWeakReference* aShell);
|
||||||
|
virtual ~nsXULSelectOptionAccessible() {}
|
||||||
|
|
||||||
|
/* ----- nsIAccessible ----- */
|
||||||
|
NS_IMETHOD GetAccRole(PRUint32 *_retval);
|
||||||
|
NS_IMETHOD GetAccState(PRUint32 *_retval);
|
||||||
|
|
||||||
|
static nsresult GetFocusedOptionNode(nsIWeakReference *aPresShell, nsIDOMNode *aListNode, nsCOMPtr<nsIDOMNode>& aFocusedOptionNode);
|
||||||
|
};
|
||||||
|
|
||||||
|
/** ------------------------------------------------------ */
|
||||||
|
/** Secondly, the Listbox widget */
|
||||||
|
/** ------------------------------------------------------ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A class the represents the XUL Listbox widget.
|
||||||
|
*/
|
||||||
|
class nsXULListboxAccessible : public nsListboxAccessible,
|
||||||
|
public nsIAccessibleSelectable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
NS_DECL_ISUPPORTS_INHERITED
|
||||||
|
NS_DECL_NSIACCESSIBLESELECTABLE
|
||||||
|
|
||||||
|
nsXULListboxAccessible(nsIDOMNode* aDOMNode, nsIWeakReference* aShell);
|
||||||
|
virtual ~nsXULListboxAccessible() {}
|
||||||
|
|
||||||
|
/* ----- nsIAccessible ----- */
|
||||||
|
NS_IMETHOD GetAccValue(nsAWritableString& _retval);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/** ------------------------------------------------------ */
|
||||||
|
/** Finally, the Combobox widgets */
|
||||||
|
/** ------------------------------------------------------ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A class the represents the XUL Combobox widget.
|
||||||
|
*/
|
||||||
|
class nsXULComboboxAccessible : public nsComboboxAccessible
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
nsXULComboboxAccessible(nsIDOMNode* aDOMNode, nsIWeakReference* aShell);
|
||||||
|
virtual ~nsXULComboboxAccessible() {}
|
||||||
|
|
||||||
|
/* ----- nsIAccessible ----- */
|
||||||
|
NS_IMETHOD GetAccValue(nsAWritableString& _retval);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A class the represents the text field in the Select to the left
|
||||||
|
* of the drop down button
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* A class that represents the button inside the Select to the
|
||||||
|
* right of the text field
|
||||||
|
*/
|
||||||
|
class nsXULComboboxButtonAccessible : public nsComboboxButtonAccessible
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
nsXULComboboxButtonAccessible(nsIAccessible* aParent, nsIDOMNode* aDOMNode, nsIWeakReference* aShell);
|
||||||
|
virtual ~nsXULComboboxButtonAccessible() {}
|
||||||
|
|
||||||
|
/* ----- nsIAccessible ----- */
|
||||||
|
NS_IMETHOD AccDoAction(PRUint8 index);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //__nsXULSelectAccessible_h__
|
|
@ -0,0 +1,211 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape 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/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is mozilla.org code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Netscape Communications Corporation.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Author: John Gaunt (jgaunt@netscape.com)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the NPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
// NOTE: alphabetically ordered
|
||||||
|
#include "nsXULTabAccessible.h"
|
||||||
|
#include "nsIDOMXULSelectCntrlEl.h"
|
||||||
|
#include "nsIDOMXULSelectCntrlItemEl.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* XUL Tab
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Constructor */
|
||||||
|
nsXULTabAccessible::nsXULTabAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell):
|
||||||
|
nsLeafAccessible(aNode, aShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Might need to use the GetXULAccName method from nsFormControlAcc.cpp
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP nsXULTabAccessible::GetAccName(nsAWritableString& _retval)
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> tab(do_QueryInterface(mDOMNode));
|
||||||
|
if (tab)
|
||||||
|
return GetXULAccName(_retval);
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Only one action available */
|
||||||
|
NS_IMETHODIMP nsXULTabAccessible::GetAccNumActions(PRUint8 *_retval)
|
||||||
|
{
|
||||||
|
*_retval = eSingle_Action;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Return the name of our only action */
|
||||||
|
NS_IMETHODIMP nsXULTabAccessible::GetAccActionName(PRUint8 index, nsAWritableString& _retval)
|
||||||
|
{
|
||||||
|
if (index == eAction_Click) {
|
||||||
|
_retval = NS_LITERAL_STRING("switch");
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Tell the tab to do it's action */
|
||||||
|
NS_IMETHODIMP nsXULTabAccessible::AccDoAction(PRUint8 index)
|
||||||
|
{
|
||||||
|
if (index == eAction_Switch) {
|
||||||
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> tab(do_QueryInterface(mDOMNode));
|
||||||
|
if ( tab )
|
||||||
|
{
|
||||||
|
tab->DoCommand();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** We are a tab */
|
||||||
|
NS_IMETHODIMP nsXULTabAccessible::GetAccRole(PRUint32 *_retval)
|
||||||
|
{
|
||||||
|
*_retval = ROLE_PAGETAB;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible states: focused, focusable, unavailable(disabled), offscreen
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP nsXULTabAccessible::GetAccState(PRUint32 *_retval)
|
||||||
|
{
|
||||||
|
// get focus and disable status from base class
|
||||||
|
nsLeafAccessible::GetAccState(_retval);
|
||||||
|
*_retval |= STATE_FOCUSABLE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* XUL TabBox
|
||||||
|
* to facilitate naming of the tabPanels object we will give this the name
|
||||||
|
* of the selected tab in the tabs object.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Constructor */
|
||||||
|
nsXULTabBoxAccessible::nsXULTabBoxAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell):
|
||||||
|
nsAccessible(aNode, aShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/** We are a window*/
|
||||||
|
NS_IMETHODIMP nsXULTabBoxAccessible::GetAccRole(PRUint32 *_retval)
|
||||||
|
{
|
||||||
|
*_retval = ROLE_WINDOW;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Possible states: normal */
|
||||||
|
NS_IMETHODIMP nsXULTabBoxAccessible::GetAccState(PRUint32 *_retval)
|
||||||
|
{
|
||||||
|
*_retval = 0;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 2 children, tabs, tabpanels */
|
||||||
|
NS_IMETHODIMP nsXULTabBoxAccessible::GetAccChildCount(PRInt32 *_retval)
|
||||||
|
{
|
||||||
|
*_retval = 2;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* XUL TabPanels
|
||||||
|
* XXX jgaunt -- this has to report the info for the selected child, reachable through
|
||||||
|
* the DOMNode. The TabPanels object has as its children the different
|
||||||
|
* vbox/hbox/whatevers that provide what you look at when you click on
|
||||||
|
* a tab.
|
||||||
|
* Here is how this will work: when asked about an object the tabPanels object will find
|
||||||
|
* out the selected child and create the tabPanel object using the child. That should wrap
|
||||||
|
* any XUL/HTML content in the child, since it is a simple nsAccessible basically.
|
||||||
|
* or maybe we just do that on creation. Not use the DOMnode we are given, but cache the selected
|
||||||
|
* DOMnode and then run from there.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Constructor */
|
||||||
|
nsXULTabPanelsAccessible::nsXULTabPanelsAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell):
|
||||||
|
nsAccessible(aNode, aShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/** We are a Property Page */
|
||||||
|
NS_IMETHODIMP nsXULTabPanelsAccessible::GetAccRole(PRUint32 *_retval)
|
||||||
|
{
|
||||||
|
*_retval = ROLE_PROPERTYPAGE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible values: focused, focusable, unavailable
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP nsXULTabPanelsAccessible::GetAccState(PRUint32 *_retval)
|
||||||
|
{
|
||||||
|
// get focus and disable status from base class -- skip container because we have state
|
||||||
|
nsAccessible::GetAccState(_retval);
|
||||||
|
*_retval |= STATE_FOCUSABLE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name for the panel is the name from the tab associated with
|
||||||
|
* the panel. XXX not sure if the "panels" object should have the
|
||||||
|
* same name.
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP nsXULTabPanelsAccessible::GetAccName(nsAWritableString& _retval)
|
||||||
|
{
|
||||||
|
return NS_ERROR_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* XUL Tabs - the s really stands for strip. this is a collection of tab objects
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Constructor */
|
||||||
|
nsXULTabsAccessible::nsXULTabsAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell):
|
||||||
|
nsContainerAccessible(aNode, aShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/** We are a Page Tab List */
|
||||||
|
NS_IMETHODIMP nsXULTabsAccessible::GetAccRole(PRUint32 *_retval)
|
||||||
|
{
|
||||||
|
*_retval = ROLE_PAGETABLIST;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape 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/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is mozilla.org code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Netscape Communications Corporation.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Author: John Gaunt (jgaunt@netscape.com)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the NPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#ifndef _nsXULTabAccessible_H_
|
||||||
|
#define _nsXULTabAccessible_H_
|
||||||
|
|
||||||
|
// NOTE: alphabetically ordered
|
||||||
|
#include "nsBaseWidgetAccessible.h"
|
||||||
|
#include "nsFormControlAccessible.h"
|
||||||
|
#include "nsHTMLFormControlAccessible.h"
|
||||||
|
|
||||||
|
/** An individual tab */
|
||||||
|
class nsXULTabAccessible : public nsLeafAccessible
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsXULTabAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell);
|
||||||
|
NS_IMETHOD GetAccRole(PRUint32 *_retval);
|
||||||
|
NS_IMETHOD GetAccName(nsAWritableString& _retval);
|
||||||
|
NS_IMETHOD GetAccState(PRUint32 *_retval);
|
||||||
|
NS_IMETHOD GetAccNumActions(PRUint8 *_retval);
|
||||||
|
NS_IMETHOD GetAccActionName(PRUint8 index, nsAWritableString& _retval);
|
||||||
|
NS_IMETHOD AccDoAction(PRUint8 index);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains a tabs object and a tabPanels object. A complete
|
||||||
|
* entity with relationships between tabs and content to
|
||||||
|
* be displayed in the tabpanels object
|
||||||
|
*/
|
||||||
|
class nsXULTabBoxAccessible : public nsAccessible
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsXULTabBoxAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell);
|
||||||
|
NS_IMETHOD GetAccRole(PRUint32 *_retval);
|
||||||
|
NS_IMETHOD GetAccState(PRUint32 *_retval);
|
||||||
|
NS_IMETHOD GetAccChildCount(PRInt32 *_retval);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the content area associated with the tabs object (when
|
||||||
|
* used together)
|
||||||
|
*/
|
||||||
|
class nsXULTabPanelsAccessible : public nsAccessible
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsXULTabPanelsAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell);
|
||||||
|
NS_IMETHOD GetAccRole(PRUint32 *_retval);
|
||||||
|
NS_IMETHOD GetAccName(nsAWritableString& _retval);
|
||||||
|
NS_IMETHOD GetAccState(PRUint32 *_retval);
|
||||||
|
protected:
|
||||||
|
nsCOMPtr<nsIDOMNode> mGParentDOMNode;
|
||||||
|
nsCOMPtr<nsIDOMNode> mParentDOMNode;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** merely a container of tab obejcts */
|
||||||
|
class nsXULTabsAccessible : public nsContainerAccessible
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsXULTabsAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell);
|
||||||
|
NS_IMETHOD GetAccRole(PRUint32 *_retval);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -3251,7 +3251,7 @@ nsListControlFrame::KeyPress(nsIDOMEvent* aKeyEvent)
|
||||||
PerformSelection(newIndex, isShift, PR_FALSE);
|
PerformSelection(newIndex, isShift, PR_FALSE);
|
||||||
// Dispatch event
|
// Dispatch event
|
||||||
if (mComboboxFrame && mIsAllFramesHere) {
|
if (mComboboxFrame && mIsAllFramesHere) {
|
||||||
mComboboxFrame->UpdateSelection(PR_TRUE, PR_TRUE, newIndex);
|
mComboboxFrame->UpdateSelection(PR_TRUE, PR_FALSE, newIndex);
|
||||||
} else {
|
} else {
|
||||||
UpdateSelection();
|
UpdateSelection();
|
||||||
}
|
}
|
||||||
|
|
|
@ -3251,7 +3251,7 @@ nsListControlFrame::KeyPress(nsIDOMEvent* aKeyEvent)
|
||||||
PerformSelection(newIndex, isShift, PR_FALSE);
|
PerformSelection(newIndex, isShift, PR_FALSE);
|
||||||
// Dispatch event
|
// Dispatch event
|
||||||
if (mComboboxFrame && mIsAllFramesHere) {
|
if (mComboboxFrame && mIsAllFramesHere) {
|
||||||
mComboboxFrame->UpdateSelection(PR_TRUE, PR_TRUE, newIndex);
|
mComboboxFrame->UpdateSelection(PR_TRUE, PR_FALSE, newIndex);
|
||||||
} else {
|
} else {
|
||||||
UpdateSelection();
|
UpdateSelection();
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,8 +14,12 @@
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
|
var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
|
||||||
if (accService) {
|
if (accService) {
|
||||||
return ((this.localName == "menuseparator")? accService.createXULMenuSeparatorAccessible(this):
|
if (this.localName == "menuseparator")
|
||||||
accService.createXULMenuitemAccessible(this));
|
return accService.createXULMenuSeparatorAccessible(this);
|
||||||
|
if (this.parentNode && this.parentNode.parentNode &&
|
||||||
|
this.parentNode.localName == "menupopup" && this.parentNode.parentNode.localName == "menulist")
|
||||||
|
return accService.createXULSelectOptionAccessible(this);
|
||||||
|
return accService.createXULMenuitemAccessible(this);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
]]>
|
]]>
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
</handler>
|
</handler>
|
||||||
</handlers>
|
</handlers>
|
||||||
|
|
||||||
<implementation implements="nsIDOMXULSelectControlElement">
|
<implementation implements="nsIDOMXULSelectControlElement, nsIAccessibleProvider">
|
||||||
<constructor>
|
<constructor>
|
||||||
this.setInitialSelection()
|
this.setInitialSelection()
|
||||||
</constructor>
|
</constructor>
|
||||||
|
@ -218,6 +218,15 @@
|
||||||
]]>
|
]]>
|
||||||
</body>
|
</body>
|
||||||
</method>
|
</method>
|
||||||
|
|
||||||
|
<property name="accessible">
|
||||||
|
<getter>
|
||||||
|
<![CDATA[
|
||||||
|
var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
|
||||||
|
return (accService? accService.createXULComboboxAccessible(this): null);
|
||||||
|
]]>
|
||||||
|
</getter>
|
||||||
|
</property>
|
||||||
</implementation>
|
</implementation>
|
||||||
</binding>
|
</binding>
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
if (this.localName == "popup" || this.localName == "menupopup") {
|
if (this.localName == "popup" || this.localName == "menupopup") {
|
||||||
var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
|
var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
|
||||||
if (accService)
|
if (accService)
|
||||||
return accService.createXULMenupopupAccessible(this);
|
return (this.parentNode.localName == "menulist")? accService.createXULComboboxWindowAccessible: accService.createXULMenupopupAccessible(this);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
]]>
|
]]>
|
||||||
|
|
|
@ -14,7 +14,16 @@
|
||||||
extends="chrome://global/content/bindings/tabbox.xml#tab-base">
|
extends="chrome://global/content/bindings/tabbox.xml#tab-base">
|
||||||
<content orient="vertical"/>
|
<content orient="vertical"/>
|
||||||
|
|
||||||
<implementation>
|
<implementation implements="nsIAccessibleProvider">
|
||||||
|
<property name="accessible">
|
||||||
|
<getter>
|
||||||
|
<![CDATA[
|
||||||
|
var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
|
||||||
|
return (accService? accService.createXULTabBoxAccessible(this): null);
|
||||||
|
]]>
|
||||||
|
</getter>
|
||||||
|
</property>
|
||||||
|
|
||||||
<property name="handleCtrlTab">
|
<property name="handleCtrlTab">
|
||||||
<setter>
|
<setter>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
|
@ -131,7 +140,7 @@
|
||||||
|
|
||||||
<binding id="tabs" display="xul:box"
|
<binding id="tabs" display="xul:box"
|
||||||
extends="chrome://global/content/bindings/tabbox.xml#tab-base">
|
extends="chrome://global/content/bindings/tabbox.xml#tab-base">
|
||||||
<implementation implements="nsIDOMXULSelectControlElement">
|
<implementation implements="nsIDOMXULSelectControlElement, nsIAccessibleProvider">
|
||||||
<constructor>
|
<constructor>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
// first and last tabs need to be able to have unique styles
|
// first and last tabs need to be able to have unique styles
|
||||||
|
@ -154,6 +163,15 @@
|
||||||
]]>
|
]]>
|
||||||
</constructor>
|
</constructor>
|
||||||
|
|
||||||
|
<property name="accessible">
|
||||||
|
<getter>
|
||||||
|
<![CDATA[
|
||||||
|
var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
|
||||||
|
return (accService? accService.createXULTabsAccessible(this): null);
|
||||||
|
]]>
|
||||||
|
</getter>
|
||||||
|
</property>
|
||||||
|
|
||||||
<property name="selectedIndex">
|
<property name="selectedIndex">
|
||||||
<getter>
|
<getter>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
|
@ -303,7 +321,16 @@
|
||||||
|
|
||||||
<binding id="tabpanels"
|
<binding id="tabpanels"
|
||||||
extends="chrome://global/content/bindings/tabbox.xml#tab-base">
|
extends="chrome://global/content/bindings/tabbox.xml#tab-base">
|
||||||
<implementation>
|
<implementation implements="nsIAccessibleProvider">
|
||||||
|
<property name="accessible">
|
||||||
|
<getter>
|
||||||
|
<![CDATA[
|
||||||
|
var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
|
||||||
|
return (accService? accService.createXULTabPanelsAccessible(this): null);
|
||||||
|
]]>
|
||||||
|
</getter>
|
||||||
|
</property>
|
||||||
|
|
||||||
<property name="selectedIndex">
|
<property name="selectedIndex">
|
||||||
<getter>
|
<getter>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
|
@ -355,7 +382,16 @@
|
||||||
</xul:hbox>
|
</xul:hbox>
|
||||||
</content>
|
</content>
|
||||||
|
|
||||||
<implementation>
|
<implementation implements="nsIDOMXULSelectControlItemElement, nsIAccessibleProvider">
|
||||||
|
<property name="accessible">
|
||||||
|
<getter>
|
||||||
|
<![CDATA[
|
||||||
|
var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
|
||||||
|
return (accService? accService.createXULTabAccessible(this): null);
|
||||||
|
]]>
|
||||||
|
</getter>
|
||||||
|
</property>
|
||||||
|
|
||||||
<property name="label">
|
<property name="label">
|
||||||
<getter>
|
<getter>
|
||||||
return this.getAttribute("label");
|
return this.getAttribute("label");
|
||||||
|
|
Загрузка…
Ссылка в новой задаче