aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2013-09-29 21:20:09 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-30 18:21:26 +0200
commitc48d727e25f0a07d709a81765af6196bc0ddb4c5 (patch)
tree1ad34d61bf20e8756d52f44fd17956844a793d84 /tests
parent2b6dfcf23b8e9d672dff0a083ed4e7adc28115eb (diff)
Compile imported scripts in the loader thread
This has the benefit of blocking the GUI thread less and speeding up type creation in the GUI thread (for types that import js libraries). This patch also brings one behavioral change: Due to the parsing at type instantiation type, things like syntax errors for script imports would only generate a run-time warning and the code in the QML file would just see "undefined". Errors in the script now generate real errors at component compilation time, meaning the errors come out earlier and as real errors. This patch implements the separation for the VME only (to keep the size of this patch small). Change-Id: I82f7f3a2d3d4524ea12a7ab62abd8640aba6a47f Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp63
1 files changed, 42 insertions, 21 deletions
diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
index 0ea6a25afb..5f923c7a21 100644
--- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
+++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
@@ -3932,6 +3932,7 @@ void tst_qqmlecmascript::verifyContextLifetime(QQmlContextData *ctxt) {
void tst_qqmlecmascript::importScripts_data()
{
QTest::addColumn<QUrl>("testfile");
+ QTest::addColumn<bool>("compilationShouldSucceed");
QTest::addColumn<QString>("errorMessage");
QTest::addColumn<QStringList>("warningMessages");
QTest::addColumn<QStringList>("propertyNames");
@@ -3939,6 +3940,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("basic functionality")
<< testFileUrl("jsimport/testImport.qml")
+ << true /* compilation should succeed */
<< QString()
<< QStringList()
<< (QStringList() << QLatin1String("importedScriptStringValue")
@@ -3952,6 +3954,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("import scoping")
<< testFileUrl("jsimport/testImportScoping.qml")
+ << true /* compilation should succeed */
<< QString()
<< QStringList()
<< (QStringList() << QLatin1String("componentError"))
@@ -3959,6 +3962,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("parent scope shouldn't be inherited by import with imports")
<< testFileUrl("jsimportfail/failOne.qml")
+ << true /* compilation should succeed */
<< QString()
<< (QStringList() << QString(testFileUrl("jsimportfail/failOne.qml").toString() + QLatin1String(":6: TypeError: Cannot call method 'greetingString' of undefined")))
<< (QStringList() << QLatin1String("importScriptFunctionValue"))
@@ -3966,6 +3970,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("javascript imports in an import should be private to the import scope")
<< testFileUrl("jsimportfail/failTwo.qml")
+ << true /* compilation should succeed */
<< QString()
<< (QStringList() << QString(testFileUrl("jsimportfail/failTwo.qml").toString() + QLatin1String(":6: ReferenceError: ImportOneJs is not defined")))
<< (QStringList() << QLatin1String("importScriptFunctionValue"))
@@ -3973,6 +3978,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("module imports in an import should be private to the import scope")
<< testFileUrl("jsimportfail/failThree.qml")
+ << true /* compilation should succeed */
<< QString()
<< (QStringList() << QString(testFileUrl("jsimportfail/failThree.qml").toString() + QLatin1String(":7: TypeError: Cannot read property 'JsQtTest' of undefined")))
<< (QStringList() << QLatin1String("importedModuleAttachedPropertyValue"))
@@ -3980,6 +3986,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("typenames in an import should be private to the import scope")
<< testFileUrl("jsimportfail/failFour.qml")
+ << true /* compilation should succeed */
<< QString()
<< (QStringList() << QString(testFileUrl("jsimportfail/failFour.qml").toString() + QLatin1String(":6: ReferenceError: JsQtTest is not defined")))
<< (QStringList() << QLatin1String("importedModuleEnumValue"))
@@ -3987,6 +3994,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("import with imports has it's own activation scope")
<< testFileUrl("jsimportfail/failFive.qml")
+ << true /* compilation should succeed */
<< QString()
<< (QStringList() << QString(testFileUrl("jsimportfail/importWithImports.js").toString() + QLatin1String(":8: ReferenceError: Component is not defined")))
<< (QStringList() << QLatin1String("componentError"))
@@ -3994,6 +4002,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("import pragma library script")
<< testFileUrl("jsimport/testImportPragmaLibrary.qml")
+ << true /* compilation should succeed */
<< QString()
<< QStringList()
<< (QStringList() << QLatin1String("testValue"))
@@ -4001,6 +4010,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("pragma library imports shouldn't inherit parent imports or scope")
<< testFileUrl("jsimportfail/testImportPragmaLibrary.qml")
+ << true /* compilation should succeed */
<< QString()
<< (QStringList() << QString(testFileUrl("jsimportfail/importPragmaLibrary.js").toString() + QLatin1String(":6: ReferenceError: Component is not defined")))
<< (QStringList() << QLatin1String("testValue"))
@@ -4008,6 +4018,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("import pragma library script which has an import")
<< testFileUrl("jsimport/testImportPragmaLibraryWithImports.qml")
+ << true /* compilation should succeed */
<< QString()
<< QStringList()
<< (QStringList() << QLatin1String("testValue"))
@@ -4015,6 +4026,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("import pragma library script which has a pragma library import")
<< testFileUrl("jsimport/testImportPragmaLibraryWithPragmaLibraryImports.qml")
+ << true /* compilation should succeed */
<< QString()
<< QStringList()
<< (QStringList() << QLatin1String("testValue"))
@@ -4022,6 +4034,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("import singleton type into js import")
<< testFileUrl("jsimport/testImportSingletonType.qml")
+ << true /* compilation should succeed */
<< QString()
<< QStringList()
<< (QStringList() << QLatin1String("testValue"))
@@ -4029,6 +4042,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("import module which exports a script")
<< testFileUrl("jsimport/testJsImport.qml")
+ << true /* compilation should succeed */
<< QString()
<< QStringList()
<< (QStringList() << QLatin1String("importedScriptStringValue")
@@ -4040,6 +4054,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("import module which exports a script which imports a remote module")
<< testFileUrl("jsimport/testJsRemoteImport.qml")
+ << true /* compilation should succeed */
<< QString()
<< QStringList()
<< (QStringList() << QLatin1String("importedScriptStringValue")
@@ -4051,6 +4066,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("malformed import statement")
<< testFileUrl("jsimportfail/malformedImport.qml")
+ << false /* compilation should succeed */
<< QString()
<< (QStringList() << testFileUrl("jsimportfail/malformedImport.js").toString() + QLatin1String(":1:1: Syntax error"))
<< QStringList()
@@ -4058,6 +4074,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("malformed file name")
<< testFileUrl("jsimportfail/malformedFile.qml")
+ << false /* compilation should succeed */
<< QString()
<< (QStringList() << testFileUrl("jsimportfail/malformedFile.js").toString() + QLatin1String(":1:9: Imported file must be a script"))
<< QStringList()
@@ -4065,6 +4082,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("missing file qualifier")
<< testFileUrl("jsimportfail/missingFileQualifier.qml")
+ << false /* compilation should succeed */
<< QString()
<< (QStringList() << testFileUrl("jsimportfail/missingFileQualifier.js").toString() + QLatin1String(":1:1: File import requires a qualifier"))
<< QStringList()
@@ -4072,6 +4090,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("malformed file qualifier")
<< testFileUrl("jsimportfail/malformedFileQualifier.qml")
+ << false /* compilation should succeed */
<< QString()
<< (QStringList() << testFileUrl("jsimportfail/malformedFileQualifier.js").toString() + QLatin1String(":1:20: File import requires a qualifier"))
<< QStringList()
@@ -4079,6 +4098,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("malformed module qualifier 2")
<< testFileUrl("jsimportfail/malformedFileQualifier.2.qml")
+ << false /* compilation should succeed */
<< QString()
<< (QStringList() << testFileUrl("jsimportfail/malformedFileQualifier.2.js").toString() + QLatin1String(":1:1: Invalid import qualifier"))
<< QStringList()
@@ -4086,6 +4106,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("malformed module uri")
<< testFileUrl("jsimportfail/malformedModule.qml")
+ << false /* compilation should succeed */
<< QString()
<< (QStringList() << testFileUrl("jsimportfail/malformedModule.js").toString() + QLatin1String(":1:17: Invalid module URI"))
<< QStringList()
@@ -4093,6 +4114,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("missing module version")
<< testFileUrl("jsimportfail/missingModuleVersion.qml")
+ << false /* compilation should succeed */
<< QString()
<< (QStringList() << testFileUrl("jsimportfail/missingModuleVersion.js").toString() + QLatin1String(":1:17: Module import requires a version"))
<< QStringList()
@@ -4100,6 +4122,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("malformed module version")
<< testFileUrl("jsimportfail/malformedModuleVersion.qml")
+ << false /* compilation should succeed */
<< QString()
<< (QStringList() << testFileUrl("jsimportfail/malformedModuleVersion.js").toString() + QLatin1String(":1:17: Module import requires a version"))
<< QStringList()
@@ -4107,6 +4130,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("missing module qualifier")
<< testFileUrl("jsimportfail/missingModuleQualifier.qml")
+ << false /* compilation should succeed */
<< QString()
<< (QStringList() << testFileUrl("jsimportfail/missingModuleQualifier.js").toString() + QLatin1String(":1:1: Module import requires a qualifier"))
<< QStringList()
@@ -4114,6 +4138,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("malformed module qualifier")
<< testFileUrl("jsimportfail/malformedModuleQualifier.qml")
+ << false /* compilation should succeed */
<< QString()
<< (QStringList() << testFileUrl("jsimportfail/malformedModuleQualifier.js").toString() + QLatin1String(":1:21: Module import requires a qualifier"))
<< QStringList()
@@ -4121,6 +4146,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("malformed module qualifier 2")
<< testFileUrl("jsimportfail/malformedModuleQualifier.2.qml")
+ << false /* compilation should succeed */
<< QString()
<< (QStringList() << testFileUrl("jsimportfail/malformedModuleQualifier.2.js").toString() + QLatin1String(":1:1: Invalid import qualifier"))
<< QStringList()
@@ -4130,8 +4156,9 @@ void tst_qqmlecmascript::importScripts_data()
void tst_qqmlecmascript::importScripts()
{
QFETCH(QUrl, testfile);
+ QFETCH(bool, compilationShouldSucceed);
QFETCH(QString, errorMessage);
- QFETCH(QStringList, warningMessages);
+ QFETCH(QStringList, warningMessages); // error messages if !compilationShouldSucceed
QFETCH(QStringList, propertyNames);
QFETCH(QVariantList, propertyValues);
@@ -4149,11 +4176,19 @@ void tst_qqmlecmascript::importScripts()
if (!errorMessage.isEmpty())
QTest::ignoreMessage(QtWarningMsg, errorMessage.toLatin1().constData());
- if (warningMessages.size())
+ if (compilationShouldSucceed && warningMessages.size())
foreach (const QString &warning, warningMessages)
QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData());
- QTRY_VERIFY(component.isReady());
+ if (compilationShouldSucceed)
+ QTRY_VERIFY(component.isReady());
+ else {
+ QVERIFY(component.isError());
+ QCOMPARE(warningMessages.size(), 1);
+ QCOMPARE(component.errors().count(), 2);
+ QCOMPARE(component.errors().at(1).toString(), warningMessages.first());
+ return;
+ }
QObject *object = component.create();
if (!errorMessage.isEmpty()) {
@@ -6653,26 +6688,12 @@ void tst_qqmlecmascript::qtbug_22843()
fileName += QLatin1String(".qml");
QQmlComponent component(&engine, testFileUrl(fileName));
+
QString url = component.url().toString();
- QString warning1 = url.left(url.length()-3) + QLatin1String("js:4:16: Expected token `;'");
- QString warning2 = url + QLatin1String(":5: TypeError: Cannot call method 'func' of undefined");
+ QString expectedError = url.left(url.length()-3) + QLatin1String("js:4:16: Expected token `;'");
- qRegisterMetaType<QList<QQmlError> >("QList<QQmlError>");
- QSignalSpy warningsSpy(&engine, SIGNAL(warnings(QList<QQmlError>)));
- for (int x = 0; x < 3; ++x) {
- warningsSpy.clear();
- // For libraries, only the first import attempt should produce a
- // SyntaxError warning; subsequent component creation should not
- // attempt to reload the script.
- bool expectSyntaxError = !library || (x == 0);
- if (expectSyntaxError)
- QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
- QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
- QObject *object = component.create();
- QVERIFY(object != 0);
- QCOMPARE(warningsSpy.count(), 1 + (expectSyntaxError?1:0));
- delete object;
- }
+ QVERIFY(component.isError());
+ QCOMPARE(component.errors().value(1).toString(), expectedError);
}