aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4engine.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2021-04-20 10:43:11 +0200
committerUlf Hermann <ulf.hermann@qt.io>2021-04-22 22:15:36 +0200
commit3c9339f3c817c985f9ff3410f1f0ef864554687a (patch)
tree05305a6a503b35f9627456435cc2523f5c9909ed /src/qml/jsruntime/qv4engine.cpp
parente44a949f9028df1d4750dad2925b074c9c59efcc (diff)
Support native transformation between UrlObject and QVariant/QUrl
URL has become a builtin type. We should support it on the same level as QString/String and QDateTime/Date. In order to continue support for comparing URL properties with the JavaScript equality operators, we still pass URLs as variants when using them in JavaScript. However, we now create proper URL objects for QJSValue and QJSManagedValue, and we allow transforming the URL-carrying variant objects back into QUrls. Change-Id: I78cb2d7d51ac720877217d2d4b4d0ab17cdd2a4b Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4engine.cpp')
-rw-r--r--src/qml/jsruntime/qv4engine.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index 34fbd19a78..69db5efd05 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -94,6 +94,7 @@
#include "qv4atomics_p.h"
#include "qv4urlobject_p.h"
#include "qv4jscall_p.h"
+#include "qv4variantobject_p.h"
#if QT_CONFIG(qml_sequence_object)
#include "qv4sequenceobject_p.h"
@@ -1083,6 +1084,14 @@ Heap::UrlObject *ExecutionEngine::newUrlObject()
return memoryManager->allocate<UrlObject>();
}
+Heap::UrlObject *ExecutionEngine::newUrlObject(const QUrl &url)
+{
+ Scope scope(this);
+ Scoped<UrlObject> urlObject(scope, newUrlObject());
+ urlObject->setUrl(url);
+ return urlObject->d();
+}
+
Heap::UrlSearchParamsObject *ExecutionEngine::newUrlSearchParamsObject()
{
return memoryManager->allocate<UrlSearchParamsObject>();
@@ -1628,6 +1637,8 @@ static QVariant toVariant(QV4::ExecutionEngine *e, const QV4::Value &value, QMet
#endif
if (const QV4::DateObject *d = value.as<DateObject>())
return d->toQDateTime();
+ if (const QV4::UrlObject *d = value.as<UrlObject>())
+ return d->toQUrl();
if (const ArrayBuffer *d = value.as<ArrayBuffer>())
return d->asByteArray();
// NOTE: since we convert QTime to JS Date, round trip will change the variant type (to QDateTime)!
@@ -1949,6 +1960,9 @@ QV4::ReturnedValue ExecutionEngine::metaTypeToJS(QMetaType type, const void *dat
// unwrap it: this is tested in QJSEngine, and makes the most sense for
// end-user code too.
return fromVariant(*reinterpret_cast<const QVariant*>(data));
+ } else if (type == QMetaType::fromType<QUrl>()) {
+ // Create a proper URL object here, rather than a variant.
+ return newUrlObject(*reinterpret_cast<const QUrl *>(data))->asReturnedValue();
}
return fromData(type, data);
@@ -2296,7 +2310,15 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi
} else if (const QV4::UrlObject *d = value.as<UrlObject>()) {
*reinterpret_cast<QUrl *>(data) = d->toQUrl();
return true;
- } break;
+ } else if (const QV4::VariantObject *d = value.as<VariantObject>()) {
+ const QVariant *variant = &d->d()->data();
+ if (variant->metaType() == QMetaType::fromType<QUrl>()) {
+ *reinterpret_cast<QUrl *>(data)
+ = *reinterpret_cast<const QUrl *>(variant->constData());
+ return true;
+ }
+ }
+ break;
#if QT_CONFIG(regularexpression)
case QMetaType::QRegularExpression:
if (const QV4::RegExpObject *r = value.as<QV4::RegExpObject>()) {