Bug 567503 - GetDOMNodeFromPoint should work with and return nsINode*, r=marcoz

This commit is contained in:
Alexander Surkov 2010-05-25 17:12:43 +09:00
parent b6ef0d73b1
commit 7d8d2da3ac
4 changed files with 31 additions and 38 deletions

View File

@ -552,46 +552,46 @@ nsAccUtils::GetTextAccessibleFromSelection(nsISelection *aSelection,
// Get accessible from selection's focus DOM point (the DOM point where
// selection is ended).
nsCOMPtr<nsIDOMNode> focusNode;
aSelection->GetFocusNode(getter_AddRefs(focusNode));
if (!focusNode)
nsCOMPtr<nsIDOMNode> focusDOMNode;
aSelection->GetFocusNode(getter_AddRefs(focusDOMNode));
if (!focusDOMNode)
return nsnull;
PRInt32 focusOffset = 0;
aSelection->GetFocusOffset(&focusOffset);
nsCOMPtr<nsIDOMNode> resultNode =
nsCOMPtr<nsINode> focusNode(do_QueryInterface(focusDOMNode));
nsCOMPtr<nsINode> resultNode =
nsCoreUtils::GetDOMNodeFromDOMPoint(focusNode, focusOffset);
// Get text accessible containing the result node.
while (resultNode) {
// Make sure to get the correct starting node for selection events inside
// XBL content trees.
nsCOMPtr<nsIDOMNode> relevantNode;
GetAccService()->GetRelevantContentNodeFor(resultNode,
getter_AddRefs(relevantNode));
if (relevantNode)
resultNode.swap(relevantNode);
nsCOMPtr<nsIDOMNode> resultDOMNode(do_QueryInterface(resultNode));
nsCOMPtr<nsIDOMNode> relevantDOMNode;
GetAccService()->GetRelevantContentNodeFor(resultDOMNode,
getter_AddRefs(relevantDOMNode));
if (relevantDOMNode) {
resultNode = do_QueryInterface(relevantDOMNode);
resultDOMNode.swap(relevantDOMNode);
}
nsCOMPtr<nsIContent> content = do_QueryInterface(resultNode);
if (!content || !content->IsNodeOfType(nsINode::eTEXT)) {
nsCOMPtr<nsIAccessible> accessible;
GetAccService()->GetAccessibleFor(resultNode, getter_AddRefs(accessible));
if (!resultNode || !resultNode->IsNodeOfType(nsINode::eTEXT)) {
nsAccessible *accessible = GetAccService()->GetAccessible(resultDOMNode);
if (accessible) {
nsIAccessibleText *textAcc = nsnull;
CallQueryInterface(accessible, &textAcc);
if (textAcc) {
if (aNode)
NS_ADDREF(*aNode = resultNode);
resultDOMNode.forget(aNode);
return textAcc;
}
}
}
nsCOMPtr<nsIDOMNode> parentNode;
resultNode->GetParentNode(getter_AddRefs(parentNode));
resultNode.swap(parentNode);
resultNode = resultNode->GetParent();
}
NS_NOTREACHED("No nsIAccessibleText for selection change event!");

View File

@ -270,29 +270,22 @@ nsCoreUtils::GetDOMElementFor(nsIDOMNode *aNode)
return element;
}
already_AddRefed<nsIDOMNode>
nsCoreUtils::GetDOMNodeFromDOMPoint(nsIDOMNode *aNode, PRUint32 aOffset)
nsINode *
nsCoreUtils::GetDOMNodeFromDOMPoint(nsINode *aNode, PRUint32 aOffset)
{
nsIDOMNode *resultNode = nsnull;
nsCOMPtr<nsIContent> content(do_QueryInterface(aNode));
if (content && content->IsElement()) {
PRUint32 childCount = content->GetChildCount();
if (aNode && aNode->IsElement()) {
PRUint32 childCount = aNode->GetChildCount();
NS_ASSERTION(aOffset >= 0 && aOffset <= childCount,
"Wrong offset of the DOM point!");
// The offset can be after last child of container node that means DOM point
// is placed immediately after the last child. In this case use the DOM node
// from the given DOM point is used as result node.
if (aOffset != childCount) {
CallQueryInterface(content->GetChildAt(aOffset), &resultNode);
return resultNode;
}
if (aOffset != childCount)
return aNode->GetChildAt(aOffset);
}
NS_IF_ADDREF(resultNode = aNode);
return resultNode;
return aNode;
}
nsIContent*

View File

@ -129,8 +129,8 @@ public:
/**
* Return DOM node for the given DOM point.
*/
static already_AddRefed<nsIDOMNode> GetDOMNodeFromDOMPoint(nsIDOMNode *aNode,
PRUint32 aOffset);
static nsINode *GetDOMNodeFromDOMPoint(nsINode *aNode, PRUint32 aOffset);
/**
* Return the nsIContent* to check for ARIA attributes on -- this may not
* always be the DOM node for the accessible. Specifically, for doc

View File

@ -1640,8 +1640,8 @@ nsHyperTextAccessible::GetCaretOffset(PRInt32 *aCaretOffset)
nsnull, getter_AddRefs(domSel));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIDOMNode> focusNode;
rv = domSel->GetFocusNode(getter_AddRefs(focusNode));
nsCOMPtr<nsIDOMNode> focusDOMNode;
rv = domSel->GetFocusNode(getter_AddRefs(focusDOMNode));
NS_ENSURE_SUCCESS(rv, rv);
PRInt32 focusOffset;
@ -1651,16 +1651,16 @@ nsHyperTextAccessible::GetCaretOffset(PRInt32 *aCaretOffset)
// No caret if this DOM node is inside of focused node but the selection's
// focus point is not inside of this DOM node.
if (isInsideOfFocusedNode) {
nsCOMPtr<nsIDOMNode> resultDOMNode =
nsCOMPtr<nsINode> focusNode(do_QueryInterface(focusDOMNode));
nsINode *resultNode =
nsCoreUtils::GetDOMNodeFromDOMPoint(focusNode, focusOffset);
nsCOMPtr<nsINode> resultNode(do_QueryInterface(resultDOMNode));
if (resultNode != thisNode &&
!nsCoreUtils::IsAncestorOf(thisNode, resultNode))
return NS_OK;
}
DOMPointToHypertextOffset(focusNode, focusOffset, aCaretOffset);
DOMPointToHypertextOffset(focusDOMNode, focusOffset, aCaretOffset);
return NS_OK;
}