Bug 1574852 - part 32: Move `HTMLEditRules::MaybeSplitAncestorsForInsertWithTransaction()` to `HTMLEditor` r=m_kato

Differential Revision: https://phabricator.services.mozilla.com/D43193

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Masayuki Nakano 2019-08-26 01:38:56 +00:00
Родитель 337e804b70
Коммит 337a97617a
3 изменённых файлов: 89 добавлений и 68 удалений

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

@ -4071,8 +4071,9 @@ nsresult HTMLEditRules::MakeList(nsAtom& aListType, bool aEntireList,
} }
SplitNodeResult splitAtSelectionStartResult = SplitNodeResult splitAtSelectionStartResult =
MaybeSplitAncestorsForInsertWithTransaction(aListType, MOZ_KnownLive(HTMLEditorRef())
atStartOfSelection); .MaybeSplitAncestorsForInsertWithTransaction(aListType,
atStartOfSelection);
if (NS_WARN_IF(splitAtSelectionStartResult.Failed())) { if (NS_WARN_IF(splitAtSelectionStartResult.Failed())) {
return splitAtSelectionStartResult.Rv(); return splitAtSelectionStartResult.Rv();
} }
@ -4356,7 +4357,9 @@ nsresult HTMLEditRules::MakeList(nsAtom& aListType, bool aEntireList,
// need to make a list to put things in if we haven't already, // need to make a list to put things in if we haven't already,
if (!curList) { if (!curList) {
SplitNodeResult splitCurNodeResult = SplitNodeResult splitCurNodeResult =
MaybeSplitAncestorsForInsertWithTransaction(aListType, atCurNode); MOZ_KnownLive(HTMLEditorRef())
.MaybeSplitAncestorsForInsertWithTransaction(aListType,
atCurNode);
if (NS_WARN_IF(splitCurNodeResult.Failed())) { if (NS_WARN_IF(splitCurNodeResult.Failed())) {
return splitCurNodeResult.Rv(); return splitCurNodeResult.Rv();
} }
@ -4670,8 +4673,9 @@ nsresult HTMLEditRules::MakeBasicBlock(nsAtom& blockType) {
} }
// Make sure we can put a block here. // Make sure we can put a block here.
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction(blockType, MOZ_KnownLive(HTMLEditorRef())
pointToInsertBlock); .MaybeSplitAncestorsForInsertWithTransaction(blockType,
pointToInsertBlock);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -4866,8 +4870,9 @@ nsresult HTMLEditRules::IndentAroundSelectionWithCSS() {
// make sure we can put a block here // make sure we can put a block here
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::div, MOZ_KnownLive(HTMLEditorRef())
atStartOfSelection); .MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::div,
atStartOfSelection);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -4989,8 +4994,9 @@ nsresult HTMLEditRules::IndentAroundSelectionWithCSS() {
atCurNode.GetContainer()->NodeInfo()->NameAtom(); atCurNode.GetContainer()->NodeInfo()->NameAtom();
// Create a new nested list of correct type. // Create a new nested list of correct type.
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction( MOZ_KnownLive(HTMLEditorRef())
MOZ_KnownLive(*containerName), atCurNode); .MaybeSplitAncestorsForInsertWithTransaction(
MOZ_KnownLive(*containerName), atCurNode);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -5042,8 +5048,9 @@ nsresult HTMLEditRules::IndentAroundSelectionWithCSS() {
} }
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::div, MOZ_KnownLive(HTMLEditorRef())
atCurNode); .MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::div,
atCurNode);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -5159,8 +5166,9 @@ nsresult HTMLEditRules::IndentAroundSelectionWithHTML() {
// Make sure we can put a block here. // Make sure we can put a block here.
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::blockquote, MOZ_KnownLive(HTMLEditorRef())
atStartOfSelection); .MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::blockquote,
atStartOfSelection);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -5275,8 +5283,9 @@ nsresult HTMLEditRules::IndentAroundSelectionWithHTML() {
atCurNode.GetContainer()->NodeInfo()->NameAtom(); atCurNode.GetContainer()->NodeInfo()->NameAtom();
// Create a new nested list of correct type. // Create a new nested list of correct type.
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction( MOZ_KnownLive(HTMLEditorRef())
MOZ_KnownLive(*containerName), atCurNode); .MaybeSplitAncestorsForInsertWithTransaction(
MOZ_KnownLive(*containerName), atCurNode);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -5339,8 +5348,9 @@ nsresult HTMLEditRules::IndentAroundSelectionWithHTML() {
atListItem.GetContainer()->NodeInfo()->NameAtom(); atListItem.GetContainer()->NodeInfo()->NameAtom();
// Create a new nested list of correct type. // Create a new nested list of correct type.
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction( MOZ_KnownLive(HTMLEditorRef())
MOZ_KnownLive(*containerName), atListItem); .MaybeSplitAncestorsForInsertWithTransaction(
MOZ_KnownLive(*containerName), atListItem);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -5386,8 +5396,9 @@ nsresult HTMLEditRules::IndentAroundSelectionWithHTML() {
} }
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::blockquote, MOZ_KnownLive(HTMLEditorRef())
atCurNode); .MaybeSplitAncestorsForInsertWithTransaction(
*nsGkAtoms::blockquote, atCurNode);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -6210,8 +6221,9 @@ nsresult HTMLEditRules::AlignContentsAtSelection(const nsAString& aAlignType) {
} }
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::div, MOZ_KnownLive(HTMLEditorRef())
atStartOfSelection); .MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::div,
atStartOfSelection);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -6381,8 +6393,9 @@ nsresult HTMLEditRules::AlignContentsAtSelection(const nsAString& aAlignType) {
} }
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::div, MOZ_KnownLive(HTMLEditorRef())
atCurNode); .MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::div,
atCurNode);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -8730,8 +8743,9 @@ nsresult HTMLEditRules::MakeBlockquote(
// If no curBlock, make one // If no curBlock, make one
if (!curBlock) { if (!curBlock) {
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::blockquote, MOZ_KnownLive(HTMLEditorRef())
EditorDOMPoint(curNode)); .MaybeSplitAncestorsForInsertWithTransaction(
*nsGkAtoms::blockquote, EditorDOMPoint(curNode));
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -8962,7 +8976,9 @@ nsresult HTMLEditRules::ApplyBlockStyle(
// Make sure we can put a block here // Make sure we can put a block here
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction(aBlockTag, atCurNode); MOZ_KnownLive(HTMLEditorRef())
.MaybeSplitAncestorsForInsertWithTransaction(aBlockTag,
atCurNode);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -9015,7 +9031,9 @@ nsresult HTMLEditRules::ApplyBlockStyle(
// The break is the first (or even only) node we encountered. Create a // The break is the first (or even only) node we encountered. Create a
// block for it. // block for it.
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction(aBlockTag, atCurNode); MOZ_KnownLive(HTMLEditorRef())
.MaybeSplitAncestorsForInsertWithTransaction(aBlockTag,
atCurNode);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -9074,7 +9092,9 @@ nsresult HTMLEditRules::ApplyBlockStyle(
// If no curBlock, make one // If no curBlock, make one
if (!curBlock) { if (!curBlock) {
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction(aBlockTag, atCurNode); MOZ_KnownLive(HTMLEditorRef())
.MaybeSplitAncestorsForInsertWithTransaction(aBlockTag,
atCurNode);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -9134,16 +9154,16 @@ nsresult HTMLEditRules::ApplyBlockStyle(
return NS_OK; return NS_OK;
} }
SplitNodeResult HTMLEditRules::MaybeSplitAncestorsForInsertWithTransaction( SplitNodeResult HTMLEditor::MaybeSplitAncestorsForInsertWithTransaction(
nsAtom& aTag, const EditorDOMPoint& aStartOfDeepestRightNode) { nsAtom& aTag, const EditorDOMPoint& aStartOfDeepestRightNode) {
MOZ_ASSERT(IsEditorDataAvailable()); MOZ_ASSERT(IsEditActionDataAvailable());
if (NS_WARN_IF(!aStartOfDeepestRightNode.IsSet())) { if (NS_WARN_IF(!aStartOfDeepestRightNode.IsSet())) {
return SplitNodeResult(NS_ERROR_INVALID_ARG); return SplitNodeResult(NS_ERROR_INVALID_ARG);
} }
MOZ_ASSERT(aStartOfDeepestRightNode.IsSetAndValid()); MOZ_ASSERT(aStartOfDeepestRightNode.IsSetAndValid());
RefPtr<Element> host = HTMLEditorRef().GetActiveEditingHost(); RefPtr<Element> host = GetActiveEditingHost();
if (NS_WARN_IF(!host)) { if (NS_WARN_IF(!host)) {
return SplitNodeResult(NS_ERROR_FAILURE); return SplitNodeResult(NS_ERROR_FAILURE);
} }
@ -9165,7 +9185,7 @@ SplitNodeResult HTMLEditRules::MaybeSplitAncestorsForInsertWithTransaction(
return SplitNodeResult(NS_ERROR_FAILURE); return SplitNodeResult(NS_ERROR_FAILURE);
} }
if (HTMLEditorRef().CanContainTag(*pointToInsert.GetContainer(), aTag)) { if (CanContainTag(*pointToInsert.GetContainer(), aTag)) {
// Found an ancestor node which can contain the element. // Found an ancestor node which can contain the element.
break; break;
} }
@ -9180,13 +9200,10 @@ SplitNodeResult HTMLEditRules::MaybeSplitAncestorsForInsertWithTransaction(
return SplitNodeResult(aStartOfDeepestRightNode); return SplitNodeResult(aStartOfDeepestRightNode);
} }
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult = SplitNodeDeepWithTransaction(
MOZ_KnownLive(HTMLEditorRef()) MOZ_KnownLive(*pointToInsert.GetChild()), aStartOfDeepestRightNode,
.SplitNodeDeepWithTransaction( SplitAtEdges::eAllowToCreateEmptyContainer);
MOZ_KnownLive(*pointToInsert.GetChild()), if (NS_WARN_IF(Destroyed())) {
aStartOfDeepestRightNode,
SplitAtEdges::eAllowToCreateEmptyContainer);
if (NS_WARN_IF(!CanHandleEditAction())) {
return SplitNodeResult(NS_ERROR_EDITOR_DESTROYED); return SplitNodeResult(NS_ERROR_EDITOR_DESTROYED);
} }
NS_WARNING_ASSERTION(splitNodeResult.Succeeded(), NS_WARNING_ASSERTION(splitNodeResult.Succeeded(),
@ -10868,8 +10885,9 @@ nsresult HTMLEditRules::PrepareToMakeElementAbsolutePosition(
// Make sure we can put a block here. // Make sure we can put a block here.
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::div, MOZ_KnownLive(HTMLEditorRef())
atStartOfSelection); .MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::div,
atStartOfSelection);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -10943,8 +10961,9 @@ nsresult HTMLEditRules::PrepareToMakeElementAbsolutePosition(
atCurNode.GetContainer()->NodeInfo()->NameAtom(); atCurNode.GetContainer()->NodeInfo()->NameAtom();
// Create a new nested list of correct type. // Create a new nested list of correct type.
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction( MOZ_KnownLive(HTMLEditorRef())
MOZ_KnownLive(*containerName), atCurNode); .MaybeSplitAncestorsForInsertWithTransaction(
MOZ_KnownLive(*containerName), atCurNode);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -11015,8 +11034,9 @@ nsresult HTMLEditRules::PrepareToMakeElementAbsolutePosition(
atListItem.GetContainer()->NodeInfo()->NameAtom(); atListItem.GetContainer()->NodeInfo()->NameAtom();
// Create a new nested list of correct type // Create a new nested list of correct type
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction( MOZ_KnownLive(HTMLEditorRef())
MOZ_KnownLive(*containerName), atListItem); .MaybeSplitAncestorsForInsertWithTransaction(
MOZ_KnownLive(*containerName), atListItem);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }
@ -11067,8 +11087,9 @@ nsresult HTMLEditRules::PrepareToMakeElementAbsolutePosition(
continue; continue;
} }
SplitNodeResult splitNodeResult = SplitNodeResult splitNodeResult =
MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::div, MOZ_KnownLive(HTMLEditorRef())
atCurNode); .MaybeSplitAncestorsForInsertWithTransaction(*nsGkAtoms::div,
atCurNode);
if (NS_WARN_IF(splitNodeResult.Failed())) { if (NS_WARN_IF(splitNodeResult.Failed())) {
return splitNodeResult.Rv(); return splitNodeResult.Rv();
} }

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

@ -835,27 +835,6 @@ class HTMLEditRules : public TextEditRules {
MOZ_MUST_USE nsresult MOZ_MUST_USE nsresult
MakeBlockquote(nsTArray<OwningNonNull<nsINode>>& aNodeArray); MakeBlockquote(nsTArray<OwningNonNull<nsINode>>& aNodeArray);
/**
* MaybeSplitAncestorsForInsertWithTransaction() does nothing if container of
* aStartOfDeepestRightNode can have an element whose tag name is aTag.
* Otherwise, looks for an ancestor node which is or is in active editing
* host and can have an element whose name is aTag. If there is such
* ancestor, its descendants are split.
*
* Note that this may create empty elements while splitting ancestors.
*
* @param aTag The name of element to be inserted
* after calling this method.
* @param aStartOfDeepestRightNode The start point of deepest right node.
* This point must be descendant of
* active editing host.
* @return When succeeded, SplitPoint() returns
* the point to insert the element.
*/
MOZ_CAN_RUN_SCRIPT MOZ_MUST_USE SplitNodeResult
MaybeSplitAncestorsForInsertWithTransaction(
nsAtom& aTag, const EditorDOMPoint& aStartOfDeepestRightNode);
/** /**
* JoinNearestEditableNodesWithTransaction() joins two editable nodes which * JoinNearestEditableNodesWithTransaction() joins two editable nodes which
* are themselves or the nearest editable node of aLeftNode and aRightNode. * are themselves or the nearest editable node of aLeftNode and aRightNode.

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

@ -1595,6 +1595,27 @@ class HTMLEditor final : public TextEditor,
return true; return true;
} }
/**
* MaybeSplitAncestorsForInsertWithTransaction() does nothing if container of
* aStartOfDeepestRightNode can have an element whose tag name is aTag.
* Otherwise, looks for an ancestor node which is or is in active editing
* host and can have an element whose name is aTag. If there is such
* ancestor, its descendants are split.
*
* Note that this may create empty elements while splitting ancestors.
*
* @param aTag The name of element to be inserted
* after calling this method.
* @param aStartOfDeepestRightNode The start point of deepest right node.
* This point must be descendant of
* active editing host.
* @return When succeeded, SplitPoint() returns
* the point to insert the element.
*/
MOZ_CAN_RUN_SCRIPT MOZ_MUST_USE SplitNodeResult
MaybeSplitAncestorsForInsertWithTransaction(
nsAtom& aTag, const EditorDOMPoint& aStartOfDeepestRightNode);
protected: // Called by helper classes. protected: // Called by helper classes.
virtual void OnStartToHandleTopLevelEditSubAction( virtual void OnStartToHandleTopLevelEditSubAction(
EditSubAction aEditSubAction, nsIEditor::EDirection aDirection) override; EditSubAction aEditSubAction, nsIEditor::EDirection aDirection) override;