aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-12-02 12:56:51 +0100
committerUlf Hermann <ulf.hermann@qt.io>2020-12-02 21:44:16 +0100
commit6cfe4cbebb8e429164f6f1878abb560fa417f9fa (patch)
tree4ec7116946d1d39bcf2c764855416d6054d55b44
parent9664d9346af854ccc13c099862184d5a0f7544f1 (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.qmltypes6
-rw-r--r--src/qml/jsapi/qjsengine.cpp5
-rw-r--r--src/qml/jsruntime/qv4engine.cpp8
-rw-r--r--src/qml/jsruntime/qv4urlobject_p.h3
-rw-r--r--tests/auto/qml/qjsvalue/tst_qjsvalue.cpp19
-rw-r--r--tests/auto/qml/qjsvalue/tst_qjsvalue.h1
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()