Bug 1713334 - Part 2: Initialize TextEditor always with a text node r=masayuki

Differential Revision: https://phabricator.services.mozilla.com/D117022
This commit is contained in:
Kagami Sascha Rosylight 2021-06-18 00:36:54 +00:00
Родитель 8bbe7f3f11
Коммит 9b640ade5b
3 изменённых файлов: 27 добавлений и 1 удалений

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

@ -339,9 +339,33 @@ nsresult EditorBase::Init(Document& aDocument, Element* aRoot,
return NS_OK;
}
nsresult EditorBase::EnsureEmptyTextFirstChild() {
MOZ_ASSERT(IsTextEditor());
RefPtr<Element> root = GetRoot();
nsIContent* firstChild = root->GetFirstChild();
if (!firstChild || !firstChild->IsText()) {
RefPtr<nsTextNode> newTextNode = CreateTextNode(u""_ns);
if (!newTextNode) {
NS_WARNING("EditorBase::CreateTextNode() failed");
return NS_ERROR_UNEXPECTED;
}
IgnoredErrorResult ignoredError;
root->InsertChildBefore(newTextNode, root->GetFirstChild(), true,
ignoredError);
MOZ_ASSERT(!ignoredError.Failed());
}
return NS_OK;
}
nsresult EditorBase::InitEditorContentAndSelection() {
MOZ_ASSERT(IsEditActionDataAvailable());
if (IsTextEditor()) {
MOZ_TRY(EnsureEmptyTextFirstChild());
}
nsresult rv = MaybeCreatePaddingBRElementForEmptyEditor();
if (NS_FAILED(rv)) {
NS_WARNING(

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

@ -2240,6 +2240,8 @@ class EditorBase : public nsIEditor,
return mIsHTMLEditorClass ? EditorType::HTML : EditorType::Text;
}
[[nodiscard]] MOZ_CAN_RUN_SCRIPT nsresult EnsureEmptyTextFirstChild();
/**
* InitEditorContentAndSelection() may insert a padding `<br>` element for
* if it's required in the anonymous `<div>` element or `<body>` element and

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

@ -82,7 +82,7 @@ class TextEditor final : public EditorBase,
MOZ_CAN_RUN_SCRIPT nsresult Init(Document& aDoc, Element* aRoot,
nsISelectionController* aSelCon,
uint32_t aFlags,
const nsAString& aValue) final;
const nsAString& aInitialValue) final;
bool IsEmpty() const final;