Bug 240933 - Part 9: Simplify text control frame's DOM point to offset conversion code; r=roc a=dbaron

--HG--
extra : rebase_source : 134895e08a57c7aeb39f25266d8925cde4595159
This commit is contained in:
Ehsan Akhgari 2010-07-20 08:47:28 -04:00
parent 57f8ffa5cb
commit 58248ee66a
6 changed files with 125 additions and 101 deletions

View File

@ -998,51 +998,27 @@ nsTextControlFrame::DOMPointToOffset(nsIDOMNode* aNode,
if (!length || aNodeOffset < 0) if (!length || aNodeOffset < 0)
return NS_OK; return NS_OK;
PRInt32 i, textOffset = 0; NS_ASSERTION(length <= 2, "We should have one text node and one mozBR at most");
PRInt32 lastIndex = (PRInt32)length - 1;
for (i = 0; i < (PRInt32)length; i++) { nsCOMPtr<nsIDOMNode> firstNode;
if (rootNode == aNode && i == aNodeOffset) { rv = nodeList->Item(0, getter_AddRefs(firstNode));
*aResult = textOffset;
return NS_OK;
}
nsCOMPtr<nsIDOMNode> item;
rv = nodeList->Item(i, getter_AddRefs(item));
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
NS_ENSURE_TRUE(item, NS_ERROR_FAILURE); nsCOMPtr<nsIDOMText> textNode = do_QueryInterface(firstNode);
nsCOMPtr<nsIDOMText> domText(do_QueryInterface(item)); nsCOMPtr<nsIDOMText> nodeAsText = do_QueryInterface(aNode);
if (nodeAsText || (aNode == rootNode && aNodeOffset == 0)) {
if (domText) { // Selection is somewhere inside the text node; the offset is aNodeOffset
PRUint32 textLength = 0; *aResult = aNodeOffset;
} else {
rv = domText->GetLength(&textLength); // Selection is on the mozBR node, so offset should be set to the length
// of the text node.
if (textNode) {
rv = textNode->GetLength(&length);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
*aResult = PRInt32(length);
if (item == aNode) {
NS_ASSERTION((aNodeOffset >= 0 && aNodeOffset <= (PRInt32)textLength),
"Invalid aNodeOffset!");
*aResult = textOffset + aNodeOffset;
return NS_OK;
}
textOffset += textLength;
}
else {
// Must be a BR node. If it's not the last BR node
// under the root, count it as a newline.
if (i != lastIndex)
++textOffset;
} }
} }
NS_ASSERTION((aNode == rootNode && aNodeOffset == (PRInt32)length),
"Invalid node offset!");
*aResult = textOffset;
return NS_OK; return NS_OK;
} }
@ -1074,71 +1050,25 @@ nsTextControlFrame::OffsetToDOMPoint(PRInt32 aOffset,
rv = nodeList->GetLength(&length); rv = nodeList->GetLength(&length);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
if (!length || aOffset < 0) { NS_ASSERTION(length <= 2, "We should have one text node and one mozBR at most");
nsCOMPtr<nsIDOMNode> firstNode;
rv = nodeList->Item(0, getter_AddRefs(firstNode));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIDOMText> textNode = do_QueryInterface(firstNode);
if (length == 0 || aOffset < 0) {
NS_IF_ADDREF(*aResult = rootNode);
*aPosition = 0; *aPosition = 0;
*aResult = rootNode; } else if (textNode) {
NS_ADDREF(*aResult); NS_IF_ADDREF(*aResult = firstNode);
*aPosition = aOffset;
} else {
NS_IF_ADDREF(*aResult = rootNode);
*aPosition = 0;
}
return NS_OK; return NS_OK;
}
PRInt32 textOffset = 0;
PRUint32 lastIndex = length - 1;
for (PRUint32 i=0; i<length; i++) {
nsCOMPtr<nsIDOMNode> item;
rv = nodeList->Item(i, getter_AddRefs(item));
NS_ENSURE_SUCCESS(rv, rv);
NS_ENSURE_TRUE(item, NS_ERROR_FAILURE);
nsCOMPtr<nsIDOMText> domText(do_QueryInterface(item));
if (domText) {
PRUint32 textLength = 0;
rv = domText->GetLength(&textLength);
NS_ENSURE_SUCCESS(rv, rv);
// Check if aOffset falls within this range.
if (aOffset >= textOffset && aOffset <= textOffset+(PRInt32)textLength) {
*aPosition = aOffset - textOffset;
*aResult = item;
NS_ADDREF(*aResult);
return NS_OK;
}
textOffset += textLength;
// If there aren't any more siblings after this text node,
// return the point at the end of this text node!
if (i == lastIndex) {
*aPosition = textLength;
*aResult = item;
NS_ADDREF(*aResult);
return NS_OK;
}
}
else {
// Must be a BR node, count it as a newline.
if (aOffset == textOffset || i == lastIndex) {
// We've found the correct position, or aOffset takes us
// beyond the last child under rootNode, just return the point
// under rootNode that is in front of this br.
*aPosition = i;
*aResult = rootNode;
NS_ADDREF(*aResult);
return NS_OK;
}
++textOffset;
}
}
NS_ERROR("We should never get here!");
return NS_ERROR_FAILURE;
} }
NS_IMETHODIMP NS_IMETHODIMP

View File

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<body onload="setup()">
<textarea id="ta" dir="rtl">
&#x05d0;a&#x05d1;
</textarea>
<textarea id="tb">
abc
</textarea>
<div id="coords1"></div>
<div id="coords2"></div>
<script>
function setup() {
document.getElementById("coords1").innerHTML = document.getElementById("ta").selectionStart;
document.getElementById("coords2").innerHTML = document.getElementById("tb").selectionStart;
}
</script>
</body>
</html>

View File

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html>
<body>
<textarea id="ta" dir="rtl">
&#x05d0;a&#x05d1;
</textarea>
<textarea id="tb">
abc
</textarea>
<div id="coords1">6</div>
<div id="coords2">6</div>
</body>
</html>

View File

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html>
<body onload="setup()">
<textarea id="ta" dir="rtl">
&#x05d0;a&#x05d1;
</textarea>
<textarea id="tb">
abc
</textarea>
<div id="coords1"></div>
<div id="coords2"></div>
<script>
function setup() {
document.getElementById("ta").selectionStart = 3;
document.getElementById("ta").selectionEnd = 3;
document.getElementById("coords1").innerHTML = document.getElementById("ta").selectionStart;
document.getElementById("tb").selectionStart = 3;
document.getElementById("tb").selectionEnd = 3;
document.getElementById("coords2").innerHTML = document.getElementById("tb").selectionStart;
}
</script>
</body>
</html>

View File

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html>
<body>
<textarea id="ta" dir="rtl">
&#x05d0;a&#x05d1;
</textarea>
<textarea id="tb">
abc
</textarea>
<div id="coords1">3</div>
<div id="coords2">3</div>
</body>
</html>

View File

@ -205,6 +205,8 @@ random == 99850-1b.html 99850-1-ref.html # bug 471629
== 236539-1.html 236539-1-ref.html == 236539-1.html 236539-1-ref.html
== 240029-1.html 240029-1-ref.html == 240029-1.html 240029-1-ref.html
== 240470-1.html 240470-1-ref.html == 240470-1.html 240470-1-ref.html
== 240933-1.html 240933-1-ref.html
== 240933-2.html 240933-2-ref.html
== 243266-1.html 243266-1-ref.html == 243266-1.html 243266-1-ref.html
== 243302-1.html 243302-1-ref.html == 243302-1.html 243302-1-ref.html
== 243519-1.html 243519-1-ref.html == 243519-1.html 243519-1-ref.html