From c5fb0a9d8a7eedaed0c4ecfe354219a9d252062f Mon Sep 17 00:00:00 2001
From: Michael Brasser <michael.brasser@live.com>
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 <gunnar.sletta@digia.com>
---
 src/quick/items/qquickimagebase.cpp           |  1 +
 .../quick/qquickimage/data/correctStatus.qml  | 26 ++++++++++
 .../quick/qquickimage/tst_qquickimage.cpp     | 51 +++++++++++++++++++
 3 files changed, 78 insertions(+)
 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 2a9edb37d1..c07f7067f5 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 0000000000..2326078657
--- /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 7f3f0d5cbc..51ac5c640a 100644
--- a/tests/auto/quick/qquickimage/tst_qquickimage.cpp
+++ b/tests/auto/quick/qquickimage/tst_qquickimage.cpp
@@ -56,6 +56,7 @@
 #include <QtGui/QPainter>
 #include <QtGui/QImageReader>
 #include <QQuickWindow>
+#include <QQuickImageProvider>
 
 #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"
-- 
GitLab