diff --git a/src/corelib/serialization/qxmlstream.cpp b/src/corelib/serialization/qxmlstream.cpp index cdb8aca63c6..c7226969cc1 100644 --- a/src/corelib/serialization/qxmlstream.cpp +++ b/src/corelib/serialization/qxmlstream.cpp @@ -823,6 +823,7 @@ void QXmlStreamReaderPrivate::init() isWhitespace = true; isCDATA = false; standalone = false; + hasStandalone = false; tos = 0; resumeReduction = 0; state_stack[tos++] = 0; @@ -1775,7 +1776,6 @@ void QXmlStreamReaderPrivate::startDocument() * proper order: * * [23] XMLDecl ::= '' */ - bool hasStandalone = false; for (qsizetype i = 0; err.isNull() && i < n; ++i) { Attribute &attrib = attributeStack[i]; diff --git a/src/corelib/serialization/qxmlstream_p.h b/src/corelib/serialization/qxmlstream_p.h index 563dab4d608..543fe3ca436 100644 --- a/src/corelib/serialization/qxmlstream_p.h +++ b/src/corelib/serialization/qxmlstream_p.h @@ -389,6 +389,7 @@ public: uint hasExternalDtdSubset : 1; uint lockEncoding : 1; uint namespaceProcessing : 1; + uint hasStandalone : 1; // TODO: expose in public API int resumeReduction; void resume(int rule); @@ -515,6 +516,8 @@ public: QXmlStreamEntityResolver *entityResolver; + static QXmlStreamReaderPrivate *get(QXmlStreamReader *q) { return q->d_func(); } + private: /*! \internal Never assign to variable type directly. Instead use this function. diff --git a/src/xml/dom/qdomhelpers.cpp b/src/xml/dom/qdomhelpers.cpp index 37fe90667f2..99246532b7f 100644 --- a/src/xml/dom/qdomhelpers.cpp +++ b/src/xml/dom/qdomhelpers.cpp @@ -44,6 +44,7 @@ #include "qdomhelpers_p.h" #include "qdom_p.h" #include "qxmlstream.h" +#include "private/qxmlstream_p.h" #include #include @@ -325,9 +326,10 @@ bool QDomParser::parseProlog() if (reader->isStandaloneDocument()) { value += QLatin1String(" standalone='yes'"); } else { - // TODO: Add standalone='no', if 'standalone' is specified. With the current - // QXmlStreamReader there is no way to figure out if it was specified or not. - // QXmlStreamReader needs to be modified for handling that case correctly. + // Add the standalone attribute only if it was specified + QXmlStreamReaderPrivate *priv = QXmlStreamReaderPrivate::get(reader); + if (priv->hasStandalone) + value += QLatin1String(" standalone='no'"); } if (!domBuilder.processingInstruction(QLatin1String("xml"), value)) { diff --git a/tests/auto/xml/dom/qdom/tst_qdom.cpp b/tests/auto/xml/dom/qdom/tst_qdom.cpp index 5045200d054..3f7aba8c334 100644 --- a/tests/auto/xml/dom/qdom/tst_qdom.cpp +++ b/tests/auto/xml/dom/qdom/tst_qdom.cpp @@ -123,6 +123,7 @@ private slots: void DTDInternalSubset() const; void DTDInternalSubset_data() const; void QTBUG49113_dontCrashWithNegativeIndex() const; + void standalone(); void cleanupTestCase() const; @@ -2069,6 +2070,31 @@ void tst_QDom::QTBUG49113_dontCrashWithNegativeIndex() const QVERIFY(node.isNull()); } +void tst_QDom::standalone() +{ + { + QDomDocument doc; + const QString dtd("\n" + "\n"); + doc.setContent(dtd); + QVERIFY(doc.toString().contains("standalone=\'no\'")); + } + { + QDomDocument doc; + const QString dtd("\n" + "\n"); + doc.setContent(dtd); + QVERIFY(!doc.toString().contains("standalone")); + } + { + QDomDocument doc; + const QString dtd("\n" + "\n"); + doc.setContent(dtd); + QVERIFY(doc.toString().contains("standalone=\'yes\'")); + } +} + void tst_QDom::DTDInternalSubset() const { QFETCH( QString, doc );