summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2016-05-16 18:47:54 +0100
committerSean Harmer <sean.harmer@kdab.com>2016-05-20 18:18:12 +0000
commit701764ed4835d6ca9fd7c06f0ae824bea9bfde51 (patch)
tree6e4d551ebad7c866abcaabcb4959f88545108e49
parent244a650a7f577db45ef4a339fe8858577883b04f (diff)
Avoid crash in QML app shutdown and actually send events in C++ app
The logic was such that in a C++ application the QNode::setParent() function would bail out early in a C++ application when called from the destructor of its parent object. This is because by the time the child is being deleted the parent is in QObjectPrivate::deleteChildren and therefore the QNode part of the object has already been destroyed. This led to the cast in the parentNode() == parent to fail, thereby exiting the functio early and never getting into QNodePrivate::_q_setParentHelper(). In the case of a QML application, the parent has a dynamic metaobject set by the QML engine. This resulted in the cast in QNode::setParent() succeeding and we called into _q_setParentHelper(). The logic in here resulted in a crash when called from a destructor because the child had already been removed from its parent's list of children. Thus when we called QObjectPrivate::setParentHelper(), this function ended up with an index of -1 for the child in its child list (i.e. not found) and it then tried to index into the children list with this index and we then crashed. The solution in this change is to not do the full logic in QNode::setParent() and _q_setParentHelper(). Rather, we simply remove the subtree at this node from the scene and we send node destruction changes to the backend. With this we avoid the crash of QML application shutdowns and we also make sure to correctly send the node destruction changes even in the case of a C++ Qt 3D application. The backend does not yet get an opportunity to process these final changes. This will be addressed in a follow up commit. As a result of these changes many unit tests began crashing. This is because the QNode dtor is now actually doing some work, rather than bailing out of that work early when the parent is no longer a QNode. This work involves mutating the QScene object which in the unit tests did not live longer than the QNode's to which it was associated with. The unit tests have been adjusted to ensure that the arbiter and scene objects remain alive longer than the QNodes they are being used to test. Task-number: QTBUG-42353 Change-Id: I197870f48fca30656bd85c4c51346d93403fba08 Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com>
-rw-r--r--src/core/nodes/qnode.cpp70
-rw-r--r--src/core/nodes/qnode_p.h2
-rw-r--r--tests/auto/core/nodes/tst_nodes.cpp132
-rw-r--r--tests/auto/core/qtransform/tst_qtransform.cpp3
-rw-r--r--tests/auto/input/qabstractaxisinput/tst_qabstractaxisinput.cpp3
-rw-r--r--tests/auto/input/qaction/tst_qaction.cpp3
-rw-r--r--tests/auto/input/qactioninput/tst_qactioninput.cpp3
-rw-r--r--tests/auto/input/qanalogaxisinput/tst_qanalogaxisinput.cpp3
-rw-r--r--tests/auto/input/qaxis/tst_qaxis.cpp3
-rw-r--r--tests/auto/input/qbuttonaxisinput/tst_qbuttonaxisinput.cpp3
-rw-r--r--tests/auto/input/qlogicaldevice/tst_qlogicaldevice.cpp3
-rw-r--r--tests/auto/render/commons/testpostmanarbiter.cpp11
-rw-r--r--tests/auto/render/commons/testpostmanarbiter.h8
-rw-r--r--tests/auto/render/qabstractlight/tst_qabstractlight.cpp66
-rw-r--r--tests/auto/render/qattribute/tst_qattribute.cpp3
-rw-r--r--tests/auto/render/qbuffer/tst_qbuffer.cpp3
-rw-r--r--tests/auto/render/qcameraselector/tst_qcameraselector.cpp3
-rw-r--r--tests/auto/render/qclearbuffers/tst_qclearbuffers.cpp3
-rw-r--r--tests/auto/render/qframegraphnode/tst_qframegraphnode.cpp3
-rw-r--r--tests/auto/render/qgeometry/tst_qgeometry.cpp3
-rw-r--r--tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp3
-rw-r--r--tests/auto/render/qlayerfilter/tst_qlayerfilter.cpp3
-rw-r--r--tests/auto/render/qmaterial/tst_qmaterial.cpp12
-rw-r--r--tests/auto/render/qobjectpicker/tst_qobjectpicker.cpp3
-rw-r--r--tests/auto/render/qrenderpassfilter/tst_qrenderpassfilter.cpp3
-rw-r--r--tests/auto/render/qrenderstateset/tst_qrenderstateset.cpp3
-rw-r--r--tests/auto/render/qrendertargetselector/tst_qrendertargetselector.cpp3
-rw-r--r--tests/auto/render/qsortpolicy/tst_qsortpolicy.cpp3
-rw-r--r--tests/auto/render/qtechniquefilter/tst_qtechniquefilter.cpp3
-rw-r--r--tests/auto/render/qviewport/tst_qviewport.cpp3
-rw-r--r--tests/auto/render/renderviewutils/tst_renderviewutils.cpp3
31 files changed, 232 insertions, 141 deletions
diff --git a/src/core/nodes/qnode.cpp b/src/core/nodes/qnode.cpp
index e56d4bd81..6f19e7217 100644
--- a/src/core/nodes/qnode.cpp
+++ b/src/core/nodes/qnode.cpp
@@ -91,6 +91,7 @@ void QNodePrivate::init(QNode *parent)
// in a deferred way when the object is fully constructed. This is delayed
// until the object is fully constructed as it involves calling a virtual
// function of QNode.
+ m_parentId = parent->id();
const auto parentPrivate = get(parent);
m_scene = parentPrivate->m_scene;
Q_Q(QNode);
@@ -119,6 +120,43 @@ void QNodePrivate::notifyCreationChange()
/*!
* \internal
*
+ * Notify the backend that the parent lost this node as a child and
+ * that this node is being destroyed. We only send the node removed
+ * change for the parent's children property iff we have an id for
+ * a parent node. This is set/unset in the _q_addChild()/_q_removeChild()
+ * functions (and initialized in init() if there is a parent at
+ * construction time).
+ *
+ * Likewise, we only send the node destroyed change, iff we have
+ * previously sent a node created change. This is tracked via the
+ * m_hasBackendNode member.
+ */
+void QNodePrivate::notifyDestructionChangesAndRemoveFromScene()
+{
+ Q_Q(QNode);
+
+// // We notify the backend that the parent lost us as a child
+ if (m_changeArbiter != nullptr && !m_parentId.isNull()) {
+ const auto change = QPropertyNodeRemovedChangePtr::create(m_parentId, q);
+ change->setPropertyName("children");
+ notifyObservers(change);
+ }
+
+ // Tell the backend we are about to be destroyed
+ if (m_hasBackendNode) {
+ const QDestructionIdAndTypeCollector collector(q);
+ const auto destroyedChange = QNodeDestroyedChangePtr::create(q, collector.subtreeIdsAndTypes());
+ notifyObservers(destroyedChange);
+ }
+
+ // We unset the scene from the node as its backend node was/is about to be destroyed
+ QNodeVisitor visitor;
+ visitor.traverse(q, this, &QNodePrivate::unsetSceneHelper);
+}
+
+/*!
+ * \internal
+ *
* Sends a QNodeCreatedChange event to the aspects and then also notifies the
* parent backend node of its new child. This is called in a deferred manner
* by the QNodePrivate::init() method to notify the backend of newly created
@@ -152,6 +190,14 @@ void QNodePrivate::_q_addChild(QNode *childNode)
Q_ASSERT(childNode);
Q_ASSERT_X(childNode->parent() == q_func(), Q_FUNC_INFO, "not a child of this node");
+ // Store our id as the parentId in the child so that even if the child gets
+ // removed from the scene as part of the destruction of the parent, when the
+ // parent's children are deleted in the QObject dtor, we still have access to
+ // the parentId. If we didn't store this, we wouldn't have access at that time
+ // because the parent woudl then only be a QObject, the QNode part would have
+ // been destroyed already.
+ QNodePrivate::get(childNode)->m_parentId = m_id;
+
if (!m_scene)
return;
@@ -180,6 +226,8 @@ void QNodePrivate::_q_removeChild(QNode *childNode)
Q_ASSERT(childNode);
Q_ASSERT_X(childNode->parent() == q_func(), Q_FUNC_INFO, "not a child of this node");
+ QNodePrivate::get(childNode)->m_parentId = QNodeId();
+
// We notify the backend that we lost a child
if (m_changeArbiter != nullptr) {
const auto change = QPropertyNodeRemovedChangePtr::create(m_id, childNode);
@@ -220,18 +268,8 @@ void QNodePrivate::_q_setParentHelper(QNode *parent)
// If we have an old parent but the new parent is null
// the backend node needs to be destroyed
- if (!parent) {
- // Tell the backend we are about to be destroyed
- if (m_hasBackendNode) {
- const QDestructionIdAndTypeCollector collector(q);
- const auto destroyedChange = QNodeDestroyedChangePtr::create(q, collector.subtreeIdsAndTypes());
- notifyObservers(destroyedChange);
- }
-
- // We unset the scene from the node as its backend node was/is about to be destroyed
- QNodeVisitor visitor;
- visitor.traverse(q, oldParentNode->d_func(), &QNodePrivate::unsetSceneHelper);
- }
+ if (!parent)
+ notifyDestructionChangesAndRemoveFromScene();
}
// Basically QObject::setParent but for QObjectPrivate
@@ -586,10 +624,10 @@ QNode::QNode(QNodePrivate &dd, QNode *parent)
QNode::~QNode()
{
- // If we have a parent it makes sense to let it know we are about to be destroyed.
- // This in turn triggers the deletion of the corresponding backend nodes for the
- // subtree rooted at this QNode.
- setParent(Q_NODE_NULLPTR);
+ // Notify the backend that the parent lost this node as a child and
+ // that this node is being destroyed.
+ Q_D(QNode);
+ d->notifyDestructionChangesAndRemoveFromScene();
}
/*!
diff --git a/src/core/nodes/qnode_p.h b/src/core/nodes/qnode_p.h
index 648bc4c34..e290ffe32 100644
--- a/src/core/nodes/qnode_p.h
+++ b/src/core/nodes/qnode_p.h
@@ -92,6 +92,7 @@ public:
QMetaObject *m_typeInfo;
QScene *m_scene;
mutable QNodeId m_id;
+ QNodeId m_parentId; // Store this so we have it even in parent's QObject dtor
bool m_blockNotifications;
bool m_hasBackendNode;
bool m_enabled;
@@ -101,6 +102,7 @@ public:
private:
void notifyCreationChange();
+ void notifyDestructionChangesAndRemoveFromScene();
void _q_notifyCreationAndChildChanges();
void _q_addChild(QNode *childNode);
void _q_removeChild(QNode *childNode);
diff --git a/tests/auto/core/nodes/tst_nodes.cpp b/tests/auto/core/nodes/tst_nodes.cpp
index a75236386..695a93640 100644
--- a/tests/auto/core/nodes/tst_nodes.cpp
+++ b/tests/auto/core/nodes/tst_nodes.cpp
@@ -113,17 +113,14 @@ public:
bool wasLocked() const { return second; }
};
- ObserverSpy(Qt3DCore::QNode *node)
+ ObserverSpy()
: Qt3DCore::QAbstractArbiter()
- , m_node(node)
, m_postman(new SimplePostman(this))
{
- Qt3DCore::QNodePrivate::get(node)->setArbiter(this);
}
~ObserverSpy()
{
- Qt3DCore::QNodePrivate::get(m_node)->setArbiter(nullptr);
}
void sceneChangeEventWithLock(const Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE
@@ -149,7 +146,6 @@ public:
}
QList<ChangeRecord> events;
- Qt3DCore::QNode *m_node;
QScopedPointer<SimplePostman> m_postman;
};
@@ -165,12 +161,10 @@ class MyQNode : public Qt3DCore::QNode
public:
explicit MyQNode(Qt3DCore::QNode *parent = 0)
: QNode(parent)
- , m_scene(nullptr)
{}
~MyQNode()
{
- delete m_scene;
}
void setCustomProperty(const QString &s)
@@ -187,14 +181,14 @@ public:
return m_customProperty;
}
- void assignScene(Qt3DCore::QAbstractArbiter *arbiter)
+ void setArbiterAndScene(Qt3DCore::QAbstractArbiter *arbiter,
+ Qt3DCore::QScene *scene = nullptr)
{
- if (!m_scene) {
- m_scene = new Qt3DCore::QScene();
- if (arbiter)
- m_scene->setArbiter(arbiter);
- }
- Qt3DCore::QNodePrivate::get(this)->setScene(m_scene);
+ Q_ASSERT(arbiter);
+ if (scene)
+ scene->setArbiter(arbiter);
+ Qt3DCore::QNodePrivate::get(this)->setScene(scene);
+ Qt3DCore::QNodePrivate::get(this)->setArbiter(arbiter);
}
signals:
@@ -202,7 +196,29 @@ signals:
protected:
QString m_customProperty;
- Qt3DCore::QScene *m_scene;
+};
+
+class MyQEntity : public Qt3DCore::QEntity
+{
+ Q_OBJECT
+public:
+ explicit MyQEntity(Qt3DCore::QNode *parent = 0)
+ : QEntity(parent)
+ {}
+
+ ~MyQEntity()
+ {
+ }
+
+ void setArbiterAndScene(Qt3DCore::QAbstractArbiter *arbiter,
+ Qt3DCore::QScene *scene = nullptr)
+ {
+ Q_ASSERT(arbiter);
+ if (scene)
+ scene->setArbiter(arbiter);
+ Qt3DCore::QNodePrivate::get(this)->setScene(scene);
+ Qt3DCore::QNodePrivate::get(this)->setArbiter(arbiter);
+ }
};
class MyQComponent : public Qt3DCore::QComponent
@@ -262,8 +278,9 @@ void tst_Nodes::appendSingleChildNodeToNodeNoSceneExplicitParenting()
{
// Check nodes added when no scene is set
// GIVEN
+ ObserverSpy spy;
QScopedPointer<MyQNode> node(new MyQNode());
- ObserverSpy spy(node.data());
+ node->setArbiterAndScene(&spy);
// THEN
QVERIFY(Qt3DCore::QNodePrivate::get(node.data())->scene() == nullptr);
@@ -289,8 +306,9 @@ void tst_Nodes::appendSingleChildNodeToNodeNoSceneImplicitParenting()
{
// Check nodes added when no scene is set
// GIVEN
+ ObserverSpy spy;
QScopedPointer<MyQNode> node(new MyQNode());
- ObserverSpy spy(node.data());
+ node->setArbiterAndScene(&spy);
// THEN
QVERIFY(Qt3DCore::QNodePrivate::get(node.data())->scene() == nullptr);
@@ -311,8 +329,9 @@ void tst_Nodes::appendMultipleChildNodesToNodeNoScene()
{
// Check multiple nodes added with no scene set
// GIVEN
+ ObserverSpy spy;
QScopedPointer<MyQNode> node(new MyQNode());
- ObserverSpy spy(node.data());
+ node->setArbiterAndScene(&spy);
// THEN
QVERIFY(Qt3DCore::QNodePrivate::get(node.data())->scene() == nullptr);
@@ -342,10 +361,11 @@ void tst_Nodes::appendSingleChildNodeToNodeSceneExplicitParenting()
{
// Check nodes added when scene is set
// GIVEN
+ Qt3DCore::QScene scene;
+ ObserverSpy spy;
QScopedPointer<MyQNode> node(new MyQNode());
- ObserverSpy spy(node.data());
// WHEN
- node->assignScene(&spy);
+ node->setArbiterAndScene(&spy, &scene);
// THEN
QVERIFY(Qt3DCore::QNodePrivate::get(node.data())->scene() != nullptr);
@@ -388,11 +408,12 @@ void tst_Nodes::appendSingleChildNodeToNodeSceneImplicitParenting()
{
// Check nodes added when scene is set
// GIVEN
+ Qt3DCore::QScene scene;
+ ObserverSpy spy;
QScopedPointer<MyQNode> node(new MyQNode());
- ObserverSpy spy(node.data());
// WHEN
- node->assignScene(&spy);
+ node->setArbiterAndScene(&spy, &scene);
// THEN
QVERIFY(Qt3DCore::QNodePrivate::get(node.data())->scene() != nullptr);
@@ -432,11 +453,12 @@ void tst_Nodes::appendMultipleChildNodesToNodeScene()
// Check nodes added when scene is set
// GIVEN
+ Qt3DCore::QScene scene;
+ ObserverSpy spy;
QScopedPointer<MyQNode> node(new MyQNode());
// WHEN
- ObserverSpy spy(node.data());
- node->assignScene(&spy);
+ node->setArbiterAndScene(&spy, &scene);
// THEN
QVERIFY(Qt3DCore::QNodePrivate::get(node.data())->scene() != nullptr);
@@ -516,11 +538,12 @@ void tst_Nodes::appendMultipleChildNodesToNodeScene()
void tst_Nodes::checkParentChangeToNull()
{
// GIVEN
+ Qt3DCore::QScene scene;
+ ObserverSpy spy;
QScopedPointer<MyQNode> root(new MyQNode());
- ObserverSpy spy(root.data());
// WHEN
- root->assignScene(&spy);
+ root->setArbiterAndScene(&spy, &scene);
QScopedPointer<Qt3DCore::QNode> child(new MyQNode(root.data()));
QCoreApplication::processEvents();
@@ -558,22 +581,19 @@ void tst_Nodes::checkParentChangeToNull()
void tst_Nodes::checkParentChangeToOtherParent()
{
// GIVEN
+ Qt3DCore::QScene scene;
+ ObserverSpy spy;
QScopedPointer<MyQNode> root(new MyQNode());
- ObserverSpy spy(root.data());
- root->assignScene(&spy);
+ root->setArbiterAndScene(&spy, &scene);
QScopedPointer<MyQNode> parent1(new MyQNode(root.data()));
QScopedPointer<MyQNode> parent2(new MyQNode(root.data()));
QCoreApplication::processEvents();
// THEN
- QCOMPARE(spy.events.size(), 4);
+ QCOMPARE(spy.events.size(), 4); // 2 x (1 node created change, 1 node added to children change)
// WHEN
- ObserverSpy spyParent1(parent1.data());
- ObserverSpy spyParent2(parent2.data());
- parent1->assignScene(&spyParent1);
- parent2->assignScene(&spyParent2);
-
+ spy.events.clear();
QScopedPointer<Qt3DCore::QNode> child(new MyQNode(parent1.data()));
QCoreApplication::processEvents();
@@ -582,30 +602,29 @@ void tst_Nodes::checkParentChangeToOtherParent()
QCOMPARE(parent1->children().size(), 1);
QCOMPARE(parent2->children().size(), 0);
QVERIFY(Qt3DCore::QNodePrivate::get(child.data())->scene() != nullptr);
- QCOMPARE(spyParent1.events.size(), 2);
+ QCOMPARE(spy.events.size(), 2); // 1 node created change, 1 node added to children change
// WHEN
- spyParent1.events.clear();
+ spy.events.clear();
child->setParent(parent2.data());
// THEN
QVERIFY(child->parent() == parent2.data());
QCOMPARE(parent1->children().size(), 0);
QCOMPARE(parent2->children().size(), 1);
- QCOMPARE(spyParent1.events.size(), 1);
- QCOMPARE(spyParent2.events.size(), 1);
+ QCOMPARE(spy.events.size(), 2);
// CHECK event 1 is a Node Removed event
- QVERIFY(spyParent1.events.first().wasLocked());
- const Qt3DCore::QPropertyNodeRemovedChangePtr event = spyParent1.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeRemovedChange>();
+ QVERIFY(spy.events.first().wasLocked());
+ const Qt3DCore::QPropertyNodeRemovedChangePtr event = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeRemovedChange>();
QCOMPARE(event->type(), Qt3DCore::PropertyValueRemoved);
QCOMPARE(event->subjectId(), parent1->id());
QCOMPARE(event->removedNodeId(), child->id());
QCOMPARE(event->metaObject(), child->metaObject());
// CHECK event 2 is a Node Added event
- QVERIFY(spyParent2.events.last().wasLocked());
- const Qt3DCore::QPropertyNodeAddedChangePtr event2 = spyParent2.events.last().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>();
+ QVERIFY(spy.events.last().wasLocked());
+ const Qt3DCore::QPropertyNodeAddedChangePtr event2 = spy.events.last().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>();
QCOMPARE(event2->type(), Qt3DCore::PropertyValueAdded);
QCOMPARE(event2->subjectId(), parent2->id());
QCOMPARE(event2->addedNodeId(), child->id());
@@ -615,12 +634,13 @@ void tst_Nodes::checkParentChangeToOtherParent()
void tst_Nodes::removingSingleChildNodeFromNode()
{
// GIVEN
+ Qt3DCore::QScene scene;
+ ObserverSpy spy;
QScopedPointer<MyQNode> root(new MyQNode());
QScopedPointer<Qt3DCore::QNode> child(new MyQNode());
- ObserverSpy spy(root.data());
// WHEN
- root->assignScene(&spy);
+ root->setArbiterAndScene(&spy, &scene);
child->setParent(root.data());
// Clear any creation event
@@ -657,11 +677,12 @@ void tst_Nodes::removingSingleChildNodeFromNode()
void tst_Nodes::removingMultipleChildNodesFromNode()
{
// GIVEN
+ Qt3DCore::QScene scene;
+ ObserverSpy spy;
QScopedPointer<MyQNode> root(new MyQNode());
// WHEN
- ObserverSpy spy(root.data());
- root->assignScene(&spy);
+ root->setArbiterAndScene(&spy, &scene);
// THEN
QVERIFY(Qt3DCore::QNodePrivate::get(root.data())->scene() != nullptr);
@@ -749,7 +770,9 @@ void tst_Nodes::removingChildEntitiesFromNode()
void tst_Nodes::appendingParentlessComponentToEntity()
{
// GIVEN
- QScopedPointer<Qt3DCore::QEntity> entity(new Qt3DCore::QEntity());
+ ObserverSpy spy;
+ QScopedPointer<MyQEntity> entity(new MyQEntity());
+ entity->setArbiterAndScene(&spy);
MyQComponent *comp = new MyQComponent();
// THEN
@@ -759,7 +782,6 @@ void tst_Nodes::appendingParentlessComponentToEntity()
QVERIFY(comp->parentNode() == nullptr);
// WHEN
- ObserverSpy spy(entity.data());
entity->addComponent(comp);
// THEN
@@ -787,7 +809,9 @@ void tst_Nodes::appendingParentlessComponentToEntity()
void tst_Nodes::appendingComponentToEntity()
{
// GIVEN
- QScopedPointer<Qt3DCore::QEntity> entity(new Qt3DCore::QEntity());
+ ObserverSpy spy;
+ QScopedPointer<MyQEntity> entity(new MyQEntity());
+ entity->setArbiterAndScene(&spy);
MyQComponent *comp = new MyQComponent(entity.data());
QCoreApplication::processEvents();
@@ -798,7 +822,6 @@ void tst_Nodes::appendingComponentToEntity()
QVERIFY(comp->parentNode() == entity.data());
// WHEN
- ObserverSpy spy(entity.data());
entity->addComponent(comp);
// THEN
@@ -818,7 +841,9 @@ void tst_Nodes::appendingComponentToEntity()
void tst_Nodes::removingComponentFromEntity()
{
// GIVEN
- QScopedPointer<Qt3DCore::QEntity> entity(new Qt3DCore::QEntity());
+ ObserverSpy spy;
+ QScopedPointer<MyQEntity> entity(new MyQEntity());
+ entity->setArbiterAndScene(&spy);
MyQComponent *comp = new MyQComponent();
// WHEN
@@ -829,8 +854,8 @@ void tst_Nodes::removingComponentFromEntity()
QCOMPARE(entity->children().count(), 1);
QVERIFY(comp->parent() == entity.data());
- ObserverSpy spy(entity.data());
// WHEN
+ spy.events.clear();
entity->removeComponent(comp);
// THEN
@@ -850,8 +875,9 @@ void tst_Nodes::removingComponentFromEntity()
void tst_Nodes::changeCustomProperty()
{
// GIVEN
+ ObserverSpy spy;
QScopedPointer<MyQNode> node(new MyQNode());
- ObserverSpy spy(node.data());
+ node->setArbiterAndScene(&spy);
// WHEN
node->setCustomProperty(QStringLiteral("foo"));
// THEN
diff --git a/tests/auto/core/qtransform/tst_qtransform.cpp b/tests/auto/core/qtransform/tst_qtransform.cpp
index 2b92ffacd..b94bde2d1 100644
--- a/tests/auto/core/qtransform/tst_qtransform.cpp
+++ b/tests/auto/core/qtransform/tst_qtransform.cpp
@@ -100,8 +100,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DCore::QTransform> transform(new Qt3DCore::QTransform());
- TestArbiter arbiter(transform.data());
+ arbiter.setArbiterOnNode(transform.data());
// WHEN
transform->setTranslation(QVector3D(454.0f, 427.0f, 383.0f));
diff --git a/tests/auto/input/qabstractaxisinput/tst_qabstractaxisinput.cpp b/tests/auto/input/qabstractaxisinput/tst_qabstractaxisinput.cpp
index f0d8aeddd..890d9b0d3 100644
--- a/tests/auto/input/qabstractaxisinput/tst_qabstractaxisinput.cpp
+++ b/tests/auto/input/qabstractaxisinput/tst_qabstractaxisinput.cpp
@@ -62,8 +62,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DInput::QAbstractAxisInput> axisInput(new DummyAxisInput());
- TestArbiter arbiter(axisInput.data());
+ arbiter.setArbiterOnNode(axisInput.data());
// WHEN
TestDevice *device = new TestDevice(axisInput.data());
diff --git a/tests/auto/input/qaction/tst_qaction.cpp b/tests/auto/input/qaction/tst_qaction.cpp
index cbfc7d756..7d97eddd9 100644
--- a/tests/auto/input/qaction/tst_qaction.cpp
+++ b/tests/auto/input/qaction/tst_qaction.cpp
@@ -106,8 +106,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DInput::QAction> action(new Qt3DInput::QAction());
- TestArbiter arbiter(action.data());
+ arbiter.setArbiterOnNode(action.data());
// WHEN
Qt3DInput::QActionInput *input = new Qt3DInput::QActionInput();
diff --git a/tests/auto/input/qactioninput/tst_qactioninput.cpp b/tests/auto/input/qactioninput/tst_qactioninput.cpp
index b6920af4d..b8eeca0d8 100644
--- a/tests/auto/input/qactioninput/tst_qactioninput.cpp
+++ b/tests/auto/input/qactioninput/tst_qactioninput.cpp
@@ -94,8 +94,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DInput::QActionInput> actionInput(new Qt3DInput::QActionInput());
- TestArbiter arbiter(actionInput.data());
+ arbiter.setArbiterOnNode(actionInput.data());
// WHEN
QVector<int> buttons = QVector<int>() << 555;
diff --git a/tests/auto/input/qanalogaxisinput/tst_qanalogaxisinput.cpp b/tests/auto/input/qanalogaxisinput/tst_qanalogaxisinput.cpp
index 0c98b5d55..da22ca165 100644
--- a/tests/auto/input/qanalogaxisinput/tst_qanalogaxisinput.cpp
+++ b/tests/auto/input/qanalogaxisinput/tst_qanalogaxisinput.cpp
@@ -91,8 +91,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DInput::QAnalogAxisInput> axisInput(new Qt3DInput::QAnalogAxisInput());
- TestArbiter arbiter(axisInput.data());
+ arbiter.setArbiterOnNode(axisInput.data());
// WHEN
axisInput->setAxis(350);
diff --git a/tests/auto/input/qaxis/tst_qaxis.cpp b/tests/auto/input/qaxis/tst_qaxis.cpp
index 70c9a9a48..cd2d002b7 100644
--- a/tests/auto/input/qaxis/tst_qaxis.cpp
+++ b/tests/auto/input/qaxis/tst_qaxis.cpp
@@ -103,8 +103,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DInput::QAxis> axis(new Qt3DInput::QAxis());
- TestArbiter arbiter(axis.data());
+ arbiter.setArbiterOnNode(axis.data());
// WHEN
Qt3DInput::QAbstractAxisInput *input = new Qt3DInput::QAnalogAxisInput();
diff --git a/tests/auto/input/qbuttonaxisinput/tst_qbuttonaxisinput.cpp b/tests/auto/input/qbuttonaxisinput/tst_qbuttonaxisinput.cpp
index 2eb66196b..1a0459958 100644
--- a/tests/auto/input/qbuttonaxisinput/tst_qbuttonaxisinput.cpp
+++ b/tests/auto/input/qbuttonaxisinput/tst_qbuttonaxisinput.cpp
@@ -102,8 +102,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DInput::QButtonAxisInput> axisInput(new Qt3DInput::QButtonAxisInput());
- TestArbiter arbiter(axisInput.data());
+ arbiter.setArbiterOnNode(axisInput.data());
// WHEN
QVector<int> buttons = QVector<int>() << 555;
diff --git a/tests/auto/input/qlogicaldevice/tst_qlogicaldevice.cpp b/tests/auto/input/qlogicaldevice/tst_qlogicaldevice.cpp
index 083fa70ce..fcbd8894c 100644
--- a/tests/auto/input/qlogicaldevice/tst_qlogicaldevice.cpp
+++ b/tests/auto/input/qlogicaldevice/tst_qlogicaldevice.cpp
@@ -109,8 +109,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DInput::QLogicalDevice> logicalDevice(new Qt3DInput::QLogicalDevice());
- TestArbiter arbiter(logicalDevice.data());
+ arbiter.setArbiterOnNode(logicalDevice.data());
// WHEN
Qt3DInput::QAction *action = new Qt3DInput::QAction(logicalDevice.data());
diff --git a/tests/auto/render/commons/testpostmanarbiter.cpp b/tests/auto/render/commons/testpostmanarbiter.cpp
index 6371471c9..6c3ca025b 100644
--- a/tests/auto/render/commons/testpostmanarbiter.cpp
+++ b/tests/auto/render/commons/testpostmanarbiter.cpp
@@ -46,18 +46,13 @@ void TestPostman::notifyBackend(const Qt3DCore::QSceneChangePtr &e)
m_arbiter->sceneChangeEventWithLock(e);
}
-TestArbiter::TestArbiter(Qt3DCore::QNode *node)
+TestArbiter::TestArbiter()
: m_postman(new TestPostman(this))
- , m_node(node)
{
- if (m_node)
- assignArbiter(m_node);
}
TestArbiter::~TestArbiter()
{
- if (m_node)
- Qt3DCore::QNodePrivate::get(m_node)->setArbiter(nullptr);
}
void TestArbiter::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
@@ -80,11 +75,11 @@ Qt3DCore::QAbstractPostman *TestArbiter::postman() const
return m_postman;
}
-void TestArbiter::assignArbiter(Qt3DCore::QNode *node)
+void TestArbiter::setArbiterOnNode(Qt3DCore::QNode *node)
{
Qt3DCore::QNodePrivate::get(node)->setArbiter(this);
Q_FOREACH (Qt3DCore::QNode *n, node->childNodes())
- assignArbiter(n);
+ setArbiterOnNode(n);
}
QT_END_NAMESPACE
diff --git a/tests/auto/render/commons/testpostmanarbiter.h b/tests/auto/render/commons/testpostmanarbiter.h
index 2861801e5..cb2b87afd 100644
--- a/tests/auto/render/commons/testpostmanarbiter.h
+++ b/tests/auto/render/commons/testpostmanarbiter.h
@@ -53,8 +53,7 @@ private:
class TestArbiter : public Qt3DCore::QAbstractArbiter
{
public:
- TestArbiter(Qt3DCore::QNode *node = nullptr);
-
+ TestArbiter();
~TestArbiter();
void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_FINAL;
@@ -67,11 +66,10 @@ public:
QVector<Qt3DCore::QSceneChangePtr> events;
+ void setArbiterOnNode(Qt3DCore::QNode *node);
+
private:
TestPostman *m_postman;
- Qt3DCore::QNode *m_node;
-
- void assignArbiter(Qt3DCore::QNode *node);
};
QT_END_NAMESPACE
diff --git a/tests/auto/render/qabstractlight/tst_qabstractlight.cpp b/tests/auto/render/qabstractlight/tst_qabstractlight.cpp
index c85fcde6b..9fc6bfa76 100644
--- a/tests/auto/render/qabstractlight/tst_qabstractlight.cpp
+++ b/tests/auto/render/qabstractlight/tst_qabstractlight.cpp
@@ -143,41 +143,43 @@ private Q_SLOTS:
void checkLightPropertyUpdates()
{
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QAbstractLight> light(new DummyLight);
- TestArbiter lightArbiter(light.data());
+ arbiter.setArbiterOnNode(light.data());
light->setColor(Qt::red);
light->setIntensity(0.5f);
QCoreApplication::processEvents();
- QCOMPARE(lightArbiter.events.size(), 2 * 2); // Due to contained shader data
+ QCOMPARE(arbiter.events.size(), 2 * 2); // Due to contained shader data
for (int i = 0; i < 2; i++)
- lightArbiter.events.removeAt(i);
- Qt3DCore::QPropertyUpdatedChangePtr change = lightArbiter.events[0].staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ arbiter.events.removeAt(i);
+ Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events[0].staticCast<Qt3DCore::QPropertyUpdatedChange>();
QCOMPARE(change->propertyName(), "color");
QCOMPARE(change->subjectId(), light->id());
QCOMPARE(change->value().value<QColor>(), QColor(Qt::red));
QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
- change = lightArbiter.events[1].staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ change = arbiter.events[1].staticCast<Qt3DCore::QPropertyUpdatedChange>();
QCOMPARE(change->propertyName(), "intensity");
QCOMPARE(change->subjectId(), light->id());
QCOMPARE(change->value().value<float>(), 0.5f);
QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
- lightArbiter.events.clear();
+ arbiter.events.clear();
light->setColor(Qt::red);
QCoreApplication::processEvents();
- QCOMPARE(lightArbiter.events.size(), 0);
+ QCOMPARE(arbiter.events.size(), 0);
- lightArbiter.events.clear();
+ arbiter.events.clear();
}
void checkPointLightPropertyUpdates()
{
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QPointLight> pointLight(new Qt3DRender::QPointLight);
- TestArbiter pointLightArbiter(pointLight.data());
+ arbiter.setArbiterOnNode(pointLight.data());
pointLight->setColor(Qt::green);
pointLight->setIntensity(0.5f);
@@ -186,69 +188,71 @@ private Q_SLOTS:
pointLight->setQuadraticAttenuation(1.0f);
QCoreApplication::processEvents();
- QCOMPARE(pointLightArbiter.events.size(), 4 * 2); // Due to contained shader data
+ QCOMPARE(arbiter.events.size(), 4 * 2); // Due to contained shader data
for (int i = 0; i < 4; i++)
- pointLightArbiter.events.removeAt(i);
- Qt3DCore::QPropertyUpdatedChangePtr change = pointLightArbiter.events[0].staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ arbiter.events.removeAt(i);
+ Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events[0].staticCast<Qt3DCore::QPropertyUpdatedChange>();
QCOMPARE(change->propertyName(), "color");
QCOMPARE(change->subjectId(), pointLight->id());
QCOMPARE(change->value().value<QColor>(), QColor(Qt::green));
QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
- change = pointLightArbiter.events[1].staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ change = arbiter.events[1].staticCast<Qt3DCore::QPropertyUpdatedChange>();
QCOMPARE(change->propertyName(), "intensity");
QCOMPARE(change->subjectId(), pointLight->id());
QCOMPARE(change->value().value<float>(), 0.5f);
QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
- change = pointLightArbiter.events[2].staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ change = arbiter.events[2].staticCast<Qt3DCore::QPropertyUpdatedChange>();
QCOMPARE(change->propertyName(), "constantAttenuation");
QCOMPARE(change->subjectId(), pointLight->id());
QCOMPARE(change->value().value<float>(), 0.5f);
QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
- change = pointLightArbiter.events[3].staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ change = arbiter.events[3].staticCast<Qt3DCore::QPropertyUpdatedChange>();
QCOMPARE(change->propertyName(), "quadraticAttenuation");
QCOMPARE(change->subjectId(), pointLight->id());
QCOMPARE(change->value().value<float>(), 1.0f);
QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
- pointLightArbiter.events.clear();
+ arbiter.events.clear();
}
void checkDirectionalLightPropertyUpdates()
{
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QDirectionalLight> dirLight(new Qt3DRender::QDirectionalLight);
- TestArbiter dirLightArbiter(dirLight.data());
+ arbiter.setArbiterOnNode(dirLight.data());
dirLight->setColor(Qt::blue);
dirLight->setIntensity(0.5f);
dirLight->setWorldDirection(QVector3D(0.5f, 0.0f, -1.0f));
QCoreApplication::processEvents();
- QCOMPARE(dirLightArbiter.events.size(), 3 * 2); // Due to contained shader data
+ QCOMPARE(arbiter.events.size(), 3 * 2); // Due to contained shader data
for (int i = 0; i < 3; i++)
- dirLightArbiter.events.removeAt(i);
- Qt3DCore::QPropertyUpdatedChangePtr change = dirLightArbiter.events[0].staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ arbiter.events.removeAt(i);
+ Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events[0].staticCast<Qt3DCore::QPropertyUpdatedChange>();
QCOMPARE(change->propertyName(), "color");
QCOMPARE(change->subjectId(), dirLight->id());
QCOMPARE(change->value().value<QColor>(), QColor(Qt::blue));
QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
- change = dirLightArbiter.events[1].staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ change = arbiter.events[1].staticCast<Qt3DCore::QPropertyUpdatedChange>();
QCOMPARE(change->propertyName(), "intensity");
QCOMPARE(change->subjectId(), dirLight->id());
QCOMPARE(change->value().value<float>(), 0.5f);
QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
- change = dirLightArbiter.events[2].staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ change = arbiter.events[2].staticCast<Qt3DCore::QPropertyUpdatedChange>();
QCOMPARE(change->propertyName(), "worldDirection");
QCOMPARE(change->subjectId(), dirLight->id());
QCOMPARE(change->value().value<QVector3D>(), QVector3D(0.5f, 0.0f, -1.0f));
QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
- dirLightArbiter.events.clear();
+ arbiter.events.clear();
}
void checkSpotLightPropertyUpdates()
{
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QSpotLight> spotLight(new Qt3DRender::QSpotLight);
- TestArbiter spotLightArbiter(spotLight.data());
+ arbiter.setArbiterOnNode(spotLight.data());
spotLight->setColor(Qt::lightGray);
spotLight->setIntensity(0.5f);
@@ -256,31 +260,31 @@ private Q_SLOTS:
spotLight->setCutOffAngle(0.75f);
QCoreApplication::processEvents();
- QCOMPARE(spotLightArbiter.events.size(), 4 * 2); // Due to contained shader data
+ QCOMPARE(arbiter.events.size(), 4 * 2); // Due to contained shader data
for (int i = 0; i < 4; i++)
- spotLightArbiter.events.removeAt(i);
- Qt3DCore::QPropertyUpdatedChangePtr change = spotLightArbiter.events[0].staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ arbiter.events.removeAt(i);
+ Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events[0].staticCast<Qt3DCore::QPropertyUpdatedChange>();
QCOMPARE(change->propertyName(), "color");
QCOMPARE(change->subjectId(), spotLight->id());
QCOMPARE(change->value().value<QColor>(), QColor(Qt::lightGray));
QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
- change = spotLightArbiter.events[1].staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ change = arbiter.events[1].staticCast<Qt3DCore::QPropertyUpdatedChange>();
QCOMPARE(change->propertyName(), "intensity");
QCOMPARE(change->subjectId(), spotLight->id());
QCOMPARE(change->value().value<float>(), 0.5f);
QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
- change = spotLightArbiter.events[2].staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ change = arbiter.events[2].staticCast<Qt3DCore::QPropertyUpdatedChange>();
QCOMPARE(change->propertyName(), "localDirection");
QCOMPARE(change->subjectId(), spotLight->id());
QCOMPARE(change->value().value<QVector3D>(), QVector3D(0.5f, 0.0f, -1.0f));
QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
- change = spotLightArbiter.events[3].staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ change = arbiter.events[3].staticCast<Qt3DCore::QPropertyUpdatedChange>();
QCOMPARE(change->propertyName(), "cutOffAngle");
QCOMPARE(change->subjectId(), spotLight->id());
QCOMPARE(change->value().value<float>(), 0.75f);
QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
- spotLightArbiter.events.clear();
+ arbiter.events.clear();
}
};
diff --git a/tests/auto/render/qattribute/tst_qattribute.cpp b/tests/auto/render/qattribute/tst_qattribute.cpp
index 9632f4fcb..48bdf5c33 100644
--- a/tests/auto/render/qattribute/tst_qattribute.cpp
+++ b/tests/auto/render/qattribute/tst_qattribute.cpp
@@ -115,8 +115,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QAttribute> attribute(new Qt3DRender::QAttribute());
- TestArbiter arbiter(attribute.data());
+ arbiter.setArbiterOnNode(attribute.data());
// WHEN
attribute->setDataType(Qt3DRender::QAttribute::Double);
diff --git a/tests/auto/render/qbuffer/tst_qbuffer.cpp b/tests/auto/render/qbuffer/tst_qbuffer.cpp
index 566f16f13..995593971 100644
--- a/tests/auto/render/qbuffer/tst_qbuffer.cpp
+++ b/tests/auto/render/qbuffer/tst_qbuffer.cpp
@@ -125,8 +125,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QBuffer> buffer(new Qt3DRender::QBuffer(Qt3DRender::QBuffer::VertexBuffer));
- TestArbiter arbiter(buffer.data());
+ arbiter.setArbiterOnNode(buffer.data());
// WHEN
buffer->setType(Qt3DRender::QBuffer::IndexBuffer);
diff --git a/tests/auto/render/qcameraselector/tst_qcameraselector.cpp b/tests/auto/render/qcameraselector/tst_qcameraselector.cpp
index ca6895f90..1cb3eaabf 100644
--- a/tests/auto/render/qcameraselector/tst_qcameraselector.cpp
+++ b/tests/auto/render/qcameraselector/tst_qcameraselector.cpp
@@ -85,8 +85,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QCameraSelector> cameraSelector(new Qt3DRender::QCameraSelector());
- TestArbiter arbiter(cameraSelector.data());
+ arbiter.setArbiterOnNode(cameraSelector.data());
// WHEN
Qt3DCore::QEntity *camera = new Qt3DCore::QEntity();
diff --git a/tests/auto/render/qclearbuffers/tst_qclearbuffers.cpp b/tests/auto/render/qclearbuffers/tst_qclearbuffers.cpp
index e190d3c96..ce1493e10 100644
--- a/tests/auto/render/qclearbuffers/tst_qclearbuffers.cpp
+++ b/tests/auto/render/qclearbuffers/tst_qclearbuffers.cpp
@@ -98,8 +98,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QClearBuffers> clearBuffer(new Qt3DRender::QClearBuffers());
- TestArbiter arbiter(clearBuffer.data());
+ arbiter.setArbiterOnNode(clearBuffer.data());
// WHEN
clearBuffer->setBuffers(Qt3DRender::QClearBuffers::AllBuffers);
diff --git a/tests/auto/render/qframegraphnode/tst_qframegraphnode.cpp b/tests/auto/render/qframegraphnode/tst_qframegraphnode.cpp
index 17f7e8546..5a5eb266e 100644
--- a/tests/auto/render/qframegraphnode/tst_qframegraphnode.cpp
+++ b/tests/auto/render/qframegraphnode/tst_qframegraphnode.cpp
@@ -102,8 +102,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QFrameGraphNode> frameGraphNode(new MyFrameGraphNode());
- TestArbiter arbiter(frameGraphNode.data());
+ arbiter.setArbiterOnNode(frameGraphNode.data());
// WHEN
frameGraphNode->setEnabled(false);
diff --git a/tests/auto/render/qgeometry/tst_qgeometry.cpp b/tests/auto/render/qgeometry/tst_qgeometry.cpp
index 8e0974657..d07b410ee 100644
--- a/tests/auto/render/qgeometry/tst_qgeometry.cpp
+++ b/tests/auto/render/qgeometry/tst_qgeometry.cpp
@@ -108,8 +108,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QGeometry> geometry(new Qt3DRender::QGeometry());
- TestArbiter arbiter(geometry.data());
+ arbiter.setArbiterOnNode(geometry.data());
// WHEN
Qt3DRender::QAttribute attr;
diff --git a/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp b/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp
index 11835be2d..d88b63dd8 100644
--- a/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp
+++ b/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp
@@ -150,8 +150,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QGeometryRenderer> geometryRenderer(new Qt3DRender::QGeometryRenderer());
- TestArbiter arbiter(geometryRenderer.data());
+ arbiter.setArbiterOnNode(geometryRenderer.data());
// WHEN
geometryRenderer->setInstanceCount(256);
diff --git a/tests/auto/render/qlayerfilter/tst_qlayerfilter.cpp b/tests/auto/render/qlayerfilter/tst_qlayerfilter.cpp
index 60ea33f71..9c14af50e 100644
--- a/tests/auto/render/qlayerfilter/tst_qlayerfilter.cpp
+++ b/tests/auto/render/qlayerfilter/tst_qlayerfilter.cpp
@@ -112,8 +112,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QLayerFilter> layerFilter(new Qt3DRender::QLayerFilter());
- TestArbiter arbiter(layerFilter.data());
+ arbiter.setArbiterOnNode(layerFilter.data());
// WHEN
auto layer = new Qt3DRender::QLayer(layersNode.data());
diff --git a/tests/auto/render/qmaterial/tst_qmaterial.cpp b/tests/auto/render/qmaterial/tst_qmaterial.cpp
index 437cfa5ad..d658b1b3e 100644
--- a/tests/auto/render/qmaterial/tst_qmaterial.cpp
+++ b/tests/auto/render/qmaterial/tst_qmaterial.cpp
@@ -246,8 +246,9 @@ private Q_SLOTS:
void checkEffectUpdate()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QMaterial> material(new Qt3DRender::QMaterial());
- TestArbiter arbiter(material.data());
+ arbiter.setArbiterOnNode(material.data());
// WHEN
Qt3DRender::QEffect effect;
@@ -264,8 +265,9 @@ private Q_SLOTS:
arbiter.events.clear();
// GIVEN
+ TestArbiter arbiter2;
QScopedPointer<TestMaterial> material2(new TestMaterial());
- TestArbiter arbiter2(material2.data());
+ arbiter2.setArbiterOnNode(material2.data());
QCoreApplication::processEvents();
// Clear events trigger by child generation of TestMnterial
@@ -287,8 +289,9 @@ private Q_SLOTS:
void checkDynamicParametersAddedUpdates()
{
// GIVEN
+ TestArbiter arbiter;
TestMaterial *material = new TestMaterial();
- TestArbiter arbiter(material);
+ arbiter.setArbiterOnNode(material);
QCoreApplication::processEvents();
// Clear events trigger by child generation of TestMnterial
@@ -357,8 +360,9 @@ private Q_SLOTS:
void checkShaderProgramUpdates()
{
// GIVEN
+ TestArbiter arbiter;
TestMaterial *material = new TestMaterial();
- TestArbiter arbiter(material);
+ arbiter.setArbiterOnNode(material);
QCoreApplication::processEvents();
// Clear events trigger by child generation of TestMnterial
diff --git a/tests/auto/render/qobjectpicker/tst_qobjectpicker.cpp b/tests/auto/render/qobjectpicker/tst_qobjectpicker.cpp
index ff56d3590..4397954ec 100644
--- a/tests/auto/render/qobjectpicker/tst_qobjectpicker.cpp
+++ b/tests/auto/render/qobjectpicker/tst_qobjectpicker.cpp
@@ -103,8 +103,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QObjectPicker> objectPicker(new Qt3DRender::QObjectPicker());
- TestArbiter arbiter(objectPicker.data());
+ arbiter.setArbiterOnNode(objectPicker.data());
// WHEN
objectPicker->setHoverEnabled(true);
diff --git a/tests/auto/render/qrenderpassfilter/tst_qrenderpassfilter.cpp b/tests/auto/render/qrenderpassfilter/tst_qrenderpassfilter.cpp
index 9e6e4fcc1..8e1565bdf 100644
--- a/tests/auto/render/qrenderpassfilter/tst_qrenderpassfilter.cpp
+++ b/tests/auto/render/qrenderpassfilter/tst_qrenderpassfilter.cpp
@@ -144,8 +144,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QRenderPassFilter> renderPassFilter(new Qt3DRender::QRenderPassFilter());
- TestArbiter arbiter(renderPassFilter.data());
+ arbiter.setArbiterOnNode(renderPassFilter.data());
// WHEN
Qt3DRender::QParameter *param1 = new Qt3DRender::QParameter();
diff --git a/tests/auto/render/qrenderstateset/tst_qrenderstateset.cpp b/tests/auto/render/qrenderstateset/tst_qrenderstateset.cpp
index 073306237..6782ef8f7 100644
--- a/tests/auto/render/qrenderstateset/tst_qrenderstateset.cpp
+++ b/tests/auto/render/qrenderstateset/tst_qrenderstateset.cpp
@@ -130,8 +130,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QRenderStateSet> stateSet(new Qt3DRender::QRenderStateSet());
- TestArbiter arbiter(stateSet.data());
+ arbiter.setArbiterOnNode(stateSet.data());
// WHEN
Qt3DRender::QRenderState *state1 = new MyStateSet();
diff --git a/tests/auto/render/qrendertargetselector/tst_qrendertargetselector.cpp b/tests/auto/render/qrendertargetselector/tst_qrendertargetselector.cpp
index b4cb479ba..1ed546c13 100644
--- a/tests/auto/render/qrendertargetselector/tst_qrendertargetselector.cpp
+++ b/tests/auto/render/qrendertargetselector/tst_qrendertargetselector.cpp
@@ -107,8 +107,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QRenderTargetSelector> renderTargetSelector(new Qt3DRender::QRenderTargetSelector());
- TestArbiter arbiter(renderTargetSelector.data());
+ arbiter.setArbiterOnNode(renderTargetSelector.data());
// WHEN
Qt3DRender::QRenderTarget *target = new Qt3DRender::QRenderTarget();
diff --git a/tests/auto/render/qsortpolicy/tst_qsortpolicy.cpp b/tests/auto/render/qsortpolicy/tst_qsortpolicy.cpp
index cd88785f5..020929e09 100644
--- a/tests/auto/render/qsortpolicy/tst_qsortpolicy.cpp
+++ b/tests/auto/render/qsortpolicy/tst_qsortpolicy.cpp
@@ -103,8 +103,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QSortPolicy> sortPolicy(new Qt3DRender::QSortPolicy());
- TestArbiter arbiter(sortPolicy.data());
+ arbiter.setArbiterOnNode(sortPolicy.data());
// WHEN
Qt3DRender::QSortPolicy::SortType sortType1 = Qt3DRender::QSortPolicy::BackToFront;
diff --git a/tests/auto/render/qtechniquefilter/tst_qtechniquefilter.cpp b/tests/auto/render/qtechniquefilter/tst_qtechniquefilter.cpp
index 8438cf033..97fe917ae 100644
--- a/tests/auto/render/qtechniquefilter/tst_qtechniquefilter.cpp
+++ b/tests/auto/render/qtechniquefilter/tst_qtechniquefilter.cpp
@@ -149,8 +149,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QTechniqueFilter> techniqueFilter(new Qt3DRender::QTechniqueFilter());
- TestArbiter arbiter(techniqueFilter.data());
+ arbiter.setArbiterOnNode(techniqueFilter.data());
// WHEN
Qt3DRender::QParameter *param1 = new Qt3DRender::QParameter();
diff --git a/tests/auto/render/qviewport/tst_qviewport.cpp b/tests/auto/render/qviewport/tst_qviewport.cpp
index 9ea758fcf..87b22e22b 100644
--- a/tests/auto/render/qviewport/tst_qviewport.cpp
+++ b/tests/auto/render/qviewport/tst_qviewport.cpp
@@ -87,8 +87,9 @@ private Q_SLOTS:
void checkPropertyUpdates()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QViewport> viewport(new Qt3DRender::QViewport());
- TestArbiter arbiter(viewport.data());
+ arbiter.setArbiterOnNode(viewport.data());
// WHEN
viewport->setNormalizedRect(QRectF(0.5f, 0.5f, 1.0f, 1.0f));
diff --git a/tests/auto/render/renderviewutils/tst_renderviewutils.cpp b/tests/auto/render/renderviewutils/tst_renderviewutils.cpp
index 0278b52c7..1bda16cba 100644
--- a/tests/auto/render/renderviewutils/tst_renderviewutils.cpp
+++ b/tests/auto/render/renderviewutils/tst_renderviewutils.cpp
@@ -467,8 +467,9 @@ void tst_RenderViewUtils::topLevelDynamicProperties()
void tst_RenderViewUtils::shouldNotifyDynamicPropertyChanges()
{
// GIVEN
+ TestArbiter arbiter;
QScopedPointer<Qt3DRender::QShaderData> shaderData(new Qt3DRender::QShaderData());
- TestArbiter arbiter(shaderData.data());
+ arbiter.setArbiterOnNode(shaderData.data());
// WHEN
shaderData->setProperty("scalar", 883.0f);