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(""