From 9242363fa6e5bb2a757ccb0bd58eb4065f65103d Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Wed, 21 Dec 2022 15:29:58 +0100 Subject: [PATCH] QTextImageHandler: Resolve Nx images correctly for file or qrc URLs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The qt_findAtNxFile helper in qicon.cpp expects a local file name that can be probed with QFile::exists. If the src attribute of an element specifies the location of the image as a file:/ or qrc:/ url rather than as a local file name, then we need to strip the scheme off the file path, and in the case of a qrc URL leave the :/ prefix before calling the qt_findAtNxFile helper. Amends, and partially reverts, 760df7256588e76d082ea959399af36d7ba80a86. We can't avoid testing whether the source in the HTML is provided as a URL before interpreting it as a file name. Fixes: QTBUG-109212 Change-Id: I7ea7a5bfde79bab90a8025c42e754129813dd0fc Reviewed-by: Tor Arne Vestbø (cherry picked from commit 2d87c4d881b74619fef966ffb0d7a00cb4ccea50) Reviewed-by: Qt CI Bot Reviewed-by: Volker Hilsheimer --- src/gui/text/qtextimagehandler.cpp | 24 +++++++++++++++---- .../tst_qtextimagehandler.cpp | 7 ------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/gui/text/qtextimagehandler.cpp b/src/gui/text/qtextimagehandler.cpp index b21ce6f2f9d..3ce3a4bd542 100644 --- a/src/gui/text/qtextimagehandler.cpp +++ b/src/gui/text/qtextimagehandler.cpp @@ -17,20 +17,34 @@ QT_BEGIN_NAMESPACE using namespace Qt::StringLiterals; -extern QString qt_findAtNxFile(const QString &baseFileName, qreal targetDevicePixelRatio, - qreal *sourceDevicePixelRatio); +static inline QString findAtNxFileOrResource(const QString &baseFileName, + qreal targetDevicePixelRatio, + qreal *sourceDevicePixelRatio) +{ + // qt_findAtNxFile expects a file name that can be tested with QFile::exists. + // so if the format.name() is a file:/ or qrc:/ URL, then we need to strip away the schema. + QString localFile = baseFileName; + if (localFile.startsWith("file:/"_L1)) + localFile = localFile.sliced(6); + else if (localFile.startsWith("qrc:/"_L1)) + localFile = localFile.sliced(3); + + extern QString qt_findAtNxFile(const QString &baseFileName, qreal targetDevicePixelRatio, + qreal *sourceDevicePixelRatio); + return qt_findAtNxFile(localFile, targetDevicePixelRatio, sourceDevicePixelRatio); +} static inline QUrl fromLocalfileOrResources(QString path) { if (path.startsWith(":/"_L1)) // auto-detect resources and convert them to url - path.prepend("qrc"_L1); + path = path.prepend("qrc"_L1); return QUrl(path); } static QPixmap getPixmap(QTextDocument *doc, const QTextImageFormat &format, const qreal devicePixelRatio = 1.0) { qreal sourcePixelRatio = 1.0; - const QString name = qt_findAtNxFile(format.name(), devicePixelRatio, &sourcePixelRatio); + const QString name = findAtNxFileOrResource(format.name(), devicePixelRatio, &sourcePixelRatio); const QUrl url = fromLocalfileOrResources(name); QPixmap pm; @@ -100,7 +114,7 @@ static QSize getPixmapSize(QTextDocument *doc, const QTextImageFormat &format) static QImage getImage(QTextDocument *doc, const QTextImageFormat &format, const qreal devicePixelRatio = 1.0) { qreal sourcePixelRatio = 1.0; - const QString name = qt_findAtNxFile(format.name(), devicePixelRatio, &sourcePixelRatio); + const QString name = findAtNxFileOrResource(format.name(), devicePixelRatio, &sourcePixelRatio); const QUrl url = fromLocalfileOrResources(name); QImage image; diff --git a/tests/auto/gui/text/qtextimagehandler/tst_qtextimagehandler.cpp b/tests/auto/gui/text/qtextimagehandler/tst_qtextimagehandler.cpp index ca35cf0c75c..b640efc8e48 100644 --- a/tests/auto/gui/text/qtextimagehandler/tst_qtextimagehandler.cpp +++ b/tests/auto/gui/text/qtextimagehandler/tst_qtextimagehandler.cpp @@ -71,13 +71,6 @@ void tst_QTextImageHandler::loadAtNImages() p.end(); QVERIFY(!img.isNull()); const auto expectedColor = dpr == 1 ? Qt::red : Qt::green; -#ifdef Q_OS_ANDROID // On Android, file:/ fails completely - QEXPECT_FAIL("file_url", "file:/ schema not handled - QTBUG-109212", Continue); -#else - if (dpr != 1) - QEXPECT_FAIL("file_url", "Nx images not resolved for file:/ schema - QTBUG-109212", Continue); -#endif - QEXPECT_FAIL("qrc_url", "qrc:/ schema not handled - QTBUG-109212", Continue); QCOMPARE(img.pixelColor(0, 0), expectedColor); } }