diff --git a/mozilla/accessible/public/nsIAccessibilityService.idl b/mozilla/accessible/public/nsIAccessibilityService.idl index a88e4851324..a83cdca8b87 100644 --- a/mozilla/accessible/public/nsIAccessibilityService.idl +++ b/mozilla/accessible/public/nsIAccessibilityService.idl @@ -56,8 +56,10 @@ interface nsIAccessibilityService : nsISupports nsIAccessible createXULCheckboxAccessible(in nsIDOMNode aNode); nsIAccessible createXULColorPickerAccessible(in nsIDOMNode aNode); nsIAccessible createXULColorPickerTileAccessible(in nsIDOMNode aNode); + nsIAccessible createXULComboboxAccessible(in nsIDOMNode aNode); nsIAccessible createXULGroupboxAccessible(in nsIDOMNode aNode); nsIAccessible createXULImageAccessible(in nsIDOMNode aNode); + nsIAccessible createXULListboxAccessible(in nsIDOMNode aNode); nsIAccessible createXULMenubarAccessible(in nsIDOMNode aNode); nsIAccessible createXULMenuitemAccessible(in nsIDOMNode aNode); nsIAccessible createXULMenupopupAccessible(in nsIDOMNode aNode); @@ -65,6 +67,12 @@ interface nsIAccessibilityService : nsISupports nsIAccessible createXULProgressMeterAccessible(in nsIDOMNode aNode); nsIAccessible createXULRadioButtonAccessible(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 getAccessibleFor(in nsIDOMNode aNode); diff --git a/mozilla/accessible/src/base/nsAccessibilityService.cpp b/mozilla/accessible/src/base/nsAccessibilityService.cpp index 2e7b70e71b5..a0cc8e31b4f 100644 --- a/mozilla/accessible/src/base/nsAccessibilityService.cpp +++ b/mozilla/accessible/src/base/nsAccessibilityService.cpp @@ -38,40 +38,43 @@ * * ***** END LICENSE BLOCK ***** */ -#include "nsIAccessibilityService.h" +// NOTE: alphabetically ordered #include "nsAccessibilityService.h" #include "nsAccessible.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 "nsHTMLFormControlAccessible.h" +#include "nsHTMLImageAccessible.h" #include "nsHTMLLinkAccessible.h" #include "nsHTMLSelectAccessible.h" -#include "nsIDOMHTMLAreaElement.h" -#include "nsHTMLFormControlAccessible.h" +#include "nsHTMLTableAccessible.h" +#include "nsHTMLTextAccessible.h" +#include "nsIAccessibilityService.h" #include "nsIAccessibleProvider.h" -#include "nsILink.h" +#include "nsIContent.h" #include "nsIDocShellTreeItem.h" +#include "nsIDocument.h" #include "nsIDOMDocument.h" +#include "nsIDOMHTMLAreaElement.h" #include "nsIDOMHTMLOptionElement.h" +#include "nsIDOMNode.h" #include "nsIDOMXULCheckboxElement.h" -#include "nsXULFormControlAccessible.h" -#include "nsXULColorPickerAccessible.h" -#include "nsXULTextAccessible.h" -#include "nsXULMenuAccessible.h" +#include "nsIFrame.h" +#include "nsILink.h" +#include "nsINameSpaceManager.h" +#include "nsIPresContext.h" +#include "nsIPresShell.h" +#include "nsITextContent.h" +#include "nsLayoutAtoms.h" +#include "nsRootAccessible.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 #include "nsIDocShell.h" @@ -688,6 +691,24 @@ nsAccessibilityService::CreateXULColorPickerTileAccessible(nsIDOMNode *aNode, ns return NS_OK; } +NS_IMETHODIMP +nsAccessibilityService::CreateXULComboboxAccessible(nsIDOMNode *aNode, nsIAccessible **_retval) +{ +#ifdef MOZ_XUL + nsCOMPtr 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 nsAccessibilityService::CreateXULGroupboxAccessible(nsIDOMNode *aNode, nsIAccessible **_retval) { @@ -737,6 +758,24 @@ nsAccessibilityService::CreateXULImageAccessible(nsIDOMNode *aNode, nsIAccessibl return NS_OK; } +NS_IMETHODIMP +nsAccessibilityService::CreateXULListboxAccessible(nsIDOMNode *aNode, nsIAccessible **_retval) +{ +#ifdef MOZ_XUL + nsCOMPtr 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 nsAccessibilityService::CreateXULMenubarAccessible(nsIDOMNode *aNode, nsIAccessible **_retval) { @@ -863,6 +902,42 @@ nsAccessibilityService::CreateXULRadioGroupAccessible(nsIDOMNode *aNode, nsIAcce return NS_OK; } +NS_IMETHODIMP +nsAccessibilityService::CreateXULSelectListAccessible(nsIDOMNode *aNode, nsIAccessible **_retval) +{ +#ifdef MOZ_XUL + nsCOMPtr 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 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 nsAccessibilityService::CreateXULTextAccessible(nsIDOMNode *aNode, nsIAccessible **_retval) { @@ -882,6 +957,63 @@ nsAccessibilityService::CreateXULTextAccessible(nsIDOMNode *aNode, nsIAccessible return NS_OK; } +/** The single tab in a dialog or tabbrowser/editor interface */ +NS_IMETHODIMP nsAccessibilityService::CreateXULTabAccessible(nsIDOMNode *aNode, nsIAccessible **_retval) +{ + nsCOMPtr 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 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 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 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 */ @@ -901,7 +1033,7 @@ NS_IMETHODIMP nsAccessibilityService::GetAccessibleFor(nsIDOMNode *aNode, // Please leave this in for now, it's a convenient debugging method nsAutoString name; aNode->GetLocalName(name); - if (name.Equals(NS_LITERAL_STRING("browser"))) + if (name.Equals(NS_LITERAL_STRING("menulist"))) printf("## aaronl debugging\n"); #endif nsCOMPtr accProv(do_QueryInterface(aNode)); @@ -1031,3 +1163,4 @@ NS_NewAccessibilityService(nsIAccessibilityService** aResult) return NS_OK; } + diff --git a/mozilla/accessible/src/html/nsHTMLSelectAccessible.h b/mozilla/accessible/src/html/nsHTMLSelectAccessible.h index 851c5edb044..315681d46ad 100644 --- a/mozilla/accessible/src/html/nsHTMLSelectAccessible.h +++ b/mozilla/accessible/src/html/nsHTMLSelectAccessible.h @@ -54,14 +54,14 @@ * * Listbox: * - nsHTMLListboxAccessible - * - nsHTMLSelctListAccessible + * - nsHTMLSelectListAccessible * - nsHTMLSelectOptionAccessible * * Comboboxes: - * - nsHTMLComboboxAccessilbe + * - nsHTMLComboboxAccessible * - nsHTMLComboboxTextFieldAccessible * - nsHTMLComboboxButtonAccessible - * - nsHTMLComboboxWindowAccessilbe + * - nsHTMLComboboxWindowAccessible * - nsHTMLSelectListAccessible * - nsHTMLSelectOptionAccessible(s) */ diff --git a/mozilla/accessible/src/xul/Makefile.in b/mozilla/accessible/src/xul/Makefile.in index 56e0e273279..30b23335b41 100644 --- a/mozilla/accessible/src/xul/Makefile.in +++ b/mozilla/accessible/src/xul/Makefile.in @@ -53,6 +53,8 @@ CPPSRCS = \ nsXULColorPickerAccessible.cpp \ nsXULFormControlAccessible.cpp \ nsXULMenuAccessible.cpp \ + nsXULSelectAccessible.cpp \ + nsXULTabAccessible.cpp \ nsXULTextAccessible.cpp \ $(NULL) diff --git a/mozilla/accessible/src/xul/makefile.win b/mozilla/accessible/src/xul/makefile.win index e72601c2a0b..4ec253f5371 100755 --- a/mozilla/accessible/src/xul/makefile.win +++ b/mozilla/accessible/src/xul/makefile.win @@ -47,6 +47,8 @@ CPP_OBJS = \ .\$(OBJDIR)\nsXULColorPickerAccessible.obj \ .\$(OBJDIR)\nsXULFormControlAccessible.obj \ .\$(OBJDIR)\nsXULMenuAccessible.obj \ + .\$(OBJDIR)\nsXULSelectAccessible.obj \ + .\$(OBJDIR)\nsXULTabAccessible.obj \ .\$(OBJDIR)\nsXULTextAccessible.obj \ $(NULL) diff --git a/mozilla/accessible/src/xul/nsXULSelectAccessible.cpp b/mozilla/accessible/src/xul/nsXULSelectAccessible.cpp new file mode 100644 index 00000000000..7439e839f16 --- /dev/null +++ b/mozilla/accessible/src/xul/nsXULSelectAccessible.cpp @@ -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 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 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 select(do_QueryInterface(mDOMNode)); + if (select) { + nsCOMPtr 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 accService(do_GetService("@mozilla.org/accessibilityService;1")); + nsCOMPtr selectedAccessibles; + NS_NewISupportsArray(getter_AddRefs(selectedAccessibles)); + if (!selectedAccessibles || !accService) + return NS_ERROR_FAILURE; + + nsCOMPtr optionNode, nextOptionNode; + mDOMNode->GetFirstChild(getter_AddRefs(optionNode)); + + while (PR_TRUE) { + nsCOMPtr option(do_QueryInterface(optionNode)); + if (!option) + break; + PRBool isSelected = PR_FALSE; + option->GetSelected(&isSelected); + if (isSelected) { + nsCOMPtr 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 select(do_QueryInterface(mDOMNode)); + if (select) { + nsCOMPtr 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 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 content; + frame->GetContent(getter_AddRefs(content)); + + // We only have one action, click. Any other index is meaningless(wrong) + if (index == eAction_Click) { + nsCOMPtr element(do_QueryInterface(content)); + if (element) + { + element->Click(); + return NS_OK; + } + return NS_ERROR_FAILURE; + } + */ + return NS_ERROR_INVALID_ARG; +} + diff --git a/mozilla/accessible/src/xul/nsXULSelectAccessible.h b/mozilla/accessible/src/xul/nsXULSelectAccessible.h new file mode 100644 index 00000000000..bab31872009 --- /dev/null +++ b/mozilla/accessible/src/xul/nsXULSelectAccessible.h @@ -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 + * - nsHTMLTextFieldAccessible + * - nsXULComboboxButtonAccessible + * - nsXULSelectListAccessible + * - nsXULSelectOptionAccessible(s) + */ + +/** ------------------------------------------------------ */ +/** 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& 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__ diff --git a/mozilla/accessible/src/xul/nsXULTabAccessible.cpp b/mozilla/accessible/src/xul/nsXULTabAccessible.cpp new file mode 100644 index 00000000000..f28d60648de --- /dev/null +++ b/mozilla/accessible/src/xul/nsXULTabAccessible.cpp @@ -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 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 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; +} diff --git a/mozilla/accessible/src/xul/nsXULTabAccessible.h b/mozilla/accessible/src/xul/nsXULTabAccessible.h new file mode 100644 index 00000000000..170a280399b --- /dev/null +++ b/mozilla/accessible/src/xul/nsXULTabAccessible.h @@ -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 mGParentDOMNode; + nsCOMPtr mParentDOMNode; +}; + +/** merely a container of tab obejcts */ +class nsXULTabsAccessible : public nsContainerAccessible +{ +public: + nsXULTabsAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell); + NS_IMETHOD GetAccRole(PRUint32 *_retval); +}; + +#endif diff --git a/mozilla/layout/forms/nsListControlFrame.cpp b/mozilla/layout/forms/nsListControlFrame.cpp index a17f072cde5..fe0331486ea 100644 --- a/mozilla/layout/forms/nsListControlFrame.cpp +++ b/mozilla/layout/forms/nsListControlFrame.cpp @@ -3251,7 +3251,7 @@ nsListControlFrame::KeyPress(nsIDOMEvent* aKeyEvent) PerformSelection(newIndex, isShift, PR_FALSE); // Dispatch event if (mComboboxFrame && mIsAllFramesHere) { - mComboboxFrame->UpdateSelection(PR_TRUE, PR_TRUE, newIndex); + mComboboxFrame->UpdateSelection(PR_TRUE, PR_FALSE, newIndex); } else { UpdateSelection(); } diff --git a/mozilla/layout/html/forms/src/nsListControlFrame.cpp b/mozilla/layout/html/forms/src/nsListControlFrame.cpp index a17f072cde5..fe0331486ea 100644 --- a/mozilla/layout/html/forms/src/nsListControlFrame.cpp +++ b/mozilla/layout/html/forms/src/nsListControlFrame.cpp @@ -3251,7 +3251,7 @@ nsListControlFrame::KeyPress(nsIDOMEvent* aKeyEvent) PerformSelection(newIndex, isShift, PR_FALSE); // Dispatch event if (mComboboxFrame && mIsAllFramesHere) { - mComboboxFrame->UpdateSelection(PR_TRUE, PR_TRUE, newIndex); + mComboboxFrame->UpdateSelection(PR_TRUE, PR_FALSE, newIndex); } else { UpdateSelection(); } diff --git a/mozilla/xpfe/global/resources/content/bindings/menu.xml b/mozilla/xpfe/global/resources/content/bindings/menu.xml index 4010fa917c3..fafb863fc68 100644 --- a/mozilla/xpfe/global/resources/content/bindings/menu.xml +++ b/mozilla/xpfe/global/resources/content/bindings/menu.xml @@ -14,8 +14,12 @@ diff --git a/mozilla/xpfe/global/resources/content/bindings/menulist.xml b/mozilla/xpfe/global/resources/content/bindings/menulist.xml index 106fd5abc27..15e425b4471 100644 --- a/mozilla/xpfe/global/resources/content/bindings/menulist.xml +++ b/mozilla/xpfe/global/resources/content/bindings/menulist.xml @@ -37,7 +37,7 @@ - + this.setInitialSelection() @@ -218,6 +218,15 @@ ]]> + + + + + + diff --git a/mozilla/xpfe/global/resources/content/bindings/popup.xml b/mozilla/xpfe/global/resources/content/bindings/popup.xml index 940f3209931..4b1f0477095 100644 --- a/mozilla/xpfe/global/resources/content/bindings/popup.xml +++ b/mozilla/xpfe/global/resources/content/bindings/popup.xml @@ -24,7 +24,7 @@ if (this.localName == "popup" || this.localName == "menupopup") { var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService); if (accService) - return accService.createXULMenupopupAccessible(this); + return (this.parentNode.localName == "menulist")? accService.createXULComboboxWindowAccessible: accService.createXULMenupopupAccessible(this); } return null; ]]> diff --git a/mozilla/xpfe/global/resources/content/bindings/tabbox.xml b/mozilla/xpfe/global/resources/content/bindings/tabbox.xml index 5d9d1bce404..e59224e1df6 100644 --- a/mozilla/xpfe/global/resources/content/bindings/tabbox.xml +++ b/mozilla/xpfe/global/resources/content/bindings/tabbox.xml @@ -14,7 +14,16 @@ extends="chrome://global/content/bindings/tabbox.xml#tab-base"> - + + + + + + + - + + + + + + + - + + + + + + + - + + + + + + + return this.getAttribute("label");