142 lines
5.9 KiB
Diff
142 lines
5.9 KiB
Diff
From cc1b9e7d4aac93d0767e83431be5a5aebcdffb59 Mon Sep 17 00:00:00 2001
|
|
From: Fabian Kosmale <fabian.kosmale@qt.io>
|
|
Date: Tue, 29 Mar 2022 10:44:04 +0200
|
|
Subject: [PATCH 21/26] Quick Animations: Fix crash
|
|
|
|
SwipeDelegate causes the running animation job to be deleted when
|
|
calling swipe.close in swipe.completed. Employ the RETURN_IF_DELETED
|
|
check in more places to avoid crashes.
|
|
|
|
Fixes: QTBUG-100560
|
|
Task-number: QTBUG-103223
|
|
Pick-to: 6.3 6.2 5.15
|
|
Change-Id: I276eeaa9aed1bdb36449b322a24641fa02c4d5e4
|
|
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
|
(cherry picked from commit 0238af0bd48b831d72126f2228d5913eccf67bae)
|
|
|
|
* asturmlechner 2023-04-09: Resolve conflict with dev branch commit
|
|
4938984f9a779192264757a06e6ca555fc8f5e91
|
|
---
|
|
.../qcontinuinganimationgroupjob.cpp | 4 +-
|
|
.../animations/qparallelanimationgroupjob.cpp | 4 +-
|
|
.../swipedelegate/CloseOnCompletedWorks.qml | 74 +++++++++++++++++++
|
|
3 files changed, 78 insertions(+), 4 deletions(-)
|
|
create mode 100644 tests/manual/quickcontrols2/swipedelegate/CloseOnCompletedWorks.qml
|
|
|
|
diff --git a/src/qml/animations/qcontinuinganimationgroupjob.cpp b/src/qml/animations/qcontinuinganimationgroupjob.cpp
|
|
index 88c0e9e60e..61a9dc36f8 100644
|
|
--- a/src/qml/animations/qcontinuinganimationgroupjob.cpp
|
|
+++ b/src/qml/animations/qcontinuinganimationgroupjob.cpp
|
|
@@ -82,9 +82,9 @@ void QContinuingAnimationGroupJob::updateState(QAbstractAnimationJob::State newS
|
|
return;
|
|
}
|
|
for (QAbstractAnimationJob *animation = firstChild(); animation; animation = animation->nextSibling()) {
|
|
- resetUncontrolledAnimationFinishTime(animation);
|
|
+ RETURN_IF_DELETED(resetUncontrolledAnimationFinishTime(animation));
|
|
animation->setDirection(m_direction);
|
|
- animation->start();
|
|
+ RETURN_IF_DELETED(animation->start());
|
|
}
|
|
break;
|
|
}
|
|
diff --git a/src/qml/animations/qparallelanimationgroupjob.cpp b/src/qml/animations/qparallelanimationgroupjob.cpp
|
|
index 420a934ba2..a828d0e234 100644
|
|
--- a/src/qml/animations/qparallelanimationgroupjob.cpp
|
|
+++ b/src/qml/animations/qparallelanimationgroupjob.cpp
|
|
@@ -144,10 +144,10 @@ void QParallelAnimationGroupJob::updateState(QAbstractAnimationJob::State newSta
|
|
animation->stop();
|
|
m_previousLoop = m_direction == Forward ? 0 : m_loopCount - 1;
|
|
}
|
|
- resetUncontrolledAnimationFinishTime(animation);
|
|
+ RETURN_IF_DELETED(resetUncontrolledAnimationFinishTime(animation));
|
|
animation->setDirection(m_direction);
|
|
if (shouldAnimationStart(animation, oldState == Stopped))
|
|
- animation->start();
|
|
+ RETURN_IF_DELETED(animation->start());
|
|
}
|
|
break;
|
|
}
|
|
diff --git a/tests/manual/quickcontrols2/swipedelegate/CloseOnCompletedWorks.qml b/tests/manual/quickcontrols2/swipedelegate/CloseOnCompletedWorks.qml
|
|
new file mode 100644
|
|
index 0000000000..38dfde41c3
|
|
--- /dev/null
|
|
+++ b/tests/manual/quickcontrols2/swipedelegate/CloseOnCompletedWorks.qml
|
|
@@ -0,0 +1,74 @@
|
|
+/****************************************************************************
|
|
+**
|
|
+** Copyright (C) 2022 The Qt Company Ltd.
|
|
+** Contact: https://www.qt.io/licensing/
|
|
+**
|
|
+** This file is part of the test suite of the Qt Toolkit.
|
|
+**
|
|
+** $QT_BEGIN_LICENSE:BSD$
|
|
+** 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 The Qt Company. For licensing terms
|
|
+** and conditions see https://www.qt.io/terms-conditions. For further
|
|
+** information use the contact form at https://www.qt.io/contact-us.
|
|
+**
|
|
+** BSD License Usage
|
|
+** Alternatively, you may use this file under the terms of the BSD license
|
|
+** as follows:
|
|
+**
|
|
+** "Redistribution and use in source and binary forms, with or without
|
|
+** modification, are permitted provided that the following conditions are
|
|
+** met:
|
|
+** * Redistributions of source code must retain the above copyright
|
|
+** notice, this list of conditions and the following disclaimer.
|
|
+** * Redistributions in binary form must reproduce the above copyright
|
|
+** notice, this list of conditions and the following disclaimer in
|
|
+** the documentation and/or other materials provided with the
|
|
+** distribution.
|
|
+** * Neither the name of The Qt Company Ltd nor the names of its
|
|
+** contributors may be used to endorse or promote products derived
|
|
+** from this software without specific prior written permission.
|
|
+**
|
|
+**
|
|
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
|
+**
|
|
+** $QT_END_LICENSE$
|
|
+**
|
|
+****************************************************************************/
|
|
+
|
|
+import QtQuick 2
|
|
+import QtQuick.Controls 2
|
|
+ApplicationWindow {
|
|
+ visible: true
|
|
+ width: 640
|
|
+ height: 480
|
|
+
|
|
+ ListView {
|
|
+ anchors.fill: parent
|
|
+ model: 2
|
|
+
|
|
+ delegate: SwipeDelegate {
|
|
+ text: "Swipe me left (should not crash)"
|
|
+
|
|
+ swipe.right: Label {
|
|
+ text: "Release (should not crash)"
|
|
+ }
|
|
+
|
|
+ swipe.onCompleted: {
|
|
+ swipe.close()
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+}
|
|
--
|
|
2.40.1
|
|
|