diff options
author | Gunnar Sletta <gunnar.sletta@jollamobile.com> | 2014-05-15 21:01:06 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-05-19 11:15:08 +0200 |
commit | 851ae1a77dc207ec11b8ed3f0786bfe1c1905e4c (patch) | |
tree | 6576f581a94851366e4481ea6994b610636f5fe0 /tests/auto/qmltest | |
parent | 8f6254a88e4c634203df779aa385d9955e91b56f (diff) |
Fix crash with running animators on re-shown windows.
The non-threaded render loops would clean up the nodes for a window
when it was hidden, but the animators kept running and had a reference
to the deleted nodes. This was not a problem for the threaded render
loop as it would wipe the animator controller as well which would
clean the jobs.
Fix it by triggering a reset of all nodes in the animators when the
window is told to clean up. If an animator is ticked when it doesn't
have a node, it will simply do nothing. When the window is made visible
again, we call initialize on all animators to find the new node.
Task-number: QTBUG-37995
Change-Id: Ie5609d95db29f4b2b30ca5bf641dce901e528389
Reviewed-by: Michael Brasser <michael.brasser@live.com>
Diffstat (limited to 'tests/auto/qmltest')
-rw-r--r-- | tests/auto/qmltest/animators/tst_multiwindow.qml | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/tests/auto/qmltest/animators/tst_multiwindow.qml b/tests/auto/qmltest/animators/tst_multiwindow.qml new file mode 100644 index 0000000000..7f7ca253d3 --- /dev/null +++ b/tests/auto/qmltest/animators/tst_multiwindow.qml @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Jolla Ltd, author: <gunnar.sletta@jollamobile.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.2 +import QtTest 1.0 +import QtQuick.Window 2.0 + +Item { + id: root; + width: 200 + height: 200 + + TestCase { + id: testCase + name: "animators-mixed" + when: countdown == 0 + function test_endresult() { + verify(true, "Just making sure we didn't crash"); + } + } + + property int countdown: 5; + + Window { + id: window + + width: 100 + height: 100 + + ShaderEffect { + width: 50 + height: 50 + + property real t; + UniformAnimator on t { from: 0; to: 1; duration: 1000; loops: Animation.Infinite } + RotationAnimator on rotation { from: 0; to: 360; duration: 1000; loops: Animation.Infinite } + ScaleAnimator on scale { from: 0.5; to: 1.5; duration: 1000; loops: Animation.Infinite } + XAnimator on x { from: 0; to: 50; duration: 1000; loops: Animation.Infinite } + YAnimator on y { from: 0; to: 50; duration: 1000; loops: Animation.Infinite } + OpacityAnimator on opacity { from: 1; to: 0.5; duration: 1000; loops: Animation.Infinite } + + fragmentShader: " + uniform lowp float t; + uniform lowp float qt_Opacity; + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = vec4(qt_TexCoord0, t, 1) * qt_Opacity; + } + " + } + + visible: true + } + + Timer { + interval: 250 + running: true + repeat: true + onTriggered: { + if (window.visible) + --countdown + window.visible = !window.visible; + } + } +} |