diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-04-03 19:56:04 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-04-04 09:37:50 +0000 |
commit | c7e98f4cb9717dcf267f23bf2e8ca57cdc874b84 (patch) | |
tree | 70ada9cc2055ffd6431b787af33d3aeabb8485ba /src/quicktemplates2 | |
parent | 88a62b3b910d09324dbbef3e1e791659ecd6537f (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.cpp | 17 | ||||
-rw-r--r-- | src/quicktemplates2/qquickstackview_p_p.h | 3 |
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); |