From 81cd248f48b3c409046f29e1893cd9dde491e384 Mon Sep 17 00:00:00 2001 From: "aaronleventhal%moonset.net" Date: Wed, 2 Mar 2005 18:59:41 +0000 Subject: [PATCH] Bug 283703. Focus events not fired for radio buttons. r=pkw, sr=bz --- accessible/src/base/nsRootAccessible.cpp | 26 ++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/accessible/src/base/nsRootAccessible.cpp b/accessible/src/base/nsRootAccessible.cpp index ba51693faf55..47fb6cf457d8 100644 --- a/accessible/src/base/nsRootAccessible.cpp +++ b/accessible/src/base/nsRootAccessible.cpp @@ -50,8 +50,8 @@ #include "nsIDOMHTMLSelectElement.h" #include "nsIDOMNSEvent.h" #include "nsIDOMWindow.h" +#include "nsIDOMXULMenuListElement.h" #include "nsIDOMXULMultSelectCntrlEl.h" -#include "nsIDOMXULSelectCntrlEl.h" #include "nsIDOMXULSelectCntrlItemEl.h" #include "nsIDocument.h" #include "nsIHTMLDocument.h" @@ -336,7 +336,9 @@ void nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *aAccessible, nsID aAccessible->GetFinalRole(&role); // Fire focus if it changes, but always fire focus events for menu items - PRBool fireFocus = gLastFocusedNode != aNode || (role == ROLE_MENUITEM); + if (gLastFocusedNode == aNode && role != ROLE_MENUITEM) { + return; + } NS_IF_RELEASE(gLastFocusedNode); gLastFocusedNode = aNode; @@ -646,6 +648,26 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent) } } else if (eventType.LowerCaseEqualsLiteral("focus")) { + nsCOMPtr selectControl = + do_QueryInterface(targetNode); + // Send focus to individual radio button or selected item + if (selectControl) { + nsCOMPtr menuList = + do_QueryInterface(targetNode); + if (!menuList) { + // Don't do this for menu lists, the items only get focused + // when the list is open, based on DOMMenuitemActive events + nsCOMPtr selectedItem; + selectControl->GetSelectedItem(getter_AddRefs(selectedItem)); + targetNode = do_QueryInterface(selectedItem); + + if (!targetNode || + NS_FAILED(mAccService->GetAccessibleInShell(targetNode, eventShell, + getter_AddRefs(accessible)))) { + return NS_OK; + } + } + } FireAccessibleFocusEvent(accessible, targetNode); } else if (eventType.LowerCaseEqualsLiteral("valuechange")) {