aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-08-04 15:27:24 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2014-08-06 09:56:49 +0200
commit2121de6d8762ec2fc90a07e207824090e8447291 (patch)
treef061114b33c8b52ecc947e7b69bd7d0eef126a42
parentc85bfba382ca1ddf0573c8f59e95b25f804b83ff (diff)
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 <lars.knoll@digia.com>
-rw-r--r--src/qml/jsruntime/qv4include.cpp24
-rw-r--r--tests/auto/qml/qqmlecmascript/qqmlecmascript.pro2
-rw-r--r--tests/auto/qml/qqmlecmascript/qqmlecmascript.qrc8
-rw-r--r--tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp17
4 files changed, 43 insertions, 8 deletions
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<QV4::Script> 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 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+<file>data/include.qml</file>
+<file>data/include.js</file>
+<file>data/js/include2.js</file>
+<file>data/js/include3.js</file>
+</qresource>
+</RCC>
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()