Context menus don't work with screen readers starting on 09/21. r=parente, sr=bryner

This commit is contained in:
aaronleventhal%moonset.net 2005-09-30 19:23:42 +00:00
Родитель bb7e1cb9f9
Коммит d5b314ea93
2 изменённых файлов: 37 добавлений и 16 удалений

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

@ -56,6 +56,7 @@
#include "nsIDOMNSHTMLDocument.h"
#include "nsIDOMMutationEvent.h"
#include "nsIDOMWindow.h"
#include "nsIDOMXULPopupElement.h"
#include "nsIEditingSession.h"
#include "nsIEventStateManager.h"
#include "nsIFrame.h"
@ -108,6 +109,16 @@ nsDocAccessible::nsDocAccessible(nsIDOMNode *aDOMNode, nsIWeakReference* aShell)
// XXX aaronl should we use an algorithm for the initial cache size?
mAccessNodeCache.Init(kDefaultCacheSize);
nsCOMPtr<nsIDocShellTreeItem> docShellTreeItem =
GetDocShellTreeItemFor(mDOMNode);
if (docShellTreeItem) {
PRInt32 itemType;
docShellTreeItem->GetItemType(&itemType);
if (itemType == nsIDocShellTreeItem::typeChrome) {
mIsContentLoaded = PR_TRUE;
}
}
}
//-----------------------------------------------------
@ -987,7 +998,14 @@ void nsDocAccessible::RefreshNodes(nsIDOMNode *aStartNode, PRUint32 aChangeEvent
PRUint32 role, event = 0;
accessible->GetFinalRole(&role);
if (role == ROLE_MENUPOPUP) {
event = nsIAccessibleEvent::EVENT_MENUPOPUPEND;
nsCOMPtr<nsIDOMNode> domNode;
accessNode->GetDOMNode(getter_AddRefs(domNode));
nsCOMPtr<nsIDOMXULPopupElement> popup(do_QueryInterface(domNode));
if (!popup) {
// Popup elements already fire these via DOMMenuInactive
// handling in nsRootAccessible::HandleEvent
event = nsIAccessibleEvent::EVENT_MENUPOPUPEND;
}
}
else if (role == ROLE_PROGRESSBAR && iterNode != aStartNode) {
// Make sure EVENT_HIDE gets fired for progress meters
@ -1124,7 +1142,7 @@ NS_IMETHODIMP nsDocAccessible::InvalidateCacheSubtree(nsIContent *aChild,
if (aChangeEventType == nsIAccessibleEvent::EVENT_SHOW && aChild) {
// Fire EVENT_SHOW, EVENT_MENUPOPUPSTART or EVENT_ALERT event for
// newly visible content. Create new accessible if necessary to do so.
// newly visible content.
nsAutoString role;
aChild->GetAttr(kNameSpaceID_XHTML2_Unofficial, nsAccessibilityAtoms::role, role);
PRUint32 event = 0;

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

@ -53,6 +53,7 @@
#include "nsIDOMXULMenuListElement.h"
#include "nsIDOMXULMultSelectCntrlEl.h"
#include "nsIDOMXULSelectCntrlItemEl.h"
#include "nsIDOMXULPopupElement.h"
#include "nsIDocument.h"
#include "nsIEventListenerManager.h"
#include "nsIHTMLDocument.h"
@ -575,6 +576,17 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent)
return NS_OK;
}
if (eventType.LowerCaseEqualsLiteral("popupshown")) {
// Fire menupopupstart events after a delay so that ancestor views
// are visible, otherwise an accessible cannot be created for the
// popup and the accessibility toolkit event can't be fired.
nsCOMPtr<nsIDOMXULPopupElement> popup(do_QueryInterface(targetNode));
if (popup) {
return FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_MENUPOPUPSTART,
targetNode, nsnull);
}
}
nsCOMPtr<nsIAccessible> accessible;
if (NS_FAILED(mAccService->GetAccessibleInShell(targetNode, eventShell,
getter_AddRefs(accessible))))
@ -766,20 +778,11 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent)
else if (eventType.LowerCaseEqualsLiteral("domcontentloaded")) {
TryFireEarlyLoadEvent(accessible, targetNode);
}
else {
// Menu popup events
PRUint32 menuEvent = 0;
if (eventType.LowerCaseEqualsLiteral("popupshown")) {
menuEvent = nsIAccessibleEvent::EVENT_MENUPOPUPSTART;
}
else if (eventType.EqualsLiteral("DOMMenuInactive")) {
menuEvent = nsIAccessibleEvent::EVENT_MENUPOPUPEND;
}
if (menuEvent) {
PRUint32 role = ROLE_NOTHING;
accessible->GetRole(&role);
if (role == ROLE_MENUPOPUP)
privAcc->FireToolkitEvent(menuEvent, accessible, nsnull);
else if (eventType.EqualsLiteral("DOMMenuInactive")) {
nsCOMPtr<nsIDOMXULPopupElement> popup(do_QueryInterface(targetNode));
if (popup) {
privAcc->FireToolkitEvent(nsIAccessibleEvent::EVENT_MENUPOPUPEND,
accessible, nsnull);
}
}
#else