PassRefPtr<DocumentFragment> HTMLElement::createContextualFragment(const String &html) { // the following is in accordance with the definition as used by IE if (endTagRequirement() == TagStatusForbidden) return 0; if (hasLocalName(colTag) || hasLocalName(colgroupTag) || hasLocalName(framesetTag) || hasLocalName(headTag) || hasLocalName(styleTag) || hasLocalName(titleTag)) return 0; RefPtr<DocumentFragment> fragment = new DocumentFragment(document()); if (document()->isHTMLDocument()) parseHTMLDocumentFragment(html, fragment.get()); else { if (!parseXMLDocumentFragment(html, fragment.get(), this)) // FIXME: We should propagate a syntax error exception out here. return 0; } // Exceptions are ignored because none ought to happen here. int ignoredExceptionCode; // we need to pop <html> and <body> elements and remove <head> to // accommodate folks passing complete HTML documents to make the // child of an element. RefPtr<Node> nextNode; for (RefPtr<Node> node = fragment->firstChild(); node; node = nextNode) { nextNode = node->nextSibling(); if (node->hasTagName(htmlTag) || node->hasTagName(bodyTag)) { Node *firstChild = node->firstChild(); if (firstChild) nextNode = firstChild; RefPtr<Node> nextChild; for (RefPtr<Node> child = firstChild; child; child = nextChild) { nextChild = child->nextSibling(); node->removeChild(child.get(), ignoredExceptionCode); ASSERT(!ignoredExceptionCode); fragment->insertBefore(child, node.get(), ignoredExceptionCode); ASSERT(!ignoredExceptionCode); } fragment->removeChild(node.get(), ignoredExceptionCode); ASSERT(!ignoredExceptionCode); } else if (node->hasTagName(headTag)) { fragment->removeChild(node.get(), ignoredExceptionCode); ASSERT(!ignoredExceptionCode); } } return fragment.release(); }
void HTMLElement::insertAdjacentHTML(const String& where, const String& html, ExceptionCode& ec) { RefPtr<DocumentFragment> fragment = document()->createDocumentFragment(); if (document()->isHTMLDocument()) parseHTMLDocumentFragment(html, fragment.get()); else { if (!parseXMLDocumentFragment(html, fragment.get(), this)) // FIXME: We should propagate a syntax error exception out here. return; } insertAdjacent(where, fragment.get(), ec); }
static inline RefPtr<DocumentFragment> createFragmentFromSource(const String& sourceString, const String& sourceMIMEType, Document* outputDoc) { RefPtr<DocumentFragment> fragment = DocumentFragment::create(outputDoc); if (sourceMIMEType == "text/html") parseHTMLDocumentFragment(sourceString, fragment.get()); else if (sourceMIMEType == "text/plain") fragment->addChild(Text::create(outputDoc, sourceString)); else { bool successfulParse = parseXMLDocumentFragment(sourceString, fragment.get(), outputDoc->documentElement()); if (!successfulParse) return 0; } // FIXME: Do we need to mess with URLs here? return fragment; }