Bug 289376. Fix description and value for combo boxes. r=louie.zhao, sr=jst. a=asa

This commit is contained in:
aaronleventhal%moonset.net 2005-05-05 15:05:34 +00:00
Родитель 54394436fc
Коммит 5a752fb290
5 изменённых файлов: 70 добавлений и 5 удалений

Просмотреть файл

@ -869,6 +869,42 @@ NS_IMETHODIMP nsHTMLComboboxAccessible::GetFirstChild(nsIAccessible **aFirstChil
return NS_OK;
}
NS_IMETHODIMP nsHTMLComboboxAccessible::GetDescription(nsAString& aDescription)
{
// Use description of currently focused option
aDescription.Truncate();
nsCOMPtr<nsIAccessible> optionAccessible = GetFocusedOptionAccessible();
NS_ENSURE_TRUE(optionAccessible, NS_ERROR_FAILURE);
return optionAccessible->GetDescription(aDescription);
}
already_AddRefed<nsIAccessible>
nsHTMLComboboxAccessible::GetFocusedOptionAccessible()
{
if (!mWeakShell) {
return nsnull; // Shut down
}
nsCOMPtr<nsIAccessible> listAccessible;
GetLastChild(getter_AddRefs(listAccessible));
nsCOMPtr<nsIAccessNode> listAccessNode(do_QueryInterface(listAccessible));
NS_ASSERTION(listAccessNode, "No list for combobox");
nsCOMPtr<nsIDOMNode> listNode;
listAccessNode->GetDOMNode(getter_AddRefs(listNode));
NS_ASSERTION(listAccessible, "No dom node for listbox");
nsCOMPtr<nsIDOMNode> focusedOptionNode;
nsHTMLSelectOptionAccessible::GetFocusedOptionNode(listNode, getter_AddRefs(focusedOptionNode));
nsCOMPtr<nsIAccessibilityService> accService =
do_GetService("@mozilla.org/accessibilityService;1");
if (!focusedOptionNode || !accService) {
return nsnull;
}
nsIAccessible *optionAccessible;
accService->GetAccessibleInWeakShell(focusedOptionNode, mWeakShell,
&optionAccessible);
return optionAccessible;
}
/**
* MSAA/ATK accessible value != HTML value, especially not in combo boxes.
* Our accessible value is the text label for of our ( first ) selected child.
@ -876,10 +912,10 @@ NS_IMETHODIMP nsHTMLComboboxAccessible::GetFirstChild(nsIAccessible **aFirstChil
*/
NS_IMETHODIMP nsHTMLComboboxAccessible::GetValue(nsAString& aValue)
{
nsCOMPtr<nsIAccessible> textFieldAccessible;
nsresult rv = GetFirstChild(getter_AddRefs(textFieldAccessible));
NS_ENSURE_SUCCESS(rv, rv);
return textFieldAccessible->GetFinalValue(aValue);
// Use label of currently focused option
nsCOMPtr<nsIAccessible> optionAccessible = GetFocusedOptionAccessible();
NS_ENSURE_TRUE(optionAccessible, NS_ERROR_FAILURE);
return optionAccessible->GetName(aValue);
}
/** ----- nsHTMLComboboxTextFieldAccessible ----- */

Просмотреть файл

@ -203,10 +203,13 @@ public:
NS_IMETHOD GetLastChild(nsIAccessible **_retval);
NS_IMETHOD GetFirstChild(nsIAccessible **_retval);
NS_IMETHOD GetValue(nsAString& _retval);
NS_IMETHOD GetDescription(nsAString& aDescription);
NS_IMETHOD Shutdown();
NS_IMETHOD Init();
protected:
already_AddRefed<nsIAccessible> GetFocusedOptionAccessible();
// Hold references to our generated children
// So that we can shut them down when we need to
nsCOMPtr<nsIAccessible> mComboboxTextFieldAccessible;

Просмотреть файл

@ -38,6 +38,7 @@
* ***** END LICENSE BLOCK ***** */
#include "nsXULSelectAccessible.h"
#include "nsAccessibilityService.h"
#include "nsArray.h"
#include "nsIContent.h"
#include "nsIDOMXULMenuListElement.h"
@ -583,6 +584,30 @@ NS_IMETHODIMP nsXULComboboxAccessible::GetValue(nsAString& _retval)
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP nsXULComboboxAccessible::GetDescription(nsAString& aDescription)
{
// Use description of currently focused option
aDescription.Truncate();
nsCOMPtr<nsIDOMXULMenuListElement> menuList(do_QueryInterface(mDOMNode));
if (!menuList) {
return NS_ERROR_FAILURE; // Shut down
}
nsCOMPtr<nsIDOMXULSelectControlItemElement> focusedOption;
menuList->GetSelectedItem(getter_AddRefs(focusedOption));
nsCOMPtr<nsIDOMNode> focusedOptionNode(do_QueryInterface(focusedOption));
if (focusedOptionNode) {
nsCOMPtr<nsIAccessibilityService> accService =
do_GetService("@mozilla.org/accessibilityService;1");
NS_ENSURE_TRUE(accService, NS_ERROR_FAILURE);
nsCOMPtr<nsIAccessible> focusedOptionAccessible;
accService->GetAccessibleInWeakShell(focusedOptionNode, mWeakShell,
getter_AddRefs(focusedOptionAccessible));
NS_ENSURE_TRUE(focusedOptionAccessible, NS_ERROR_FAILURE);
return focusedOptionAccessible->GetDescription(aDescription);
}
return NS_OK;
}
NS_IMETHODIMP nsXULComboboxAccessible::GetChildCount(PRInt32 *aAccChildCount)
{
// Set menugenerated="true" on the menupopup node to generate the

Просмотреть файл

@ -181,6 +181,7 @@ public:
NS_IMETHOD GetState(PRUint32 *_retval);
NS_IMETHOD GetValue(nsAString& _retval);
NS_IMETHOD GetDescription(nsAString& aDescription);
};
#endif

Просмотреть файл

@ -2463,9 +2463,9 @@ nsComboboxControlFrame::OnOptionSelected(nsPresContext* aPresContext,
} else {
if (aSelected) {
RedisplayText(aIndex);
FireValueChangeEvent();
} else {
RedisplaySelectedText();
FireValueChangeEvent(); // Fire after old option is unselected
}
}