diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2014-09-10 17:13:10 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@digia.com> | 2014-09-17 08:13:11 +0200 |
commit | 3dbe05f6bf3fd51ce8097c35f6c7f12b39acb0f6 (patch) | |
tree | 444ed433aa02085357b589b19b28f4bc1c243320 /tests/auto/qml/qjsvalue/tst_qjsvalue.cpp | |
parent | cfe1a8152c948a4586ffa1fe79b47f9a0e88beb5 (diff) |
Fix mapping of JS objects/arrays to C++
[ChangeLog][QtQml][Important Behavior Changes] When a JavaScript object/array
is passed to C++ through a QVariant, the engine no longer immediately converts
the object recursively into a QVariantMap or QVariantList but instead stores
a QJSValue in the QVariant. This prevents a loss of data when the JS object
contains non-primitive types such as function objects for example. Code that
expects the variant type to be exactly QVariant::Map or QVariant::List may
need to be adapted. Registered conversion functions however ensure that code
that merely calls toMap() or toList() continues to work.
Task-number: QTBUG-40431
Change-Id: I1dbc1d5f8e78ad28bb62db3681b9a0b34557e7f5
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'tests/auto/qml/qjsvalue/tst_qjsvalue.cpp')
-rw-r--r-- | tests/auto/qml/qjsvalue/tst_qjsvalue.cpp | 50 |
1 files changed, 44 insertions, 6 deletions
diff --git a/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp b/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp index 837403d391..9c615cfc15 100644 --- a/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp +++ b/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp @@ -34,10 +34,6 @@ #include "tst_qjsvalue.h" #include <QtWidgets/QPushButton> -QT_BEGIN_NAMESPACE -extern bool qt_script_isJITEnabled(); -QT_END_NAMESPACE - tst_QJSValue::tst_QJSValue() : engine(0) { @@ -45,8 +41,7 @@ tst_QJSValue::tst_QJSValue() tst_QJSValue::~tst_QJSValue() { - if (engine) - delete engine; + delete engine; } void tst_QJSValue::ctor_invalid() @@ -308,6 +303,19 @@ void tst_QJSValue::ctor_copyAndAssign() QCOMPARE(v5.toNumber(), 1.0); } +static QJSValue createUnboundValue(const QJSValue &value) +{ + QVariant variant = QVariant::fromValue(value); + QBuffer buffer; + buffer.open(QIODevice::ReadWrite); + QDataStream stream(&buffer); + variant.save(stream); + buffer.seek(0); + QVariant resultVariant; + resultVariant.load(stream); + return resultVariant.value<QJSValue>(); +} + void tst_QJSValue::toString() { QJSEngine eng; @@ -406,6 +414,28 @@ void tst_QJSValue::toString() variant = eng.toScriptValue(QUrl()); QVERIFY(variant.isVariant()); QVERIFY(variant.toString().isEmpty()); + + { + QJSValue o = eng.newObject(); + o.setProperty(QStringLiteral("test"), 42); + QCOMPARE(o.toString(), QStringLiteral("[object Object]")); + + o = createUnboundValue(o); + QVERIFY(!o.engine()); + QCOMPARE(o.toString(), QStringLiteral("[object Object]")); + } + + { + QJSValue o = eng.newArray(); + o.setProperty(0, 1); + o.setProperty(1, 2); + o.setProperty(2, 3); + QCOMPARE(o.toString(), QStringLiteral("1,2,3")); + + o = createUnboundValue(o); + QVERIFY(!o.engine()); + QCOMPARE(o.toString(), QStringLiteral("1,2,3")); + } } void tst_QJSValue::toNumber() @@ -419,35 +449,43 @@ void tst_QJSValue::toNumber() QJSValue null = eng.evaluate("null"); QCOMPARE(null.toNumber(), 0.0); QCOMPARE(qjsvalue_cast<qreal>(null), 0.0); + QCOMPARE(createUnboundValue(null).toNumber(), 0.0); { QJSValue falskt = eng.toScriptValue(false); QCOMPARE(falskt.toNumber(), 0.0); + QCOMPARE(createUnboundValue(falskt).toNumber(), 0.0); QCOMPARE(qjsvalue_cast<qreal>(falskt), 0.0); QJSValue sant = eng.toScriptValue(true); QCOMPARE(sant.toNumber(), 1.0); + QCOMPARE(createUnboundValue(sant).toNumber(), 1.0); QCOMPARE(qjsvalue_cast<qreal>(sant), 1.0); QJSValue number = eng.toScriptValue(123.0); QCOMPARE(number.toNumber(), 123.0); QCOMPARE(qjsvalue_cast<qreal>(number), 123.0); + QCOMPARE(createUnboundValue(number).toNumber(), 123.0); QJSValue str = eng.toScriptValue(QString("ciao")); QCOMPARE(qIsNaN(str.toNumber()), true); QCOMPARE(qIsNaN(qjsvalue_cast<qreal>(str)), true); + QCOMPARE(qIsNaN(createUnboundValue(str).toNumber()), true); QJSValue str2 = eng.toScriptValue(QString("123")); QCOMPARE(str2.toNumber(), 123.0); QCOMPARE(qjsvalue_cast<qreal>(str2), 123.0); + QCOMPARE(createUnboundValue(str2).toNumber(), 123.0); } QJSValue object = eng.newObject(); QCOMPARE(qIsNaN(object.toNumber()), true); + QCOMPARE(qIsNaN(createUnboundValue(object).toNumber()), true); QCOMPARE(qIsNaN(qjsvalue_cast<qreal>(object)), true); QJSValue inv = QJSValue(); QVERIFY(qIsNaN(inv.toNumber())); + QCOMPARE(qIsNaN(createUnboundValue(inv).toNumber()), true); QVERIFY(qIsNaN(qjsvalue_cast<qreal>(inv))); // V2 constructors |