Throw an error if an incompatible parameter is passed to a C++ function

[ChangeLog][Important Behavior Changes][QML] Throw an error if an incompatible parameter is passed to a C++ function

Change-Id: I088e362869f7dc00ca639a0fbc4ba20cb9e82f7d
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
Maximilian Goldstein 2020-04-01 08:06:30 +02:00
parent 19850f1298
commit 63bf6ac4c4
2 changed files with 27 additions and 28 deletions

View File

@ -1298,11 +1298,16 @@ static QV4::ReturnedValue CallMethod(const QQmlObjectOrGadget &object, int index
: QString());
}
qWarning() << QLatin1String("Passing incompatible arguments to C++ functions from "
"JavaScript is dangerous and deprecated.");
qWarning() << QLatin1String("This will throw a JavaScript TypeError in future "
"releases of Qt!");
const bool is_signal =
object.metaObject()->method(index).methodType() == QMetaMethod::Signal;
if (is_signal) {
qWarning() << "Passing incomatible arguments to signals is not supported.";
} else {
return engine->throwTypeError(
"Passing incompatible arguments to C++ functions from "
"JavaScript is not allowed.");
}
}
}
QVarLengthArray<void *, 9> argData(args.count());

View File

@ -2906,32 +2906,28 @@ void tst_qqmlecmascript::callQtInvokables()
QCOMPARE(o->actuals().at(0), QVariant(QString()));
o->reset();
QVERIFY(EVALUATE_VALUE("object.method_QPointF(0)", QV4::Primitive::undefinedValue()));
QVERIFY(EVALUATE_ERROR("object.method_QPointF(0)"));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 12);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
QCOMPARE(o->invoked(), -1);
QCOMPARE(o->actuals().count(), 0);
o->reset();
QVERIFY(EVALUATE_VALUE("object.method_QPointF(null)", QV4::Primitive::undefinedValue()));
QVERIFY(EVALUATE_ERROR("object.method_QPointF(null)"));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 12);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
QCOMPARE(o->invoked(), -1);
QCOMPARE(o->actuals().count(), 0);
o->reset();
QVERIFY(EVALUATE_VALUE("object.method_QPointF(undefined)", QV4::Primitive::undefinedValue()));
QVERIFY(EVALUATE_ERROR("object.method_QPointF(undefined)"));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 12);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
QCOMPARE(o->invoked(), -1);
QCOMPARE(o->actuals().count(), 0);
o->reset();
QVERIFY(EVALUATE_VALUE("object.method_QPointF(object)", QV4::Primitive::undefinedValue()));
QVERIFY(EVALUATE_ERROR("object.method_QPointF(object)"));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 12);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
QCOMPARE(o->invoked(), -1);
QCOMPARE(o->actuals().count(), 0);
o->reset();
QVERIFY(EVALUATE_VALUE("object.method_QPointF(object.method_get_QPointF())", QV4::Primitive::undefinedValue()));
@ -2948,18 +2944,16 @@ void tst_qqmlecmascript::callQtInvokables()
QCOMPARE(o->actuals().at(0), QVariant(QPointF(9, 12)));
o->reset();
QVERIFY(EVALUATE_VALUE("object.method_QObject(0)", QV4::Primitive::undefinedValue()));
QVERIFY(EVALUATE_ERROR("object.method_QObject(0)"));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 13);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant::fromValue((QObject *)nullptr));
QCOMPARE(o->invoked(), -1);
QCOMPARE(o->actuals().count(), 0);
o->reset();
QVERIFY(EVALUATE_VALUE("object.method_QObject(\"Hello world\")", QV4::Primitive::undefinedValue()));
QVERIFY(EVALUATE_ERROR("object.method_QObject(\"Hello world\")"));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 13);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant::fromValue((QObject *)nullptr));
QCOMPARE(o->invoked(), -1);
QCOMPARE(o->actuals().count(), 0);
o->reset();
QVERIFY(EVALUATE_VALUE("object.method_QObject(null)", QV4::Primitive::undefinedValue()));