diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2020-12-02 12:56:51 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-12-02 21:44:16 +0100 |
commit | 6cfe4cbebb8e429164f6f1878abb560fa417f9fa (patch) | |
tree | 4ec7116946d1d39bcf2c764855416d6054d55b44 | |
parent | 9664d9346af854ccc13c099862184d5a0f7544f1 (diff) |
Mark url as builtin type
Also, allow conversion from UrlObject and String. We allow the string
conversion because we treat string and url as interchangeable in various
places.
Change-Id: Ib229c6d190e1c5d849ea18798925965b8dbeef7e
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-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() |