From c5fb0a9d8a7eedaed0c4ecfe354219a9d252062f Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Wed, 23 Jan 2013 22:02:53 -0600 Subject: [PATCH] Disconnect from previous loading image when loading a new image. Change-Id: If2fa95d9715a55d3f07ecf5f232e4f4b9a44a6fb Reviewed-by: Gunnar Sletta --- src/quick/items/qquickimagebase.cpp | 1 + .../auto/quick/qquickimage/data/correctStatus.qml | 26 ++++++++++ tests/auto/quick/qquickimage/tst_qquickimage.cpp | 51 ++++++++++++++++++++ 3 files changed, 78 insertions(+), 0 deletions(-) create mode 100644 tests/auto/quick/qquickimage/data/correctStatus.qml diff --git a/src/quick/items/qquickimagebase.cpp b/src/quick/items/qquickimagebase.cpp index 2a9edb3..c07f706 100644 --- a/src/quick/items/qquickimagebase.cpp +++ b/src/quick/items/qquickimagebase.cpp @@ -207,6 +207,7 @@ void QQuickImageBase::load() options |= QQuickPixmap::Asynchronous; if (d->cache) options |= QQuickPixmap::Cache; + d->pix.clear(this); d->pix.load(qmlEngine(this), d->url, d->sourcesize, options); if (d->pix.isLoading()) { diff --git a/tests/auto/quick/qquickimage/data/correctStatus.qml b/tests/auto/quick/qquickimage/data/correctStatus.qml new file mode 100644 index 0000000..2326078 --- /dev/null +++ b/tests/auto/quick/qquickimage/data/correctStatus.qml @@ -0,0 +1,26 @@ +import QtQuick 2.0 + +Item { + property alias status: image1.status + + Image { + id: image1 + asynchronous: true + source: "image://test/first-image.png" + } + + Image { + id: image2 + asynchronous: true + source: "image://test/first-image.png" + } + + Timer { + interval: 50 + running: true + repeat: false + onTriggered: { + image1.source = "image://test/second-image.png" + } + } +} diff --git a/tests/auto/quick/qquickimage/tst_qquickimage.cpp b/tests/auto/quick/qquickimage/tst_qquickimage.cpp index 7f3f0d5..51ac5c6 100644 --- a/tests/auto/quick/qquickimage/tst_qquickimage.cpp +++ b/tests/auto/quick/qquickimage/tst_qquickimage.cpp @@ -56,6 +56,7 @@ #include #include #include +#include #include "../../shared/util.h" #include "../../shared/testhttpserver.h" @@ -102,6 +103,7 @@ private slots: void sourceSize(); void progressAndStatusChanges(); void sourceSizeChanges(); + void correctStatus(); private: QQmlEngine engine; @@ -868,6 +870,55 @@ void tst_qquickimage::progressAndStatusChanges() delete obj; } +class TestQImageProvider : public QQuickImageProvider +{ +public: + TestQImageProvider() : QQuickImageProvider(Image) {} + + QImage requestImage(const QString &id, QSize *size, const QSize& requestedSize) + { + if (id == QLatin1String("first-image.png")) { + QTest::qWait(50); + int width = 100; + int height = 100; + QImage image(width, height, QImage::Format_RGB32); + image.fill(QColor("yellow").rgb()); + if (size) + *size = QSize(width, height); + return image; + } + + QTest::qWait(400); + int width = 100; + int height = 100; + QImage image(width, height, QImage::Format_RGB32); + image.fill(QColor("green").rgb()); + if (size) + *size = QSize(width, height); + return image; + } +}; + +void tst_qquickimage::correctStatus() +{ + QQmlEngine engine; + engine.addImageProvider(QLatin1String("test"), new TestQImageProvider()); + + QQmlComponent component(&engine, testFileUrl("correctStatus.qml")); + QObject *obj = component.create(); + QVERIFY(obj); + + QTest::qWait(200); + + // at this point image1 should be attempting to load second-image.png, + // and should be in the loading state. Without a clear prior to that load, + // the status can mistakenly be in the ready state. + QCOMPARE(obj->property("status").toInt(), int(QQuickImage::Loading)); + + QTest::qWait(400); + delete obj; +} + QTEST_MAIN(tst_qquickimage) #include "tst_qquickimage.moc" -- 1.7.2.5