diff --git a/editor/libeditor/html/nsHTMLEditor.cpp b/editor/libeditor/html/nsHTMLEditor.cpp
index 574c9cea1864..759ae21e16fe 100644
--- a/editor/libeditor/html/nsHTMLEditor.cpp
+++ b/editor/libeditor/html/nsHTMLEditor.cpp
@@ -2542,66 +2542,67 @@ nsHTMLEditor::GetSelectedElement(const nsAString& aTagName, nsIDOMElement** aRet
return res;
}
-NS_IMETHODIMP
-nsHTMLEditor::CreateElementWithDefaults(const nsAString& aTagName, nsIDOMElement** aReturn)
+already_AddRefed
+nsHTMLEditor::CreateElementWithDefaults(const nsAString& aTagName)
{
- nsresult res=NS_ERROR_NOT_INITIALIZED;
- if (aReturn)
- *aReturn = nullptr;
+ MOZ_ASSERT(!aTagName.IsEmpty());
-// NS_ENSURE_TRUE(aTagName && aReturn, NS_ERROR_NULL_POINTER);
- NS_ENSURE_TRUE(!aTagName.IsEmpty() && aReturn, NS_ERROR_NULL_POINTER);
-
- nsAutoString TagName(aTagName);
- ToLowerCase(TagName);
+ nsAutoString tagName(aTagName);
+ ToLowerCase(tagName);
nsAutoString realTagName;
- if (IsLinkTag(TagName) || IsNamedAnchorTag(TagName))
- {
+ if (IsLinkTag(tagName) || IsNamedAnchorTag(tagName)) {
realTagName.AssignLiteral("a");
} else {
- realTagName = TagName;
+ realTagName = tagName;
}
- //We don't use editor's CreateElement because we don't want to
- // go through the transaction system
-
- nsCOMPtrnewElement;
- nsCOMPtr newContent;
- nsCOMPtr doc = do_QueryReferent(mDocWeak);
- NS_ENSURE_TRUE(doc, NS_ERROR_NOT_INITIALIZED);
+ // We don't use editor's CreateElement because we don't want to go through
+ // the transaction system
+ // New call to use instead to get proper HTML element, bug 39919
ErrorResult rv;
- newContent = CreateHTMLContent(realTagName, rv);
- newElement = do_QueryInterface(newContent);
+ nsCOMPtr newElement = CreateHTMLContent(realTagName, rv);
if (rv.Failed() || !newElement) {
- return NS_ERROR_FAILURE;
+ return nullptr;
}
// Mark the new element dirty, so it will be formatted
- newElement->SetAttribute(NS_LITERAL_STRING("_moz_dirty"), EmptyString());
+ newElement->SetAttribute(NS_LITERAL_STRING("_moz_dirty"), EmptyString(), rv);
// Set default values for new elements
- if (TagName.EqualsLiteral("table")) {
- res = newElement->SetAttribute(NS_LITERAL_STRING("cellpadding"),NS_LITERAL_STRING("2"));
- NS_ENSURE_SUCCESS(res, res);
- res = newElement->SetAttribute(NS_LITERAL_STRING("cellspacing"),NS_LITERAL_STRING("2"));
- NS_ENSURE_SUCCESS(res, res);
- res = newElement->SetAttribute(NS_LITERAL_STRING("border"),NS_LITERAL_STRING("1"));
- } else if (TagName.EqualsLiteral("td"))
- {
- res = SetAttributeOrEquivalent(newElement, NS_LITERAL_STRING("valign"),
- NS_LITERAL_STRING("top"), true);
+ if (tagName.EqualsLiteral("table")) {
+ newElement->SetAttribute(NS_LITERAL_STRING("cellpadding"),
+ NS_LITERAL_STRING("2"), rv);
+ NS_ENSURE_SUCCESS(rv.ErrorCode(), nullptr);
+ newElement->SetAttribute(NS_LITERAL_STRING("cellspacing"),
+ NS_LITERAL_STRING("2"), rv);
+ NS_ENSURE_SUCCESS(rv.ErrorCode(), nullptr);
+ newElement->SetAttribute(NS_LITERAL_STRING("border"),
+ NS_LITERAL_STRING("1"), rv);
+ NS_ENSURE_SUCCESS(rv.ErrorCode(), nullptr);
+ } else if (tagName.EqualsLiteral("td")) {
+ nsresult res = SetAttributeOrEquivalent(
+ static_cast(newElement->AsDOMNode()),
+ NS_LITERAL_STRING("valign"), NS_LITERAL_STRING("top"), true);
+ NS_ENSURE_SUCCESS(res, nullptr);
}
// ADD OTHER TAGS HERE
- if (NS_SUCCEEDED(res))
- {
- *aReturn = newElement;
- // Getters must addref
- NS_ADDREF(*aReturn);
- }
+ return newElement.forget();
+}
- return res;
+NS_IMETHODIMP
+nsHTMLEditor::CreateElementWithDefaults(const nsAString& aTagName, nsIDOMElement** aReturn)
+{
+ NS_ENSURE_TRUE(!aTagName.IsEmpty() && aReturn, NS_ERROR_NULL_POINTER);
+ *aReturn = nullptr;
+
+ nsCOMPtr newElement = CreateElementWithDefaults(aTagName);
+ nsCOMPtr ret = do_QueryInterface(newElement);
+ NS_ENSURE_TRUE(ret, NS_ERROR_FAILURE);
+
+ ret.forget(aReturn);
+ return NS_OK;
}
NS_IMETHODIMP
diff --git a/editor/libeditor/html/nsHTMLEditor.h b/editor/libeditor/html/nsHTMLEditor.h
index 4705a8524779..b3e43017cc14 100644
--- a/editor/libeditor/html/nsHTMLEditor.h
+++ b/editor/libeditor/html/nsHTMLEditor.h
@@ -963,7 +963,9 @@ private:
nsIContent* aChild, int32_t aIndexInContainer,
InsertedOrAppended aInsertedOrAppended);
already_AddRefed GetElementOrParentByTagName(
- const nsAString& aTagName, nsINode* aNode);
+ const nsAString& aTagName, nsINode* aNode);
+ already_AddRefed CreateElementWithDefaults(
+ const nsAString& aTagName);
};
#endif //nsHTMLEditor_h__