RawPtr<Text> Text::replaceWholeText(const String& newText) { // Remove all adjacent text nodes, and replace the contents of this one. // Protect startText and endText against mutation event handlers removing the last ref RawPtr<Text> startText = const_cast<Text*>(earliestLogicallyAdjacentTextNode(this)); RawPtr<Text> endText = const_cast<Text*>(latestLogicallyAdjacentTextNode(this)); RawPtr<Text> protectedThis(this); // Mutation event handlers could cause our last ref to go away RawPtr<ContainerNode> parent = parentNode(); // Protect against mutation handlers moving this node during traversal for (RawPtr<Node> n = startText; n && n != this && n->isTextNode() && n->parentNode() == parent;) { RawPtr<Node> nodeToRemove(n.release()); n = nodeToRemove->nextSibling(); parent->removeChild(nodeToRemove.get(), IGNORE_EXCEPTION); } if (this != endText) { Node* onePastEndText = endText->nextSibling(); for (RawPtr<Node> n = nextSibling(); n && n != onePastEndText && n->isTextNode() && n->parentNode() == parent;) { RawPtr<Node> nodeToRemove(n.release()); n = nodeToRemove->nextSibling(); parent->removeChild(nodeToRemove.get(), IGNORE_EXCEPTION); } } if (newText.isEmpty()) { if (parent && parentNode() == parent) parent->removeChild(this, IGNORE_EXCEPTION); return nullptr; } setData(newText); return protectedThis.release(); }