diff --git a/accessible/public/nsIAccessibleEventListener.idl b/accessible/public/nsIAccessibleEventListener.idl index 3028487461a1..1d056b7c0169 100644 --- a/accessible/public/nsIAccessibleEventListener.idl +++ b/accessible/public/nsIAccessibleEventListener.idl @@ -25,6 +25,15 @@ #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 { @@ -42,5 +51,22 @@ interface nsIAccessibleEventListener : nsISupports const unsigned long EVENT_MENUPOPUPEND = 0x0007; const unsigned long EVENT_SCROLLINGSTART = 0x0012; const unsigned long EVENT_SCROLLINGEND = 0x0013; - void handleEvent(in unsigned long aEvent, in nsIAccessible aTarget); + + // the additional events for ATK + const unsigned long EVENT_ATK_PROPERTY_CHANGE = 0x0100; + const unsigned long EVENT_ATK_SELECTION_CHANGE = 0x0101; + const unsigned long EVENT_ATK_TEXT_CHANGE = 0x0102; + const unsigned long EVENT_ATK_TEXT_SELECTION_CHANGE = 0x0103; + const unsigned long EVENT_ATK_TEXT_CARET_MOVE = 0x0104; + const unsigned long EVENT_ATK_TABLE_MODEL_CHANGE = 0x0110; + const unsigned long EVENT_ATK_TABLE_ROW_INSERT = 0x0111; + const unsigned long EVENT_ATK_TABLE_ROW_DELETE = 0x0112; + const unsigned long EVENT_ATK_TABLE_ROW_REORDER = 0x0113; + const unsigned long EVENT_ATK_TABLE_COLUMN_INSERT = 0x0114; + const unsigned long EVENT_ATK_TABLE_COLUMN_DELETE = 0x0115; + const unsigned long EVENT_ATK_TABLE_COLUMN_REORDER = 0x0116; + + [noscript] + void handleEvent(in unsigned long aEvent, in nsIAccessible aTarget, in AccessibleEventData aData); }; + diff --git a/accessible/src/base/nsRootAccessible.cpp b/accessible/src/base/nsRootAccessible.cpp index d681621a4d9c..84416771c91a 100644 --- a/accessible/src/base/nsRootAccessible.cpp +++ b/accessible/src/base/nsRootAccessible.cpp @@ -245,7 +245,7 @@ void nsRootAccessible::Notify(nsITimer *timer) if (mBusy != eBusyStateDone) { mBusy = eBusyStateDone; if (mListener) - mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, this); + mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, this, nsnull); } if (mScrollPositionChangedTicks) { @@ -268,7 +268,7 @@ void nsRootAccessible::Notify(nsITimer *timer) } if (docAccessible) - mListener->HandleEvent(nsIAccessibleEventListener::EVENT_SCROLLINGEND, docAccessible); + mListener->HandleEvent(nsIAccessibleEventListener::EVENT_SCROLLINGEND, docAccessible, nsnull); } mScrollPositionChangedTicks = 0; mLastScrolledPresShell = nsnull; @@ -505,7 +505,7 @@ NS_IMETHODIMP nsRootAccessible::RemoveAccessibleEventListener() void nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *focusAccessible, nsIDOMNode *focusNode) { if (focusNode && gLastFocusedNode != focusNode) { - mListener->HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, focusAccessible); + mListener->HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, focusAccessible, nsnull); NS_IF_RELEASE(gLastFocusedNode); gLastFocusedNode = focusNode; NS_ADDREF(gLastFocusedNode); @@ -561,7 +561,7 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent) accessible = new nsXULTreeitemAccessible(accessible, targetNode, weakShell, treeIndex); if (!accessible) return NS_ERROR_OUT_OF_MEMORY; - mListener->HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, accessible); + mListener->HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, accessible, nsnull); return NS_OK; } @@ -575,30 +575,30 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent) } else if (eventType.EqualsIgnoreCase("change")) { if (!selectControl) // Don't use onchange to fire EVENT_STATE_CHANGE events for selects - mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible); + mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, nsnull); } else if (eventType.EqualsIgnoreCase("ListitemStateChange")) { - mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible); - mListener->HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, accessible); + mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, nsnull); + mListener->HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, accessible, nsnull); } else if (eventType.EqualsIgnoreCase("CheckboxStateChange")) { - mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible); + mListener->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); - mListener->HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, accessible); + mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, nsnull); + mListener->HandleEvent(nsIAccessibleEventListener::EVENT_FOCUS, accessible, nsnull); } else { // for the html radio buttons -- apparently the focus code just works. :-) - mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible); + mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, accessible, nsnull); } } else if (eventType.EqualsIgnoreCase("popupshowing")) - mListener->HandleEvent(nsIAccessibleEventListener::EVENT_MENUPOPUPSTART, accessible); + mListener->HandleEvent(nsIAccessibleEventListener::EVENT_MENUPOPUPSTART, accessible, nsnull); else if (eventType.EqualsIgnoreCase("popuphiding")) - mListener->HandleEvent(nsIAccessibleEventListener::EVENT_MENUPOPUPEND, accessible); + mListener->HandleEvent(nsIAccessibleEventListener::EVENT_MENUPOPUPEND, accessible, nsnull); } } return NS_OK; @@ -626,13 +626,22 @@ NS_IMETHODIMP nsRootAccessible::Focus(nsIDOMEvent* aEvent) return HandleEvent(aEvent); } -NS_IMETHODIMP nsRootAccessible::Blur(nsIDOMEvent* aEvent) { return NS_OK; } +NS_IMETHODIMP nsRootAccessible::Blur(nsIDOMEvent* aEvent) +{ + return NS_OK; +} // ------- nsIDOMFormListener Methods (5) ------------- -NS_IMETHODIMP nsRootAccessible::Submit(nsIDOMEvent* aEvent) { return NS_OK; } +NS_IMETHODIMP nsRootAccessible::Submit(nsIDOMEvent* aEvent) +{ + return NS_OK; +} -NS_IMETHODIMP nsRootAccessible::Reset(nsIDOMEvent* aEvent) { return NS_OK; } +NS_IMETHODIMP nsRootAccessible::Reset(nsIDOMEvent* aEvent) +{ + return NS_OK; +} NS_IMETHODIMP nsRootAccessible::Change(nsIDOMEvent* aEvent) { @@ -651,7 +660,10 @@ NS_IMETHODIMP nsRootAccessible::Select(nsIDOMEvent* aEvent) } // gets Input events when text is entered or deleted in a textarea or input -NS_IMETHODIMP nsRootAccessible::Input(nsIDOMEvent* aEvent) { return NS_OK; } +NS_IMETHODIMP nsRootAccessible::Input(nsIDOMEvent* aEvent) +{ + return NS_OK; +} // ------- nsIDOMXULListener Methods (8) --------------- @@ -742,7 +754,7 @@ NS_IMETHODIMP nsRootAccessible::OnLocationChange(nsIWebProgress *aWebProgress, if (mBusy != eBusyStateLoading) { mBusy = eBusyStateLoading; if (mListener) - mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, this); + mListener->HandleEvent(nsIAccessibleEventListener::EVENT_STATE_CHANGE, this, nsnull); // Document is going away, remove its scroll position listener nsCOMPtr domWin; diff --git a/accessible/src/base/nsRootAccessible.h b/accessible/src/base/nsRootAccessible.h index 2ce0e292ede3..b510ddb44f68 100644 --- a/accessible/src/base/nsRootAccessible.h +++ b/accessible/src/base/nsRootAccessible.h @@ -169,5 +169,54 @@ class nsRootAccessible : public nsAccessible, nsCOMPtr mLastScrolledPresShell; }; +#ifdef XP_UNIX + +struct AtkStateChange { + PRUint32 state; + PRBool enable; +}; + +enum AtkProperty { + PROP_0, // gobject convention + PROP_NAME, + PROP_DESCRIPTION, + PROP_PARENT, // ancestry has changed + PROP_VALUE, + PROP_ROLE, + PROP_LAYER, + PROP_MDI_ZORDER, + PROP_TABLE_CAPTION, + PROP_TABLE_COLUMN_DESCRIPTION, + PROP_TABLE_COLUMN_HEADER, + PROP_TABLE_ROW_DESCRIPTION, + PROP_TABLE_ROW_HEADER, + PROP_TABLE_SUMMARY, + PROP_LAST // gobject convention +}; + +struct AtkPropertyChange { + PRInt32 type; // property type as listed above + void *oldvalue; + void *newvalue; +}; + +struct AtkChildrenChange { + PRUint32 index; // index of child in parent + nsIAccessible *child; + PRBool add; // true for add, false for delete +}; + +struct AtkTextChange { + PRUint32 start; + PRUint32 length; + PRBool add; // true for add, false for delete +}; + +struct AtkTableChange { + PRUint32 index; // the start row/column after which the rows are inserted/deleted. + PRUint32 count; // the number of inserted/deleted rows/columns +}; + +#endif #endif diff --git a/widget/src/windows/Accessible.cpp b/widget/src/windows/Accessible.cpp index d69db9851f63..8f3037cebae1 100644 --- a/widget/src/windows/Accessible.cpp +++ b/widget/src/windows/Accessible.cpp @@ -1002,7 +1002,7 @@ void RootAccessible::GetNSAccessibleFor(VARIANT varChild, nsCOMPtr