summaryrefslogtreecommitdiff
path: root/dev-qt/qtdeclarative/files
diff options
context:
space:
mode:
authorV3n3RiX <venerix@redcorelinux.org>2019-12-15 18:09:03 +0000
committerV3n3RiX <venerix@redcorelinux.org>2019-12-15 18:09:03 +0000
commit7bc9c63c9da678a7e6fceb095d56c634afd22c56 (patch)
tree4a67d50a439e9af63947e5f8b6ba3719af98b6c9 /dev-qt/qtdeclarative/files
parentb284a3168fa91a038925d2ecf5e4791011ea5e7d (diff)
gentoo resync : 15.12.2019
Diffstat (limited to 'dev-qt/qtdeclarative/files')
-rw-r--r--dev-qt/qtdeclarative/files/qtdeclarative-5.13.2-fix-deadlock-on-exit.patch112
-rw-r--r--dev-qt/qtdeclarative/files/qtdeclarative-5.13.2-read-QQmlPropertyMap-correctly.patch92
2 files changed, 204 insertions, 0 deletions
diff --git a/dev-qt/qtdeclarative/files/qtdeclarative-5.13.2-fix-deadlock-on-exit.patch b/dev-qt/qtdeclarative/files/qtdeclarative-5.13.2-fix-deadlock-on-exit.patch
new file mode 100644
index 000000000000..09c4ad831c54
--- /dev/null
+++ b/dev-qt/qtdeclarative/files/qtdeclarative-5.13.2-fix-deadlock-on-exit.patch
@@ -0,0 +1,112 @@
+From 73ad6e87bbeceea5830ab3a6b3dc66fa99e30f45 Mon Sep 17 00:00:00 2001
+From: Fabian Kosmale <fabian.kosmale@qt.io>
+Date: Mon, 28 Oct 2019 13:41:11 +0100
+Subject: [PATCH] QQuickItem::setParentItem: add child earlier
+
+Calling (de)refWindow can trigger QQuickItem::windowChanged, which in turn
+can call a user defined windowChanged handler. If that signal handler
+were to call setParentItem, we would encounter an inconsistent state:
+The item already has its parent set, but that parent would lack the item
+in its children list (as we would only call refWindow at a later point).
+
+Fixes: QTBUG-79573
+Fixes: QTBUG-73439
+Change-Id: I46adaa54a0521b5cd7f37810b3dd1a206e6a09c6
+Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
+---
+ src/quick/items/qquickitem.cpp | 21 +++++++++++++++++----
+ .../qquickitem/data/setParentInWindowChange.qml | 12 ++++++++++++
+ tests/auto/quick/qquickitem/tst_qquickitem.cpp | 8 ++++++++
+ 3 files changed, 37 insertions(+), 4 deletions(-)
+ create mode 100644 tests/auto/quick/qquickitem/data/setParentInWindowChange.qml
+
+diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp
+index 396012e1e67..26f02aeed7f 100644
+--- a/src/quick/items/qquickitem.cpp
++++ b/src/quick/items/qquickitem.cpp
+@@ -2748,22 +2748,35 @@ void QQuickItem::setParentItem(QQuickItem *parentItem)
+ }
+
+ QQuickWindow *parentWindow = parentItem ? QQuickItemPrivate::get(parentItem)->window : nullptr;
++ bool alreadyAddedChild = false;
+ if (d->window == parentWindow) {
+ // Avoid freeing and reallocating resources if the window stays the same.
+ d->parentItem = parentItem;
+ } else {
+- if (d->window)
+- d->derefWindow();
++ auto oldParentItem = d->parentItem;
+ d->parentItem = parentItem;
++ if (d->parentItem) {
++ QQuickItemPrivate::get(d->parentItem)->addChild(this);
++ alreadyAddedChild = true;
++ }
++ if (d->window) {
++ d->derefWindow();
++ // as we potentially changed d->parentWindow above
++ // the check in derefWindow could not work
++ // thus, we redo it here with the old parent
++ if (!oldParentItem) {
++ QQuickWindowPrivate::get(d->window)->parentlessItems.remove(this);
++ }
++ }
+ if (parentWindow)
+ d->refWindow(parentWindow);
+ }
+
+ d->dirty(QQuickItemPrivate::ParentChanged);
+
+- if (d->parentItem)
++ if (d->parentItem && !alreadyAddedChild)
+ QQuickItemPrivate::get(d->parentItem)->addChild(this);
+- else if (d->window)
++ else if (d->window && !alreadyAddedChild)
+ QQuickWindowPrivate::get(d->window)->parentlessItems.insert(this);
+
+ d->setEffectiveVisibleRecur(d->calcEffectiveVisible());
+diff --git a/tests/auto/quick/qquickitem/data/setParentInWindowChange.qml b/tests/auto/quick/qquickitem/data/setParentInWindowChange.qml
+new file mode 100644
+index 00000000000..d68b7adb72a
+--- /dev/null
++++ b/tests/auto/quick/qquickitem/data/setParentInWindowChange.qml
+@@ -0,0 +1,12 @@
++import QtQuick 2.12
++
++Rectangle {
++ width: 800
++ height: 600
++ Item {
++ id: it
++ onWindowChanged: () => it.parent = newParent
++ }
++
++ Item { id: newParent }
++}
+diff --git a/tests/auto/quick/qquickitem/tst_qquickitem.cpp b/tests/auto/quick/qquickitem/tst_qquickitem.cpp
+index 7e132f97b67..9ce9766c925 100644
+--- a/tests/auto/quick/qquickitem/tst_qquickitem.cpp
++++ b/tests/auto/quick/qquickitem/tst_qquickitem.cpp
+@@ -197,6 +197,8 @@ private slots:
+ void qtBug60123();
+ #endif
+
++ void setParentCalledInOnWindowChanged();
++
+ private:
+
+ enum PaintOrderOp {
+@@ -2145,6 +2147,12 @@ void tst_qquickitem::qtBug60123()
+ activateWindowAndTestPress(&window);
+ }
+ #endif
++void tst_qquickitem::setParentCalledInOnWindowChanged()
++{
++ QQuickView view;
++ view.setSource(testFileUrl("setParentInWindowChange.qml"));
++ QVERIFY(ensureFocus(&view)); // should not crash
++}
+
+ QTEST_MAIN(tst_qquickitem)
+
+--
+2.16.3
diff --git a/dev-qt/qtdeclarative/files/qtdeclarative-5.13.2-read-QQmlPropertyMap-correctly.patch b/dev-qt/qtdeclarative/files/qtdeclarative-5.13.2-read-QQmlPropertyMap-correctly.patch
new file mode 100644
index 000000000000..63f4235c9e7c
--- /dev/null
+++ b/dev-qt/qtdeclarative/files/qtdeclarative-5.13.2-read-QQmlPropertyMap-correctly.patch
@@ -0,0 +1,92 @@
+From bcbc3c9cec1f7d7bb8c9d5f5ea94eb5c81ec2853 Mon Sep 17 00:00:00 2001
+From: Fabian Kosmale <fabian.kosmale@qt.io>
+Date: Wed, 30 Oct 2019 10:15:23 +0100
+Subject: [PATCH] QQmlProperty: handle reads of QQmlPropertyMap correctly
+
+Fixes: QTBUG-79614
+Change-Id: Iaf84c0178dc88072a367da2b42b09554b85c7d57
+Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
+---
+ src/qml/qml/qqmlproperty.cpp | 12 +++++++++---
+ tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp | 21 +++++++++++++++++++++
+ 2 files changed, 30 insertions(+), 3 deletions(-)
+
+diff --git a/src/qml/qml/qqmlproperty.cpp b/src/qml/qml/qqmlproperty.cpp
+index c8166695bad..a394ed1ad9a 100644
+--- a/src/qml/qml/qqmlproperty.cpp
++++ b/src/qml/qml/qqmlproperty.cpp
+@@ -63,6 +63,7 @@
+ #include <private/qqmlvaluetypewrapper_p.h>
+ #include <QtCore/qdebug.h>
+ #include <cmath>
++#include <QtQml/QQmlPropertyMap>
+
+ Q_DECLARE_METATYPE(QList<int>)
+ Q_DECLARE_METATYPE(QList<qreal>)
+@@ -331,10 +332,15 @@ void QQmlPropertyPrivate::initProperty(QObject *obj, const QString &name)
+
+ return;
+ } else {
+- if (!property->isQObject())
+- return; // Not an object property
++ if (!property->isQObject()) {
++ if (auto asPropertyMap = qobject_cast<QQmlPropertyMap*>(currentObject))
++ currentObject = asPropertyMap->value(path.at(ii).toString()).value<QObject*>();
++ else
++ return; // Not an object property, and not a property map
++ } else {
++ property->readProperty(currentObject, &currentObject);
++ }
+
+- property->readProperty(currentObject, &currentObject);
+ if (!currentObject) return; // No value
+
+ }
+diff --git a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp
+index 27e06c6f674..ed213cd01aa 100644
+--- a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp
++++ b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp
+@@ -37,6 +37,7 @@
+ #include <QtCore/qdir.h>
+ #include <QtCore/private/qobject_p.h>
+ #include "../../shared/util.h"
++#include <QtQml/QQmlPropertyMap>
+
+ #include <QDebug>
+ class MyQmlObject : public QObject
+@@ -149,6 +150,8 @@ private slots:
+ void floatToStringPrecision();
+
+ void copy();
++
++ void nestedQQmlPropertyMap();
+ private:
+ QQmlEngine engine;
+ };
+@@ -2106,6 +2109,24 @@ void tst_qqmlproperty::initTestCase()
+ qmlRegisterType<MyContainer>("Test",1,0,"MyContainer");
+ }
+
++void tst_qqmlproperty::nestedQQmlPropertyMap()
++{
++ QQmlPropertyMap mainPropertyMap;
++ QQmlPropertyMap nestedPropertyMap;
++ QQmlPropertyMap deeplyNestedPropertyMap;
++
++ mainPropertyMap.insert("nesting1", QVariant::fromValue(&nestedPropertyMap));
++ nestedPropertyMap.insert("value", 42);
++ nestedPropertyMap.insert("nesting2", QVariant::fromValue(&deeplyNestedPropertyMap));
++ deeplyNestedPropertyMap.insert("value", "success");
++
++ QQmlProperty value{&mainPropertyMap, "nesting1.value"};
++ QCOMPARE(value.read().toInt(), 42);
++
++ QQmlProperty success{&mainPropertyMap, "nesting1.nesting2.value"};
++ QCOMPARE(success.read().toString(), QLatin1String("success"));
++}
++
+ QTEST_MAIN(tst_qqmlproperty)
+
+ #include "tst_qqmlproperty.moc"
+--
+2.16.3