 Chromium Code Reviews
 Chromium Code Reviews Issue 1085843002:
  Implement DOM: prepend, append, before, after & replaceWith  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/blink.git@master
    
  
    Issue 1085843002:
  Implement DOM: prepend, append, before, after & replaceWith  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/blink.git@master| 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()) |