diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2010-04-08 06:13:31 (GMT) |
---|---|---|
committer | Aaron Kennedy <aaron.kennedy@nokia.com> | 2010-04-08 06:18:43 (GMT) |
commit | df1788b4dbbb2826ae63f26bdf166342595343f4 (patch) | |
tree | b021f683c6da72f9c46d0decbf0f8aa97dd2a9d4 /tests | |
parent | 942a605a52dbbd6dfa824e3b76e37576c7d79f6e (diff) | |
download | Qt-df1788b4dbbb2826ae63f26bdf166342595343f4.zip Qt-df1788b4dbbb2826ae63f26bdf166342595343f4.tar.gz Qt-df1788b4dbbb2826ae63f26bdf166342595343f4.tar.bz2 |
Cleanup handling of errors in bindings and scripts
QML used to silently ignore a log of errors - such as a failed assignment
to a QObject property. These errors are now all reported as exceptions
in JavaScript.
Other questionable activities, like assigning a JavaScript array to a
"property var" property which appeared to work, thanks to QtScript's
transparent conversion of arrays to a QVariantList, are now blocked
entirely.
QTBUG-9152 QTBUG-9382 QTBUG-9341 QTBUG-6886
Diffstat (limited to 'tests')
3 files changed, 80 insertions, 0 deletions
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/functionErrors.qml b/tests/auto/declarative/qdeclarativeecmascript/data/functionErrors.qml new file mode 100644 index 0000000..4aca111 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/functionErrors.qml @@ -0,0 +1,10 @@ +import Qt 4.6 + +QtObject { + function myFunction() { + a = 10; + } + + Component.onCompleted: myFunction(); +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/propertyAssignmentErrors.qml b/tests/auto/declarative/qdeclarativeecmascript/data/propertyAssignmentErrors.qml new file mode 100644 index 0000000..483179a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/propertyAssignmentErrors.qml @@ -0,0 +1,28 @@ +import Qt 4.6 + +QtObject { + id: root + + property int a + property var b + + Component.onCompleted: { + try { + root.a = undefined; + } catch(e) { + console.log (e.fileName + ":" + e.lineNumber + ":" + e); + } + + try { + root.b = [ 10, root ] + } catch(e) { + console.log (e.fileName + ":" + e.lineNumber + ":" + e); + } + + try { + root.a = "Hello"; + } catch(e) { + console.log (e.fileName + ":" + e.lineNumber + ":" + e); + } + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp index 8e73afa..32d407f 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp +++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp @@ -108,6 +108,8 @@ private slots: void selfDeletingBinding(); void extendedObjectPropertyLookup(); void scriptErrors(); + void functionErrors(); + void propertyAssignmentErrors(); void signalTriggeredBindings(); void listProperties(); void exceptionClearsOnReeval(); @@ -995,6 +997,46 @@ void tst_qdeclarativeecmascript::scriptErrors() } /* +Test file/lineNumbers for inline functions. +*/ +void tst_qdeclarativeecmascript::functionErrors() +{ + QDeclarativeComponent component(&engine, TEST_FILE("functionErrors.qml")); + QString url = component.url().toString(); + + QString warning = url + ":5: Error: Invalid write to global property \"a\""; + + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData()); + + QObject *object = component.create(); + QVERIFY(object != 0); + delete object; +} + +/* +Test various errors that can occur when assigning a property from script +*/ +void tst_qdeclarativeecmascript::propertyAssignmentErrors() +{ + QDeclarativeComponent component(&engine, TEST_FILE("propertyAssignmentErrors.qml")); + + QString url = component.url().toString(); + + QString warning1 = url + ":11:Error: Cannot assign [undefined] to int"; + QString warning2 = url + ":17:Error: Cannot assign JavaScript array to QML variant property"; + QString warning3 = url + ":23:Error: Cannot assign QString to int"; + + QTest::ignoreMessage(QtDebugMsg, warning1.toLatin1().constData()); + QTest::ignoreMessage(QtDebugMsg, warning2.toLatin1().constData()); + QTest::ignoreMessage(QtDebugMsg, warning3.toLatin1().constData()); + + QObject *object = component.create(); + QVERIFY(object != 0); + + delete object; +} + +/* Test bindings still work when the reeval is triggered from within a signal script. */ |