From 2121de6d8762ec2fc90a07e207824090e8447291 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Mon, 4 Aug 2014 15:27:24 +0200 Subject: Fix Qt.include with cached compilation units and resources Similar to the worker scripts we also need to do a lookup for cached scripts here. Added also a test to ensure that Qt.include works correctly from Qt resources. Change-Id: Idb67af3da4b0cc91edbd3d2746d074fd68ed8bf0 Reviewed-by: Lars Knoll --- src/qml/jsruntime/qv4include.cpp | 24 ++++++++++++++-------- tests/auto/qml/qqmlecmascript/qqmlecmascript.pro | 2 ++ tests/auto/qml/qqmlecmascript/qqmlecmascript.qrc | 8 ++++++++ .../auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp | 17 +++++++++++++++ 4 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 tests/auto/qml/qqmlecmascript/qqmlecmascript.qrc diff --git a/src/qml/jsruntime/qv4include.cpp b/src/qml/jsruntime/qv4include.cpp index d5bae0e35e..2661ecc346 100644 --- a/src/qml/jsruntime/qv4include.cpp +++ b/src/qml/jsruntime/qv4include.cpp @@ -210,20 +210,28 @@ QV4::ReturnedValue QV4Include::method_include(QV4::CallContext *ctx) result = i->result(); } else { + QScopedPointer script; - QFile f(localFile); + if (const QQmlPrivate::CachedQmlUnit *cachedUnit = QQmlMetaType::findCachedCompilationUnit(url)) { + QV4::CompiledData::CompilationUnit *jsUnit = cachedUnit->createCompilationUnit(); + script.reset(new QV4::Script(v4, qmlcontextobject, jsUnit)); + } else { + QFile f(localFile); - if (f.open(QIODevice::ReadOnly)) { - QByteArray data = f.readAll(); - QString code = QString::fromUtf8(data); - QmlIR::Document::removeScriptPragmas(code); + if (f.open(QIODevice::ReadOnly)) { + QByteArray data = f.readAll(); + QString code = QString::fromUtf8(data); + QmlIR::Document::removeScriptPragmas(code); - QV4::Script script(v4, qmlcontextobject, code, url.toString()); + script.reset(new QV4::Script(v4, qmlcontextobject, code, url.toString())); + } + } + if (!script.isNull()) { QV4::ExecutionContext *ctx = v4->currentContext(); - script.parse(); + script->parse(); if (!v4->hasException) - script.run(); + script->run(); if (v4->hasException) { QV4::ScopedValue ex(scope, ctx->catchException()); result = resultValue(v4, Exception); diff --git a/tests/auto/qml/qqmlecmascript/qqmlecmascript.pro b/tests/auto/qml/qqmlecmascript/qqmlecmascript.pro index 6193ee7c88..6f3f765aba 100644 --- a/tests/auto/qml/qqmlecmascript/qqmlecmascript.pro +++ b/tests/auto/qml/qqmlecmascript/qqmlecmascript.pro @@ -9,6 +9,8 @@ HEADERS += testtypes.h \ ../../shared/testhttpserver.h INCLUDEPATH += ../../shared +RESOURCES += qqmlecmascript.qrc + include (../../shared/util.pri) # QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage diff --git a/tests/auto/qml/qqmlecmascript/qqmlecmascript.qrc b/tests/auto/qml/qqmlecmascript/qqmlecmascript.qrc new file mode 100644 index 0000000000..e0e29ad4a5 --- /dev/null +++ b/tests/auto/qml/qqmlecmascript/qqmlecmascript.qrc @@ -0,0 +1,8 @@ + + +data/include.qml +data/include.js +data/js/include2.js +data/js/include3.js + + diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp index a9486a8e63..34413b23de 100644 --- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp +++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp @@ -6016,6 +6016,23 @@ void tst_qqmlecmascript::include() delete o; } + + // include from resources + { + QQmlComponent component(&engine, QUrl("qrc:///data/include.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test0").toInt(), 99); + QCOMPARE(o->property("test1").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + QCOMPARE(o->property("test2_1").toBool(), true); + QCOMPARE(o->property("test3").toBool(), true); + QCOMPARE(o->property("test3_1").toBool(), true); + + delete o; + } + } void tst_qqmlecmascript::includeRemoteSuccess() -- cgit v1.2.3