diff --git a/accessible/public/nsIAccessibleEvent.idl b/accessible/public/nsIAccessibleEvent.idl index ae4d0d38b92d..14568ef731bf 100755 --- a/accessible/public/nsIAccessibleEvent.idl +++ b/accessible/public/nsIAccessibleEvent.idl @@ -541,3 +541,12 @@ interface nsIAccessibleTextChangeEvent : nsIAccessibleEvent boolean isInserted(); }; +[scriptable, uuid(b9076dce-4cd3-4e3d-a7f6-7f33a7f40c31)] +interface nsIAccessibleCaretMoveEvent: nsIAccessibleEvent +{ + /** + * Return caret offset. + */ + readonly attribute long caretOffset; +}; + diff --git a/accessible/src/atk/nsAccessibleWrap.cpp b/accessible/src/atk/nsAccessibleWrap.cpp index 60a4f74546b1..3a94590a437c 100644 --- a/accessible/src/atk/nsAccessibleWrap.cpp +++ b/accessible/src/atk/nsAccessibleWrap.cpp @@ -1159,17 +1159,23 @@ nsAccessibleWrap::FireAccessibleEvent(nsIAccessibleEvent *aEvent) break; case nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED: + { MAI_LOG_DEBUG(("\n\nReceived: EVENT_TEXT_CARET_MOVED\n")); - NS_ASSERTION(eventData, "Event needs event data"); - if (!eventData) + + nsCOMPtr caretMoveEvent(do_QueryInterface(aEvent)); + NS_ASSERTION(caretMoveEvent, "Event needs event data"); + if (!caretMoveEvent) break; - MAI_LOG_DEBUG(("\n\nCaret postion: %d", *(gint *)eventData )); + PRInt32 caretOffset = -1; + caretMoveEvent->GetCaretOffset(&caretOffset); + + MAI_LOG_DEBUG(("\n\nCaret postion: %d", *(gint *)caretOffset)); g_signal_emit_by_name(atkObj, "text_caret_moved", // Curent caret position - *(gint *)eventData); - break; + *(gint *)caretOffset); + } break; case nsIAccessibleEvent::EVENT_TABLE_MODEL_CHANGED: MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_MODEL_CHANGED\n")); diff --git a/accessible/src/base/nsAccessibleEventData.cpp b/accessible/src/base/nsAccessibleEventData.cpp index b04ddf0f607a..86974d741e33 100755 --- a/accessible/src/base/nsAccessibleEventData.cpp +++ b/accessible/src/base/nsAccessibleEventData.cpp @@ -225,3 +225,26 @@ nsAccTextChangeEvent::IsInserted(PRBool *aIsInserted) return NS_OK; } +nsAccCaretMoveEvent:: + nsAccCaretMoveEvent(nsIAccessible *aAccessible, PRInt32 aCaretOffset) : + nsAccEvent(::nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED, aAccessible, nsnull), + mCaretOffset(aCaretOffset) +{ +} + +nsAccCaretMoveEvent:: + nsAccCaretMoveEvent(nsIDOMNode *aNode) : + nsAccEvent(::nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED, aNode, nsnull), + mCaretOffset(-1) +{ +} + +NS_IMETHODIMP +nsAccCaretMoveEvent::GetCaretOffset(PRInt32* aCaretOffset) +{ + NS_ENSURE_ARG_POINTER(aCaretOffset); + + *aCaretOffset = mCaretOffset; + return NS_OK; +} + diff --git a/accessible/src/base/nsAccessibleEventData.h b/accessible/src/base/nsAccessibleEventData.h index d605b1809680..7b2ca90ca34c 100644 --- a/accessible/src/base/nsAccessibleEventData.h +++ b/accessible/src/base/nsAccessibleEventData.h @@ -113,6 +113,21 @@ private: PRBool mIsInserted; }; +class nsAccCaretMoveEvent: public nsAccEvent, + public nsIAccessibleCaretMoveEvent +{ +public: + nsAccCaretMoveEvent(nsIAccessible *aAccessible, PRInt32 aCaretOffset); + nsAccCaretMoveEvent(nsIDOMNode *aNode); + + NS_DECL_ISUPPORTS_INHERITED + NS_FORWARD_NSIACCESSIBLEEVENT(nsAccEvent::) + NS_DECL_NSIACCESSIBLECARETMOVEEVENT + +private: + PRInt32 mCaretOffset; +}; + // XXX todo: We might want to use XPCOM interfaces instead of structs // e.g., nsAccessibleTextChangeEvent: public nsIAccessibleTextChangeEvent diff --git a/accessible/src/base/nsCaretAccessible.cpp b/accessible/src/base/nsCaretAccessible.cpp index 94e57715c546..047b7c638626 100644 --- a/accessible/src/base/nsCaretAccessible.cpp +++ b/accessible/src/base/nsCaretAccessible.cpp @@ -217,8 +217,11 @@ NS_IMETHODIMP nsCaretAccessible::NotifySelectionChanged(nsIDOMDocument *aDoc, ns mLastCaretOffset = caretOffset; mLastTextAccessible = textAcc; - return mRootAccessible->FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED, - focusNode, nsnull, PR_FALSE); + nsCOMPtr event = + new nsAccCaretMoveEvent(focusNode); + NS_ENSURE_TRUE(event, NS_ERROR_OUT_OF_MEMORY); + + return mRootAccessible->FireDelayedAccessibleEvent(event, PR_FALSE); } nsRect diff --git a/accessible/src/base/nsDocAccessible.cpp b/accessible/src/base/nsDocAccessible.cpp index 739c16b63d74..d82697486c23 100644 --- a/accessible/src/base/nsDocAccessible.cpp +++ b/accessible/src/base/nsDocAccessible.cpp @@ -1262,8 +1262,12 @@ NS_IMETHODIMP nsDocAccessible::FlushPendingEvents() nsCOMPtr accessibleText = do_QueryInterface(accessible); PRInt32 caretOffset; if (accessibleText && NS_SUCCEEDED(accessibleText->GetCaretOffset(&caretOffset))) { - FireToolkitEvent(nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED, - accessible, &caretOffset); + nsCOMPtr caretMoveEvent = + new nsAccCaretMoveEvent(accessible, caretOffset); + NS_ENSURE_TRUE(caretMoveEvent, NS_ERROR_OUT_OF_MEMORY); + + FireAccessibleEvent(caretMoveEvent); + PRInt32 selectionCount; accessibleText->GetSelectionCount(&selectionCount); if (selectionCount) { // There's a selection so fire selection change as well