mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 567503 - GetDOMNodeFromPoint should work with and return nsINode*, r=marcoz
This commit is contained in:
parent
b6ef0d73b1
commit
7d8d2da3ac
@ -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!");
|
||||
|
@ -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*
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user