From 7fadcad2790ed1abbba2c5500c837f176e012554 Mon Sep 17 00:00:00 2001 From: "louie.zhao%sun.com" Date: Tue, 1 Feb 2005 09:35:28 +0000 Subject: [PATCH] bug257638 [ATK] Menu Item doesn't work properly r = pkwarren sr = Henry.Jia --- accessible/public/nsIAccessible.idl | 2 ++ accessible/src/xul/nsXULMenuAccessible.cpp | 30 +++++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/accessible/public/nsIAccessible.idl b/accessible/public/nsIAccessible.idl index 898e954fe3f..a64a905680c 100644 --- a/accessible/public/nsIAccessible.idl +++ b/accessible/public/nsIAccessible.idl @@ -480,6 +480,8 @@ interface nsIAccessible : nsISupports enum { ROLE_CLIENT = 10U }; enum { ROLE_MENUPOPUP = 11U }; enum { ROLE_MENUITEM = 12U }; + enum { ROLE_RADIO_MENUITEM = 12U }; // Same as ROLE_MENUITEM + enum { ROLE_CHECK_MENUITEM = 12U }; // Same as ROLE_MENUITEM enum { ROLE_TOOLTIP = 13U }; enum { ROLE_APPLICATION = 14U }; enum { ROLE_DOCUMENT = 15U }; diff --git a/accessible/src/xul/nsXULMenuAccessible.cpp b/accessible/src/xul/nsXULMenuAccessible.cpp index 97435173e54..dd666eff837 100644 --- a/accessible/src/xul/nsXULMenuAccessible.cpp +++ b/accessible/src/xul/nsXULMenuAccessible.cpp @@ -44,6 +44,10 @@ #include "nsIPrefService.h" #include "nsIPrefBranch.h" #include "nsIServiceManager.h" +#include "nsIPresShell.h" +#include "nsIContent.h" +#include "nsGUIEvent.h" + // ------------------------ Menu Item ----------------------------- @@ -75,16 +79,18 @@ NS_IMETHODIMP nsXULMenuitemAccessible::GetState(PRUint32 *_retval) if (!menuItemType.IsEmpty()) { // Selectable? - if (menuItemType.EqualsLiteral("radio")) + if (menuItemType.EqualsIgnoreCase("radio") || + menuItemType.EqualsIgnoreCase("checkbox")) *_retval |= STATE_SELECTABLE; // Checked? PRBool isChecked = PR_FALSE; element->HasAttribute(NS_LITERAL_STRING("checked"), &isChecked); if (isChecked) { - if (*_retval & STATE_SELECTABLE) - *_retval |= STATE_SELECTED; // Use STATE_SELECTED for radio buttons - else *_retval |= STATE_CHECKED; + nsAutoString checkValue; + element->GetAttribute(NS_LITERAL_STRING("checked"), checkValue); + if (!checkValue.EqualsIgnoreCase("false")) + *_retval |= STATE_CHECKED; } } @@ -173,6 +179,14 @@ NS_IMETHODIMP nsXULMenuitemAccessible::GetKeyBinding(nsAString& _retval) NS_IMETHODIMP nsXULMenuitemAccessible::GetRole(PRUint32 *_retval) { *_retval = ROLE_MENUITEM; + nsCOMPtr element(do_QueryInterface(mDOMNode)); + NS_ASSERTION(element, "No DOM element for menu node!"); + nsAutoString menuItemType; + element->GetAttribute(NS_LITERAL_STRING("type"), menuItemType); + if (menuItemType.EqualsIgnoreCase("radio")) + *_retval = ROLE_RADIO_MENU_ITEM; + else if (menuItemType.EqualsIgnoreCase("checkbox")) + *_retval = ROLE_CHECK_MENU_ITEM; return NS_OK; } @@ -203,6 +217,14 @@ NS_IMETHODIMP nsXULMenuitemAccessible::GetChildCount(PRInt32 *aAccChildCount) element->SetAttribute(NS_LITERAL_STRING("menugenerated"), NS_LITERAL_STRING("true")); } } + // fire a popup dom event + nsEventStatus status = nsEventStatus_eIgnore; + nsMouseEvent event(NS_XUL_POPUP_SHOWING); + + nsCOMPtr presShell(do_QueryReferent(mWeakShell)); + nsCOMPtr content(do_QueryInterface(childNode)); + if (presShell && content) + presShell->HandleDOMEventWithTarget(content, &event, &status); } }