Bug 368598. Collate multiple related caret/selection moves into one, and fire the accessible caret and selection events after focus events. r=ginn.chen

git-svn-id: svn://10.0.0.236/trunk@219257 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
aaronleventhal%moonset.net
2007-01-31 15:42:55 +00:00
parent 1d5551edc8
commit 8da4e21793
4 changed files with 21 additions and 18 deletions

View File

@@ -210,15 +210,7 @@ NS_IMETHODIMP nsCaretAccessible::NotifySelectionChanged(nsIDOMDocument *aDoc, ns
NS_ASSERTION(textAcc, "No nsIAccessibleText for caret move event!"); // No nsIAccessibleText for caret move event!
NS_ENSURE_TRUE(textAcc, NS_ERROR_FAILURE);
PRInt32 caretOffset;
if (NS_SUCCEEDED(textAcc->GetCaretOffset(&caretOffset))) {
mRootAccessible->FireToolkitEvent(nsIAccessibleEvent::EVENT_ATK_TEXT_CARET_MOVE, accessible, &caretOffset);
}
if (!isCollapsed) {
mRootAccessible->FireToolkitEvent(nsIAccessibleEvent::EVENT_ATK_TEXT_SELECTION_CHANGE, accessible, nsnull);
}
return NS_OK;
return mRootAccessible->FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_ATK_TEXT_CARET_MOVE, focusNode, nsnull, PR_FALSE);
}
/** Return the caret's bounds */

View File

@@ -1099,6 +1099,18 @@ NS_IMETHODIMP nsDocAccessible::FlushPendingEvents()
docAccessible->FireDocLoadEvents(nsIAccessibleEvent::EVENT_DOCUMENT_LOAD_COMPLETE);
}
}
else if (eventType == nsIAccessibleEvent::EVENT_ATK_TEXT_CARET_MOVE) {
nsCOMPtr<nsIAccessibleText> accessibleText = do_QueryInterface(accessible);
PRInt32 caretOffset;
if (accessibleText && NS_SUCCEEDED(accessibleText->GetCaretOffset(&caretOffset))) {
FireToolkitEvent(nsIAccessibleEvent::EVENT_ATK_TEXT_CARET_MOVE, accessible, &caretOffset);
PRInt32 selectionCount;
accessibleText->GetSelectionCount(&selectionCount);
if (selectionCount) { // There's a selection so fire selection change as well
FireToolkitEvent(nsIAccessibleEvent::EVENT_ATK_TEXT_SELECTION_CHANGE, accessible, nsnull);
}
}
}
else {
FireToolkitEvent(eventType, accessible, nsnull);
}

View File

@@ -100,6 +100,10 @@ class nsDocAccessible : public nsHyperTextAccessible,
// nsPIAccessNode
NS_IMETHOD_(nsIFrame *) GetFrame(void);
// Non-virtual
nsresult FireDelayedToolkitEvent(PRUint32 aEvent, nsIDOMNode *aDOMNode,
void *aData, PRBool aAllowDupes = PR_FALSE);
protected:
virtual void GetBoundsRect(nsRect& aRect, nsIFrame** aRelativeFrame);
virtual nsresult AddEventListeners();
@@ -112,9 +116,6 @@ class nsDocAccessible : public nsHyperTextAccessible,
virtual void SetEditor(nsIEditor *aEditor);
virtual already_AddRefed<nsIEditor> GetEditor() { nsIEditor *editor = mEditor; NS_IF_ADDREF(editor); return editor; }
nsresult FireDelayedToolkitEvent(PRUint32 aEvent, nsIDOMNode *aDOMNode,
void *aData, PRBool aAllowDupes = PR_FALSE);
nsInterfaceHashtable<nsVoidHashKey, nsIAccessNode> mAccessNodeCache;
void *mWnd;
nsCOMPtr<nsIDocument> mDocument;

View File

@@ -1411,13 +1411,11 @@ NS_IMETHODIMP nsHyperTextAccessible::GetSelectionCount(PRInt32 *aSelectionCount)
rv = domSel->GetIsCollapsed(&isSelectionCollapsed);
NS_ENSURE_SUCCESS(rv, rv);
if (isSelectionCollapsed)
if (isSelectionCollapsed) {
*aSelectionCount = 0;
rv = domSel->GetRangeCount(aSelectionCount);
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
return NS_OK;
}
return domSel->GetRangeCount(aSelectionCount);
}
/*