зеркало из https://github.com/mozilla/gecko-dev.git
Context menus don't work with screen readers starting on 09/21. r=parente, sr=bryner
This commit is contained in:
Родитель
bb7e1cb9f9
Коммит
d5b314ea93
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче