void HTMLElement::setOuterText(const String &text, ExceptionCode& ec) { // follow the IE specs about when this is allowed if (endTagRequirement() == TagStatusForbidden) { ec = NO_MODIFICATION_ALLOWED_ERR; return; } if (hasLocalName(colTag) || hasLocalName(colgroupTag) || hasLocalName(framesetTag) || hasLocalName(headTag) || hasLocalName(htmlTag) || hasLocalName(tableTag) || hasLocalName(tbodyTag) || hasLocalName(tfootTag) || hasLocalName(theadTag) || hasLocalName(trTag)) { ec = NO_MODIFICATION_ALLOWED_ERR; return; } Node* parent = parentNode(); if (!parent) { ec = NO_MODIFICATION_ALLOWED_ERR; return; } // FIXME: This creates a new text node even when the text is empty. // FIXME: This creates a single text node even when the text has CR and LF // characters in it. Instead it should create <br> elements. RefPtr<Text> t = new Text(document(), text); ec = 0; parent->replaceChild(t, this, ec); if (ec) return; // is previous node a text node? if so, merge into it Node* prev = t->previousSibling(); if (prev && prev->isTextNode()) { Text* textPrev = static_cast<Text*>(prev); textPrev->appendData(t->data(), ec); if (ec) return; t->remove(ec); if (ec) return; t = textPrev; } // is next node a text node? if so, merge it in Node* next = t->nextSibling(); if (next && next->isTextNode()) { Text* textNext = static_cast<Text*>(next); t->appendData(textNext->data(), ec); if (ec) return; textNext->remove(ec); if (ec) return; } }
bool WMLTableElement::tryMergeAdjacentTextCells(Node* item, Node* nextItem) const { if (!item || !nextItem) return false; if (!item->isTextNode() || !nextItem->isTextNode()) return false; Text* itemText = static_cast<Text*>(item); Text* nextItemText = static_cast<Text*>(nextItem); String newContent = " "; newContent += nextItemText->data(); ExceptionCode ec = 0; itemText->appendData(newContent, ec); ASSERT(ec == 0); return true; }