Bug 163834 Use correct Accessible object to fire event when text-caret moved and text-selection changed

r=aaronl, sr=bryner


git-svn-id: svn://10.0.0.236/trunk@130769 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
kyle.yuan%sun.com 2002-09-30 01:51:48 +00:00
parent 023a9d44d2
commit 861ec6b9c4
2 changed files with 26 additions and 8 deletions

View File

@ -35,10 +35,12 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsCOMPtr.h"
#include "nsAccessibilityService.h"
#include "nsCaretAccessible.h"
#include "nsIDocument.h"
#include "nsIDOMDocument.h"
#include "nsIDOMHTMLInputElement.h"
#include "nsIDOMHTMLTextAreaElement.h"
#include "nsICaret.h"
#include "nsISelectionController.h"
#include "nsIFrame.h"
@ -47,11 +49,12 @@
#include "nsIViewManager.h"
#include "nsIWidget.h"
#include "nsIPresShell.h"
#include "nsTextAccessible.h"
NS_IMPL_ISUPPORTS_INHERITED2(nsCaretAccessible, nsLeafAccessible, nsIAccessibleCaret, nsISelectionListener)
nsCaretAccessible::nsCaretAccessible(nsIDOMNode* aDocumentNode, nsIWeakReference* aShell, nsIAccessibleEventListener *aListener):
nsLeafAccessible(aDocumentNode, aShell), mVisible(PR_TRUE), mListener(aListener)
nsLeafAccessible(aDocumentNode, aShell), mVisible(PR_TRUE), mListener(aListener), mCurrentDOMNode(nsnull)
{
}
@ -68,6 +71,8 @@ NS_IMETHODIMP nsCaretAccessible::RemoveSelectionListener()
NS_IMETHODIMP nsCaretAccessible::AttachNewSelectionListener(nsIDOMNode *aCurrentNode)
{
mCurrentDOMNode = aCurrentNode;
// When focus moves such that the caret is part of a new frame selection
// this removes the old selection listener and attaches a new one for the current focus
nsCOMPtr<nsIDOMDocument> domDoc;
@ -171,13 +176,25 @@ NS_IMETHODIMP nsCaretAccessible::NotifySelectionChanged(nsIDOMDocument *aDoc, ns
if (visible)
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_LOCATION_CHANGE, this, nsnull);
#else
if (isCollapsed) {
PRInt32 caretOffset;
domSel->GetFocusOffset(&caretOffset);
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_ATK_TEXT_CARET_MOVE, this, (AccessibleEventData*)&caretOffset);
}
nsCOMPtr<nsIDOMNode> focusNode;
nsCOMPtr<nsIDOMHTMLInputElement> inputElement(do_QueryInterface(mCurrentDOMNode));
nsCOMPtr<nsIDOMHTMLTextAreaElement> textArea(do_QueryInterface(mCurrentDOMNode));
if (inputElement || textArea)
focusNode = mCurrentDOMNode;
else
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_ATK_TEXT_SELECTION_CHANGE, this, nsnull);
domSel->GetFocusNode(getter_AddRefs(focusNode));
if (!focusNode)
return NS_OK;
nsCOMPtr<nsIAccessible> accessible;
nsCOMPtr<nsIAccessibilityService> accService(do_GetService("@mozilla.org/accessibilityService;1"));
accService->GetAccessibleFor(focusNode, getter_AddRefs(accessible));
if (accessible) {
if (isCollapsed)
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_ATK_TEXT_CARET_MOVE, accessible, (AccessibleEventData*)&caretOffset);
else
mListener->HandleEvent(nsIAccessibleEventListener::EVENT_ATK_TEXT_SELECTION_CHANGE, accessible, nsnull);
}
#endif
return NS_OK;

View File

@ -78,6 +78,7 @@ public:
private:
nsRect mCaretRect;
PRBool mVisible;
nsCOMPtr<nsIDOMNode> mCurrentDOMNode;
// mListener is not a com pointer. It's a copy of the listener in the nsRootAccessible owner.
//See nsRootAccessible.h for details of the lifetime if this listener
nsIAccessibleEventListener *mListener;