зеркало из https://github.com/mozilla/gecko-dev.git
Bug 289376. Fix description and value for combo boxes. r=louie.zhao, sr=jst. a=asa
This commit is contained in:
Родитель
54394436fc
Коммит
5a752fb290
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче