Backed out changeset 7be23bb65b93 (bug 1324505)

MozReview-Commit-ID: 8ONKT1Q6oER
This commit is contained in:
Makoto Kato 2017-01-16 19:32:56 +09:00
Родитель 4306cf9aa6
Коммит a396fb9acd
4 изменённых файлов: 76 добавлений и 52 удалений

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

@ -3407,7 +3407,7 @@ HTMLEditRules::WillRemoveList(Selection* aSelection,
// unlist this listitem
bool bOutOfList;
do {
rv = PopListItem(*curNode->AsContent(), &bOutOfList);
rv = PopListItem(GetAsDOMNode(curNode), &bOutOfList);
NS_ENSURE_SUCCESS(rv, rv);
} while (!bOutOfList); // keep popping it out until it's not in a list anymore
} else if (HTMLEditUtils::IsList(curNode)) {
@ -4127,7 +4127,8 @@ HTMLEditRules::WillOutdent(Selection& aSelection,
lastBQChild = nullptr;
curBlockQuoteIsIndentedWithCSS = false;
}
rv = PopListItem(*curNode->AsContent());
bool unused;
rv = PopListItem(GetAsDOMNode(curNode), &unused);
NS_ENSURE_SUCCESS(rv, rv);
continue;
}
@ -4208,7 +4209,8 @@ HTMLEditRules::WillOutdent(Selection& aSelection,
nsCOMPtr<nsIContent> child = curNode->GetLastChild();
while (child) {
if (HTMLEditUtils::IsListItem(child)) {
rv = PopListItem(*child);
bool unused;
rv = PopListItem(GetAsDOMNode(child), &unused);
NS_ENSURE_SUCCESS(rv, rv);
} else if (HTMLEditUtils::IsList(child)) {
// We have an embedded list, so move it out from under the parent
@ -4916,8 +4918,12 @@ HTMLEditRules::CheckForEmptyBlock(nsINode* aStartNode,
if (HTMLEditUtils::IsListItem(emptyBlock)) {
// Are we the first list item in the list?
bool bIsFirst;
NS_ENSURE_STATE(htmlEditor);
if (htmlEditor->IsFirstEditableChild(emptyBlock)) {
nsresult rv =
htmlEditor->IsFirstEditableChild(GetAsDOMNode(emptyBlock), &bIsFirst);
NS_ENSURE_SUCCESS(rv, rv);
if (bIsFirst) {
nsCOMPtr<nsINode> listParent = blockParent->GetParentNode();
NS_ENSURE_TRUE(listParent, NS_ERROR_FAILURE);
int32_t listOffset = listParent->IndexOf(blockParent);
@ -4929,7 +4935,7 @@ HTMLEditRules::CheckForEmptyBlock(nsINode* aStartNode,
htmlEditor->CreateBR(listParent, listOffset);
NS_ENSURE_STATE(br);
// Adjust selection to be right before it
nsresult rv = aSelection->Collapse(listParent, listOffset);
rv = aSelection->Collapse(listParent, listOffset);
NS_ENSURE_SUCCESS(rv, rv);
}
// Else just let selection percolate up. We'll adjust it in
@ -6517,7 +6523,10 @@ HTMLEditRules::ReturnInListItem(Selection& aSelection,
int32_t offset = listParent ? listParent->IndexOf(list) : -1;
// Are we the last list item in the list?
if (!htmlEditor->IsLastEditableChild(&aListItem)) {
bool isLast;
rv = htmlEditor->IsLastEditableChild(aListItem.AsDOMNode(), &isLast);
NS_ENSURE_SUCCESS(rv, rv);
if (!isLast) {
// We need to split the list!
ErrorResult rv;
htmlEditor->SplitNode(*list, itemOffset, rv);
@ -7844,23 +7853,23 @@ HTMLEditRules::ListIsEmptyLine(nsTArray<OwningNonNull<nsINode>>& aArrayOfNodes)
nsresult
HTMLEditRules::PopListItem(nsIContent& aListItem,
HTMLEditRules::PopListItem(nsIDOMNode* aListItem,
bool* aOutOfList)
{
nsCOMPtr<Element> listItem = do_QueryInterface(aListItem);
// check parms
NS_ENSURE_TRUE(listItem && aOutOfList, NS_ERROR_NULL_POINTER);
// init out params
if (aOutOfList) {
*aOutOfList = false;
}
*aOutOfList = false;
nsCOMPtr<nsIContent> kungFuDeathGrip(&aListItem);
nsCOMPtr<nsINode> curParent = aListItem.GetParentNode();
nsCOMPtr<nsINode> curParent = listItem->GetParentNode();
if (NS_WARN_IF(!curParent)) {
return NS_ERROR_FAILURE;
}
int32_t offset = curParent->IndexOf(&aListItem);
int32_t offset = curParent->IndexOf(listItem);
if (!HTMLEditUtils::IsListItem(&aListItem)) {
if (!HTMLEditUtils::IsListItem(listItem)) {
return NS_ERROR_FAILURE;
}
@ -7869,21 +7878,24 @@ HTMLEditRules::PopListItem(nsIContent& aListItem,
nsCOMPtr<nsINode> curParPar = curParent->GetParentNode();
int32_t parOffset = curParPar ? curParPar->IndexOf(curParent) : -1;
bool bIsFirstListItem;
NS_ENSURE_STATE(mHTMLEditor);
bool bIsFirstListItem = mHTMLEditor->IsFirstEditableChild(&aListItem);
nsresult rv =
mHTMLEditor->IsFirstEditableChild(aListItem, &bIsFirstListItem);
NS_ENSURE_SUCCESS(rv, rv);
bool bIsLastListItem;
NS_ENSURE_STATE(mHTMLEditor);
bool bIsLastListItem = mHTMLEditor->IsLastEditableChild(&aListItem);
rv = mHTMLEditor->IsLastEditableChild(aListItem, &bIsLastListItem);
NS_ENSURE_SUCCESS(rv, rv);
if (!bIsFirstListItem && !bIsLastListItem) {
// split the list
ErrorResult rv;
nsCOMPtr<nsIDOMNode> newBlock;
NS_ENSURE_STATE(mHTMLEditor);
nsCOMPtr<nsIContent> newBlock =
mHTMLEditor->SplitNode(*curParent->AsContent(), offset, rv);
if (NS_WARN_IF(rv.Failed())) {
return rv.StealNSResult();
}
rv = mHTMLEditor->SplitNode(GetAsDOMNode(curParent), offset,
getter_AddRefs(newBlock));
NS_ENSURE_SUCCESS(rv, rv);
}
if (!bIsFirstListItem) {
@ -7891,18 +7903,16 @@ HTMLEditRules::PopListItem(nsIContent& aListItem,
}
NS_ENSURE_STATE(mHTMLEditor);
nsresult rv = mHTMLEditor->MoveNode(&aListItem, curParPar, parOffset);
rv = mHTMLEditor->MoveNode(listItem, curParPar, parOffset);
NS_ENSURE_SUCCESS(rv, rv);
// unwrap list item contents if they are no longer in a list
if (!HTMLEditUtils::IsList(curParPar) &&
HTMLEditUtils::IsListItem(&aListItem)) {
HTMLEditUtils::IsListItem(listItem)) {
NS_ENSURE_STATE(mHTMLEditor);
rv = mHTMLEditor->RemoveBlockContainer(*aListItem.AsElement());
rv = mHTMLEditor->RemoveBlockContainer(*listItem);
NS_ENSURE_SUCCESS(rv, rv);
if (aOutOfList) {
*aOutOfList = true;
}
*aOutOfList = true;
}
return NS_OK;
}
@ -7919,7 +7929,7 @@ HTMLEditRules::RemoveListStructure(Element& aList)
bool isOutOfList;
// Keep popping it out until it's not in a list anymore
do {
nsresult rv = PopListItem(child, &isOutOfList);
nsresult rv = PopListItem(child->AsDOMNode(), &isOutOfList);
NS_ENSURE_SUCCESS(rv, rv);
} while (!isOutOfList);
} else if (HTMLEditUtils::IsList(child)) {

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

@ -372,7 +372,7 @@ protected:
EditorDOMPoint JoinNodesSmart(nsIContent& aNodeLeft,
nsIContent& aNodeRight);
Element* GetTopEnclosingMailCite(nsINode& aNode);
nsresult PopListItem(nsIContent& aListItem, bool* aOutOfList = nullptr);
nsresult PopListItem(nsIDOMNode* aListItem, bool* aOutOfList);
nsresult RemoveListStructure(Element& aList);
nsresult CacheInlineStyles(nsIDOMNode* aNode);
nsresult ReapplyCachedStyles();

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

@ -1572,10 +1572,12 @@ HTMLEditor::InsertElementAtSelection(nsIDOMElement* aElement,
rv = SetCaretAfterElement(aElement);
NS_ENSURE_SUCCESS(rv, rv);
}
// check for inserting a whole table at the end of a block. If so insert
// a br after it.
// check for inserting a whole table at the end of a block. If so insert a br after it.
if (HTMLEditUtils::IsTable(node)) {
if (IsLastEditableChild(element)) {
bool isLast;
rv = IsLastEditableChild(node, &isLast);
NS_ENSURE_SUCCESS(rv, rv);
if (isLast) {
nsCOMPtr<nsIDOMNode> brNode;
rv = CreateBR(parentSelectedNode, offsetForInsert + 1,
address_of(brNode));
@ -4150,28 +4152,40 @@ HTMLEditor::GetNextHTMLNode(nsIDOMNode* aNode,
return NS_OK;
}
bool
HTMLEditor::IsFirstEditableChild(nsINode* aNode)
nsresult
HTMLEditor::IsFirstEditableChild(nsIDOMNode* aNode,
bool* aOutIsFirst)
{
MOZ_ASSERT(aNode);
nsCOMPtr<nsINode> node = do_QueryInterface(aNode);
NS_ENSURE_TRUE(aOutIsFirst && node, NS_ERROR_NULL_POINTER);
// init out parms
*aOutIsFirst = false;
// find first editable child and compare it to aNode
nsCOMPtr<nsINode> parent = aNode->GetParentNode();
if (NS_WARN_IF(!parent)) {
return false;
}
return (GetFirstEditableChild(*parent) == aNode);
nsCOMPtr<nsINode> parent = node->GetParentNode();
NS_ENSURE_TRUE(parent, NS_ERROR_FAILURE);
*aOutIsFirst = (GetFirstEditableChild(*parent) == node);
return NS_OK;
}
bool
HTMLEditor::IsLastEditableChild(nsINode* aNode)
nsresult
HTMLEditor::IsLastEditableChild(nsIDOMNode* aNode,
bool* aOutIsLast)
{
MOZ_ASSERT(aNode);
nsCOMPtr<nsINode> node = do_QueryInterface(aNode);
NS_ENSURE_TRUE(aOutIsLast && node, NS_ERROR_NULL_POINTER);
// init out parms
*aOutIsLast = false;
// find last editable child and compare it to aNode
nsCOMPtr<nsINode> parent = aNode->GetParentNode();
if (NS_WARN_IF(!parent)) {
return false;
}
return (GetLastEditableChild(*parent) == aNode);
nsCOMPtr<nsINode> parent = node->GetParentNode();
NS_ENSURE_TRUE(parent, NS_ERROR_FAILURE);
*aOutIsLast = (GetLastEditableChild(*parent) == node);
return NS_OK;
}
nsIContent*

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

@ -840,8 +840,8 @@ protected:
nsCOMPtr<nsIDOMNode>* outNode,
bool bNoBlockCrossing = false);
bool IsFirstEditableChild(nsINode* aNode);
bool IsLastEditableChild(nsINode* aNode);
nsresult IsFirstEditableChild(nsIDOMNode* aNode, bool* aOutIsFirst);
nsresult IsLastEditableChild(nsIDOMNode* aNode, bool* aOutIsLast);
nsIContent* GetFirstEditableChild(nsINode& aNode);
nsIContent* GetLastEditableChild(nsINode& aNode);