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:
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user