From 66a87def431a1b2442a07abecdc9753ab315ff53 Mon Sep 17 00:00:00 2001 From: ksuprynowicz Date: Sun, 22 Jan 2023 09:25:08 +0100 Subject: [PATCH] Fixed script array to QVariant conversion --- .../script-engine/src/v8/ScriptEngineV8.h | 1 + .../src/v8/ScriptEngineV8_cast.cpp | 34 +++++++++++++++++++ scripts/system/places/places.html | 1 - scripts/system/places/places.js | 2 ++ 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/libraries/script-engine/src/v8/ScriptEngineV8.h b/libraries/script-engine/src/v8/ScriptEngineV8.h index b7fb07c445..b622d8ef0f 100644 --- a/libraries/script-engine/src/v8/ScriptEngineV8.h +++ b/libraries/script-engine/src/v8/ScriptEngineV8.h @@ -175,6 +175,7 @@ public: // not for public use, but I don't like how Qt strings this along with p bool castValueToVariant(const V8ScriptValue& val, QVariant& dest, int destTypeId); // Converts JS objects created in V8 to variants. Iterates over all properties and converts them to variants. + bool convertJSArrayToVariant(v8::Local array, QVariant &dest); bool convertJSObjectToVariant(v8::Local object, QVariant &dest); V8ScriptValue castVariantToValue(const QVariant& val); QString valueType(const V8ScriptValue& val); diff --git a/libraries/script-engine/src/v8/ScriptEngineV8_cast.cpp b/libraries/script-engine/src/v8/ScriptEngineV8_cast.cpp index 4e3552c758..44f096598f 100644 --- a/libraries/script-engine/src/v8/ScriptEngineV8_cast.cpp +++ b/libraries/script-engine/src/v8/ScriptEngineV8_cast.cpp @@ -389,6 +389,11 @@ bool ScriptEngineV8::castValueToVariant(const V8ScriptValue& v8Val, QVariant& de break; } } + if (val->IsArray()) { + if (convertJSArrayToVariant(v8::Local::Cast(val), dest)) { + return true; + } + } // This is for generic JS objects if (val->IsObject()) { if (convertJSObjectToVariant(v8::Local::Cast(val), dest)) { @@ -499,6 +504,11 @@ bool ScriptEngineV8::castValueToVariant(const V8ScriptValue& v8Val, QVariant& de return true; } } + if (val->IsArray()) { + if (convertJSArrayToVariant(v8::Local::Cast(val), dest)) { + return true; + } + } if (val->IsObject()) { if (convertJSObjectToVariant(v8::Local::Cast(val), dest)) { return true; @@ -550,6 +560,30 @@ bool ScriptEngineV8::castValueToVariant(const V8ScriptValue& v8Val, QVariant& de return destTypeId == QMetaType::UnknownType || dest.userType() == destTypeId || dest.convert(destTypeId); } +bool ScriptEngineV8::convertJSArrayToVariant(v8::Local array, QVariant &dest) { + v8::HandleScope handleScope(_v8Isolate); + auto context = getContext(); + int length = array->Length(); + QList properties; + for (int i = 0; i < length; i++) { + v8::Local v8Property; + if (!array->Get(context, i).ToLocal(&v8Property)) { + qDebug() << "ScriptEngineV8::convertJSArrayToVariant could not get property: " + QString(i); + continue; + } + QVariant property; + // Maybe QMetaType::QVariant? + if (castValueToVariant(V8ScriptValue(_v8Isolate, v8Property), property, QMetaType::UnknownType)) { + properties.append(property); + } else { + qDebug() << "ScriptEngineV8::convertJSArrayToVariant could cast property to variant: " + QString(i); + ; + } + } + dest = QVariant(properties); + return true; +} + bool ScriptEngineV8::convertJSObjectToVariant(v8::Local object, QVariant &dest) { v8::HandleScope handleScope(_v8Isolate); auto context = getContext(); diff --git a/scripts/system/places/places.html b/scripts/system/places/places.html index d25f609e0d..e9a131ccd5 100644 --- a/scripts/system/places/places.html +++ b/scripts/system/places/places.html @@ -264,7 +264,6 @@ } document.getElementById("listInfo").innerHTML = metaverseCounter + metaversePageInfo + " of " + metaverseList.length + "."; } else { - console.log(JSON.stringify(placeList)); var placeRecords = placeList.slice(); if (currentListFormat === "DOMAINS") { diff --git a/scripts/system/places/places.js b/scripts/system/places/places.js index 240083cac0..ab986c1452 100644 --- a/scripts/system/places/places.js +++ b/scripts/system/places/places.js @@ -72,6 +72,7 @@ var n = d.getTime(); var messageObj = JSON.parse(message); + print(message); if (messageObj.channel === channel) { if (messageObj.action === "READY_FOR_CONTENT" && (n - timestamp) > INTERCALL_DELAY) { d = new Date(); @@ -210,6 +211,7 @@ warning = "WARNING: " + percentProtocolRejected + "% of the places are not listed because they are running under a different protocol. Maybe consider to upgrade."; } + print(JSON.stringify(portalList)); var message = { "channel": channel, "action": "PLACE_DATA",