aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-04-03 19:56:04 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2017-04-04 09:37:50 +0000
commitc7e98f4cb9717dcf267f23bf2e8ca57cdc874b84 (patch)
tree70ada9cc2055ffd6431b787af33d3aeabb8485ba /src/quicktemplates2
parent88a62b3b910d09324dbbef3e1e791659ecd6537f (diff)
StackView: resolve relative URLs to the caller
Task-number: QTBUG-59309 Change-Id: I3c19d55431dd4831c4510acb5ef0e9fffa8f478f Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2')
-rw-r--r--src/quicktemplates2/qquickstackview_p.cpp17
-rw-r--r--src/quicktemplates2/qquickstackview_p_p.h3
2 files changed, 15 insertions, 5 deletions
diff --git a/src/quicktemplates2/qquickstackview_p.cpp b/src/quicktemplates2/qquickstackview_p.cpp
index c6f9291d..3c983d6b 100644
--- a/src/quicktemplates2/qquickstackview_p.cpp
+++ b/src/quicktemplates2/qquickstackview_p.cpp
@@ -93,6 +93,7 @@ static bool initProperties(QQuickStackElement *element, const QV4::Value &props,
QList<QQuickStackElement *> QQuickStackViewPrivate::parseElements(int from, QQmlV4Function *args, QStringList *errors)
{
QV4::ExecutionEngine *v4 = args->v4engine();
+ QQmlContextData *context = v4->callingQmlContext();
QV4::Scope scope(v4);
QList<QQuickStackElement *> elements;
@@ -105,7 +106,7 @@ QList<QQuickStackElement *> QQuickStackViewPrivate::parseElements(int from, QQml
for (int j = 0; j < len; ++j) {
QString error;
QV4::ScopedValue value(scope, array->getIndexed(j));
- QQuickStackElement *element = createElement(value, &error);
+ QQuickStackElement *element = createElement(value, context, &error);
if (element) {
if (j < len - 1) {
QV4::ScopedValue props(scope, array->getIndexed(j + 1));
@@ -119,7 +120,7 @@ QList<QQuickStackElement *> QQuickStackViewPrivate::parseElements(int from, QQml
}
} else {
QString error;
- QQuickStackElement *element = createElement(arg, &error);
+ QQuickStackElement *element = createElement(arg, context, &error);
if (element) {
if (i < argc - 1) {
QV4::ScopedValue props(scope, (*args)[i + 1]);
@@ -153,11 +154,19 @@ QQuickStackElement *QQuickStackViewPrivate::findElement(const QV4::Value &value)
return nullptr;
}
-QQuickStackElement *QQuickStackViewPrivate::createElement(const QV4::Value &value, QString *error)
+static QString resolvedUrl(const QString &str, QQmlContextData *context)
+{
+ QUrl url(str);
+ if (url.isRelative())
+ return context->resolvedUrl(url).toString();
+ return str;
+}
+
+QQuickStackElement *QQuickStackViewPrivate::createElement(const QV4::Value &value, QQmlContextData *context, QString *error)
{
Q_Q(QQuickStackView);
if (const QV4::String *s = value.as<QV4::String>())
- return QQuickStackElement::fromString(s->toQString(), q, error);
+ return QQuickStackElement::fromString(resolvedUrl(s->toQString(), context), q, error);
if (const QV4::QObjectWrapper *o = value.as<QV4::QObjectWrapper>())
return QQuickStackElement::fromObject(o->object(), q, error);
return nullptr;
diff --git a/src/quicktemplates2/qquickstackview_p_p.h b/src/quicktemplates2/qquickstackview_p_p.h
index 26d741f8..81ca9164 100644
--- a/src/quicktemplates2/qquickstackview_p_p.h
+++ b/src/quicktemplates2/qquickstackview_p_p.h
@@ -57,6 +57,7 @@
QT_BEGIN_NAMESPACE
+class QQmlContextData;
class QQuickStackElement;
struct QQuickStackTransition;
@@ -79,7 +80,7 @@ public:
QList<QQuickStackElement *> parseElements(int from, QQmlV4Function *args, QStringList *errors);
QQuickStackElement *findElement(QQuickItem *item) const;
QQuickStackElement *findElement(const QV4::Value &value) const;
- QQuickStackElement *createElement(const QV4::Value &value, QString *error);
+ QQuickStackElement *createElement(const QV4::Value &value, QQmlContextData *context, QString *error);
bool pushElements(const QList<QQuickStackElement *> &elements);
bool pushElement(QQuickStackElement *element);
bool popElements(QQuickStackElement *element);