mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-12 21:05:36 +00:00
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:
parent
57f8ffa5cb
commit
58248ee66a
@ -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
|
||||||
|
25
layout/reftests/bugs/240933-1-ref.html
Normal file
25
layout/reftests/bugs/240933-1-ref.html
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<body onload="setup()">
|
||||||
|
<textarea id="ta" dir="rtl">
|
||||||
|
|
||||||
|
אaב
|
||||||
|
|
||||||
|
</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>
|
19
layout/reftests/bugs/240933-1.html
Normal file
19
layout/reftests/bugs/240933-1.html
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<textarea id="ta" dir="rtl">
|
||||||
|
|
||||||
|
אaב
|
||||||
|
|
||||||
|
</textarea>
|
||||||
|
<textarea id="tb">
|
||||||
|
|
||||||
|
abc
|
||||||
|
|
||||||
|
</textarea>
|
||||||
|
|
||||||
|
<div id="coords1">6</div>
|
||||||
|
<div id="coords2">6</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
29
layout/reftests/bugs/240933-2-ref.html
Normal file
29
layout/reftests/bugs/240933-2-ref.html
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<body onload="setup()">
|
||||||
|
<textarea id="ta" dir="rtl">
|
||||||
|
|
||||||
|
אaב
|
||||||
|
|
||||||
|
</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>
|
19
layout/reftests/bugs/240933-2.html
Normal file
19
layout/reftests/bugs/240933-2.html
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<textarea id="ta" dir="rtl">
|
||||||
|
|
||||||
|
אaב
|
||||||
|
|
||||||
|
</textarea>
|
||||||
|
<textarea id="tb">
|
||||||
|
|
||||||
|
abc
|
||||||
|
|
||||||
|
</textarea>
|
||||||
|
|
||||||
|
<div id="coords1">3</div>
|
||||||
|
<div id="coords2">3</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user