void XMLTokenizer::insertErrorMessageBlock() { #if USE(QXMLSTREAM) if (m_parsingFragment) return; #endif // One or more errors occurred during parsing of the code. Display an error block to the user above // the normal content (the DOM tree is created manually and includes line/col info regarding // where the errors are located) // Create elements for display ExceptionCode ec = 0; Document* doc = m_doc; Node* documentElement = doc->documentElement(); if (!documentElement) { RefPtr<Node> rootElement = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "html", ec); doc->appendChild(rootElement, ec); RefPtr<Node> body = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "body", ec); rootElement->appendChild(body, ec); documentElement = body.get(); } #if ENABLE(SVG) else if (documentElement->namespaceURI() == SVGNames::svgNamespaceURI) { RefPtr<Node> rootElement = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "html", ec); RefPtr<Node> body = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "body", ec); rootElement->appendChild(body, ec); body->appendChild(documentElement, ec); doc->appendChild(rootElement.get(), ec); documentElement = body.get(); } #endif #if ENABLE(WML) else if (isWMLDocument()) { RefPtr<Node> rootElement = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "html", ec); RefPtr<Node> body = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "body", ec); rootElement->appendChild(body, ec); body->appendChild(documentElement, ec); doc->appendChild(rootElement.get(), ec); documentElement = body.get(); } #endif RefPtr<Element> reportElement = createXHTMLParserErrorHeader(doc, m_errorMessages); documentElement->insertBefore(reportElement, documentElement->firstChild(), ec); #if ENABLE(XSLT) if (doc->transformSourceDocument()) { RefPtr<Element> par = doc->createElementNS(HTMLNames::xhtmlNamespaceURI, "p", ec); reportElement->appendChild(par, ec); par->setAttribute(HTMLNames::styleAttr, "white-space: normal"); par->appendChild(doc->createTextNode("This document was created as the result of an XSL transformation. The line and column numbers given are from the transformed result."), ec); } #endif doc->updateRendering(); }
void XMLDocumentParser::parse() { while (!isStopped() && !m_parserPaused && !m_stream.atEnd()) { m_stream.readNext(); switch (m_stream.tokenType()) { case QXmlStreamReader::StartDocument: { startDocument(); } break; case QXmlStreamReader::EndDocument: { endDocument(); } break; case QXmlStreamReader::StartElement: { #if ENABLE(XHTMLMP) if (document()->isXHTMLMPDocument() && !m_hasDocTypeDeclaration) { handleError(fatal, "DOCTYPE declaration lost.", lineNumber(), columnNumber()); break; } #endif parseStartElement(); } break; case QXmlStreamReader::EndElement: { parseEndElement(); } break; case QXmlStreamReader::Characters: { if (m_stream.isCDATA()) { //cdata parseCdata(); } else { //characters parseCharacters(); } } break; case QXmlStreamReader::Comment: { parseComment(); } break; case QXmlStreamReader::DTD: { //qDebug()<<"------------- DTD"; parseDtd(); #if ENABLE(XHTMLMP) m_hasDocTypeDeclaration = true; #endif } break; case QXmlStreamReader::EntityReference: { //qDebug()<<"---------- ENTITY = "<<m_stream.name().toString() // <<", t = "<<m_stream.text().toString(); if (isXHTMLDocument() #if ENABLE(XHTMLMP) || isXHTMLMPDocument() #endif #if ENABLE(WML) || isWMLDocument() #endif ) { QString entity = m_stream.name().toString(); UChar c = decodeNamedEntity(entity.toUtf8().constData()); if (!m_currentNode->isTextNode()) enterText(); ExceptionCode ec = 0; String str(&c, 1); // qDebug()<<" ------- adding entity "<<str; static_cast<Text*>(m_currentNode)->appendData(str, ec); } } break; case QXmlStreamReader::ProcessingInstruction: { parseProcessingInstruction(); } break; default: { if (m_stream.error() != QXmlStreamReader::PrematureEndOfDocumentError) { ErrorType type = (m_stream.error() == QXmlStreamReader::NotWellFormedError) ? fatal : warning; handleError(type, qPrintable(m_stream.errorString()), lineNumber(), columnNumber()); } } break; } } }