mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-21 14:47:31 +09:00
Bug 1348851 - Use new block when better selection isn't found.
Tag #1375
This commit is contained in:
parent
1f233fa14b
commit
9220996e92
3 changed files with 35 additions and 11 deletions
|
|
@ -7179,15 +7179,18 @@ HTMLEditRules::PinSelectionToNewBlock(Selection* aSelection)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (NS_WARN_IF(!mNewBlock)) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
|
||||||
// get the (collapsed) selection location
|
// get the (collapsed) selection location
|
||||||
nsCOMPtr<nsIDOMNode> selNode, temp;
|
nsCOMPtr<nsIDOMNode> selNode;
|
||||||
int32_t selOffset;
|
int32_t selOffset;
|
||||||
NS_ENSURE_STATE(mHTMLEditor);
|
NS_ENSURE_STATE(mHTMLEditor);
|
||||||
nsresult rv =
|
nsresult rv =
|
||||||
mHTMLEditor->GetStartNodeAndOffset(aSelection,
|
mHTMLEditor->GetStartNodeAndOffset(aSelection,
|
||||||
getter_AddRefs(selNode), &selOffset);
|
getter_AddRefs(selNode), &selOffset);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
temp = selNode;
|
|
||||||
|
|
||||||
// use ranges and sRangeHelper to compare sel point to new block
|
// use ranges and sRangeHelper to compare sel point to new block
|
||||||
nsCOMPtr<nsINode> node = do_QueryInterface(selNode);
|
nsCOMPtr<nsINode> node = do_QueryInterface(selNode);
|
||||||
|
|
@ -7197,24 +7200,23 @@ HTMLEditRules::PinSelectionToNewBlock(Selection* aSelection)
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
rv = range->SetEnd(selNode, selOffset);
|
rv = range->SetEnd(selNode, selOffset);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
nsCOMPtr<nsIContent> block = mNewBlock.get();
|
|
||||||
NS_ENSURE_TRUE(block, NS_ERROR_NO_INTERFACE);
|
|
||||||
bool nodeBefore, nodeAfter;
|
bool nodeBefore, nodeAfter;
|
||||||
rv = nsRange::CompareNodeToRange(block, range, &nodeBefore, &nodeAfter);
|
rv = nsRange::CompareNodeToRange(mNewBlock, range, &nodeBefore, &nodeAfter);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
if (nodeBefore && nodeAfter) {
|
if (nodeBefore && nodeAfter) {
|
||||||
return NS_OK; // selection is inside block
|
return NS_OK; // selection is inside block
|
||||||
} else if (nodeBefore) {
|
} else if (nodeBefore) {
|
||||||
// selection is after block. put at end of block.
|
// selection is after block. put at end of block.
|
||||||
nsCOMPtr<nsIDOMNode> tmp = GetAsDOMNode(mNewBlock);
|
|
||||||
NS_ENSURE_STATE(mHTMLEditor);
|
NS_ENSURE_STATE(mHTMLEditor);
|
||||||
tmp = GetAsDOMNode(mHTMLEditor->GetLastEditableChild(*block));
|
nsCOMPtr<nsINode> tmp = mHTMLEditor->GetLastEditableChild(*mNewBlock);
|
||||||
|
if (!tmp) {
|
||||||
|
tmp = mNewBlock;
|
||||||
|
}
|
||||||
uint32_t endPoint;
|
uint32_t endPoint;
|
||||||
if (mHTMLEditor->IsTextNode(tmp) ||
|
if (mHTMLEditor->IsTextNode(tmp) ||
|
||||||
mHTMLEditor->IsContainer(tmp)) {
|
mHTMLEditor->IsContainer(tmp)) {
|
||||||
rv = EditorBase::GetLengthOfDOMNode(tmp, endPoint);
|
endPoint = tmp->Length();
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
} else {
|
} else {
|
||||||
tmp = EditorBase::GetNodeLocation(tmp, (int32_t*)&endPoint);
|
tmp = EditorBase::GetNodeLocation(tmp, (int32_t*)&endPoint);
|
||||||
endPoint++; // want to be after this node
|
endPoint++; // want to be after this node
|
||||||
|
|
@ -7222,9 +7224,11 @@ HTMLEditRules::PinSelectionToNewBlock(Selection* aSelection)
|
||||||
return aSelection->Collapse(tmp, (int32_t)endPoint);
|
return aSelection->Collapse(tmp, (int32_t)endPoint);
|
||||||
} else {
|
} else {
|
||||||
// selection is before block. put at start of block.
|
// selection is before block. put at start of block.
|
||||||
nsCOMPtr<nsIDOMNode> tmp = GetAsDOMNode(mNewBlock);
|
|
||||||
NS_ENSURE_STATE(mHTMLEditor);
|
NS_ENSURE_STATE(mHTMLEditor);
|
||||||
tmp = GetAsDOMNode(mHTMLEditor->GetFirstEditableChild(*block));
|
nsCOMPtr<nsINode> tmp = mHTMLEditor->GetFirstEditableChild(*mNewBlock);
|
||||||
|
if (!tmp) {
|
||||||
|
tmp = mNewBlock;
|
||||||
|
}
|
||||||
int32_t offset;
|
int32_t offset;
|
||||||
if (mHTMLEditor->IsTextNode(tmp) ||
|
if (mHTMLEditor->IsTextNode(tmp) ||
|
||||||
mHTMLEditor->IsContainer(tmp)) {
|
mHTMLEditor->IsContainer(tmp)) {
|
||||||
|
|
|
||||||
19
editor/libeditor/crashtests/1348851.html
Normal file
19
editor/libeditor/crashtests/1348851.html
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
<!DOCTYPE>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<script>
|
||||||
|
function boom(){
|
||||||
|
document.designMode = "on";
|
||||||
|
document.execCommand("insertlinebreak");
|
||||||
|
document.designMode = "off";
|
||||||
|
document.designMode = "on";
|
||||||
|
document.execCommand("insertunorderedlist");
|
||||||
|
}
|
||||||
|
addEventListener("DOMContentLoaded", boom);
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body style="display:flex;">
|
||||||
|
<!--comment-->
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -68,4 +68,5 @@ load 1158452.html
|
||||||
load 1158651.html
|
load 1158651.html
|
||||||
load 1244894.xhtml
|
load 1244894.xhtml
|
||||||
load 1272490.html
|
load 1272490.html
|
||||||
|
load 1348851.html
|
||||||
load 1317704.html
|
load 1317704.html
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue