diff options
-rw-r--r-- | src/imports/builtins/builtins.qmltypes | 6 | ||||
-rw-r--r-- | src/qml/jsapi/qjsengine.cpp | 5 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 8 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4urlobject_p.h | 3 | ||||
-rw-r--r-- | tests/auto/qml/qjsvalue/tst_qjsvalue.cpp | 19 | ||||
-rw-r--r-- | tests/auto/qml/qjsvalue/tst_qjsvalue.h | 1 |
6 files changed, 41 insertions, 1 deletions
diff --git a/src/imports/builtins/builtins.qmltypes b/src/imports/builtins/builtins.qmltypes index a2dabde755..d5279dcbdd 100644 --- a/src/imports/builtins/builtins.qmltypes +++ b/src/imports/builtins/builtins.qmltypes @@ -1724,4 +1724,10 @@ Module { accessSemantics: "value" } + Component { + name: "QUrl" + exports: ["QML/url 1.0"] + exportMetaObjectRevisions: [256] + accessSemantics: "value" + } } diff --git a/src/qml/jsapi/qjsengine.cpp b/src/qml/jsapi/qjsengine.cpp index 0363e9b76e..96fcd99de4 100644 --- a/src/qml/jsapi/qjsengine.cpp +++ b/src/qml/jsapi/qjsengine.cpp @@ -755,6 +755,11 @@ bool QJSEngine::convertV2(const QJSValue &value, int type, void *ptr) *reinterpret_cast<QString*>(ptr) = *string; return true; } + if (type == QMetaType::QUrl) { + *reinterpret_cast<QUrl *>(ptr) = QUrl(*string); + return true; + } + double d = QV4::RuntimeHelpers::stringToNumber(*string); switch (type) { case QMetaType::Int: diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index a96e93c212..2892b616b0 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -2240,6 +2240,14 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, int type, void *data) *reinterpret_cast<QDate *>(data) = d->toQDateTime().date(); return true; } break; + case QMetaType::QUrl: + if (String *s = value.stringValue()) { + *reinterpret_cast<QUrl *>(data) = QUrl(s->toQString()); + return true; + } else if (const QV4::UrlObject *d = value.as<UrlObject>()) { + *reinterpret_cast<QUrl *>(data) = d->toQUrl(); + return true; + } break; #if QT_CONFIG(regularexpression) case QMetaType::QRegularExpression: if (const QV4::RegExpObject *r = value.as<QV4::RegExpObject>()) { diff --git a/src/qml/jsruntime/qv4urlobject_p.h b/src/qml/jsruntime/qv4urlobject_p.h index aa0e7a062f..8ac3d72a4f 100644 --- a/src/qml/jsruntime/qv4urlobject_p.h +++ b/src/qml/jsruntime/qv4urlobject_p.h @@ -143,8 +143,9 @@ struct UrlObject : Object QString username() const { return d()->username->toQString(); } bool setUsername(QString username); -private: QUrl toQUrl() const; + +private: void updateOrigin(); void updateHost(); }; diff --git a/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp b/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp index 7f35282e89..6e91cec474 100644 --- a/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp +++ b/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp @@ -2737,4 +2737,23 @@ void tst_QJSValue::deleteFromDifferentThread() #endif } +void tst_QJSValue::stringAndUrl() +{ + QJSEngine engine; + const QString string = QStringLiteral("http://example.com/something.html"); + const QUrl url(string); + + const QJSValue urlValue(engine.toScriptValue(url)); + QCOMPARE(urlValue.toString(), string); + QCOMPARE(engine.fromScriptValue<QUrl>(urlValue), url); + + const QJSValue stringValue(engine.toScriptValue(string)); + QCOMPARE(stringValue.toString(), string); + QCOMPARE(engine.fromScriptValue<QUrl>(stringValue), url); + + const QJSValue immediateStringValue(string); + QCOMPARE(immediateStringValue.toString(), string); + QCOMPARE(engine.fromScriptValue<QUrl>(immediateStringValue), url); +} + QTEST_MAIN(tst_QJSValue) diff --git a/tests/auto/qml/qjsvalue/tst_qjsvalue.h b/tests/auto/qml/qjsvalue/tst_qjsvalue.h index 63558bbbca..f6e3c2aacf 100644 --- a/tests/auto/qml/qjsvalue/tst_qjsvalue.h +++ b/tests/auto/qml/qjsvalue/tst_qjsvalue.h @@ -144,6 +144,7 @@ private slots: void jsvalueArrayToSequenceType(); void deleteFromDifferentThread(); + void stringAndUrl(); private: void newEngine() |