diff --git a/src/xml/dom/qdom.cpp b/src/xml/dom/qdom.cpp index 2ac4c69b7f1..603704f9163 100644 --- a/src/xml/dom/qdom.cpp +++ b/src/xml/dom/qdom.cpp @@ -6197,12 +6197,28 @@ bool QDomDocument::setContent(const QByteArray &data, bool namespaceProcessing, This function reads the XML document from the IO device \a dev, returning true if the content was successfully parsed; otherwise returns \c false. + + \note This method will try to open \a dev in read-only mode if it is not + already open. In that case, the caller is responsible for calling close. + This will change in Qt 7, which will no longer open \a dev. Applications + shoul therefore open the device themselves before calling setContent. */ bool QDomDocument::setContent(QIODevice* dev, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn) { if (!impl) impl = new QDomDocumentPrivate(); +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) + if (!dev->isOpen()) { + qWarning("QDomDocument called with unopened QIODevice. " + "This will not be supported in future Qt versions"); + if (!dev->open(QIODevice::ReadOnly)) { + qWarning("QDomDocument::setContent: Failed to open device"); + return false; + } + } +#endif + QXmlStreamReader streamReader(dev); streamReader.setNamespaceProcessing(namespaceProcessing); return IMPL->setContent(&streamReader, namespaceProcessing, errorMsg, errorLine, errorColumn); diff --git a/tests/auto/xml/dom/qdom/tst_qdom.cpp b/tests/auto/xml/dom/qdom/tst_qdom.cpp index c44626e1612..b1c9b2e9c9e 100644 --- a/tests/auto/xml/dom/qdom/tst_qdom.cpp +++ b/tests/auto/xml/dom/qdom/tst_qdom.cpp @@ -111,6 +111,7 @@ private slots: void checkIntOverflow() const; void setContentWhitespace() const; void setContentWhitespace_data() const; + void setContentUnopenedQIODevice() const; void taskQTBUG4595_dontAssertWhenDocumentSpecifiesUnknownEncoding() const; void cloneDTD_QTBUG8398() const; @@ -1919,6 +1920,23 @@ void tst_QDom::setContentWhitespace_data() const QTest::newRow("data25") << QString::fromLatin1("\t\t\t\t") << false; } +void tst_QDom::setContentUnopenedQIODevice() const +{ + QByteArray data("bar"); + QBuffer buffer(&data); + + QDomDocument doc; + + QTest::ignoreMessage(QtWarningMsg, + "QDomDocument called with unopened QIODevice. " + "This will not be supported in future Qt versions"); + + // Note: the check below is expected to fail in Qt 7. + // Fix the test and remove the obsolete code from setContent(). + QVERIFY(doc.setContent(&buffer, true)); + QCOMPARE(doc.toString().trimmed(), data); +} + void tst_QDom::taskQTBUG4595_dontAssertWhenDocumentSpecifiesUnknownEncoding() const { QString xmlWithUnknownEncoding(""