Bug 1770877 - part 31-3: Replace insertLineBreak variable in HTMLEditor::InsertParagraphSeparatorAsSubAction with a lambda r=m_kato
This can encapsule the long if-elseif-else blocks into the lambda. Differential Revision: https://phabricator.services.mozilla.com/D149102
This commit is contained in:
@@ -1616,6 +1616,52 @@ EditActionResult HTMLEditor::InsertParagraphSeparatorAsSubAction(
|
|||||||
return EditActionHandled(NS_ERROR_EDITOR_NO_EDITABLE_RANGE);
|
return EditActionHandled(NS_ERROR_EDITOR_NO_EDITABLE_RANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto InsertLineBreakInstead =
|
||||||
|
[](const Element* aEditableBlockElement,
|
||||||
|
const EditorDOMPoint& aCandidatePointToSplit,
|
||||||
|
ParagraphSeparator aDefaultParagraphSeparator,
|
||||||
|
const Element& aEditingHost) {
|
||||||
|
// If there is no block parent in the editing host, i.e., the editing
|
||||||
|
// host itself is also a non-block element, we should insert a line
|
||||||
|
// break.
|
||||||
|
if (!aEditableBlockElement) {
|
||||||
|
// XXX Chromium checks if the CSS box of the editing host is a block.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the editable block element is not splittable, e.g., it's an
|
||||||
|
// editing host, and the default paragraph separator is <br> or the
|
||||||
|
// element cannot contain a <p> element, we should insert a <br>
|
||||||
|
// element.
|
||||||
|
if (!HTMLEditUtils::IsSplittableNode(*aEditableBlockElement)) {
|
||||||
|
return aDefaultParagraphSeparator == ParagraphSeparator::br ||
|
||||||
|
!HTMLEditUtils::CanElementContainParagraph(aEditingHost) ||
|
||||||
|
HTMLEditUtils::ShouldInsertLinefeedCharacter(
|
||||||
|
aCandidatePointToSplit, aEditingHost);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the nearest block parent is a single-line container declared in
|
||||||
|
// the execCommand spec and not the editing host, we should separate the
|
||||||
|
// block even if the default paragraph separator is <br> element.
|
||||||
|
if (HTMLEditUtils::IsSingleLineContainer(*aEditableBlockElement)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, unless there is no block ancestor which can contain <p>
|
||||||
|
// element, we shouldn't insert a line break here.
|
||||||
|
for (const Element* editableBlockAncestor = aEditableBlockElement;
|
||||||
|
editableBlockAncestor;
|
||||||
|
editableBlockAncestor = HTMLEditUtils::GetAncestorElement(
|
||||||
|
*editableBlockAncestor,
|
||||||
|
HTMLEditUtils::ClosestEditableBlockElement)) {
|
||||||
|
if (HTMLEditUtils::CanElementContainParagraph(
|
||||||
|
*editableBlockAncestor)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
// Look for the nearest parent block. However, don't return error even if
|
// Look for the nearest parent block. However, don't return error even if
|
||||||
// there is no block parent here because in such case, i.e., editing host
|
// there is no block parent here because in such case, i.e., editing host
|
||||||
// is an inline element, we should insert <br> simply.
|
// is an inline element, we should insert <br> simply.
|
||||||
@@ -1626,47 +1672,11 @@ EditActionResult HTMLEditor::InsertParagraphSeparatorAsSubAction(
|
|||||||
HTMLEditUtils::ClosestEditableBlockElement)
|
HTMLEditUtils::ClosestEditableBlockElement)
|
||||||
: nullptr;
|
: nullptr;
|
||||||
|
|
||||||
ParagraphSeparator separator = GetDefaultParagraphSeparator();
|
|
||||||
bool insertLineBreak;
|
|
||||||
// If there is no block parent in the editing host, i.e., the editing host
|
|
||||||
// itself is also a non-block element, we should insert a line break.
|
|
||||||
if (!editableBlockElement) {
|
|
||||||
// XXX Chromium checks if the CSS box of the editing host is a block.
|
|
||||||
insertLineBreak = true;
|
|
||||||
}
|
|
||||||
// If the editable block element is not splittable, e.g., it's an editing
|
|
||||||
// host, and the default paragraph separator is <br> or the element cannot
|
|
||||||
// contain a <p> element, we should insert a <br> element.
|
|
||||||
else if (!HTMLEditUtils::IsSplittableNode(*editableBlockElement)) {
|
|
||||||
insertLineBreak =
|
|
||||||
separator == ParagraphSeparator::br ||
|
|
||||||
!HTMLEditUtils::CanElementContainParagraph(aEditingHost) ||
|
|
||||||
HTMLEditUtils::ShouldInsertLinefeedCharacter(atStartOfSelection,
|
|
||||||
aEditingHost);
|
|
||||||
}
|
|
||||||
// If the nearest block parent is a single-line container declared in
|
|
||||||
// the execCommand spec and not the editing host, we should separate the
|
|
||||||
// block even if the default paragraph separator is <br> element.
|
|
||||||
else if (HTMLEditUtils::IsSingleLineContainer(*editableBlockElement)) {
|
|
||||||
insertLineBreak = false;
|
|
||||||
}
|
|
||||||
// Otherwise, unless there is no block ancestor which can contain <p>
|
|
||||||
// element, we shouldn't insert a line break here.
|
|
||||||
else {
|
|
||||||
insertLineBreak = true;
|
|
||||||
for (const Element* editableBlockAncestor = editableBlockElement;
|
|
||||||
editableBlockAncestor && insertLineBreak;
|
|
||||||
editableBlockAncestor = HTMLEditUtils::GetAncestorElement(
|
|
||||||
*editableBlockAncestor,
|
|
||||||
HTMLEditUtils::ClosestEditableBlockElement)) {
|
|
||||||
insertLineBreak =
|
|
||||||
!HTMLEditUtils::CanElementContainParagraph(*editableBlockAncestor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we cannot insert a <p>/<div> element at the selection, we should insert
|
// If we cannot insert a <p>/<div> element at the selection, we should insert
|
||||||
// a <br> element or a linefeed instead.
|
// a <br> element or a linefeed instead.
|
||||||
if (insertLineBreak) {
|
const ParagraphSeparator separator = GetDefaultParagraphSeparator();
|
||||||
|
if (InsertLineBreakInstead(editableBlockElement, atStartOfSelection,
|
||||||
|
separator, aEditingHost)) {
|
||||||
// For backward compatibility, we should not insert a linefeed if
|
// For backward compatibility, we should not insert a linefeed if
|
||||||
// paragraph separator is set to "br" which is Gecko-specific mode.
|
// paragraph separator is set to "br" which is Gecko-specific mode.
|
||||||
if (separator != ParagraphSeparator::br &&
|
if (separator != ParagraphSeparator::br &&
|
||||||
|
|||||||
@@ -676,7 +676,7 @@ bool HTMLEditUtils::IsEmptyNode(nsPresContext* aPresContext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool HTMLEditUtils::ShouldInsertLinefeedCharacter(
|
bool HTMLEditUtils::ShouldInsertLinefeedCharacter(
|
||||||
EditorDOMPoint& aPointToInsert, const Element& aEditingHost) {
|
const EditorDOMPoint& aPointToInsert, const Element& aEditingHost) {
|
||||||
MOZ_ASSERT(aPointToInsert.IsSetAndValid());
|
MOZ_ASSERT(aPointToInsert.IsSetAndValid());
|
||||||
|
|
||||||
if (!aPointToInsert.IsInContentNode()) {
|
if (!aPointToInsert.IsInContentNode()) {
|
||||||
@@ -1043,14 +1043,14 @@ bool HTMLEditUtils::IsContainerNode(nsHTMLTag aTagId) {
|
|||||||
return kElements[aTagId - 1].mIsContainer;
|
return kElements[aTagId - 1].mIsContainer;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HTMLEditUtils::IsNonListSingleLineContainer(nsINode& aNode) {
|
bool HTMLEditUtils::IsNonListSingleLineContainer(const nsINode& aNode) {
|
||||||
return aNode.IsAnyOfHTMLElements(
|
return aNode.IsAnyOfHTMLElements(
|
||||||
nsGkAtoms::address, nsGkAtoms::div, nsGkAtoms::h1, nsGkAtoms::h2,
|
nsGkAtoms::address, nsGkAtoms::div, nsGkAtoms::h1, nsGkAtoms::h2,
|
||||||
nsGkAtoms::h3, nsGkAtoms::h4, nsGkAtoms::h5, nsGkAtoms::h6,
|
nsGkAtoms::h3, nsGkAtoms::h4, nsGkAtoms::h5, nsGkAtoms::h6,
|
||||||
nsGkAtoms::listing, nsGkAtoms::p, nsGkAtoms::pre, nsGkAtoms::xmp);
|
nsGkAtoms::listing, nsGkAtoms::p, nsGkAtoms::pre, nsGkAtoms::xmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HTMLEditUtils::IsSingleLineContainer(nsINode& aNode) {
|
bool HTMLEditUtils::IsSingleLineContainer(const nsINode& aNode) {
|
||||||
return IsNonListSingleLineContainer(aNode) ||
|
return IsNonListSingleLineContainer(aNode) ||
|
||||||
aNode.IsAnyOfHTMLElements(nsGkAtoms::li, nsGkAtoms::dt, nsGkAtoms::dd);
|
aNode.IsAnyOfHTMLElements(nsGkAtoms::li, nsGkAtoms::dt, nsGkAtoms::dd);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -311,8 +311,8 @@ class HTMLEditUtils final {
|
|||||||
* https://w3c.github.io/editing/execCommand.html#non-list-single-line-container
|
* https://w3c.github.io/editing/execCommand.html#non-list-single-line-container
|
||||||
* https://w3c.github.io/editing/execCommand.html#single-line-container
|
* https://w3c.github.io/editing/execCommand.html#single-line-container
|
||||||
*/
|
*/
|
||||||
static bool IsNonListSingleLineContainer(nsINode& aNode);
|
static bool IsNonListSingleLineContainer(const nsINode& aNode);
|
||||||
static bool IsSingleLineContainer(nsINode& aNode);
|
static bool IsSingleLineContainer(const nsINode& aNode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IsVisibleTextNode() returns true if aText has visible text. If it has
|
* IsVisibleTextNode() returns true if aText has visible text. If it has
|
||||||
@@ -421,8 +421,8 @@ class HTMLEditUtils final {
|
|||||||
* ShouldInsertLinefeedCharacter() returns true if the caller should insert
|
* ShouldInsertLinefeedCharacter() returns true if the caller should insert
|
||||||
* a linefeed character instead of <br> element.
|
* a linefeed character instead of <br> element.
|
||||||
*/
|
*/
|
||||||
static bool ShouldInsertLinefeedCharacter(EditorDOMPoint& aPointToInsert,
|
static bool ShouldInsertLinefeedCharacter(
|
||||||
const Element& aEditingHost);
|
const EditorDOMPoint& aPointToInsert, const Element& aEditingHost);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IsEmptyNode() returns false if aNode has some visible content nodes,
|
* IsEmptyNode() returns false if aNode has some visible content nodes,
|
||||||
|
|||||||
Reference in New Issue
Block a user