summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--editor/libeditor/EditorBase.cpp75
-rw-r--r--editor/libeditor/EditorBase.h13
-rw-r--r--editor/libeditor/HTMLEditor.cpp110
-rw-r--r--editor/libeditor/HTMLEditor.h18
-rw-r--r--editor/libeditor/TextEditor.cpp8
-rw-r--r--editor/libeditor/TextEditor.h19
6 files changed, 143 insertions, 100 deletions
diff --git a/editor/libeditor/EditorBase.cpp b/editor/libeditor/EditorBase.cpp
index f7988cd1a..fd970390f 100644
--- a/editor/libeditor/EditorBase.cpp
+++ b/editor/libeditor/EditorBase.cpp
@@ -1229,12 +1229,23 @@ EditorBase::SetAttribute(nsIDOMElement* aElement,
const nsAString& aAttribute,
const nsAString& aValue)
{
+ if (NS_WARN_IF(aAttribute.IsEmpty())) {
+ return NS_ERROR_FAILURE;
+ }
nsCOMPtr<Element> element = do_QueryInterface(aElement);
NS_ENSURE_TRUE(element, NS_ERROR_NULL_POINTER);
nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute);
+ return SetAttribute(element, attribute, aValue);
+}
+
+nsresult
+EditorBase::SetAttribute(Element* aElement,
+ nsIAtom* aAttribute,
+ const nsAString& aValue)
+{
RefPtr<ChangeAttributeTransaction> transaction =
- CreateTxnForSetAttribute(*element, *attribute, aValue);
+ CreateTxnForSetAttribute(*aElement, *aAttribute, aValue);
return DoTransaction(transaction);
}
@@ -1263,12 +1274,22 @@ NS_IMETHODIMP
EditorBase::RemoveAttribute(nsIDOMElement* aElement,
const nsAString& aAttribute)
{
+ if (NS_WARN_IF(aAttribute.IsEmpty())) {
+ return NS_ERROR_FAILURE;
+ }
nsCOMPtr<Element> element = do_QueryInterface(aElement);
NS_ENSURE_TRUE(element, NS_ERROR_NULL_POINTER);
nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute);
+ return RemoveAttribute(element, attribute);
+}
+
+nsresult
+EditorBase::RemoveAttribute(Element* aElement,
+ nsIAtom* aAttribute)
+{
RefPtr<ChangeAttributeTransaction> transaction =
- CreateTxnForRemoveAttribute(*element, *attribute);
+ CreateTxnForRemoveAttribute(*aElement, *aAttribute);
return DoTransaction(transaction);
}
@@ -2208,25 +2229,28 @@ EditorBase::CloneAttribute(const nsAString& aAttribute,
nsIDOMNode* aSourceNode)
{
NS_ENSURE_TRUE(aDestNode && aSourceNode, NS_ERROR_NULL_POINTER);
+ if (NS_WARN_IF(aAttribute.IsEmpty())) {
+ return NS_ERROR_FAILURE;
+ }
- nsCOMPtr<nsIDOMElement> destElement = do_QueryInterface(aDestNode);
- nsCOMPtr<nsIDOMElement> sourceElement = do_QueryInterface(aSourceNode);
+ nsCOMPtr<Element> destElement = do_QueryInterface(aDestNode);
+ nsCOMPtr<Element> sourceElement = do_QueryInterface(aSourceNode);
NS_ENSURE_TRUE(destElement && sourceElement, NS_ERROR_NO_INTERFACE);
+ nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute);
+ return CloneAttribute(attribute, destElement, sourceElement);
+}
+
+nsresult
+EditorBase::CloneAttribute(nsIAtom* aAttribute,
+ Element* aDestElement,
+ Element* aSourceElement)
+{
nsAutoString attrValue;
- bool isAttrSet;
- nsresult rv = GetAttributeValue(sourceElement,
- aAttribute,
- attrValue,
- &isAttrSet);
- NS_ENSURE_SUCCESS(rv, rv);
- if (isAttrSet) {
- rv = SetAttribute(destElement, aAttribute, attrValue);
- } else {
- rv = RemoveAttribute(destElement, aAttribute);
+ if (aSourceElement->GetAttr(kNameSpaceID_None, aAttribute, attrValue)) {
+ return SetAttribute(aDestElement, aAttribute, attrValue);
}
-
- return rv;
+ return RemoveAttribute(aDestElement, aAttribute);
}
/**
@@ -4618,21 +4642,32 @@ EditorBase::CreateHTMLContent(nsIAtom* aTag)
kNameSpaceID_XHTML);
}
-nsresult
+NS_IMETHODIMP
EditorBase::SetAttributeOrEquivalent(nsIDOMElement* aElement,
const nsAString& aAttribute,
const nsAString& aValue,
bool aSuppressTransaction)
{
- return SetAttribute(aElement, aAttribute, aValue);
+ nsCOMPtr<Element> element = do_QueryInterface(aElement);
+ if (NS_WARN_IF(!element)) {
+ return NS_ERROR_NULL_POINTER;
+ }
+ nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute);
+ return SetAttributeOrEquivalent(element, attribute, aValue,
+ aSuppressTransaction);
}
-nsresult
+NS_IMETHODIMP
EditorBase::RemoveAttributeOrEquivalent(nsIDOMElement* aElement,
const nsAString& aAttribute,
bool aSuppressTransaction)
{
- return RemoveAttribute(aElement, aAttribute);
+ nsCOMPtr<Element> element = do_QueryInterface(aElement);
+ if (NS_WARN_IF(!element)) {
+ return NS_ERROR_NULL_POINTER;
+ }
+ nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute);
+ return RemoveAttributeOrEquivalent(element, attribute, aSuppressTransaction);
}
nsresult
diff --git a/editor/libeditor/EditorBase.h b/editor/libeditor/EditorBase.h
index dbd00771e..e537c77cf 100644
--- a/editor/libeditor/EditorBase.h
+++ b/editor/libeditor/EditorBase.h
@@ -236,6 +236,19 @@ public:
nsresult JoinNodes(nsINode& aLeftNode, nsINode& aRightNode);
nsresult MoveNode(nsIContent* aNode, nsINode* aParent, int32_t aOffset);
+ nsresult CloneAttribute(nsIAtom* aAttribute, Element* aDestElement,
+ Element* aSourceElement);
+ nsresult RemoveAttribute(Element* aElement, nsIAtom* aAttribute);
+ virtual nsresult RemoveAttributeOrEquivalent(Element* aElement,
+ nsIAtom* aAttribute,
+ bool aSuppressTransaction) = 0;
+ nsresult SetAttribute(Element* aElement, nsIAtom* aAttribute,
+ const nsAString& aValue);
+ virtual nsresult SetAttributeOrEquivalent(Element* aElement,
+ nsIAtom* aAttribute,
+ const nsAString& aValue,
+ bool aSuppressTransaction) = 0;
+
/**
* Method to replace certain CreateElementNS() calls.
*
diff --git a/editor/libeditor/HTMLEditor.cpp b/editor/libeditor/HTMLEditor.cpp
index 0dc2483d1..cf0be447d 100644
--- a/editor/libeditor/HTMLEditor.cpp
+++ b/editor/libeditor/HTMLEditor.cpp
@@ -4443,93 +4443,83 @@ HTMLEditor::IsEmptyNodeImpl(nsINode* aNode,
// add to aElement the CSS inline styles corresponding to the HTML attribute
// aAttribute with its value aValue
nsresult
-HTMLEditor::SetAttributeOrEquivalent(nsIDOMElement* aElement,
- const nsAString& aAttribute,
+HTMLEditor::SetAttributeOrEquivalent(Element* aElement,
+ nsIAtom* aAttribute,
const nsAString& aValue,
bool aSuppressTransaction)
{
+ MOZ_ASSERT(aElement);
+ MOZ_ASSERT(aAttribute);
+
nsAutoScriptBlocker scriptBlocker;
- if (IsCSSEnabled() && mCSSEditUtils) {
- nsCOMPtr<dom::Element> element = do_QueryInterface(aElement);
- MOZ_ASSERT(element);
-
- nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute);
- MOZ_ASSERT(attribute);
-
- int32_t count =
- mCSSEditUtils->SetCSSEquivalentToHTMLStyle(element, nullptr,
- attribute, &aValue,
- aSuppressTransaction);
- if (count) {
- // we found an equivalence ; let's remove the HTML attribute itself if it is set
- nsAutoString existingValue;
- bool wasSet = false;
- nsresult rv =
- GetAttributeValue(aElement, aAttribute, existingValue, &wasSet);
- NS_ENSURE_SUCCESS(rv, rv);
- if (!wasSet) {
- return NS_OK;
- }
- return aSuppressTransaction ?
- element->UnsetAttr(kNameSpaceID_None, attribute, true) :
- RemoveAttribute(aElement, aAttribute);
- }
+ if (!IsCSSEnabled() || !mCSSEditUtils) {
+ // we are not in an HTML+CSS editor; let's set the attribute the HTML way
+ return aSuppressTransaction ?
+ aElement->SetAttr(kNameSpaceID_None, aAttribute, aValue, true) :
+ SetAttribute(aElement, aAttribute, aValue);
+ }
- // count is an integer that represents the number of CSS declarations applied to the
- // element. If it is zero, we found no equivalence in this implementation for the
- // attribute
- if (attribute == nsGkAtoms::style) {
- // if it is the style attribute, just add the new value to the existing style
- // attribute's value
- nsAutoString existingValue;
- bool wasSet = false;
- nsresult rv = GetAttributeValue(aElement, NS_LITERAL_STRING("style"),
- existingValue, &wasSet);
- NS_ENSURE_SUCCESS(rv, rv);
- existingValue.Append(' ');
- existingValue.Append(aValue);
- return aSuppressTransaction ?
- element->SetAttr(kNameSpaceID_None, attribute, existingValue, true) :
- SetAttribute(aElement, aAttribute, existingValue);
+ int32_t count =
+ mCSSEditUtils->SetCSSEquivalentToHTMLStyle(aElement, nullptr,
+ aAttribute, &aValue,
+ aSuppressTransaction);
+ if (count) {
+ // we found an equivalence ; let's remove the HTML attribute itself if it
+ // is set
+ nsAutoString existingValue;
+ if (!aElement->GetAttr(kNameSpaceID_None, aAttribute, existingValue)) {
+ return NS_OK;
}
- // we have no CSS equivalence for this attribute and it is not the style
- // attribute; let's set it the good'n'old HTML way
return aSuppressTransaction ?
- element->SetAttr(kNameSpaceID_None, attribute, aValue, true) :
- SetAttribute(aElement, aAttribute, aValue);
+ aElement->UnsetAttr(kNameSpaceID_None, aAttribute, true) :
+ RemoveAttribute(aElement, aAttribute);
+ }
+
+ // count is an integer that represents the number of CSS declarations applied
+ // to the element. If it is zero, we found no equivalence in this
+ // implementation for the attribute
+ if (aAttribute == nsGkAtoms::style) {
+ // if it is the style attribute, just add the new value to the existing
+ // style attribute's value
+ nsAutoString existingValue;
+ aElement->GetAttr(kNameSpaceID_None, nsGkAtoms::style, existingValue);
+ existingValue.Append(' ');
+ existingValue.Append(aValue);
+ return aSuppressTransaction ?
+ aElement->SetAttr(kNameSpaceID_None, aAttribute, existingValue, true) :
+ SetAttribute(aElement, aAttribute, existingValue);
}
- // we are not in an HTML+CSS editor; let's set the attribute the HTML way
- return aSuppressTransaction ? aElement->SetAttribute(aAttribute, aValue) :
- SetAttribute(aElement, aAttribute, aValue);
+ // we have no CSS equivalence for this attribute and it is not the style
+ // attribute; let's set it the good'n'old HTML way
+ return aSuppressTransaction ?
+ aElement->SetAttr(kNameSpaceID_None, aAttribute, aValue, true) :
+ SetAttribute(aElement, aAttribute, aValue);
}
nsresult
-HTMLEditor::RemoveAttributeOrEquivalent(nsIDOMElement* aElement,
- const nsAString& aAttribute,
+HTMLEditor::RemoveAttributeOrEquivalent(Element* aElement,
+ nsIAtom* aAttribute,
bool aSuppressTransaction)
{
- nsCOMPtr<dom::Element> element = do_QueryInterface(aElement);
- NS_ENSURE_TRUE(element, NS_OK);
-
- nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute);
- MOZ_ASSERT(attribute);
+ MOZ_ASSERT(aElement);
+ MOZ_ASSERT(aAttribute);
if (IsCSSEnabled() && mCSSEditUtils) {
nsresult rv =
mCSSEditUtils->RemoveCSSEquivalentToHTMLStyle(
- element, nullptr, attribute, nullptr, aSuppressTransaction);
+ aElement, nullptr, aAttribute, nullptr, aSuppressTransaction);
NS_ENSURE_SUCCESS(rv, rv);
}
- if (!element->HasAttr(kNameSpaceID_None, attribute)) {
+ if (!aElement->HasAttr(kNameSpaceID_None, aAttribute)) {
return NS_OK;
}
return aSuppressTransaction ?
- element->UnsetAttr(kNameSpaceID_None, attribute, /* aNotify = */ true) :
+ aElement->UnsetAttr(kNameSpaceID_None, aAttribute, /* aNotify = */ true) :
RemoveAttribute(aElement, aAttribute);
}
diff --git a/editor/libeditor/HTMLEditor.h b/editor/libeditor/HTMLEditor.h
index dfcdd8d6b..090e3f56c 100644
--- a/editor/libeditor/HTMLEditor.h
+++ b/editor/libeditor/HTMLEditor.h
@@ -118,6 +118,16 @@ public:
virtual already_AddRefed<nsIContent> GetInputEventTargetContent() override;
virtual bool IsEditable(nsINode* aNode) override;
using EditorBase::IsEditable;
+ virtual nsresult RemoveAttributeOrEquivalent(
+ Element* aElement,
+ nsIAtom* aAttribute,
+ bool aSuppressTransaction) override;
+ virtual nsresult SetAttributeOrEquivalent(Element* aElement,
+ nsIAtom* aAttribute,
+ const nsAString& aValue,
+ bool aSuppressTransaction) override;
+ using EditorBase::RemoveAttributeOrEquivalent;
+ using EditorBase::SetAttributeOrEquivalent;
// nsStubMutationObserver overrides
NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED
@@ -329,14 +339,6 @@ public:
*/
virtual nsresult SelectEntireDocument(Selection* aSelection) override;
- NS_IMETHOD SetAttributeOrEquivalent(nsIDOMElement* aElement,
- const nsAString& aAttribute,
- const nsAString& aValue,
- bool aSuppressTransaction) override;
- NS_IMETHOD RemoveAttributeOrEquivalent(nsIDOMElement* aElement,
- const nsAString& aAttribute,
- bool aSuppressTransaction) override;
-
/**
* Join together any adjacent editable text nodes in the range.
*/
diff --git a/editor/libeditor/TextEditor.cpp b/editor/libeditor/TextEditor.cpp
index 1e855d769..7eb91af64 100644
--- a/editor/libeditor/TextEditor.cpp
+++ b/editor/libeditor/TextEditor.cpp
@@ -1621,8 +1621,8 @@ TextEditor::GetDOMEventTarget()
nsresult
-TextEditor::SetAttributeOrEquivalent(nsIDOMElement* aElement,
- const nsAString& aAttribute,
+TextEditor::SetAttributeOrEquivalent(Element* aElement,
+ nsIAtom* aAttribute,
const nsAString& aValue,
bool aSuppressTransaction)
{
@@ -1630,8 +1630,8 @@ TextEditor::SetAttributeOrEquivalent(nsIDOMElement* aElement,
}
nsresult
-TextEditor::RemoveAttributeOrEquivalent(nsIDOMElement* aElement,
- const nsAString& aAttribute,
+TextEditor::RemoveAttributeOrEquivalent(Element* aElement,
+ nsIAtom* aAttribute,
bool aSuppressTransaction)
{
return EditorBase::RemoveAttribute(aElement, aAttribute);
diff --git a/editor/libeditor/TextEditor.h b/editor/libeditor/TextEditor.h
index 31c551f85..7bb594931 100644
--- a/editor/libeditor/TextEditor.h
+++ b/editor/libeditor/TextEditor.h
@@ -63,14 +63,17 @@ public:
// nsIEditorMailSupport overrides
NS_DECL_NSIEDITORMAILSUPPORT
- // Overrides of EditorBase interface methods
- NS_IMETHOD SetAttributeOrEquivalent(nsIDOMElement* aElement,
- const nsAString& aAttribute,
- const nsAString& aValue,
- bool aSuppressTransaction) override;
- NS_IMETHOD RemoveAttributeOrEquivalent(nsIDOMElement* aElement,
- const nsAString& aAttribute,
- bool aSuppressTransaction) override;
+ // Overrides of EditorBase
+ virtual nsresult RemoveAttributeOrEquivalent(
+ Element* aElement,
+ nsIAtom* aAttribute,
+ bool aSuppressTransaction) override;
+ virtual nsresult SetAttributeOrEquivalent(Element* aElement,
+ nsIAtom* aAttribute,
+ const nsAString& aValue,
+ bool aSuppressTransaction) override;
+ using EditorBase::RemoveAttributeOrEquivalent;
+ using EditorBase::SetAttributeOrEquivalent;
NS_IMETHOD Init(nsIDOMDocument* aDoc, nsIContent* aRoot,
nsISelectionController* aSelCon, uint32_t aFlags,