Bug 193987 need ability to fire event in any accObjects
r=aaronl, sr=henry.jia git-svn-id: svn://10.0.0.236/trunk@138901 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
df20076634
commit
5e16760568
@ -80,6 +80,8 @@ interface nsIAccessible : nsISupports
|
||||
// Used by Accessible implementation to save data and speed up accessibility tree walking
|
||||
[noscript] void CacheOptimizations(in nsIAccessible aParent, in PRInt32 aSiblingIndex, in nsIDOMNodeList aSiblingList);
|
||||
|
||||
[noscript] void handleEvent(in unsigned long aEvent, in nsIAccessible aTarget, in voidPtr aData);
|
||||
|
||||
// MSAA State flags - used for bitfield. More than 1 allowed.
|
||||
const unsigned long STATE_UNAVAILABLE = 0x00000001; // Disabled, maps to opposite of Java ENABLED, Gnome/ATK SENSITIVE?
|
||||
const unsigned long STATE_SELECTED = 0x00000002;
|
||||
|
||||
@ -25,15 +25,6 @@
|
||||
#include "nsISupports.idl"
|
||||
#include "nsIAccessible.idl"
|
||||
|
||||
%{ C++
|
||||
// extra event data (currently used by ATK)
|
||||
struct AccessibleEventData {
|
||||
PRUint32 aUnused;
|
||||
};
|
||||
%}
|
||||
|
||||
[ptr] native AccessibleEventData(AccessibleEventData);
|
||||
|
||||
[scriptable, uuid(BEE49E7D-9D06-49bf-8984-1694C697D74F)]
|
||||
interface nsIAccessibleEventListener : nsISupports
|
||||
{
|
||||
@ -94,6 +85,6 @@ interface nsIAccessibleEventListener : nsISupports
|
||||
const unsigned long EVENT_ATK_TABLE_COLUMN_REORDER = 0x0116;
|
||||
|
||||
[noscript]
|
||||
void handleEvent(in unsigned long aEvent, in nsIAccessible aTarget, in AccessibleEventData aData);
|
||||
void handleEvent(in unsigned long aEvent, in nsIAccessible aTarget, in voidPtr aData);
|
||||
};
|
||||
|
||||
|
||||
@ -1615,3 +1615,10 @@ NS_IMETHODIMP nsAccessible::GetXULAccName(nsAString& _retval)
|
||||
_retval.Assign(label);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsAccessible::HandleEvent(PRUint32 aEvent, nsIAccessible *aTarget, void * aData)
|
||||
{
|
||||
nsCOMPtr<nsIAccessible> parent;
|
||||
GetAccParent(getter_AddRefs(parent));
|
||||
return parent ? parent->HandleEvent(aEvent, aTarget, aData) : NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
@ -110,6 +110,7 @@ protected:
|
||||
NS_IMETHOD AppendStringWithSpaces(nsAString *aFlatString, const nsAString& textEquivalent);
|
||||
NS_IMETHOD GetFocusedNode(nsIDOMNode **aFocusedNode);
|
||||
NS_IMETHOD CacheOptimizations(nsIAccessible *aParent, PRInt32 aSiblingIndex, nsIDOMNodeList *aSiblingList);
|
||||
NS_IMETHOD HandleEvent(PRUint32 aEvent, nsIAccessible *aTarget, void * aData);
|
||||
// helper method to verify frames
|
||||
static PRBool IsCorrectFrameType(nsIFrame* aFrame, nsIAtom* aAtom);
|
||||
static nsresult GetFullKeyName(const nsAString& aModifierName, const nsAString& aKeyName, nsAString& aStringOut);
|
||||
|
||||
@ -193,7 +193,7 @@ NS_IMETHODIMP nsCaretAccessible::NotifySelectionChanged(nsIDOMDocument *aDoc, ns
|
||||
if (isCollapsed) {
|
||||
PRInt32 caretOffset;
|
||||
domSel->GetFocusOffset(&caretOffset);
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_ATK_TEXT_CARET_MOVE, accessible, (AccessibleEventData*)&caretOffset);
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_ATK_TEXT_CARET_MOVE, accessible, &caretOffset);
|
||||
}
|
||||
else
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_ATK_TEXT_SELECTION_CHANGE, accessible, nsnull);
|
||||
|
||||
@ -248,12 +248,20 @@ NS_IMETHODIMP nsGenericAccessible::GetAccExtState(PRUint32 *_retval)
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/* nsIDOMNode accGetDOMNode (); */
|
||||
NS_IMETHODIMP nsGenericAccessible::AccGetDOMNode(nsIDOMNode **_retval)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/* [noscript] void CacheOptimizations (in nsIAccessible aParent, in PRInt32 aSiblingIndex, in nsIDOMNodeList aSiblingList); */
|
||||
NS_IMETHODIMP nsGenericAccessible::CacheOptimizations(nsIAccessible *aParent, PRInt32 aSiblingIndex, nsIDOMNodeList *aSiblingList)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/* [noscript] void handleEvent (in unsigned long aEvent, in nsIAccessible aTarget, in voidPtr aData); */
|
||||
NS_IMETHODIMP nsGenericAccessible::HandleEvent(PRUint32 aEvent, nsIAccessible *aTarget, void * aData)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
@ -262,8 +262,7 @@ void nsRootAccessible::ScrollTimerCallback(nsITimer *aTimer, void *aClosure)
|
||||
// We only want to fire accessibilty scroll event when scrolling stops or pauses
|
||||
// Therefore, we wait for no scroll events to occur between 2 ticks of this timer
|
||||
// That indicates a pause in scrolling, so we fire the accessibilty scroll event
|
||||
if (rootAcc->mListener)
|
||||
rootAcc->mListener->HandleEvent(nsIAccessibleEventListener::EVENT_SCROLLINGEND, rootAcc, nsnull);
|
||||
rootAcc->HandleEvent(nsIAccessibleEventListener::EVENT_SCROLLINGEND, rootAcc, nsnull);
|
||||
rootAcc->mScrollPositionChangedTicks = 0;
|
||||
rootAcc->mScrollWatchTimer->Cancel();
|
||||
rootAcc->mScrollWatchTimer = nsnull;
|
||||
@ -435,7 +434,7 @@ NS_IMETHODIMP nsRootAccessible::GetCaretAccessible(nsIAccessibleCaret **aCaretAc
|
||||
void nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *focusAccessible, nsIDOMNode *focusNode)
|
||||
{
|
||||
if (focusAccessible && focusNode && gLastFocusedNode != focusNode) {
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, focusAccessible, nsnull);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, focusAccessible, nsnull);
|
||||
NS_IF_RELEASE(gLastFocusedNode);
|
||||
PRUint32 role = ROLE_NOTHING;
|
||||
focusAccessible->GetAccRole(&role);
|
||||
@ -505,7 +504,7 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent)
|
||||
// tree event
|
||||
if (treeItemAccessible &&
|
||||
(eventType.EqualsIgnoreCase("DOMMenuItemActive") || eventType.EqualsIgnoreCase("select"))) {
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, treeItemAccessible, nsnull);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, treeItemAccessible, nsnull);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -525,27 +524,27 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent)
|
||||
FireAccessibleFocusEvent(accessible, targetNode);
|
||||
}
|
||||
else if (eventType.EqualsIgnoreCase("ListitemStateChange")) {
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, nsnull);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, nsnull);
|
||||
FireAccessibleFocusEvent(accessible, optionTargetNode);
|
||||
}
|
||||
else if (eventType.EqualsIgnoreCase("CheckboxStateChange")) {
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, nsnull);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, nsnull);
|
||||
}
|
||||
else if (eventType.EqualsIgnoreCase("RadioStateChange") ) {
|
||||
// first the XUL radio buttons
|
||||
if (targetNode &&
|
||||
NS_SUCCEEDED(mAccService->GetAccessibleFor(targetNode, getter_AddRefs(accessible)))) {
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, nsnull);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, nsnull);
|
||||
FireAccessibleFocusEvent(accessible, targetNode);
|
||||
}
|
||||
else { // for the html radio buttons -- apparently the focus code just works. :-)
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, nsnull);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, nsnull);
|
||||
}
|
||||
}
|
||||
else if (eventType.EqualsIgnoreCase("DOMMenuBarActive"))
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_MENUSTART, accessible, nsnull);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_MENUSTART, accessible, nsnull);
|
||||
else if (eventType.EqualsIgnoreCase("DOMMenuBarInactive")) {
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_MENUEND, accessible, nsnull);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_MENUEND, accessible, nsnull);
|
||||
GetAccFocused(getter_AddRefs(accessible));
|
||||
if (accessible) {
|
||||
accessible->AccGetDOMNode(getter_AddRefs(targetNode));
|
||||
@ -563,7 +562,7 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent)
|
||||
PRUint32 role = ROLE_NOTHING;
|
||||
accessible->GetAccRole(&role);
|
||||
if (role == ROLE_MENUPOPUP)
|
||||
mListener->HandleEvent(menuEvent, accessible, nsnull);
|
||||
HandleEvent(menuEvent, accessible, nsnull);
|
||||
}
|
||||
}
|
||||
#else
|
||||
@ -571,7 +570,7 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent)
|
||||
AtkTextChange textData;
|
||||
if (eventType.EqualsIgnoreCase("focus") || eventType.EqualsIgnoreCase("DOMMenuItemActive")) {
|
||||
if (treeItemAccessible) // use focused treeitem
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, treeItemAccessible, nsnull);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, treeItemAccessible, nsnull);
|
||||
else if (optionTargetNode && // use focused option
|
||||
NS_SUCCEEDED(mAccService->GetAccessibleFor(optionTargetNode, getter_AddRefs(accessible))))
|
||||
FireAccessibleFocusEvent(accessible, optionTargetNode);
|
||||
@ -580,23 +579,23 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent)
|
||||
}
|
||||
else if (eventType.EqualsIgnoreCase("change")) {
|
||||
if (selectElement) // it's a HTML <select>
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_ATK_SELECTION_CHANGE, accessible, nsnull);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_ATK_SELECTION_CHANGE, accessible, nsnull);
|
||||
else {
|
||||
nsCOMPtr<nsIDOMHTMLInputElement> inputElement(do_QueryInterface(targetNode));
|
||||
if (inputElement) { // it's a HTML <input>
|
||||
accessible->GetAccState(&stateData.state);
|
||||
stateData.enable = (stateData.state & STATE_CHECKED) != 0;
|
||||
stateData.state = STATE_CHECKED;
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, (AccessibleEventData*)&stateData);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, &stateData);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (eventType.EqualsIgnoreCase("select")) {
|
||||
if (selectControl) // it's a XUL <listbox>
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_ATK_SELECTION_CHANGE, accessible, nsnull);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_ATK_SELECTION_CHANGE, accessible, nsnull);
|
||||
else if (treeBox && treeIndex >= 0) // it's a XUL <tree>
|
||||
// use EVENT_FOCUS instead of EVENT_ATK_SELECTION_CHANGE
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, treeItemAccessible, nsnull);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, treeItemAccessible, nsnull);
|
||||
}
|
||||
else if (eventType.EqualsIgnoreCase("input")) {
|
||||
// XXX kyle.yuan@sun.com future work, put correct values for text change data
|
||||
@ -605,16 +604,16 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent)
|
||||
textData.add = PR_TRUE;
|
||||
nsAutoString accName;
|
||||
accessible->GetAccValue(accName);
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_ATK_TEXT_CHANGE, accessible, (AccessibleEventData*)&textData);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_ATK_TEXT_CHANGE, accessible, &textData);
|
||||
}
|
||||
else if (eventType.EqualsIgnoreCase("ListitemStateChange")) // it's a XUL <listbox>
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, accessible, nsnull);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, accessible, nsnull);
|
||||
else if (eventType.EqualsIgnoreCase("CheckboxStateChange") || // it's a XUL <checkbox>
|
||||
eventType.EqualsIgnoreCase("RadioStateChange")) { // it's a XUL <radio>
|
||||
accessible->GetAccState(&stateData.state);
|
||||
stateData.enable = (stateData.state & STATE_CHECKED) != 0;
|
||||
stateData.state = STATE_CHECKED;
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, (AccessibleEventData*)&stateData);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, &stateData);
|
||||
}
|
||||
else if (eventType.EqualsIgnoreCase("popupshowing"))
|
||||
FireAccessibleFocusEvent(accessible, targetNode);
|
||||
@ -640,6 +639,13 @@ NS_IMETHODIMP nsRootAccessible::GetTargetNode(nsIDOMEvent *aEvent, nsCOMPtr<nsID
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsRootAccessible::HandleEvent(PRUint32 aEvent, nsIAccessible *aTarget, void * aData)
|
||||
{
|
||||
if (mListener)
|
||||
mListener->HandleEvent(aEvent, aTarget, aData);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// ------- nsIDOMFocusListener Methods (1) -------------
|
||||
|
||||
NS_IMETHODIMP nsRootAccessible::Focus(nsIDOMEvent* aEvent)
|
||||
@ -835,9 +841,7 @@ void nsRootAccessible::FireDocLoadFinished()
|
||||
if (mBusy != eBusyStateDone) {
|
||||
mBusy = eBusyStateDone;
|
||||
#ifndef MOZ_ACCESSIBILITY_ATK
|
||||
if (mListener) {
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, this, nsnull);
|
||||
}
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, this, nsnull);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@ -875,16 +879,13 @@ NS_IMETHODIMP nsRootAccessible::OnLocationChange(nsIWebProgress *aWebProgress,
|
||||
mBusy = eBusyStateLoading;
|
||||
// Fire a "new doc has started to load" event
|
||||
#ifndef MOZ_ACCESSIBILITY_ATK
|
||||
if (mListener)
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, this, nsnull);
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, this, nsnull);
|
||||
#else
|
||||
if (mListener) {
|
||||
AtkChildrenChange childrenData;
|
||||
childrenData.index = -1;
|
||||
childrenData.child = 0;
|
||||
childrenData.add = PR_FALSE;
|
||||
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_REORDER , this, (AccessibleEventData*)&childrenData);
|
||||
}
|
||||
AtkChildrenChange childrenData;
|
||||
childrenData.index = -1;
|
||||
childrenData.child = 0;
|
||||
childrenData.add = PR_FALSE;
|
||||
HandleEvent(nsIAccessibleEventListener::EVENT_REORDER , this, &childrenData);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -98,6 +98,7 @@ class nsRootAccessible : public nsAccessible,
|
||||
NS_IMETHOD GetAccParent(nsIAccessible * *aAccParent);
|
||||
NS_IMETHOD GetAccRole(PRUint32 *aAccRole);
|
||||
NS_IMETHOD GetAccState(PRUint32 *aAccState);
|
||||
NS_IMETHOD HandleEvent(PRUint32 aEvent, nsIAccessible *aTarget, void * aData);
|
||||
|
||||
// ----- nsIAccessibleEventReceiver -------------------
|
||||
NS_IMETHOD AddAccessibleEventListener(nsIAccessibleEventListener *aListener);
|
||||
|
||||
@ -178,7 +178,7 @@ MaiTopLevel::CreateAndCache(nsIAccessible *aAcc)
|
||||
|
||||
NS_IMETHODIMP
|
||||
MaiTopLevel::HandleEvent(PRUint32 aEvent, nsIAccessible *aAccessible,
|
||||
AccessibleEventData * aEventData)
|
||||
void * aEventData)
|
||||
{
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
MaiWidget *pMaiObject = NULL;
|
||||
|
||||
@ -1240,7 +1240,7 @@ STDMETHODIMP RootAccessible::get_accChild(
|
||||
return Accessible::get_accChild(varChild, ppdispChild);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP RootAccessible::HandleEvent(PRUint32 aEvent, nsIAccessible* aAccessible, AccessibleEventData* aData)
|
||||
NS_IMETHODIMP RootAccessible::HandleEvent(PRUint32 aEvent, nsIAccessible* aAccessible, void* aData)
|
||||
{
|
||||
if (!mIsActive) {
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user