aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/declarative/items/qsgloader.cpp29
-rw-r--r--src/declarative/items/qsgloader_p_p.h1
-rw-r--r--tests/auto/declarative/qsgloader/data/active.7.qml14
-rw-r--r--tests/auto/declarative/qsgloader/data/active.8.qml13
-rw-r--r--tests/auto/declarative/qsgloader/tst_qsgloader.cpp29
5 files changed, 69 insertions, 17 deletions
diff --git a/src/declarative/items/qsgloader.cpp b/src/declarative/items/qsgloader.cpp
index 0a0a3b9cc5..91dce3b364 100644
--- a/src/declarative/items/qsgloader.cpp
+++ b/src/declarative/items/qsgloader.cpp
@@ -53,8 +53,9 @@
QT_BEGIN_NAMESPACE
QSGLoaderPrivate::QSGLoaderPrivate()
- : item(0), component(0), ownComponent(false), updatingSize(false),
- itemWidthValid(false), itemHeightValid(false), active(true)
+ : item(0), component(0), updatingSize(false),
+ itemWidthValid(false), itemHeightValid(false),
+ active(true), loadingFromSource(false)
{
}
@@ -79,10 +80,9 @@ void QSGLoaderPrivate::clear()
{
disposeInitialPropertyValues();
- if (ownComponent) {
+ if (loadingFromSource && component) {
component->deleteLater();
component = 0;
- ownComponent = false;
}
source = QUrl();
@@ -340,11 +340,10 @@ void QSGLoader::loadFromSource()
return;
}
- d->component = new QDeclarativeComponent(qmlEngine(this), d->source, this);
- d->ownComponent = true;
-
- if (isComponentComplete())
+ if (isComponentComplete()) {
+ d->component = new QDeclarativeComponent(qmlEngine(this), d->source, this);
d->load();
+ }
}
/*!
@@ -384,7 +383,6 @@ void QSGLoader::setSourceComponent(QDeclarativeComponent *comp)
d->clear();
d->component = comp;
- d->ownComponent = false;
d->loadingFromSource = false;
if (d->active)
@@ -520,7 +518,7 @@ void QSGLoaderPrivate::load()
q, SIGNAL(progressChanged()));
emit q->statusChanged();
emit q->progressChanged();
- if (ownComponent)
+ if (loadingFromSource)
emit q->sourceChanged();
else
emit q->sourceComponentChanged();
@@ -535,7 +533,7 @@ void QSGLoaderPrivate::_q_sourceLoaded()
if (component) {
if (!component->errors().isEmpty()) {
QDeclarativeEnginePrivate::warning(qmlEngine(q), component->errors());
- if (ownComponent)
+ if (loadingFromSource)
emit q->sourceChanged();
else
emit q->sourceComponentChanged();
@@ -582,7 +580,7 @@ void QSGLoaderPrivate::_q_sourceLoaded()
source = QUrl();
}
completeCreateWithInitialPropertyValues(component, obj, initialPropertyValues, qmlGlobalForIpv);
- if (ownComponent)
+ if (loadingFromSource)
emit q->sourceChanged();
else
emit q->sourceComponentChanged();
@@ -653,7 +651,12 @@ void QSGLoader::componentComplete()
{
Q_D(QSGLoader);
QSGItem::componentComplete();
- d->load();
+ if (active()) {
+ if (d->loadingFromSource) {
+ d->component = new QDeclarativeComponent(qmlEngine(this), d->source, this);
+ }
+ d->load();
+ }
}
/*!
diff --git a/src/declarative/items/qsgloader_p_p.h b/src/declarative/items/qsgloader_p_p.h
index 732ec8679d..13292ffc54 100644
--- a/src/declarative/items/qsgloader_p_p.h
+++ b/src/declarative/items/qsgloader_p_p.h
@@ -86,7 +86,6 @@ public:
QDeclarativeComponent *component;
v8::Persistent<v8::Object> initialPropertyValues;
v8::Persistent<v8::Object> qmlGlobalForIpv;
- bool ownComponent : 1;
bool updatingSize: 1;
bool itemWidthValid : 1;
bool itemHeightValid : 1;
diff --git a/tests/auto/declarative/qsgloader/data/active.7.qml b/tests/auto/declarative/qsgloader/data/active.7.qml
new file mode 100644
index 0000000000..a29e932f5e
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/active.7.qml
@@ -0,0 +1,14 @@
+import QtQuick 2.0
+Rectangle {
+ id: root
+ color: "blue"
+ width: 100; height: 100
+ property bool success: true
+
+ Loader {
+ active: false
+ anchors.fill: parent
+ sourceComponent: Rectangle { color: "red" }
+ onLoaded: { root.success = false; } // shouldn't be triggered if active is false
+ }
+}
diff --git a/tests/auto/declarative/qsgloader/data/active.8.qml b/tests/auto/declarative/qsgloader/data/active.8.qml
new file mode 100644
index 0000000000..3a66d3e99a
--- /dev/null
+++ b/tests/auto/declarative/qsgloader/data/active.8.qml
@@ -0,0 +1,13 @@
+import QtQuick 2.0
+Rectangle {
+ id: root
+ color: "blue"
+ width: 100; height: 100
+ property bool success: false
+
+ Loader {
+ anchors.fill: parent
+ sourceComponent: Rectangle { color: "red" }
+ onLoaded: { root.success = true; } // should be triggered since active is true by default
+ }
+}
diff --git a/tests/auto/declarative/qsgloader/tst_qsgloader.cpp b/tests/auto/declarative/qsgloader/tst_qsgloader.cpp
index cd4792532d..ba8d5e01d7 100644
--- a/tests/auto/declarative/qsgloader/tst_qsgloader.cpp
+++ b/tests/auto/declarative/qsgloader/tst_qsgloader.cpp
@@ -141,9 +141,14 @@ void tst_QSGLoader::sourceOrComponent()
QCOMPARE(static_cast<QSGItem*>(loader)->childItems().count(), error ? 0: 1);
if (!error) {
- QDeclarativeComponent *c = qobject_cast<QDeclarativeComponent*>(loader->children().at(0));
- QVERIFY(c);
- QCOMPARE(loader->sourceComponent(), c);
+ bool sourceComponentIsChildOfLoader = false;
+ for (int ii = 0; ii < loader->children().size(); ++ii) {
+ QDeclarativeComponent *c = qobject_cast<QDeclarativeComponent*>(loader->children().at(ii));
+ if (c && c == loader->sourceComponent()) {
+ sourceComponentIsChildOfLoader = true;
+ }
+ }
+ QVERIFY(sourceComponentIsChildOfLoader);
}
if (sourceOrComponent == "component") {
@@ -585,6 +590,24 @@ void tst_QSGLoader::active()
delete object;
}
+
+ // check that the component isn't loaded until active is set to true
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("active.7.qml"));
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+ QCOMPARE(object->property("success").toBool(), true);
+ delete object;
+ }
+
+ // check that the component is loaded if active is not set (true by default)
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("active.8.qml"));
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+ QCOMPARE(object->property("success").toBool(), true);
+ delete object;
+ }
}
void tst_QSGLoader::initialPropertyValues_data()