DocumentImpl* XSLTProcessorImpl::documentFromXMLDocPtr(xmlDocPtr resultDoc, xsltStylesheetPtr sheet) { // FIXME: For now we serialize and then reparse. It might be more optimal to write a DOM // converter. if (!resultDoc || !sheet) return 0; DocumentImpl* result = 0; xmlOutputBufferPtr outputBuf = xmlAllocOutputBuffer(NULL); if (outputBuf) { outputBuf->context = this; outputBuf->writecallback = bufferWrite; if (xsltSaveResultTo(outputBuf, resultDoc, sheet) < 0) return 0; // There are three types of output we need to be able to deal with: // HTML (create an HTML document), XML (create an XML document), and text (wrap in a <pre> and // make an XML document). KHTMLView* view = m_sourceDocument->view(); const xmlChar* method; XSLT_GET_IMPORT_PTR(method, sheet, method); if (method == NULL && resultDoc->type == XML_HTML_DOCUMENT_NODE) method = (const xmlChar*)"html"; if (xmlStrEqual(method, (const xmlChar*)"html")) result = m_sourceDocument->implementation()->createHTMLDocument(view); else result = m_sourceDocument->implementation()->createDocument(view); result->attach(); result->setURL(m_sourceDocument->URL()); result->setBaseURL(m_sourceDocument->baseURL()); result->setDecoder(m_sourceDocument->decoder()); // FIXME: Should just be UTF-16. result->docLoader()->setShowAnimations(m_sourceDocument->docLoader()->showAnimations()); result->setTransformSourceDocument(m_sourceDocument); if (xmlStrEqual(method, (const xmlChar*)"text")) { // Modify the output so that it is a well-formed XHTML document with a <pre> tag enclosing // the text. QString beforeString("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<body>\n<pre>\n<![CDATA["); QString afterString("]]>\n</pre>\n</body>\n</html>\n"); m_resultOutput = beforeString + m_resultOutput + afterString; } // Before parsing, we need to detach the old document completely and get the new document // in place. We have to do this only if we're rendering the result document. if (view) { view->clear(); view->part()->replaceDocImpl(result); } result->open(); result->determineParseMode(m_resultOutput); // Make sure we parse in the correct mode. result->write(m_resultOutput); result->finishParsing(); if (view) view->part()->checkCompleted(); else result->close(); // FIXME: Even viewless docs can load subresources. onload will fire too early. // This is probably a bug in XMLHttpRequestObjects as well. } return result; }
Value DOMParserProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) { if (!thisObj.inherits(&DOMParser::info)) { Object err = Error::create(exec,TypeError); exec->setException(err); return err; } DOMParser *parser = static_cast<DOMParser *>(thisObj.imp()); switch (id) { case DOMParser::ParseFromString: { if (args.size() != 2) { return Undefined(); } TQString str = args[0].toString(exec).qstring(); TQString contentType = args[1].toString(exec).qstring().stripWhiteSpace(); if (contentType == "text/xml" || contentType == "application/xml" || contentType == "application/xhtml+xml") { DocumentImpl *docImpl = parser->doc->implementation()->createDocument(); docImpl->open(); docImpl->write(str); docImpl->finishParsing(); docImpl->close(); return getDOMNode(exec, docImpl); } } } return Undefined(); }