From c7e98f4cb9717dcf267f23bf2e8ca57cdc874b84 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Mon, 3 Apr 2017 19:56:04 +0200 Subject: StackView: resolve relative URLs to the caller Task-number: QTBUG-59309 Change-Id: I3c19d55431dd4831c4510acb5ef0e9fffa8f478f Reviewed-by: Mitch Curtis --- src/quicktemplates2/qquickstackview_p.cpp | 17 +++++++++++++---- src/quicktemplates2/qquickstackview_p_p.h | 3 ++- 2 files changed, 15 insertions(+), 5 deletions(-) (limited to 'src') 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 QQuickStackViewPrivate::parseElements(int from, QQmlV4Function *args, QStringList *errors) { QV4::ExecutionEngine *v4 = args->v4engine(); + QQmlContextData *context = v4->callingQmlContext(); QV4::Scope scope(v4); QList elements; @@ -105,7 +106,7 @@ QList 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 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()) - return QQuickStackElement::fromString(s->toQString(), q, error); + return QQuickStackElement::fromString(resolvedUrl(s->toQString(), context), q, error); if (const QV4::QObjectWrapper *o = value.as()) 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 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 &elements); bool pushElement(QQuickStackElement *element); bool popElements(QQuickStackElement *element); -- cgit v1.2.3