From 46b6faa6b26bdd008d5d7f9eb7451bd73bab5b32 Mon Sep 17 00:00:00 2001 From: Cameron Kaiser Date: Sun, 11 Feb 2018 13:21:45 -0800 Subject: [PATCH] closes #472: Element.insertAdjacentText Element.insertAdjacentElement --- dom/base/Element.cpp | 49 +++++++++++++++++++++++++++++++++++++++ dom/base/Element.h | 20 ++++++++++++++++ dom/webidl/Element.webidl | 6 +++++ 3 files changed, 75 insertions(+) diff --git a/dom/base/Element.cpp b/dom/base/Element.cpp index ba8d232630..51f6860ff9 100644 --- a/dom/base/Element.cpp +++ b/dom/base/Element.cpp @@ -3556,6 +3556,55 @@ Element::InsertAdjacentHTML(const nsAString& aPosition, const nsAString& aText, } } +nsINode* +Element::InsertAdjacent(const nsAString& aWhere, + nsINode* aNode, + ErrorResult& aError) +{ + if (aWhere.LowerCaseEqualsLiteral("beforebegin")) { + nsCOMPtr parent = GetParentNode(); + if (!parent) { + return nullptr; + } + parent->InsertBefore(*aNode, this, aError); + } else if (aWhere.LowerCaseEqualsLiteral("afterbegin")) { + nsCOMPtr refChild = GetFirstChild(); + static_cast(this)->InsertBefore(*aNode, refChild, aError); + } else if (aWhere.LowerCaseEqualsLiteral("beforeend")) { + static_cast(this)->AppendChild(*aNode, aError); + } else if (aWhere.LowerCaseEqualsLiteral("afterend")) { + nsCOMPtr parent = GetParentNode(); + if (!parent) { + return nullptr; + } + nsCOMPtr refChild = GetNextSibling(); + parent->InsertBefore(*aNode, refChild, aError); + } else { + aError.Throw(NS_ERROR_DOM_SYNTAX_ERR); + return nullptr; + } + + return aError.Failed() ? nullptr : aNode; +} + +Element* +Element::InsertAdjacentElement(const nsAString& aWhere, + Element& aElement, + ErrorResult& aError) { + nsINode* newNode = InsertAdjacent(aWhere, &aElement, aError); + MOZ_ASSERT(!newNode || newNode->IsElement()); + + return newNode ? newNode->AsElement() : nullptr; +} + +void +Element::InsertAdjacentText( + const nsAString& aWhere, const nsAString& aData, ErrorResult& aError) +{ + RefPtr textNode = OwnerDoc()->CreateTextNode(aData); + InsertAdjacent(aWhere, textNode, aError); +} + nsIEditor* Element::GetEditorInternal() { diff --git a/dom/base/Element.h b/dom/base/Element.h index f0c431c367..71c1614cd8 100644 --- a/dom/base/Element.h +++ b/dom/base/Element.h @@ -708,6 +708,26 @@ class Element : public FragmentOrElement ErrorResult& aError); already_AddRefed GetElementsByClassName(const nsAString& aClassNames); + +private: + /** + * Implement the algorithm specified at + * https://dom.spec.whatwg.org/#insert-adjacent for both + * |insertAdjacentElement()| and |insertAdjacentText()| APIs. + */ + nsINode* InsertAdjacent(const nsAString& aWhere, + nsINode* aNode, + ErrorResult& aError); + +public: + Element* InsertAdjacentElement(const nsAString& aWhere, + Element& aElement, + ErrorResult& aError); + + void InsertAdjacentText(const nsAString& aWhere, + const nsAString& aData, + ErrorResult& aError); + void SetPointerCapture(int32_t aPointerId, ErrorResult& aError) { bool activeState = false; diff --git a/dom/webidl/Element.webidl b/dom/webidl/Element.webidl index 7c485aca9b..984e37f50b 100644 --- a/dom/webidl/Element.webidl +++ b/dom/webidl/Element.webidl @@ -71,6 +71,12 @@ interface Element : Node { [Pure] HTMLCollection getElementsByClassName(DOMString classNames); + [Throws, Pure] + Element? insertAdjacentElement(DOMString where, Element element); // historical + + [Throws] + void insertAdjacentText(DOMString where, DOMString data); // historical + /** * The ratio of font-size-inflated text font size to computed font * size for this element. This will query the element for its primary frame,