void HTMLConstructionSite::insertTextNode(const String& characters) { AttachmentSite site; site.parent = currentNode(); site.nextChild = 0; if (shouldFosterParent()) findFosterSite(site); unsigned currentPosition = 0; // FIXME: Splitting text nodes into smaller chunks contradicts HTML5 spec, but is currently necessary // for performance, see <https://bugs.webkit.org/show_bug.cgi?id=55898>. Node* previousChild = site.nextChild ? site.nextChild->previousSibling() : site.parent->lastChild(); if (previousChild && previousChild->isTextNode()) { // FIXME: We're only supposed to append to this text node if it // was the last text node inserted by the parser. CharacterData* textNode = static_cast<CharacterData*>(previousChild); currentPosition = textNode->parserAppendData(characters.characters(), characters.length(), Text::defaultLengthLimit); } while (currentPosition < characters.length()) { RefPtr<Text> textNode = Text::createWithLengthLimit(site.parent->document(), characters, currentPosition); // If we have a whole string of unbreakable characters the above could lead to an infinite loop. Exceeding the length limit is the lesser evil. if (!textNode->length()) textNode = Text::create(site.parent->document(), characters.substring(currentPosition)); currentPosition += textNode->length(); ASSERT(currentPosition <= characters.length()); attachAtSite(site, textNode.release()); } }
void HTMLConstructionSite::insertTextNode(const String& characters, WhitespaceMode whitespaceMode) { HTMLConstructionSiteTask task; task.parent = currentNode(); if (shouldFosterParent()) findFosterSite(task); #if ENABLE(TEMPLATE_ELEMENT) if (task.parent->hasTagName(templateTag)) task.parent = toHTMLTemplateElement(task.parent.get())->content(); #endif // Strings composed entirely of whitespace are likely to be repeated. // Turn them into AtomicString so we share a single string for each. bool shouldUseAtomicString = whitespaceMode == AllWhitespace || (whitespaceMode == WhitespaceUnknown && isAllWhitespace(characters)); unsigned currentPosition = 0; // FIXME: Splitting text nodes into smaller chunks contradicts HTML5 spec, but is currently necessary // for performance, see <https://bugs.webkit.org/show_bug.cgi?id=55898>. Node* previousChild = task.nextChild ? task.nextChild->previousSibling() : task.parent->lastChild(); if (previousChild && previousChild->isTextNode()) { // FIXME: We're only supposed to append to this text node if it // was the last text node inserted by the parser. CharacterData* textNode = static_cast<CharacterData*>(previousChild); currentPosition = textNode->parserAppendData(characters, 0, Text::defaultLengthLimit); } while (currentPosition < characters.length()) { RefPtr<Text> textNode = Text::createWithLengthLimit(task.parent->document(), shouldUseAtomicString ? AtomicString(characters).string() : characters, currentPosition); // If we have a whole string of unbreakable characters the above could lead to an infinite loop. Exceeding the length limit is the lesser evil. if (!textNode->length()) { String substring = characters.substring(currentPosition); textNode = Text::create(task.parent->document(), shouldUseAtomicString ? AtomicString(substring).string() : substring); } currentPosition += textNode->length(); ASSERT(currentPosition <= characters.length()); task.child = textNode.release(); if (task.parent->document() != task.child->document()) task.parent->document()->adoptNode(task.child, ASSERT_NO_EXCEPTION); executeTask(task); } }
void HTMLConstructionSite::insertTextNode(const String& characters) { AttachmentSite site; site.parent = currentElement(); site.nextChild = 0; if (shouldFosterParent()) findFosterSite(site); Node* previousChild = site.nextChild ? site.nextChild->previousSibling() : site.parent->lastChild(); if (previousChild && previousChild->isTextNode()) { // FIXME: We're only supposed to append to this text node if it // was the last text node inserted by the parser. CharacterData* textNode = static_cast<CharacterData*>(previousChild); textNode->parserAppendData(characters); return; } attachAtSite(site, Text::create(site.parent->document(), characters)); }