bug 758113 - remove a bunch of nsIDOMNode stuff from HypertextAccessible r=davidb

This commit is contained in:
Trevor Saunders 2012-04-06 14:08:24 -04:00
Родитель 5ae276db7c
Коммит 20c7e75ace
5 изменённых файлов: 71 добавлений и 144 удалений

Просмотреть файл

@ -258,45 +258,36 @@ nsCoreUtils::IsAncestorOf(nsINode *aPossibleAncestorNode,
}
nsresult
nsCoreUtils::ScrollSubstringTo(nsIFrame *aFrame,
nsIDOMNode *aStartNode, PRInt32 aStartIndex,
nsIDOMNode *aEndNode, PRInt32 aEndIndex,
nsCoreUtils::ScrollSubstringTo(nsIFrame* aFrame, nsRange* aRange,
PRUint32 aScrollType)
{
nsIPresShell::ScrollAxis vertical, horizontal;
ConvertScrollTypeToPercents(aScrollType, &vertical, &horizontal);
return ScrollSubstringTo(aFrame, aStartNode, aStartIndex, aEndNode, aEndIndex,
vertical, horizontal);
return ScrollSubstringTo(aFrame, aRange, vertical, horizontal);
}
nsresult
nsCoreUtils::ScrollSubstringTo(nsIFrame *aFrame,
nsIDOMNode *aStartNode, PRInt32 aStartIndex,
nsIDOMNode *aEndNode, PRInt32 aEndIndex,
nsCoreUtils::ScrollSubstringTo(nsIFrame* aFrame, nsRange* aRange,
nsIPresShell::ScrollAxis aVertical,
nsIPresShell::ScrollAxis aHorizontal)
{
if (!aFrame || !aStartNode || !aEndNode)
if (!aFrame)
return NS_ERROR_FAILURE;
nsPresContext *presContext = aFrame->PresContext();
nsRefPtr<nsIDOMRange> scrollToRange = new nsRange();
nsCOMPtr<nsISelectionController> selCon;
aFrame->GetSelectionController(presContext, getter_AddRefs(selCon));
NS_ENSURE_TRUE(selCon, NS_ERROR_FAILURE);
scrollToRange->SetStart(aStartNode, aStartIndex);
scrollToRange->SetEnd(aEndNode, aEndIndex);
nsCOMPtr<nsISelection> selection;
selCon->GetSelection(nsISelectionController::SELECTION_ACCESSIBILITY,
getter_AddRefs(selection));
nsCOMPtr<nsISelectionPrivate> privSel(do_QueryInterface(selection));
selection->RemoveAllRanges();
selection->AddRange(scrollToRange);
selection->AddRange(aRange);
privSel->ScrollIntoViewInternal(
nsISelectionController::SELECTION_ANCHOR_REGION,

Просмотреть файл

@ -21,6 +21,8 @@
#include "nsPoint.h"
#include "nsTArray.h"
class nsRange;
/**
* Core utils.
*/
@ -129,31 +131,21 @@ public:
* nsIAccessibleText::scrollSubstringTo().
*
* @param aFrame the frame for accessible the range belongs to.
* @param aStartNode start node of a range
* @param aStartOffset an offset inside the start node
* @param aEndNode end node of a range
* @param aEndOffset an offset inside the end node
* @param aRange the range to scroll to
* @param aScrollType the place a range should be scrolled to
*/
static nsresult ScrollSubstringTo(nsIFrame *aFrame,
nsIDOMNode *aStartNode, PRInt32 aStartIndex,
nsIDOMNode *aEndNode, PRInt32 aEndIndex,
static nsresult ScrollSubstringTo(nsIFrame* aFrame, nsRange* aRange,
PRUint32 aScrollType);
/** Helper method to scroll range into view, used for implementation of
* nsIAccessibleText::scrollSubstringTo[Point]().
*
* @param aFrame the frame for accessible the range belongs to.
* @param aStartNode start node of a range
* @param aStartOffset an offset inside the start node
* @param aEndNode end node of a range
* @param aEndOffset an offset inside the end node
* @param aRange the range to scroll to
* @param aVertical how to align vertically, specified in percents, and when.
* @param aHorizontal how to align horizontally, specified in percents, and when.
*/
static nsresult ScrollSubstringTo(nsIFrame *aFrame,
nsIDOMNode *aStartNode, PRInt32 aStartIndex,
nsIDOMNode *aEndNode, PRInt32 aEndIndex,
static nsresult ScrollSubstringTo(nsIFrame* aFrame, nsRange* aRange,
nsIPresShell::ScrollAxis aVertical,
nsIPresShell::ScrollAxis aHorizontal);

Просмотреть файл

@ -519,9 +519,7 @@ HyperTextAccessible::DOMPointToHypertextOffset(nsINode* aNode,
// For text nodes, aNodeOffset comes in as a character offset
// Text offset will be added at the end, if we find the offset in this hypertext
// We want the "skipped" offset into the text (rendered text without the extra whitespace)
nsCOMPtr<nsIContent> content = do_QueryInterface(aNode);
NS_ASSERTION(content, "No nsIContent for dom node");
nsIFrame *frame = content->GetPrimaryFrame();
nsIFrame *frame = aNode->AsContent()->GetPrimaryFrame();
NS_ENSURE_TRUE(frame, nsnull);
nsresult rv = ContentToRenderedOffset(frame, aNodeOffset, &addTextOffset);
NS_ENSURE_SUCCESS(rv, nsnull);
@ -631,38 +629,11 @@ HyperTextAccessible::DOMPointToHypertextOffset(nsINode* aNode,
return nsnull;
}
nsresult
HyperTextAccessible::HypertextOffsetToDOMPoint(PRInt32 aHTOffset,
nsIDOMNode** aNode,
PRInt32* aOffset)
{
nsCOMPtr<nsIDOMNode> endNode;
PRInt32 endOffset;
return HypertextOffsetsToDOMRange(aHTOffset, aHTOffset, aNode, aOffset,
getter_AddRefs(endNode), &endOffset);
}
nsresult
HyperTextAccessible::HypertextOffsetsToDOMRange(PRInt32 aStartHTOffset,
PRInt32 aEndHTOffset,
nsIDOMNode** aStartNode,
PRInt32* aStartOffset,
nsIDOMNode** aEndNode,
PRInt32* aEndOffset)
nsRange* aRange)
{
NS_ENSURE_ARG_POINTER(aStartNode);
*aStartNode = nsnull;
NS_ENSURE_ARG_POINTER(aStartOffset);
*aStartOffset = -1;
NS_ENSURE_ARG_POINTER(aEndNode);
*aEndNode = nsnull;
NS_ENSURE_ARG_POINTER(aEndOffset);
*aEndOffset = -1;
// If the given offsets are 0 and associated editor is empty then return
// collapsed range with editor root element as range container.
if (aStartHTOffset == 0 && aEndHTOffset == 0) {
@ -674,11 +645,10 @@ HyperTextAccessible::HypertextOffsetsToDOMRange(PRInt32 aStartHTOffset,
nsCOMPtr<nsIDOMElement> editorRootElm;
editor->GetRootElement(getter_AddRefs(editorRootElm));
nsCOMPtr<nsIDOMNode> editorRoot(do_QueryInterface(editorRootElm));
nsCOMPtr<nsINode> editorRoot(do_QueryInterface(editorRootElm));
if (editorRoot) {
*aStartOffset = *aEndOffset = 0;
NS_ADDREF(*aStartNode = editorRoot);
NS_ADDREF(*aEndNode = editorRoot);
aRange->SetStart(editorRoot, 0);
aRange->SetEnd(editorRoot, 0);
return NS_OK;
}
@ -695,28 +665,21 @@ HyperTextAccessible::HypertextOffsetsToDOMRange(PRInt32 aStartHTOffset,
if (!startAcc || !endAcc)
return NS_ERROR_FAILURE;
nsCOMPtr<nsIDOMNode> startNode, endNode;
DOMPoint startPoint, endPoint;
nsresult rv = GetDOMPointByFrameOffset(startFrame, startOffset, startAcc,
getter_AddRefs(startNode),
&startOffset);
&startPoint);
NS_ENSURE_SUCCESS(rv, rv);
if (aStartHTOffset != aEndHTOffset) {
rv = GetDOMPointByFrameOffset(endFrame, endOffset, endAcc,
getter_AddRefs(endNode), &endOffset);
NS_ENSURE_SUCCESS(rv, rv);
} else {
endNode = startNode;
endOffset = startOffset;
}
rv = aRange->SetStart(startPoint.node, startPoint.idx);
NS_ENSURE_SUCCESS(rv, rv);
NS_ADDREF(*aStartNode = startNode);
*aStartOffset = startOffset;
if (aStartHTOffset == aEndHTOffset)
return aRange->SetEnd(startPoint.node, startPoint.idx);
NS_ADDREF(*aEndNode = endNode);
*aEndOffset = endOffset;
rv = GetDOMPointByFrameOffset(endFrame, endOffset, endAcc, &endPoint);
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
return aRange->SetEnd(endPoint.node, endPoint.idx);
}
PRInt32
@ -1863,19 +1826,18 @@ HyperTextAccessible::SetSelectionBounds(PRInt32 aSelectionNum,
NS_ENSURE_TRUE(range, NS_ERROR_FAILURE);
}
PRInt32 startOffset = 0, endOffset = 0;
nsCOMPtr<nsIDOMNode> startNode, endNode;
nsresult rv = HypertextOffsetsToDOMRange(aStartOffset, aEndOffset,
getter_AddRefs(startNode), &startOffset,
getter_AddRefs(endNode), &endOffset);
// XXX bug 758112 will make this nice, but for now just take the easy dumb approach
nsRefPtr<nsRange> tempRange = new nsRange();
nsresult rv = HypertextOffsetsToDOMRange(aStartOffset, aEndOffset, tempRange);
NS_ENSURE_SUCCESS(rv, rv);
rv = range->SetStart(startNode, startOffset);
nsCOMPtr<nsIDOMNode> startDOMNode = do_QueryInterface(tempRange->GetStartParent());
rv = range->SetStart(startDOMNode, tempRange->StartOffset());
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIDOMNode> endDOMNode = do_QueryInterface(tempRange->GetEndParent());
rv = isOnlyCaret ? range->Collapse(true) :
range->SetEnd(endNode, endOffset);
range->SetEnd(endDOMNode, tempRange->EndOffset());
NS_ENSURE_SUCCESS(rv, rv);
// If new range was created then add it, otherwise notify selection listeners
@ -1937,18 +1899,14 @@ NS_IMETHODIMP
HyperTextAccessible::ScrollSubstringTo(PRInt32 aStartIndex, PRInt32 aEndIndex,
PRUint32 aScrollType)
{
PRInt32 startOffset, endOffset;
nsCOMPtr<nsIDOMNode> startNode, endNode;
if (IsDefunct())
return NS_ERROR_FAILURE;
nsresult rv = HypertextOffsetsToDOMRange(aStartIndex, aEndIndex,
getter_AddRefs(startNode),
&startOffset,
getter_AddRefs(endNode),
&endOffset);
nsRefPtr<nsRange> range = new nsRange();
nsresult rv = HypertextOffsetsToDOMRange(aStartIndex, aEndIndex, range);
NS_ENSURE_SUCCESS(rv, rv);
return nsCoreUtils::ScrollSubstringTo(GetFrame(), startNode, startOffset,
endNode, endOffset, aScrollType);
return nsCoreUtils::ScrollSubstringTo(GetFrame(), range, aScrollType);
}
// void nsIAccessibleText::
@ -1970,12 +1928,8 @@ HyperTextAccessible::ScrollSubstringToPoint(PRInt32 aStartIndex,
this, &coords);
NS_ENSURE_SUCCESS(rv, rv);
PRInt32 startOffset, endOffset;
nsCOMPtr<nsIDOMNode> startNode, endNode;
rv = HypertextOffsetsToDOMRange(aStartIndex, aEndIndex,
getter_AddRefs(startNode), &startOffset,
getter_AddRefs(endNode), &endOffset);
nsRefPtr<nsRange> range = new nsRange();
rv = HypertextOffsetsToDOMRange(aStartIndex, aEndIndex, range);
NS_ENSURE_SUCCESS(rv, rv);
nsPresContext *presContext = frame->PresContext();
@ -2004,9 +1958,7 @@ HyperTextAccessible::ScrollSubstringToPoint(PRInt32 aStartIndex,
PRInt16 hPercent = offsetPoint.x * 100 / size.width;
PRInt16 vPercent = offsetPoint.y * 100 / size.height;
rv = nsCoreUtils::ScrollSubstringTo(GetFrame(), startNode, startOffset,
endNode, endOffset,
vPercent, hPercent);
rv = nsCoreUtils::ScrollSubstringTo(frame, range, vPercent, hPercent);
NS_ENSURE_SUCCESS(rv, rv);
initialScrolled = true;
@ -2226,16 +2178,12 @@ HyperTextAccessible::GetChildIndexAtOffset(PRUint32 aOffset)
// HyperTextAccessible protected
nsresult
HyperTextAccessible::GetDOMPointByFrameOffset(nsIFrame* aFrame,
PRInt32 aOffset,
HyperTextAccessible::GetDOMPointByFrameOffset(nsIFrame* aFrame, PRInt32 aOffset,
Accessible* aAccessible,
nsIDOMNode** aNode,
PRInt32* aNodeOffset)
DOMPoint* aPoint)
{
NS_ENSURE_ARG(aAccessible);
nsCOMPtr<nsIDOMNode> node;
if (!aFrame) {
// If the given frame is null then set offset after the DOM node of the
// given accessible.
@ -2247,31 +2195,30 @@ HyperTextAccessible::GetDOMPointByFrameOffset(nsIFrame* aFrame,
nsIContent* parent = content->GetParent();
*aNodeOffset = parent->IndexOf(content) + 1;
node = do_QueryInterface(parent);
aPoint->idx = parent->IndexOf(content) + 1;
aPoint->node = parent;
} else if (aFrame->GetType() == nsGkAtoms::textFrame) {
nsCOMPtr<nsIContent> content(aFrame->GetContent());
nsIContent* content = aFrame->GetContent();
NS_ENSURE_STATE(content);
nsIFrame *primaryFrame = content->GetPrimaryFrame();
nsresult rv = RenderedToContentOffset(primaryFrame, aOffset, aNodeOffset);
nsresult rv = RenderedToContentOffset(primaryFrame, aOffset, &(aPoint->idx));
NS_ENSURE_SUCCESS(rv, rv);
node = do_QueryInterface(content);
aPoint->node = content;
} else {
nsCOMPtr<nsIContent> content(aFrame->GetContent());
nsIContent* content = aFrame->GetContent();
NS_ENSURE_STATE(content);
nsCOMPtr<nsIContent> parent(content->GetParent());
nsIContent* parent = content->GetParent();
NS_ENSURE_STATE(parent);
*aNodeOffset = parent->IndexOf(content);
node = do_QueryInterface(parent);
aPoint->idx = parent->IndexOf(content);
aPoint->node = parent;
}
NS_IF_ADDREF(*aNode = node);
return NS_OK;
}

Просмотреть файл

@ -16,6 +16,15 @@
#include "nsFrameSelection.h"
#include "nsISelectionController.h"
namespace mozilla {
namespace a11y {
struct DOMPoint {
nsINode* node;
PRInt32 idx;
};
}
}
enum EGetTextType { eGetBefore=-1, eGetAt=0, eGetAfter=1 };
// This character marks where in the text returned via nsIAccessibleText(),
@ -130,33 +139,16 @@ public:
PRInt32* aHypertextOffset,
bool aIsEndOffset = false);
/**
* Turn a hypertext offsets into DOM point.
*
* @param aHTOffset [in] the given start hypertext offset
* @param aNode [out] start node
* @param aOffset [out] offset inside the start node
*/
nsresult HypertextOffsetToDOMPoint(PRInt32 aHTOffset,
nsIDOMNode **aNode,
PRInt32 *aOffset);
/**
* Turn a start and end hypertext offsets into DOM range.
*
* @param aStartHTOffset [in] the given start hypertext offset
* @param aEndHTOffset [in] the given end hypertext offset
* @param aStartNode [out] start node of the range
* @param aStartOffset [out] start offset of the range
* @param aEndNode [out] end node of the range
* @param aEndOffset [out] end offset of the range
* @param aRange [out] the range whose bounds to set
*/
nsresult HypertextOffsetsToDOMRange(PRInt32 aStartHTOffset,
PRInt32 aEndHTOffset,
nsIDOMNode **aStartNode,
PRInt32 *aStartOffset,
nsIDOMNode **aEndNode,
PRInt32 *aEndOffset);
nsRange* aRange);
/**
* Return true if the used ARIA role (if any) allows the hypertext accessible
@ -355,7 +347,7 @@ protected:
// Helpers
nsresult GetDOMPointByFrameOffset(nsIFrame* aFrame, PRInt32 aOffset,
Accessible* aAccessible,
nsIDOMNode** aNode, PRInt32* aNodeOffset);
mozilla::a11y::DOMPoint* aPoint);
/**

Просмотреть файл

@ -155,10 +155,15 @@ __try {
if (IsDefunct())
return E_FAIL;
nsCOMPtr<nsIDOMNode> DOMNode(do_QueryInterface(mContent));
nsRefPtr<nsRange> range = new nsRange();
if (NS_FAILED(range->SetStart(mContent, aStartIndex)))
return E_FAIL;
if (NS_FAILED(range->SetEnd(mContent, aEndIndex)))
return E_FAIL;
nsresult rv =
nsCoreUtils::ScrollSubstringTo(GetFrame(), DOMNode, aStartIndex,
DOMNode, aEndIndex,
nsCoreUtils::ScrollSubstringTo(GetFrame(), range,
nsIAccessibleScrollType::SCROLL_TYPE_ANYWHERE);
if (NS_FAILED(rv))
return E_FAIL;