diff options
author | V3n3RiX <venerix@redcorelinux.org> | 2019-12-15 18:09:03 +0000 |
---|---|---|
committer | V3n3RiX <venerix@redcorelinux.org> | 2019-12-15 18:09:03 +0000 |
commit | 7bc9c63c9da678a7e6fceb095d56c634afd22c56 (patch) | |
tree | 4a67d50a439e9af63947e5f8b6ba3719af98b6c9 /dev-qt/qtdeclarative/files | |
parent | b284a3168fa91a038925d2ecf5e4791011ea5e7d (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.patch | 112 | ||||
-rw-r--r-- | dev-qt/qtdeclarative/files/qtdeclarative-5.13.2-read-QQmlPropertyMap-correctly.patch | 92 |
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, ¤tObject); ++ } + +- property->readProperty(currentObject, ¤tObject); + 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 |