aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp
diff options
context:
space:
mode:
authorDaniel d'Andrada <daniel.dandrada@canonical.com>2016-06-08 14:42:03 -0300
committerAlbert Astals Cid <albert.astals@canonical.com>2016-06-21 14:31:09 +0000
commitb61c774ce58d15bfc26a2a75b55e3f5eefbcdcc2 (patch)
tree9e3afb29dc2e7d0c3e0eb8cf35ce2dd20f7d7183 /tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp
parent5511ed66e654dbd0ce3c03c7bf22b201494bb82f (diff)
QQuickSpriteEngine: avoid entering infinite loop in assembledImage()
Do not allow a frame size larger than the image size, otherwise we would never leave "while (framesLeft > 0) {...}" as framesLeft is never decremented because "copied/frameWidth" in the expression "framesLeft -= copied/frameWidth;" always resolves to zero because copied < frameWidth. Task-number: QTBUG-53937 Change-Id: Ia777ec65d72562426b13533918efcaca5bcabdd7 Reviewed-by: Albert Astals Cid <albert.astals@canonical.com> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp')
-rw-r--r--tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp b/tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp
index 3cb7ff511f..b34ac63b83 100644
--- a/tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp
+++ b/tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp
@@ -40,6 +40,7 @@
#include <QtGui/qopenglcontext.h>
#include <QtGui/qopenglfunctions.h>
#include <QtGui/qoffscreensurface.h>
+#include <QtQml/qqmlproperty.h>
class tst_qquickanimatedsprite : public QQmlDataTest
{
@@ -55,6 +56,7 @@ private slots:
void test_largeAnimation_data();
void test_largeAnimation();
void test_reparenting();
+ void test_changeSourceToSmallerImgKeepingBigFrameSize();
};
void tst_qquickanimatedsprite::initTestCase()
@@ -291,6 +293,43 @@ void tst_qquickanimatedsprite::test_reparenting()
QTRY_COMPARE(QQuickItemPrivate::get(sprite)->polishScheduled, false);
}
+class KillerThread : public QThread
+{
+ Q_OBJECT
+protected:
+ void run() Q_DECL_OVERRIDE {
+ sleep(3);
+ qFatal("Either the GUI or the render thread is stuck in an infinite loop.");
+ }
+};
+
+// Regression test for QTBUG-53937
+void tst_qquickanimatedsprite::test_changeSourceToSmallerImgKeepingBigFrameSize()
+{
+ QQuickView window;
+ window.setSource(testFileUrl("sourceSwitch.qml"));
+ window.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&window));
+
+ QVERIFY(window.rootObject());
+ QQuickAnimatedSprite* sprite = qobject_cast<QQuickAnimatedSprite*>(window.rootObject());
+ QVERIFY(sprite);
+
+ QQmlProperty big(sprite, "big");
+ big.write(QVariant::fromValue(false));
+
+ KillerThread *killer = new KillerThread;
+ killer->start(); // will kill us in case the GUI or render thread enters an infinite loop
+
+ QTest::qWait(50); // let it draw with the new source.
+
+ // If we reach this point it's because we didn't hit QTBUG-53937
+
+ killer->terminate();
+ killer->wait();
+ delete killer;
+}
+
QTEST_MAIN(tst_qquickanimatedsprite)
#include "tst_qquickanimatedsprite.moc"