aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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()