diff options
-rw-r--r-- | editor/libeditor/EditorBase.cpp | 75 | ||||
-rw-r--r-- | editor/libeditor/EditorBase.h | 13 | ||||
-rw-r--r-- | editor/libeditor/HTMLEditor.cpp | 110 | ||||
-rw-r--r-- | editor/libeditor/HTMLEditor.h | 18 | ||||
-rw-r--r-- | editor/libeditor/TextEditor.cpp | 8 | ||||
-rw-r--r-- | editor/libeditor/TextEditor.h | 19 |
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, |