From 2ec0df06aa61d23a1a7ad5bdf87c772f376259b7 Mon Sep 17 00:00:00 2001
From: Damian Jansen <damian.jansen@nokia.com>
Date: Wed, 11 Jul 2012 17:01:09 +1000
Subject: [PATCH] Fix signal emission for the Image based items when loading.

StatusChanged signals are now always emitted.
Other properties only emit when altered.
AnimatedImage local and remote loading was also unified in this fix.
BorderImage duplicated loading code is streamlined.

Task-number: QTBUG-26405
Change-Id: Ib412d5879e0007229a8098e1fa960003051508de
Reviewed-by: Alan Alpert <alan.alpert@nokia.com>
---
 src/quick/items/qquickanimatedimage.cpp       | 169 ++++++++++--------
 src/quick/items/qquickanimatedimage_p.h       |   3 +-
 src/quick/items/qquickborderimage.cpp         |  82 ++++-----
 src/quick/items/qquickimagebase.cpp           |  57 +++---
 src/quick/items/qquickimagebase_p_p.h         |   1 +
 .../qquickanimatedimage/data/hearts_copy.gif  | Bin 0 -> 6524 bytes
 .../tst_qquickanimatedimage.cpp               | 124 +++++++++++--
 .../qquickborderimage/data/heart200_copy.png  | Bin 0 -> 7943 bytes
 .../tst_qquickborderimage.cpp                 | 137 +++++++++++++-
 .../quick/qquickimage/data/heart_copy.png     | Bin 0 -> 12577 bytes
 .../quick/qquickimage/tst_qquickimage.cpp     | 141 ++++++++++++++-
 11 files changed, 549 insertions(+), 165 deletions(-)
 create mode 100644 tests/auto/quick/qquickanimatedimage/data/hearts_copy.gif
 create mode 100644 tests/auto/quick/qquickborderimage/data/heart200_copy.png
 create mode 100644 tests/auto/quick/qquickimage/data/heart_copy.png

diff --git a/src/quick/items/qquickanimatedimage.cpp b/src/quick/items/qquickanimatedimage.cpp
index b4c1bd435a..72b24a7fac 100644
--- a/src/quick/items/qquickanimatedimage.cpp
+++ b/src/quick/items/qquickanimatedimage.cpp
@@ -131,6 +131,8 @@ QQuickAnimatedImage::QQuickAnimatedImage(QQuickItem *parent)
 QQuickAnimatedImage::~QQuickAnimatedImage()
 {
     Q_D(QQuickAnimatedImage);
+    if (d->reply)
+        d->reply->deleteLater();
     delete d->_movie;
 }
 
@@ -233,14 +235,16 @@ void QQuickAnimatedImage::setSource(const QUrl &url)
     if (url == d->url)
         return;
 
-    delete d->_movie;
-    d->_movie = 0;
-
     if (d->reply) {
         d->reply->deleteLater();
         d->reply = 0;
     }
 
+    if (d->_movie) {
+        delete d->_movie;
+        d->_movie = 0;
+    }
+
     d->url = url;
     emit sourceChanged(d->url);
 
@@ -252,64 +256,43 @@ void QQuickAnimatedImage::load()
 {
     Q_D(QQuickAnimatedImage);
 
-    QQuickImageBase::Status oldStatus = d->status;
-    qreal oldProgress = d->progress;
-
     if (d->url.isEmpty()) {
-        delete d->_movie;
+        if (d->progress != 0) {
+            d->progress = 0;
+            emit progressChanged(d->progress);
+        }
+
         d->setImage(QImage());
-        d->progress = 0;
         d->status = Null;
-        if (d->status != oldStatus)
-            emit statusChanged(d->status);
-        if (d->progress != oldProgress)
-            emit progressChanged(d->progress);
+        emit statusChanged(d->status);
+
+        if (sourceSize() != d->oldSourceSize) {
+            d->oldSourceSize = sourceSize();
+            emit sourceSizeChanged();
+        }
     } else {
         QString lf = QQmlFile::urlToLocalFileOrQrc(d->url);
         if (!lf.isEmpty()) {
-            //### should be unified with movieRequestFinished
             d->_movie = new QMovie(lf);
-            if (!d->_movie->isValid()){
-                qmlInfo(this) << "Error Reading Animated Image File " << d->url.toString();
-                delete d->_movie;
-                d->_movie = 0;
-                d->status = Error;
-                if (d->status != oldStatus)
-                    emit statusChanged(d->status);
-                return;
-            }
-            connect(d->_movie, SIGNAL(stateChanged(QMovie::MovieState)),
-                    this, SLOT(playingStatusChanged()));
-            connect(d->_movie, SIGNAL(frameChanged(int)),
-                    this, SLOT(movieUpdate()));
-            d->_movie->setCacheMode(QMovie::CacheAll);
-            if (d->playing)
-                d->_movie->start();
-            else
-                d->_movie->jumpToFrame(0);
-            if (d->paused)
-                d->_movie->setPaused(true);
-            d->setImage(d->_movie->currentPixmap().toImage());
-            d->status = Ready;
-            d->progress = 1.0;
-            if (d->status != oldStatus)
+            movieRequestFinished();
+        } else {
+            if (d->status != Loading) {
+                d->status = Loading;
                 emit statusChanged(d->status);
-            if (d->progress != oldProgress)
+            }
+            if (d->progress != 0) {
+                d->progress = 0;
                 emit progressChanged(d->progress);
-            return;
+            }
+            QNetworkRequest req(d->url);
+            req.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
+
+            d->reply = qmlEngine(this)->networkAccessManager()->get(req);
+            QObject::connect(d->reply, SIGNAL(finished()),
+                            this, SLOT(movieRequestFinished()));
+            QObject::connect(d->reply, SIGNAL(downloadProgress(qint64,qint64)),
+                            this, SLOT(requestProgress(qint64,qint64)));
         }
-
-        d->status = Loading;
-        d->progress = 0;
-        emit statusChanged(d->status);
-        emit progressChanged(d->progress);
-        QNetworkRequest req(d->url);
-        req.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
-        d->reply = qmlEngine(this)->networkAccessManager()->get(req);
-        QObject::connect(d->reply, SIGNAL(finished()),
-                         this, SLOT(movieRequestFinished()));
-        QObject::connect(d->reply, SIGNAL(downloadProgress(qint64,qint64)),
-                         this, SLOT(requestProgress(qint64,qint64)));
     }
 }
 
@@ -319,58 +302,85 @@ void QQuickAnimatedImage::movieRequestFinished()
 {
     Q_D(QQuickAnimatedImage);
 
-    d->redirectCount++;
-    if (d->redirectCount < ANIMATEDIMAGE_MAXIMUM_REDIRECT_RECURSION) {
-        QVariant redirect = d->reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
-        if (redirect.isValid()) {
-            QUrl url = d->reply->url().resolved(redirect.toUrl());
-            d->reply->deleteLater();
-            d->reply = 0;
-            setSource(url);
-            return;
+    if (d->reply) {
+        d->redirectCount++;
+        if (d->redirectCount < ANIMATEDIMAGE_MAXIMUM_REDIRECT_RECURSION) {
+            QVariant redirect = d->reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
+            if (redirect.isValid()) {
+                QUrl url = d->reply->url().resolved(redirect.toUrl());
+                d->reply->deleteLater();
+                setSource(url);
+                return;
+            }
         }
+
+        d->redirectCount=0;
+        d->_movie = new QMovie(d->reply);
     }
-    d->redirectCount=0;
 
-    d->_movie = new QMovie(d->reply);
-    if (!d->_movie->isValid()){
-#ifndef QT_NO_DEBUG_STREAM
-        qmlInfo(this) << "Error Reading Animated Image File " << d->url;
-#endif
+    if (!d->_movie->isValid()) {
+        qmlInfo(this) << "Error Reading Animated Image File " << d->url.toString();
         delete d->_movie;
         d->_movie = 0;
+        d->setImage(QImage());
+        if (d->progress != 0) {
+            d->progress = 0;
+            emit progressChanged(d->progress);
+        }
         d->status = Error;
         emit statusChanged(d->status);
+
+        if (sourceSize() != d->oldSourceSize) {
+            d->oldSourceSize = sourceSize();
+            emit sourceSizeChanged();
+        }
         return;
     }
+
     connect(d->_movie, SIGNAL(stateChanged(QMovie::MovieState)),
             this, SLOT(playingStatusChanged()));
     connect(d->_movie, SIGNAL(frameChanged(int)),
             this, SLOT(movieUpdate()));
     d->_movie->setCacheMode(QMovie::CacheAll);
+
+    d->status = Ready;
+    emit statusChanged(d->status);
+
+    if (d->progress != 1.0) {
+        d->progress = 1.0;
+        emit progressChanged(d->progress);
+    }
     if (d->playing)
         d->_movie->start();
+
+    if (d->paused)
+        d->_movie->setPaused(true);
     if (d->paused || !d->playing) {
         d->_movie->jumpToFrame(d->preset_currentframe);
         d->preset_currentframe = 0;
     }
-    if (d->paused)
-        d->_movie->setPaused(true);
     d->setImage(d->_movie->currentPixmap().toImage());
-    d->status = Ready;
-    emit statusChanged(d->status);
+
+    if (sourceSize() != d->oldSourceSize) {
+        d->oldSourceSize = sourceSize();
+        emit sourceSizeChanged();
+    }
 }
 
 void QQuickAnimatedImage::movieUpdate()
 {
     Q_D(QQuickAnimatedImage);
-    d->setImage(d->_movie->currentPixmap().toImage());
-    emit frameChanged();
+
+    if (d->_movie) {
+        d->setImage(d->_movie->currentPixmap().toImage());
+        emit frameChanged();
+    }
 }
 
 void QQuickAnimatedImage::playingStatusChanged()
 {
     Q_D(QQuickAnimatedImage);
+
     if ((d->_movie->state() != QMovie::NotRunning) != d->playing) {
         d->playing = (d->_movie->state() != QMovie::NotRunning);
         emit playingChanged();
@@ -381,16 +391,19 @@ void QQuickAnimatedImage::playingStatusChanged()
     }
 }
 
+QSize QQuickAnimatedImage::sourceSize()
+{
+    Q_D(QQuickAnimatedImage);
+    if (!d->_movie)
+        return QSize(0, 0);
+    return QSize(d->_movie->currentPixmap().size());
+}
+
 void QQuickAnimatedImage::componentComplete()
 {
     Q_D(QQuickAnimatedImage);
     QQuickItem::componentComplete(); // NOT QQuickImage
-    if (d->url.isValid())
-        load();
-    if (!d->reply) {
-        setCurrentFrame(d->preset_currentframe);
-        d->preset_currentframe = 0;
-    }
+    load();
 }
 
 QT_END_NAMESPACE
diff --git a/src/quick/items/qquickanimatedimage_p.h b/src/quick/items/qquickanimatedimage_p.h
index 86910199ac..0841683f38 100644
--- a/src/quick/items/qquickanimatedimage_p.h
+++ b/src/quick/items/qquickanimatedimage_p.h
@@ -80,8 +80,9 @@ public:
 
     int frameCount() const;
 
-    // Extends QQuickImage's src property*/
+    // Extends QQuickImage's src property
     virtual void setSource(const QUrl&);
+    virtual QSize sourceSize();
 
 Q_SIGNALS:
     void playingChanged();
diff --git a/src/quick/items/qquickborderimage.cpp b/src/quick/items/qquickborderimage.cpp
index 889877aea1..6c0387f859 100644
--- a/src/quick/items/qquickborderimage.cpp
+++ b/src/quick/items/qquickborderimage.cpp
@@ -293,34 +293,42 @@ void QQuickBorderImage::setSource(const QUrl &url)
 void QQuickBorderImage::load()
 {
     Q_D(QQuickBorderImage);
-    if (d->progress != 0.0) {
-        d->progress = 0.0;
-        emit progressChanged(d->progress);
-    }
 
     if (d->url.isEmpty()) {
         d->pix.clear(this);
         d->status = Null;
         setImplicitSize(0, 0);
         emit statusChanged(d->status);
+        if (d->progress != 0.0) {
+            d->progress = 0.0;
+            emit progressChanged(d->progress);
+        }
+        if (sourceSize() != d->oldSourceSize) {
+            d->oldSourceSize = sourceSize();
+            emit sourceSizeChanged();
+        }
         update();
         return;
     } else {
-        d->status = Loading;
         if (d->url.path().endsWith(QLatin1String("sci"))) {
             QString lf = QQmlFile::urlToLocalFileOrQrc(d->url);
             if (!lf.isEmpty()) {
                 QFile file(lf);
                 file.open(QIODevice::ReadOnly);
                 setGridScaledImage(QQuickGridScaledImage(&file));
+                return;
             } else {
+                if (d->progress != 0.0) {
+                    d->progress = 0.0;
+                    emit progressChanged(d->progress);
+                }
+                d->status = Loading;
                 QNetworkRequest req(d->url);
                 d->sciReply = qmlEngine(this)->networkAccessManager()->get(req);
                 qmlobject_connect(d->sciReply, QNetworkReply, SIGNAL(finished()),
                                   this, QQuickBorderImage, SLOT(sciRequestFinished()))
             }
         } else {
-
             QQuickPixmap::Options options;
             if (d->async)
                 options |= QQuickPixmap::Asynchronous;
@@ -330,23 +338,15 @@ void QQuickBorderImage::load()
             d->pix.load(qmlEngine(this), d->url, options);
 
             if (d->pix.isLoading()) {
+                if (d->progress != 0.0) {
+                    d->progress = 0.0;
+                    emit progressChanged(d->progress);
+                }
+                d->status = Loading;
                 d->pix.connectFinished(this, SLOT(requestFinished()));
                 d->pix.connectDownloadProgress(this, SLOT(requestProgress(qint64,qint64)));
             } else {
-                QSize impsize = d->pix.implicitSize();
-                setImplicitSize(impsize.width(), impsize.height());
-
-                if (d->pix.isReady()) {
-                    d->status = Ready;
-                } else {
-                    d->status = Error;
-                    qmlInfo(this) << d->pix.error();
-                }
-
-                d->progress = 1.0;
-                emit statusChanged(d->status);
-                emit progressChanged(d->progress);
-                update();
+                requestFinished();
                 return;
             }
         }
@@ -462,6 +462,14 @@ void QQuickBorderImage::setGridScaledImage(const QQuickGridScaledImage& sci)
         d->pix.load(qmlEngine(this), d->sciurl, options);
 
         if (d->pix.isLoading()) {
+            if (d->progress != 0.0) {
+                d->progress = 0.0;
+                emit progressChanged(d->progress);
+            }
+            if (d->status != Loading) {
+                d->status = Loading;
+                emit statusChanged(d->status);
+            }
             static int thisRequestProgress = -1;
             static int thisRequestFinished = -1;
             if (thisRequestProgress == -1) {
@@ -475,22 +483,7 @@ void QQuickBorderImage::setGridScaledImage(const QQuickGridScaledImage& sci)
             d->pix.connectDownloadProgress(this, thisRequestProgress);
 
         } else {
-
-            QSize impsize = d->pix.implicitSize();
-            setImplicitSize(impsize.width(), impsize.height());
-
-            if (d->pix.isReady()) {
-                d->status = Ready;
-            } else {
-                d->status = Error;
-                qmlInfo(this) << d->pix.error();
-            }
-
-            d->progress = 1.0;
-            emit statusChanged(d->status);
-            emit progressChanged(1.0);
-            update();
-
+            requestFinished();
         }
     }
 }
@@ -503,18 +496,25 @@ void QQuickBorderImage::requestFinished()
     if (d->pix.isError()) {
         d->status = Error;
         qmlInfo(this) << d->pix.error();
+        if (d->progress != 0) {
+            d->progress = 0;
+            emit progressChanged(d->progress);
+        }
     } else {
         d->status = Ready;
+        if (d->progress != 1.0) {
+            d->progress = 1.0;
+            emit progressChanged(d->progress);
+        }
     }
 
     setImplicitSize(impsize.width(), impsize.height());
-
-    if (d->sourcesize.width() != d->pix.width() || d->sourcesize.height() != d->pix.height())
+    emit statusChanged(d->status);
+    if (sourceSize() != d->oldSourceSize) {
+        d->oldSourceSize = sourceSize();
         emit sourceSizeChanged();
+    }
 
-    d->progress = 1.0;
-    emit statusChanged(d->status);
-    emit progressChanged(1.0);
     update();
 }
 
diff --git a/src/quick/items/qquickimagebase.cpp b/src/quick/items/qquickimagebase.cpp
index 798050d776..e42b0ee2e2 100644
--- a/src/quick/items/qquickimagebase.cpp
+++ b/src/quick/items/qquickimagebase.cpp
@@ -187,27 +187,37 @@ void QQuickImageBase::load()
 
     if (d->url.isEmpty()) {
         d->pix.clear(this);
-        d->status = Null;
-        d->progress = 0.0;
+        if (d->progress != 0.0) {
+            d->progress = 0.0;
+            emit progressChanged(d->progress);
+        }
         pixmapChange();
-        emit progressChanged(d->progress);
+        d->status = Null;
         emit statusChanged(d->status);
+
+        if (sourceSize() != d->oldSourceSize) {
+            d->oldSourceSize = sourceSize();
+            emit sourceSizeChanged();
+        }
         update();
+
     } else {
         QQuickPixmap::Options options;
         if (d->async)
             options |= QQuickPixmap::Asynchronous;
         if (d->cache)
             options |= QQuickPixmap::Cache;
-        d->pix.clear(this);
-        pixmapChange();
         d->pix.load(qmlEngine(this), d->url, d->sourcesize, options);
 
         if (d->pix.isLoading()) {
-            d->progress = 0.0;
-            d->status = Loading;
-            emit progressChanged(d->progress);
-            emit statusChanged(d->status);
+            if (d->progress != 0.0) {
+                d->progress = 0.0;
+                emit progressChanged(d->progress);
+            }
+            if (d->status != Loading) {
+                d->status = Loading;
+                emit statusChanged(d->status);
+            }
 
             static int thisRequestProgress = -1;
             static int thisRequestFinished = -1;
@@ -231,28 +241,27 @@ void QQuickImageBase::requestFinished()
 {
     Q_D(QQuickImageBase);
 
-    QQuickImageBase::Status oldStatus = d->status;
-    qreal oldProgress = d->progress;
-
     if (d->pix.isError()) {
-        d->status = Error;
         qmlInfo(this) << d->pix.error();
+        d->pix.clear(this);
+        d->status = Error;
+        if (d->progress != 0.0) {
+            d->progress = 0.0;
+            emit progressChanged(d->progress);
+        }
     } else {
         d->status = Ready;
+        if (d->progress != 1.0) {
+            d->progress = 1.0;
+            emit progressChanged(d->progress);
+        }
     }
-
-    d->progress = 1.0;
-
     pixmapChange();
-
-    if (d->sourcesize.width() != d->pix.width() || d->sourcesize.height() != d->pix.height())
+    emit statusChanged(d->status);
+    if (sourceSize() != d->oldSourceSize) {
+        d->oldSourceSize = sourceSize();
         emit sourceSizeChanged();
-
-    if (d->status != oldStatus)
-        emit statusChanged(d->status);
-    if (d->progress != oldProgress)
-        emit progressChanged(d->progress);
-
+    }
     update();
 }
 
diff --git a/src/quick/items/qquickimagebase_p_p.h b/src/quick/items/qquickimagebase_p_p.h
index 6e452387ae..5708e6d177 100644
--- a/src/quick/items/qquickimagebase_p_p.h
+++ b/src/quick/items/qquickimagebase_p_p.h
@@ -80,6 +80,7 @@ public:
     QUrl url;
     qreal progress;
     QSize sourcesize;
+    QSize oldSourceSize;
     bool async : 1;
     bool cache : 1;
     bool mirror: 1;
diff --git a/tests/auto/quick/qquickanimatedimage/data/hearts_copy.gif b/tests/auto/quick/qquickanimatedimage/data/hearts_copy.gif
new file mode 100644
index 0000000000000000000000000000000000000000..cfb55f27f5e33ebcde7601dcc628f52b436d651e
GIT binary patch
literal 6524
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

literal 0
HcmV?d00001

diff --git a/tests/auto/quick/qquickanimatedimage/tst_qquickanimatedimage.cpp b/tests/auto/quick/qquickanimatedimage/tst_qquickanimatedimage.cpp
index 7775e395cb..690d5c14c9 100644
--- a/tests/auto/quick/qquickanimatedimage/tst_qquickanimatedimage.cpp
+++ b/tests/auto/quick/qquickanimatedimage/tst_qquickanimatedimage.cpp
@@ -60,6 +60,7 @@ public:
     tst_qquickanimatedimage() {}
 
 private slots:
+    void cleanup();
     void play();
     void pause();
     void stopped();
@@ -71,13 +72,19 @@ private slots:
     void remote();
     void remote_data();
     void sourceSize();
+    void sourceSizeChanges();
     void sourceSizeReadOnly();
     void invalidSource();
     void qtbug_16520();
     void progressAndStatusChanges();
-
 };
 
+void tst_qquickanimatedimage::cleanup()
+{
+    QQuickCanvas canvas;
+    canvas.releaseResources();
+}
+
 void tst_qquickanimatedimage::play()
 {
     QQmlEngine engine;
@@ -95,8 +102,9 @@ void tst_qquickanimatedimage::pause()
     QQmlComponent component(&engine, testFileUrl("stickmanpause.qml"));
     QQuickAnimatedImage *anim = qobject_cast<QQuickAnimatedImage *>(component.create());
     QVERIFY(anim);
-    QVERIFY(anim->isPlaying());
-    QVERIFY(anim->isPaused());
+
+    QTRY_VERIFY(anim->isPaused());
+    QTRY_VERIFY(anim->isPlaying());
 
     delete anim;
 }
@@ -180,6 +188,8 @@ void tst_qquickanimatedimage::mirror_running()
 
     QCOMPARE(frame0_flipped, frame0_expected);
     QCOMPARE(frame1_flipped, frame1_expected);
+
+    delete anim;
 }
 
 void tst_qquickanimatedimage::mirror_notRunning()
@@ -207,13 +217,14 @@ void tst_qquickanimatedimage::mirror_notRunning()
     anim->setProperty("mirror", true);
     screenshot = QPixmap::fromImage(canvas.grabFrameBuffer());
 
-    QSKIP("Skip while QTBUG-19351 and QTBUG-19252 are not resolved");
     QCOMPARE(screenshot, expected);
 
     // mirroring should not change the current frame or playing status
     QCOMPARE(anim->currentFrame(), frame);
     QCOMPARE(anim->isPlaying(), playing);
     QCOMPARE(anim->isPaused(), paused);
+
+    delete anim;
 }
 
 void tst_qquickanimatedimage::mirror_notRunning_data()
@@ -224,6 +235,15 @@ void tst_qquickanimatedimage::mirror_notRunning_data()
     QTest::newRow("stopped") << testFileUrl("stickmanstopped.qml");
 }
 
+void tst_qquickanimatedimage::remote_data()
+{
+    QTest::addColumn<QString>("fileName");
+    QTest::addColumn<bool>("paused");
+
+    QTest::newRow("playing") << "stickman.qml" << false;
+    QTest::newRow("paused") << "stickmanpause.qml" << true;
+}
+
 void tst_qquickanimatedimage::remote()
 {
     QFETCH(QString, fileName);
@@ -271,15 +291,6 @@ void tst_qquickanimatedimage::sourceSizeReadOnly()
     QCOMPARE(component.errors().at(0).description(), QString("Invalid property assignment: \"sourceSize\" is a read-only property"));
 }
 
-void tst_qquickanimatedimage::remote_data()
-{
-    QTest::addColumn<QString>("fileName");
-    QTest::addColumn<bool>("paused");
-
-    QTest::newRow("playing") << "stickman.qml" << false;
-    QTest::newRow("paused") << "stickmanpause.qml" << true;
-}
-
 void tst_qquickanimatedimage::invalidSource()
 {
     QQmlEngine engine;
@@ -297,6 +308,74 @@ void tst_qquickanimatedimage::invalidSource()
     QCOMPARE(anim->currentFrame(), 0);
     QCOMPARE(anim->frameCount(), 0);
     QTRY_VERIFY(anim->status() == 3);
+
+    delete anim;
+}
+
+void tst_qquickanimatedimage::sourceSizeChanges()
+{
+    TestHTTPServer server(14449);
+    QVERIFY(server.isValid());
+    server.serveDirectory(dataDirectory());
+
+    QQmlEngine engine;
+    QQmlComponent component(&engine);
+    component.setData("import QtQuick 2.0\nAnimatedImage { source: srcImage }", QUrl::fromLocalFile(""));
+    QTRY_VERIFY(component.isReady());
+    QQmlContext *ctxt = engine.rootContext();
+    ctxt->setContextProperty("srcImage", "");
+    QQuickAnimatedImage *anim = qobject_cast<QQuickAnimatedImage*>(component.create());
+    QVERIFY(anim != 0);
+
+    QSignalSpy sourceSizeSpy(anim, SIGNAL(sourceSizeChanged()));
+
+    // Local
+    ctxt->setContextProperty("srcImage", QUrl(""));
+    QTRY_COMPARE(anim->status(), QQuickAnimatedImage::Null);
+    QTRY_VERIFY(sourceSizeSpy.count() == 0);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("hearts.gif"));
+    QTRY_COMPARE(anim->status(), QQuickAnimatedImage::Ready);
+    QTRY_VERIFY(sourceSizeSpy.count() == 1);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("hearts.gif"));
+    QTRY_COMPARE(anim->status(), QQuickAnimatedImage::Ready);
+    QTRY_VERIFY(sourceSizeSpy.count() == 1);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("hearts_copy.gif"));
+    QTRY_COMPARE(anim->status(), QQuickAnimatedImage::Ready);
+    QTRY_VERIFY(sourceSizeSpy.count() == 1);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("colors.gif"));
+    QTRY_COMPARE(anim->status(), QQuickAnimatedImage::Ready);
+    QTRY_VERIFY(sourceSizeSpy.count() == 2);
+
+    ctxt->setContextProperty("srcImage", QUrl(""));
+    QTRY_COMPARE(anim->status(), QQuickAnimatedImage::Null);
+    QTRY_VERIFY(sourceSizeSpy.count() == 3);
+
+    // Remote
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/hearts.gif"));
+    QTRY_COMPARE(anim->status(), QQuickAnimatedImage::Ready);
+    QTRY_VERIFY(sourceSizeSpy.count() == 4);
+
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/hearts.gif"));
+    QTRY_COMPARE(anim->status(), QQuickAnimatedImage::Ready);
+    QTRY_VERIFY(sourceSizeSpy.count() == 4);
+
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/hearts_copy.gif"));
+    QTRY_COMPARE(anim->status(), QQuickAnimatedImage::Ready);
+    QTRY_VERIFY(sourceSizeSpy.count() == 4);
+
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/colors.gif"));
+    QTRY_COMPARE(anim->status(), QQuickAnimatedImage::Ready);
+    QTRY_VERIFY(sourceSizeSpy.count() == 5);
+
+    ctxt->setContextProperty("srcImage", QUrl(""));
+    QTRY_COMPARE(anim->status(), QQuickAnimatedImage::Null);
+    QTRY_VERIFY(sourceSizeSpy.count() == 6);
+
+    delete anim;
 }
 
 void tst_qquickanimatedimage::qtbug_16520()
@@ -312,13 +391,14 @@ void tst_qquickanimatedimage::qtbug_16520()
     QQuickRectangle *root = qobject_cast<QQuickRectangle *>(component.create());
     QVERIFY(root);
     QQuickAnimatedImage *anim = root->findChild<QQuickAnimatedImage*>("anim");
+    QVERIFY(anim != 0);
 
     anim->setProperty("source", "http://127.0.0.1:14449/stickman.gif");
-
     QTRY_VERIFY(anim->opacity() == 0);
     QTRY_VERIFY(anim->opacity() == 1);
 
     delete anim;
+    delete root;
 }
 
 void tst_qquickanimatedimage::progressAndStatusChanges()
@@ -343,13 +423,21 @@ void tst_qquickanimatedimage::progressAndStatusChanges()
     QSignalSpy progressSpy(obj, SIGNAL(progressChanged(qreal)));
     QSignalSpy statusSpy(obj, SIGNAL(statusChanged(QQuickImageBase::Status)));
 
+    // Same image
+    ctxt->setContextProperty("srcImage", testFileUrl("stickman.gif"));
+    QTRY_VERIFY(obj->status() == QQuickImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 0);
+    QTRY_COMPARE(progressSpy.count(), 0);
+    QTRY_COMPARE(statusSpy.count(), 0);
+
     // Loading local file
     ctxt->setContextProperty("srcImage", testFileUrl("colors.gif"));
     QTRY_VERIFY(obj->status() == QQuickImage::Ready);
     QTRY_VERIFY(obj->progress() == 1.0);
     QTRY_COMPARE(sourceSpy.count(), 1);
     QTRY_COMPARE(progressSpy.count(), 0);
-    QTRY_COMPARE(statusSpy.count(), 0);
+    QTRY_COMPARE(statusSpy.count(), 1);
 
     // Loading remote file
     ctxt->setContextProperty("srcImage", "http://127.0.0.1:14449/stickman.gif");
@@ -359,14 +447,16 @@ void tst_qquickanimatedimage::progressAndStatusChanges()
     QTRY_VERIFY(obj->progress() == 1.0);
     QTRY_COMPARE(sourceSpy.count(), 2);
     QTRY_VERIFY(progressSpy.count() > 1);
-    QTRY_COMPARE(statusSpy.count(), 2);
+    QTRY_COMPARE(statusSpy.count(), 3);
 
     ctxt->setContextProperty("srcImage", "");
     QTRY_VERIFY(obj->status() == QQuickImage::Null);
     QTRY_VERIFY(obj->progress() == 0.0);
     QTRY_COMPARE(sourceSpy.count(), 3);
     QTRY_VERIFY(progressSpy.count() > 2);
-    QTRY_COMPARE(statusSpy.count(), 3);
+    QTRY_COMPARE(statusSpy.count(), 4);
+
+    delete obj;
 }
 
 QTEST_MAIN(tst_qquickanimatedimage)
diff --git a/tests/auto/quick/qquickborderimage/data/heart200_copy.png b/tests/auto/quick/qquickborderimage/data/heart200_copy.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a31ae8f4d722e168b5b1489d4eb61399365117b
GIT binary patch
literal 7943
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

literal 0
HcmV?d00001

diff --git a/tests/auto/quick/qquickborderimage/tst_qquickborderimage.cpp b/tests/auto/quick/qquickborderimage/tst_qquickborderimage.cpp
index 9bffdbc0f3..7e32ca054e 100644
--- a/tests/auto/quick/qquickborderimage/tst_qquickborderimage.cpp
+++ b/tests/auto/quick/qquickborderimage/tst_qquickborderimage.cpp
@@ -71,6 +71,7 @@ public:
     tst_qquickborderimage();
 
 private slots:
+    void cleanup();
     void noSource();
     void imageSource();
     void imageSource_data();
@@ -86,14 +87,22 @@ private slots:
     void validSciFiles();
     void pendingRemoteRequest();
     void pendingRemoteRequest_data();
-
     void statusChanges();
     void statusChanges_data();
+    void sourceSizeChanges();
+    void progressAndStatusChanges();
 
 private:
     QQmlEngine engine;
 };
 
+void tst_qquickborderimage::cleanup()
+{
+    QQuickCanvas canvas;
+    canvas.releaseResources();
+    engine.clearComponentCache();
+}
+
 tst_qquickborderimage::tst_qquickborderimage()
 {
 }
@@ -189,6 +198,8 @@ void tst_qquickborderimage::clearSource()
     QVERIFY(obj->status() == QQuickBorderImage::Null);
     QCOMPARE(obj->width(), 0.);
     QCOMPARE(obj->height(), 0.);
+
+    delete obj;
 }
 
 void tst_qquickborderimage::resized()
@@ -447,6 +458,130 @@ void tst_qquickborderimage::statusChanges()
     delete server;
 }
 
+void tst_qquickborderimage::sourceSizeChanges()
+{
+    TestHTTPServer server(14449);
+    QVERIFY(server.isValid());
+    server.serveDirectory(dataDirectory());
+
+    QQmlEngine engine;
+    QQmlComponent component(&engine);
+    component.setData("import QtQuick 2.0\nBorderImage { source: srcImage }", QUrl::fromLocalFile(""));
+    QTRY_VERIFY(component.isReady());
+    QQmlContext *ctxt = engine.rootContext();
+    ctxt->setContextProperty("srcImage", "");
+    QQuickBorderImage *obj = qobject_cast<QQuickBorderImage*>(component.create());
+    QVERIFY(obj != 0);
+
+    QSignalSpy sourceSizeSpy(obj, SIGNAL(sourceSizeChanged()));
+
+    // Local
+    ctxt->setContextProperty("srcImage", QUrl(""));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Null);
+    QTRY_COMPARE(sourceSizeSpy.count(), 0);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("heart200.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 1);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("heart200.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 1);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("heart200_copy.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 1);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("colors.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 2);
+
+    ctxt->setContextProperty("srcImage", QUrl(""));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Null);
+    QTRY_COMPARE(sourceSizeSpy.count(), 3);
+
+    // Remote
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/heart200.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 4);
+
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/heart200.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 4);
+
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/heart200_copy.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 4);
+
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/colors.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 5);
+
+    ctxt->setContextProperty("srcImage", QUrl(""));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Null);
+    QTRY_COMPARE(sourceSizeSpy.count(), 6);
+
+    delete obj;
+}
+
+void tst_qquickborderimage::progressAndStatusChanges()
+{
+    TestHTTPServer server(14449);
+    QVERIFY(server.isValid());
+    server.serveDirectory(dataDirectory());
+
+    QQmlEngine engine;
+    QString componentStr = "import QtQuick 2.0\nBorderImage { source: srcImage }";
+    QQmlContext *ctxt = engine.rootContext();
+    ctxt->setContextProperty("srcImage", testFileUrl("heart200.png"));
+    QQmlComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QQuickBorderImage *obj = qobject_cast<QQuickBorderImage*>(component.create());
+    QVERIFY(obj != 0);
+    QVERIFY(obj->status() == QQuickBorderImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+
+    qRegisterMetaType<QQuickBorderImage::Status>();
+    QSignalSpy sourceSpy(obj, SIGNAL(sourceChanged(const QUrl &)));
+    QSignalSpy progressSpy(obj, SIGNAL(progressChanged(qreal)));
+    QSignalSpy statusSpy(obj, SIGNAL(statusChanged(QQuickImageBase::Status)));
+
+    // Same file
+    ctxt->setContextProperty("srcImage", testFileUrl("heart200.png"));
+    QTRY_VERIFY(obj->status() == QQuickBorderImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 0);
+    QTRY_COMPARE(progressSpy.count(), 0);
+    QTRY_COMPARE(statusSpy.count(), 0);
+
+    // Loading local file
+    ctxt->setContextProperty("srcImage", testFileUrl("colors.png"));
+    QTRY_VERIFY(obj->status() == QQuickBorderImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 1);
+    QTRY_COMPARE(progressSpy.count(), 0);
+    QTRY_COMPARE(statusSpy.count(), 1);
+
+    // Loading remote file
+    ctxt->setContextProperty("srcImage", "http://127.0.0.1:14449/heart200.png");
+    QTRY_VERIFY(obj->status() == QQuickBorderImage::Loading);
+    QTRY_VERIFY(obj->progress() == 0.0);
+    QTRY_VERIFY(obj->status() == QQuickBorderImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 2);
+    QTRY_VERIFY(progressSpy.count() > 1);
+    QTRY_COMPARE(statusSpy.count(), 3);
+
+    ctxt->setContextProperty("srcImage", "");
+    QTRY_VERIFY(obj->status() == QQuickBorderImage::Null);
+    QTRY_VERIFY(obj->progress() == 0.0);
+    QTRY_COMPARE(sourceSpy.count(), 3);
+    QTRY_VERIFY(progressSpy.count() > 2);
+    QTRY_COMPARE(statusSpy.count(), 4);
+
+    delete obj;
+}
+
 QTEST_MAIN(tst_qquickborderimage)
 
 #include "tst_qquickborderimage.moc"
diff --git a/tests/auto/quick/qquickimage/data/heart_copy.png b/tests/auto/quick/qquickimage/data/heart_copy.png
new file mode 100644
index 0000000000000000000000000000000000000000..abe97fee4bbdca9b00962408956013bd2f237736
GIT binary patch
literal 12577
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
E0|#43N&o-=

literal 0
HcmV?d00001

diff --git a/tests/auto/quick/qquickimage/tst_qquickimage.cpp b/tests/auto/quick/qquickimage/tst_qquickimage.cpp
index 5e55793d36..0ff825cea1 100644
--- a/tests/auto/quick/qquickimage/tst_qquickimage.cpp
+++ b/tests/auto/quick/qquickimage/tst_qquickimage.cpp
@@ -55,6 +55,7 @@
 #include <QtTest/QSignalSpy>
 #include <QtGui/QPainter>
 #include <QtGui/QImageReader>
+#include <QQuickCanvas>
 
 #include "../../shared/util.h"
 #include "../../shared/testhttpserver.h"
@@ -75,6 +76,7 @@ public:
     tst_qquickimage();
 
 private slots:
+    void cleanup();
     void noSource();
     void imageSource();
     void imageSource_data();
@@ -98,6 +100,8 @@ private slots:
     void imageCrash_QTBUG_22125();
     void sourceSize_data();
     void sourceSize();
+    void progressAndStatusChanges();
+    void sourceSizeChanges();
 
 private:
     QQmlEngine engine;
@@ -107,6 +111,13 @@ tst_qquickimage::tst_qquickimage()
 {
 }
 
+void tst_qquickimage::cleanup()
+{
+    QQuickCanvas canvas;
+    canvas.releaseResources();
+    engine.clearComponentCache();
+}
+
 void tst_qquickimage::noSource()
 {
     QString componentStr = "import QtQuick 2.0\nImage { source: \"\" }";
@@ -536,7 +547,7 @@ void tst_qquickimage::noLoading()
     QTRY_VERIFY(obj->progress() == 1.0);
     QTRY_COMPARE(sourceSpy.count(), 1);
     QTRY_COMPARE(progressSpy.count(), 0);
-    QTRY_COMPARE(statusSpy.count(), 0);
+    QTRY_COMPARE(statusSpy.count(), 1);
 
     // Loading remote file
     ctxt->setContextProperty("srcImage", QString(SERVER_ADDR) + "/rect.png");
@@ -546,7 +557,7 @@ void tst_qquickimage::noLoading()
     QTRY_VERIFY(obj->progress() == 1.0);
     QTRY_COMPARE(sourceSpy.count(), 2);
     QTRY_COMPARE(progressSpy.count(), 2);
-    QTRY_COMPARE(statusSpy.count(), 2);
+    QTRY_COMPARE(statusSpy.count(), 3);
 
     // Loading remote file again - should not go through 'Loading' state.
     ctxt->setContextProperty("srcImage", testFileUrl("green.png"));
@@ -555,7 +566,7 @@ void tst_qquickimage::noLoading()
     QTRY_VERIFY(obj->progress() == 1.0);
     QTRY_COMPARE(sourceSpy.count(), 4);
     QTRY_COMPARE(progressSpy.count(), 2);
-    QTRY_COMPARE(statusSpy.count(), 2);
+    QTRY_COMPARE(statusSpy.count(), 5);
 
     delete obj;
 }
@@ -741,6 +752,130 @@ void tst_qquickimage::sourceSize()
     delete canvas;
 }
 
+void tst_qquickimage::sourceSizeChanges()
+{
+    TestHTTPServer server(14449);
+    QVERIFY(server.isValid());
+    server.serveDirectory(dataDirectory());
+
+    QQmlEngine engine;
+    QQmlComponent component(&engine);
+    component.setData("import QtQuick 2.0\nImage { source: srcImage }", QUrl::fromLocalFile(""));
+    QTRY_VERIFY(component.isReady());
+    QQmlContext *ctxt = engine.rootContext();
+    ctxt->setContextProperty("srcImage", "");
+    QQuickImage *img = qobject_cast<QQuickImage*>(component.create());
+    QVERIFY(img != 0);
+
+    QSignalSpy sourceSizeSpy(img, SIGNAL(sourceSizeChanged()));
+
+    // Local
+    ctxt->setContextProperty("srcImage", QUrl(""));
+    QTRY_COMPARE(img->status(), QQuickImage::Null);
+    QTRY_COMPARE(sourceSizeSpy.count(), 0);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("heart.png"));
+    QTRY_COMPARE(img->status(), QQuickImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 1);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("heart.png"));
+    QTRY_COMPARE(img->status(), QQuickImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 1);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("heart_copy.png"));
+    QTRY_COMPARE(img->status(), QQuickImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 1);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("colors.png"));
+    QTRY_COMPARE(img->status(), QQuickImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 2);
+
+    ctxt->setContextProperty("srcImage", QUrl(""));
+    QTRY_COMPARE(img->status(), QQuickImage::Null);
+    QTRY_COMPARE(sourceSizeSpy.count(), 3);
+
+    // Remote
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/heart.png"));
+    QTRY_COMPARE(img->status(), QQuickImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 4);
+
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/heart.png"));
+    QTRY_COMPARE(img->status(), QQuickImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 4);
+
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/heart_copy.png"));
+    QTRY_COMPARE(img->status(), QQuickImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 4);
+
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/colors.png"));
+    QTRY_COMPARE(img->status(), QQuickImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 5);
+
+    ctxt->setContextProperty("srcImage", QUrl(""));
+    QTRY_COMPARE(img->status(), QQuickImage::Null);
+    QTRY_COMPARE(sourceSizeSpy.count(), 6);
+
+    delete img;
+}
+
+void tst_qquickimage::progressAndStatusChanges()
+{
+    TestHTTPServer server(14449);
+    QVERIFY(server.isValid());
+    server.serveDirectory(dataDirectory());
+
+    QQmlEngine engine;
+    QString componentStr = "import QtQuick 2.0\nImage { source: srcImage }";
+    QQmlContext *ctxt = engine.rootContext();
+    ctxt->setContextProperty("srcImage", testFileUrl("heart.png"));
+    QQmlComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QQuickImage *obj = qobject_cast<QQuickImage*>(component.create());
+    QVERIFY(obj != 0);
+    QVERIFY(obj->status() == QQuickImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+
+    qRegisterMetaType<QQuickImageBase::Status>();
+    QSignalSpy sourceSpy(obj, SIGNAL(sourceChanged(const QUrl &)));
+    QSignalSpy progressSpy(obj, SIGNAL(progressChanged(qreal)));
+    QSignalSpy statusSpy(obj, SIGNAL(statusChanged(QQuickImageBase::Status)));
+
+    // Same image
+    ctxt->setContextProperty("srcImage", testFileUrl("heart.png"));
+    QTRY_VERIFY(obj->status() == QQuickImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 0);
+    QTRY_COMPARE(progressSpy.count(), 0);
+    QTRY_COMPARE(statusSpy.count(), 0);
+
+    // Loading local file
+    ctxt->setContextProperty("srcImage", testFileUrl("colors.png"));
+    QTRY_VERIFY(obj->status() == QQuickImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 1);
+    QTRY_COMPARE(progressSpy.count(), 0);
+    QTRY_COMPARE(statusSpy.count(), 1);
+
+    // Loading remote file
+    ctxt->setContextProperty("srcImage", "http://127.0.0.1:14449/heart.png");
+    QTRY_VERIFY(obj->status() == QQuickImage::Loading);
+    QTRY_VERIFY(obj->progress() == 0.0);
+    QTRY_VERIFY(obj->status() == QQuickImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 2);
+    QTRY_VERIFY(progressSpy.count() > 1);
+    QTRY_COMPARE(statusSpy.count(), 3);
+
+    ctxt->setContextProperty("srcImage", "");
+    QTRY_VERIFY(obj->status() == QQuickImage::Null);
+    QTRY_VERIFY(obj->progress() == 0.0);
+    QTRY_COMPARE(sourceSpy.count(), 3);
+    QTRY_VERIFY(progressSpy.count() > 2);
+    QTRY_COMPARE(statusSpy.count(), 4);
+
+    delete obj;
+}
+
 QTEST_MAIN(tst_qquickimage)
 
 #include "tst_qquickimage.moc"
-- 
GitLab