From bc8b25dd91e931e892f478ea5ec8f0e3062655ff Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Wed, 18 Sep 2013 13:29:38 +0200 Subject: [PATCH] Correctly convert an invalid QDateTime to JS Task-number: QTBUG-33539 Change-Id: I645db2e12e3b46731c0bef04e2d48abb71650974 Reviewed-by: Simon Hausmann --- src/qml/jsruntime/qv4dateobject.cpp | 2 +- tests/auto/qml/qqmlecmascript/data/date.qml | 20 +++++++++++++++++++ tests/auto/qml/qqmlecmascript/testtypes.cpp | 11 ++++++++++ .../qml/qqmlecmascript/tst_qqmlecmascript.cpp | 20 +++++++++++++++++++ 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 tests/auto/qml/qqmlecmascript/data/date.qml diff --git a/src/qml/jsruntime/qv4dateobject.cpp b/src/qml/jsruntime/qv4dateobject.cpp index 7707d188ee..76d712656a 100644 --- a/src/qml/jsruntime/qv4dateobject.cpp +++ b/src/qml/jsruntime/qv4dateobject.cpp @@ -641,7 +641,7 @@ DateObject::DateObject(ExecutionEngine *engine, const QDateTime &date) { vtbl = &static_vtbl; type = Type_DateObject; - value = Value::fromDouble(date.toMSecsSinceEpoch()); + value.setDouble(date.isValid() ? date.toMSecsSinceEpoch() : qSNaN()); } QDateTime DateObject::toQDateTime() const diff --git a/tests/auto/qml/qqmlecmascript/data/date.qml b/tests/auto/qml/qqmlecmascript/data/date.qml new file mode 100644 index 0000000000..0dcba71ae3 --- /dev/null +++ b/tests/auto/qml/qqmlecmascript/data/date.qml @@ -0,0 +1,20 @@ +import QtQuick 2.0 +import Qt.test 1.0 + +Item { + MyDateClass { + id: mdc + } + + function test_is_invalid_qtDateTime() + { + var dt = mdc.invalidDate(); + return isNaN(dt); + } + + function test_is_invalid_jsDateTime() + { + var dt = new Date(""); + return isNaN(dt); + } +} diff --git a/tests/auto/qml/qqmlecmascript/testtypes.cpp b/tests/auto/qml/qqmlecmascript/testtypes.cpp index 919e06d7ee..a09bd9f3c6 100644 --- a/tests/auto/qml/qqmlecmascript/testtypes.cpp +++ b/tests/auto/qml/qqmlecmascript/testtypes.cpp @@ -225,6 +225,16 @@ void MyWorkerObject::doIt() new MyWorkerObjectThread(this); } +class MyDateClass : public QObject +{ + Q_OBJECT +public: + Q_INVOKABLE QDateTime invalidDate() + { + return QDateTime(); + } +}; + class MyStringClass : public QObject { Q_OBJECT @@ -317,6 +327,7 @@ void registerTypes() qmlRegisterType("Qt.test.fallbackBindingsObject", 1, 0, "FallbackBindingsType"); qmlRegisterType("Qt.test.fallbackBindingsDerived", 1, 0, "FallbackBindingsType"); + qmlRegisterType("Qt.test", 1, 0, "MyDateClass"); qmlRegisterType("Qt.test", 1, 0, "MyStringClass"); qmlRegisterSingletonType("Qt.test.importOrderApi",1,0,"Data",testImportOrder_api); diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp index 892e708aa4..837b73dfa9 100644 --- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp +++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp @@ -209,6 +209,7 @@ private slots: void assignSequenceTypes(); void sequenceSort_data(); void sequenceSort(); + void dateParse(); void qtbug_22464(); void qtbug_21580(); void singleV8BindingDestroyedDuringEvaluation(); @@ -7204,6 +7205,25 @@ void tst_qqmlecmascript::sequenceSort() delete object; } +void tst_qqmlecmascript::dateParse() +{ + QQmlComponent component(&engine, testFileUrl("date.qml")); + + QObject *object = component.create(); + if (object == 0) + qDebug() << component.errorString(); + QVERIFY(object != 0); + + QVariant q; + QMetaObject::invokeMethod(object, "test_is_invalid_jsDateTime", Q_RETURN_ARG(QVariant, q)); + QVERIFY(q.toBool() == true); + + QMetaObject::invokeMethod(object, "test_is_invalid_qtDateTime", Q_RETURN_ARG(QVariant, q)); + QVERIFY(q.toBool() == true); + + +} + void tst_qqmlecmascript::concatenatedStringPropertyAccess() { QQmlComponent component(&engine, testFileUrl("concatenatedStringPropertyAccess.qml"));