Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(700)

Unified Diff: Source/core/dom/Node.cpp

Issue 1085843002: Implement DOM: prepend, append, before, after & replaceWith (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/dom/Node.cpp
diff --git a/Source/core/dom/Node.cpp b/Source/core/dom/Node.cpp
index 348b452eecd06e3d5a7daeed1fac437ea13389b9..4099ca3ff36619815895f67ec9d1966f5cda133c 100644
--- a/Source/core/dom/Node.cpp
+++ b/Source/core/dom/Node.cpp
@@ -381,6 +381,33 @@ void Node::clearRareData()
}
#endif
+PassRefPtr<Node> Node::mutationMethodMacro(const Vector<NodeOrString>& nodes, ExceptionState& exceptionState)
philipj_slow 2015/04/29 13:16:57 If I'm not mistaken, this should be PassRefPtrWill
Paritosh Kumar 2015/06/08 12:21:24 Yes, This will be PassRefPtrWillBeRawPtr<Node> and
+{
+ RefPtr<Node> node;
+ if (nodes.size() == 1) {
+ if (nodes[0].isNode())
+ node = nodes[0].getAsNode();
+ else if (nodes[0].isString())
+ node = Text::create(document(), nodes[0].getAsString());
+ else
+ return nullptr;
philipj_slow 2015/04/29 13:16:57 This case should be unreachable.
Paritosh Kumar 2015/06/08 12:21:24 Yes, Removing it.
+ } else {
+ node = DocumentFragment::create(document());
philipj_slow 2015/04/29 13:16:57 This is what the spec says, but implementing it li
Paritosh Kumar 2015/06/08 12:21:24 I looked into this and found that we may use colle
+ for (size_t i = 0; i < nodes.size(); ++i) {
philipj_slow 2015/04/29 13:16:57 Will a range-based for loop work here? for (NodeOr
Paritosh Kumar 2015/06/08 12:21:24 Yes, Done.
+ if (nodes[i].isNode())
+ node->appendChild(nodes[i].getAsNode(), exceptionState);
+ else
+ node->appendChild(Text::create(document(), nodes[i].getAsString()), exceptionState);
+ if (exceptionState.hadException()) {
+ exceptionState.throwIfNeeded();
philipj_slow 2015/04/29 13:16:57 This looks unusual, why throwIfNeeded() here? If w
Paritosh Kumar 2015/06/08 12:21:24 Done.
+ return nullptr;
+ }
+ }
+ }
+ return node.release();
+}
+
philipj_slow 2015/04/29 13:16:57 There's an extra blank line here.
Paritosh Kumar 2015/06/08 12:21:24 Done.
+
Node* Node::toNode()
{
return this;
@@ -500,6 +527,45 @@ PassRefPtrWillBeRawPtr<Node> Node::appendChild(PassRefPtrWillBeRawPtr<Node> newC
return nullptr;
}
+void Node::prepend(const Vector<NodeOrString>& nodes, ExceptionState& exceptionState)
+{
+ RefPtr<Node> nodeToPrepend = mutationMethodMacro(nodes, exceptionState);
philipj_slow 2015/04/29 13:16:57 All of these will also need to use the Oilpan tran
Paritosh Kumar 2015/06/08 12:21:24 Done.
+ this->insertBefore(nodeToPrepend, this->firstChild(), exceptionState);
philipj_slow 2015/04/29 13:16:57 In the spec none of these are expressed in terms o
+}
+
+void Node::append(const Vector<NodeOrString>& nodes, ExceptionState& exceptionState)
+{
+ RefPtr<Node> nodeToAppend = mutationMethodMacro(nodes, exceptionState);
+ this->appendChild(nodeToAppend, exceptionState);
+}
+
+void Node::before(const Vector<NodeOrString>& nodes, ExceptionState& exceptionState)
+{
+ Node* parent = parentNode();
+ if (!parent)
+ return;
+ RefPtr<Node> nodeToInsert = mutationMethodMacro(nodes, exceptionState);
+ parent->insertBefore(nodeToInsert, this, exceptionState);
+}
+
+void Node::after(const Vector<NodeOrString>& nodes, ExceptionState& exceptionState)
+{
+ Node* parent = parentNode();
+ if (!parent)
+ return;
+ RefPtr<Node> nodeToInsert = mutationMethodMacro(nodes, exceptionState);
+ parent->insertBefore(nodeToInsert, this->nextSibling(), exceptionState);
+}
+
+void Node::replaceWith(const Vector<NodeOrString>& nodes, ExceptionState& exceptionState)
+{
+ Node* parent = parentNode();
+ if (!parent)
+ return;
+ RefPtr<Node> nodeToReplaceWith = mutationMethodMacro(nodes, exceptionState);
+ parent->replaceChild(nodeToReplaceWith, this, exceptionState);
+}
+
void Node::remove(ExceptionState& exceptionState)
{
if (ContainerNode* parent = parentNode())

Powered by Google App Engine
This is Rietveld 408576698