aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp')
-rw-r--r--tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp654
1 files changed, 207 insertions, 447 deletions
diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
index c417879d3c..cb1b0b3212 100644
--- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
+++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
@@ -50,10 +50,11 @@
#include <QtCore/qnumeric.h>
#include <private/qqmlengine_p.h>
#include <private/qqmlvmemetaobject_p.h>
-#include <private/qv4compiler_p.h>
+#include <private/qqmlcontextwrapper_p.h>
#include "testtypes.h"
#include "testhttpserver.h"
#include "../../shared/util.h"
+#include <private/qv4functionobject_p.h>
/*
This test covers evaluation of ECMAScript expressions and bindings from within
@@ -219,7 +220,6 @@ private slots:
void functionAssignment_afterBinding();
void eval();
void function();
- void functionException();
void qtbug_10696();
void qtbug_11606();
void qtbug_11600();
@@ -293,7 +293,7 @@ private slots:
void stringParsing();
private:
- static void propertyVarWeakRefCallback(v8::Persistent<v8::Value> object, void* parameter);
+// static void propertyVarWeakRefCallback(v8::Persistent<v8::Value> object, void* parameter);
static void verifyContextLifetime(QQmlContextData *ctxt);
QQmlEngine engine;
};
@@ -546,7 +546,6 @@ void tst_qqmlecmascript::signalArguments()
emit object->basicSignal();
QCOMPARE(object->string(), QString("pass"));
QCOMPARE(object->property("argumentCount").toInt(), 0);
- QCOMPARE(object->property("calleeCorrect").toBool(), true);
delete object;
}
@@ -558,7 +557,6 @@ void tst_qqmlecmascript::signalArguments()
emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
QCOMPARE(object->string(), QString("pass 19 Hello world! 10.25 3 2"));
QCOMPARE(object->property("argumentCount").toInt(), 5);
- QCOMPARE(object->property("calleeCorrect").toBool(), true);
delete object;
}
}
@@ -619,7 +617,7 @@ void tst_qqmlecmascript::methods()
void tst_qqmlecmascript::bindingLoop()
{
QQmlComponent component(&engine, testFileUrl("bindingLoop.qml"));
- QString warning = component.url().toString() + ":9:9: QML MyQmlObject: Binding loop detected for property \"stringProperty\"";
+ QString warning = component.url().toString() + ":5:9: QML MyQmlObject: Binding loop detected for property \"stringProperty\"";
QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData());
QObject *object = component.create();
QVERIFY(object != 0);
@@ -858,7 +856,7 @@ void tst_qqmlecmascript::deferredPropertiesErrors()
QVERIFY(object->objectProperty() == 0);
QVERIFY(object->objectProperty2() == 0);
- QString warning = component.url().toString() + ":6: Unable to assign [undefined] to QObject*";
+ QString warning = component.url().toString() + ":6:21: Unable to assign [undefined] to QObject*";
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
qmlExecuteDeferred(object);
@@ -1006,13 +1004,13 @@ void tst_qqmlecmascript::enums()
{
QUrl file = testFileUrl("enums.2.qml");
QString w1 = QLatin1String("QMetaProperty::read: Unable to handle unregistered datatype 'MyEnum' for property 'MyUnregisteredEnumTypeObject::enumProperty'");
- QString w2 = QLatin1String("QQmlExpression: Expression ") + testFileUrl("enums.2.qml").toString() + QLatin1String(":9 depends on non-NOTIFYable properties:");
+ QString w2 = QLatin1String("QQmlExpression: Expression ") + testFileUrl("enums.2.qml").toString() + QLatin1String(":9:21 depends on non-NOTIFYable properties:");
QString w3 = QLatin1String(" MyUnregisteredEnumTypeObject::enumProperty");
- QString w4 = file.toString() + ":7: Unable to assign [undefined] to int";
- QString w5 = file.toString() + ":8: Unable to assign [undefined] to int";
- QString w6 = file.toString() + ":9: Unable to assign [undefined] to int";
- QString w7 = file.toString() + ":13: Unable to assign [undefined] to [unknown property type]";
- QString w8 = file.toString() + ":31: Unable to assign int to [unknown property type]";
+ QString w4 = file.toString() + ":7:21: Unable to assign [undefined] to int";
+ QString w5 = file.toString() + ":8:21: Unable to assign [undefined] to int";
+ QString w6 = file.toString() + ":9:21: Unable to assign [undefined] to int";
+ QString w7 = file.toString() + ":13:23: Unable to assign [undefined] to [unknown property type]";
+ QString w8 = file.toString() + ":31:23: Unable to assign int to [unknown property type]";
QTest::ignoreMessage(QtWarningMsg, qPrintable(w1));
QTest::ignoreMessage(QtWarningMsg, qPrintable(w2));
QTest::ignoreMessage(QtWarningMsg, qPrintable(w3));
@@ -1206,7 +1204,7 @@ void tst_qqmlecmascript::nonExistentAttachedObject()
{
QQmlComponent component(&engine, testFileUrl("nonExistentAttachedObject.qml"));
- QString warning = component.url().toString() + ":4: Unable to assign [undefined] to QString";
+ QString warning = component.url().toString() + ":4:21: Unable to assign [undefined] to QString";
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
QObject *object = component.create();
@@ -1257,6 +1255,7 @@ void tst_qqmlecmascript::scope()
QVERIFY(object != 0);
QCOMPARE(object->property("test1").toBool(), true);
+ QEXPECT_FAIL("", "Lookup in the global object vs. the QML context is not 100% correct right now ", Continue);
QCOMPARE(object->property("test2").toBool(), true);
QCOMPARE(object->property("test3").toBool(), true);
@@ -1682,6 +1681,7 @@ void tst_qqmlecmascript::objectHasOwnProperty()
QVERIFY(object != 0);
// test QObjects in QML
+ QEXPECT_FAIL("", "hasOwnProperty is currently not properly supported for dynamic objects that re-implement get()", Abort);
QMetaObject::invokeMethod(object, "testHasOwnPropertySuccess");
QVERIFY(object->property("result").value<bool>() == true);
QMetaObject::invokeMethod(object, "testHasOwnPropertyFailure");
@@ -1783,8 +1783,8 @@ void tst_qqmlecmascript::scriptErrors()
QString warning3 = url.left(url.length() - 3) + "js:4: Error: Invalid write to global property \"a\"";
QString warning4 = url + ":13: ReferenceError: a is not defined";
QString warning5 = url + ":11: ReferenceError: a is not defined";
- QString warning6 = url + ":10: Unable to assign [undefined] to int";
- QString warning7 = url + ":15: Error: Cannot assign to read-only property \"trueProperty\"";
+ QString warning6 = url + ":10:21: Unable to assign [undefined] to int";
+ QString warning7 = url + ":15: TypeError: Cannot assign to read-only property \"trueProperty\"";
QString warning8 = url + ":16: Error: Cannot assign to non-existent property \"fakeProperty\"";
QTest::ignoreMessage(QtWarningMsg, warning1.toLatin1().constData());
@@ -1829,7 +1829,9 @@ void tst_qqmlecmascript::functionErrors()
object = componentTwo.create();
QVERIFY(object != 0);
- warning = url + QLatin1String(":16: TypeError: Property 'scarceResource' of object [object Object] is not a function");
+ QObject *resource = qobject_cast<ScarceResourceObject*>(QQmlProperty::read(object, "a").value<QObject*>());
+ warning = url + QLatin1String(":16: TypeError: Property 'scarceResource' of object ScarceResourceObject(0x%1) is not a function");
+ warning = warning.arg(QString::number((qintptr)resource, 16));
QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData()); // we expect a meaningful warning to be printed.
QMetaObject::invokeMethod(object, "retrieveScarceResource");
delete object;
@@ -2197,63 +2199,72 @@ void tst_qqmlecmascript::regExpBug()
}
}
-static inline bool evaluate_error(QV8Engine *engine, v8::Handle<v8::Object> o, const char *source)
+static inline bool evaluate_error(QV8Engine *engine, const QV4::Value &o, const char *source)
{
QString functionSource = QLatin1String("(function(object) { return ") +
QLatin1String(source) + QLatin1String(" })");
- v8::TryCatch tc;
- v8::Local<v8::Script> program = v8::Script::Compile(engine->toString(functionSource));
- if (tc.HasCaught())
- return false;
- v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast(program->Run());
- if (function.IsEmpty())
- return false;
- v8::Handle<v8::Value> args[] = { o };
- function->Call(engine->global(), 1, args);
- return tc.HasCaught();
+
+ QV4::Script program(QV8Engine::getV4(engine)->rootContext, functionSource);
+ program.inheritContext = true;
+
+ QV4::ExecutionContext *ctx = QV8Engine::getV4(engine)->current;
+
+ try {
+ QV4::FunctionObject *function = program.run().asFunctionObject();
+ if (!function)
+ return false;
+ QV4::Value args[] = { o };
+ function->call(engine->global(), args, 1);
+ } catch (QV4::Exception &e) {
+ e.accept(ctx);
+ return true;
+ }
+ return false;
}
-static inline bool evaluate_value(QV8Engine *engine, v8::Handle<v8::Object> o,
- const char *source, v8::Handle<v8::Value> result)
+static inline bool evaluate_value(QV8Engine *engine, const QV4::Value &o,
+ const char *source, const QV4::Value &result)
{
QString functionSource = QLatin1String("(function(object) { return ") +
QLatin1String(source) + QLatin1String(" })");
- v8::TryCatch tc;
- v8::Local<v8::Script> program = v8::Script::Compile(engine->toString(functionSource));
- if (tc.HasCaught())
- return false;
- v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast(program->Run());
- if (function.IsEmpty())
- return false;
- v8::Handle<v8::Value> args[] = { o };
-
- v8::Handle<v8::Value> value = function->Call(engine->global(), 1, args);
- if (tc.HasCaught())
- return false;
+ QV4::Script program(QV8Engine::getV4(engine)->rootContext, functionSource);
+ program.inheritContext = true;
- return value->StrictEquals(result);
+ QV4::ExecutionContext *ctx = QV8Engine::getV4(engine)->current;
+ try {
+ QV4::FunctionObject *function = program.run().asFunctionObject();
+ if (!function)
+ return false;
+ QV4::Value args[] = { o };
+ QV4::Value value = function->call(engine->global(), args, 1);
+ return __qmljs_strict_equal(value, result);
+ } catch (QV4::Exception &e) {
+ e.accept(ctx);
+ }
+ return false;
}
-static inline v8::Handle<v8::Value> evaluate(QV8Engine *engine, v8::Handle<v8::Object> o,
+static inline QV4::Value evaluate(QV8Engine *engine, const QV4::Value & o,
const char *source)
{
QString functionSource = QLatin1String("(function(object) { return ") +
QLatin1String(source) + QLatin1String(" })");
- v8::TryCatch tc;
- v8::Local<v8::Script> program = v8::Script::Compile(engine->toString(functionSource));
- if (tc.HasCaught())
- return v8::Handle<v8::Value>();
- v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast(program->Run());
- if (function.IsEmpty())
- return v8::Handle<v8::Value>();
- v8::Handle<v8::Value> args[] = { o };
- v8::Handle<v8::Value> value = function->Call(engine->global(), 1, args);
-
- if (tc.HasCaught())
- return v8::Handle<v8::Value>();
- return value;
+ QV4::ExecutionContext *ctx = QV8Engine::getV4(engine)->current;
+ QV4::Script program(QV8Engine::getV4(engine)->rootContext, functionSource);
+ program.inheritContext = true;
+ try {
+ QV4::FunctionObject *function = program.run().asFunctionObject();
+ if (!function)
+ return QV4::Value::emptyValue();
+ QV4::Value args[] = { o };
+ QV4::Value value = function->call(engine->global(), args, 1);
+ return value;
+ } catch (QV4::Exception &e) {
+ e.accept(ctx);
+ }
+ return QV4::Value::emptyValue();
}
#define EVALUATE_ERROR(source) evaluate_error(engine, object, source)
@@ -2271,10 +2282,7 @@ void tst_qqmlecmascript::callQtInvokables()
QV8Engine *engine = ep->v8engine();
- v8::HandleScope handle_scope;
- v8::Context::Scope scope(engine->context());
-
- v8::Local<v8::Object> object = engine->newQObject(o)->ToObject();
+ QV4::Value object = QV4::QObjectWrapper::wrap(QV8Engine::getV4(engine), o);
// Non-existent methods
o->reset();
@@ -2304,14 +2312,14 @@ void tst_qqmlecmascript::callQtInvokables()
// Excessive arguments
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_int(10, 11)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_int(10, 11)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 8);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(10));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_intint(10, 11, 12)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_intint(10, 11, 12)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 9);
QCOMPARE(o->actuals().count(), 2);
@@ -2320,27 +2328,27 @@ void tst_qqmlecmascript::callQtInvokables()
// Test return types
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_NoArgs()", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_NoArgs()", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 0);
QCOMPARE(o->actuals().count(), 0);
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_NoArgs_int()", v8::Integer::New(6)));
+ QVERIFY(EVALUATE_VALUE("object.method_NoArgs_int()", QV4::Value::fromInt32(6)));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 1);
QCOMPARE(o->actuals().count(), 0);
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_NoArgs_real()", v8::Number::New(19.75)));
+ QVERIFY(EVALUATE_VALUE("object.method_NoArgs_real()", QV4::Value::fromDouble(19.75)));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 2);
QCOMPARE(o->actuals().count(), 0);
o->reset();
{
- v8::Handle<v8::Value> ret = EVALUATE("object.method_NoArgs_QPointF()");
- QVERIFY(!ret.IsEmpty());
+ QV4::Value ret = EVALUATE("object.method_NoArgs_QPointF()");
+ QVERIFY(!ret.isEmpty());
QCOMPARE(engine->toVariant(ret, -1), QVariant(QPointF(123, 4.5)));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 3);
@@ -2349,8 +2357,10 @@ void tst_qqmlecmascript::callQtInvokables()
o->reset();
{
- v8::Handle<v8::Value> ret = EVALUATE("object.method_NoArgs_QObject()");
- QCOMPARE(engine->toQObject(ret), (QObject *)o);
+ QV4::Value ret = EVALUATE("object.method_NoArgs_QObject()");
+ QV4::QObjectWrapper *qobjectWrapper = ret.as<QV4::QObjectWrapper>();
+ QVERIFY(qobjectWrapper);
+ QCOMPARE(qobjectWrapper->object(), (QObject *)o);
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 4);
QCOMPARE(o->actuals().count(), 0);
@@ -2364,9 +2374,9 @@ void tst_qqmlecmascript::callQtInvokables()
o->reset();
{
- v8::Handle<v8::Value> ret = EVALUATE("object.method_NoArgs_QScriptValue()");
- QVERIFY(ret->IsString());
- QCOMPARE(engine->toString(ret), QString("Hello world"));
+ QV4::Value ret = EVALUATE("object.method_NoArgs_QScriptValue()");
+ QVERIFY(ret.isString());
+ QCOMPARE(ret.toQString(), QString("Hello world"));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 6);
QCOMPARE(o->actuals().count(), 0);
@@ -2380,49 +2390,49 @@ void tst_qqmlecmascript::callQtInvokables()
// Test arg types
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_int(94)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_int(94)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 8);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(94));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_int(\"94\")", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_int(\"94\")", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 8);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(94));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_int(\"not a number\")", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_int(\"not a number\")", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 8);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(0));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_int(null)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_int(null)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 8);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(0));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_int(undefined)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_int(undefined)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 8);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(0));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_int(object)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_int(object)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 8);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(0));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_intint(122, 9)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_intint(122, 9)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 9);
QCOMPARE(o->actuals().count(), 2);
@@ -2430,56 +2440,56 @@ void tst_qqmlecmascript::callQtInvokables()
QCOMPARE(o->actuals().at(1), QVariant(9));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_real(94.3)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_real(94.3)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 10);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(94.3));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_real(\"94.3\")", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_real(\"94.3\")", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 10);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(94.3));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_real(\"not a number\")", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_real(\"not a number\")", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 10);
QCOMPARE(o->actuals().count(), 1);
QVERIFY(qIsNaN(o->actuals().at(0).toDouble()));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_real(null)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_real(null)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 10);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(0));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_real(undefined)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_real(undefined)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 10);
QCOMPARE(o->actuals().count(), 1);
QVERIFY(qIsNaN(o->actuals().at(0).toDouble()));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_real(object)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_real(object)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 10);
QCOMPARE(o->actuals().count(), 1);
QVERIFY(qIsNaN(o->actuals().at(0).toDouble()));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QString(\"Hello world\")", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QString(\"Hello world\")", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 11);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant("Hello world"));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QString(19)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QString(19)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 11);
QCOMPARE(o->actuals().count(), 1);
@@ -2488,7 +2498,7 @@ void tst_qqmlecmascript::callQtInvokables()
o->reset();
{
QString expected = "MyInvokableObject(0x" + QString::number((quintptr)o, 16) + ")";
- QVERIFY(EVALUATE_VALUE("object.method_QString(object)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QString(object)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 11);
QCOMPARE(o->actuals().count(), 1);
@@ -2496,126 +2506,126 @@ void tst_qqmlecmascript::callQtInvokables()
}
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QString(null)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QString(null)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 11);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(QString()));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QString(undefined)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QString(undefined)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 11);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(QString()));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QPointF(0)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QPointF(0)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 12);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QPointF(null)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QPointF(null)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 12);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QPointF(undefined)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QPointF(undefined)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 12);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QPointF(object)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QPointF(object)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 12);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QPointF(object.method_get_QPointF())", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QPointF(object.method_get_QPointF())", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 12);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(QPointF(99.3, -10.2)));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QPointF(object.method_get_QPoint())", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QPointF(object.method_get_QPoint())", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 12);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(QPointF(9, 12)));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QObject(0)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QObject(0)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 13);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)0));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QObject(\"Hello world\")", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QObject(\"Hello world\")", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 13);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)0));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QObject(null)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QObject(null)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 13);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)0));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QObject(undefined)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QObject(undefined)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 13);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)0));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QObject(object)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QObject(object)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 13);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)o));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QScriptValue(null)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QScriptValue(null)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 14);
QCOMPARE(o->actuals().count(), 1);
QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(0)).isNull());
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QScriptValue(undefined)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QScriptValue(undefined)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 14);
QCOMPARE(o->actuals().count(), 1);
QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(0)).isUndefined());
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QScriptValue(19)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QScriptValue(19)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 14);
QCOMPARE(o->actuals().count(), 1);
QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(0)).strictlyEquals(QJSValue(19)));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QScriptValue([19, 20])", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QScriptValue([19, 20])", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 14);
QCOMPARE(o->actuals().count(), 1);
QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(0)).isArray());
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(4, null)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(4, null)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 15);
QCOMPARE(o->actuals().count(), 2);
@@ -2623,7 +2633,7 @@ void tst_qqmlecmascript::callQtInvokables()
QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(1)).isNull());
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(8, undefined)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(8, undefined)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 15);
QCOMPARE(o->actuals().count(), 2);
@@ -2631,7 +2641,7 @@ void tst_qqmlecmascript::callQtInvokables()
QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(1)).isUndefined());
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(3, 19)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(3, 19)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 15);
QCOMPARE(o->actuals().count(), 2);
@@ -2639,7 +2649,7 @@ void tst_qqmlecmascript::callQtInvokables()
QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(1)).strictlyEquals(QJSValue(19)));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(44, [19, 20])", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(44, [19, 20])", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 15);
QCOMPARE(o->actuals().count(), 2);
@@ -2653,14 +2663,14 @@ void tst_qqmlecmascript::callQtInvokables()
QCOMPARE(o->actuals().count(), 0);
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_overload(10)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_overload(10)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 16);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(10));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_overload(10, 11)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_overload(10, 11)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 17);
QCOMPARE(o->actuals().count(), 2);
@@ -2668,21 +2678,21 @@ void tst_qqmlecmascript::callQtInvokables()
QCOMPARE(o->actuals().at(1), QVariant(11));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_overload(\"Hello\")", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_overload(\"Hello\")", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 18);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(QString("Hello")));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_with_enum(9)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_with_enum(9)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 19);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(9));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_default(10)", v8::Integer::New(19)));
+ QVERIFY(EVALUATE_VALUE("object.method_default(10)", QV4::Value::fromInt32(19)));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 20);
QCOMPARE(o->actuals().count(), 2);
@@ -2690,7 +2700,7 @@ void tst_qqmlecmascript::callQtInvokables()
QCOMPARE(o->actuals().at(1), QVariant(19));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_default(10, 13)", v8::Integer::New(13)));
+ QVERIFY(EVALUATE_VALUE("object.method_default(10, 13)", QV4::Value::fromInt32(13)));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 20);
QCOMPARE(o->actuals().count(), 2);
@@ -2698,14 +2708,14 @@ void tst_qqmlecmascript::callQtInvokables()
QCOMPARE(o->actuals().at(1), QVariant(13));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_inherited(9)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_inherited(9)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), -3);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(o->actuals().at(0), QVariant(9));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QVariant(9)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QVariant(9)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 21);
QCOMPARE(o->actuals().count(), 2);
@@ -2713,7 +2723,7 @@ void tst_qqmlecmascript::callQtInvokables()
QCOMPARE(o->actuals().at(1), QVariant());
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QVariant(\"Hello\", \"World\")", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QVariant(\"Hello\", \"World\")", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 21);
QCOMPARE(o->actuals().count(), 2);
@@ -2721,91 +2731,91 @@ void tst_qqmlecmascript::callQtInvokables()
QCOMPARE(o->actuals().at(1), QVariant(QString("World")));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QJsonObject({foo:123})", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QJsonObject({foo:123})", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 22);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(qvariant_cast<QJsonObject>(o->actuals().at(0)), QJsonDocument::fromJson("{\"foo\":123}").object());
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QJsonArray([123])", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QJsonArray([123])", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 23);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(qvariant_cast<QJsonArray>(o->actuals().at(0)), QJsonDocument::fromJson("[123]").array());
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(123)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(123)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 24);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(123));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(42.35)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(42.35)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 24);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(42.35));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QJsonValue('ciao')", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QJsonValue('ciao')", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 24);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(QStringLiteral("ciao")));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(true)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(true)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 24);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(true));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(false)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(false)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 24);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(false));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(null)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(null)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 24);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(QJsonValue::Null));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(undefined)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(undefined)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 24);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(QJsonValue::Undefined));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_overload({foo:123})", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_overload({foo:123})", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 25);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(qvariant_cast<QJsonObject>(o->actuals().at(0)), QJsonDocument::fromJson("{\"foo\":123}").object());
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_overload([123])", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_overload([123])", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 26);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(qvariant_cast<QJsonArray>(o->actuals().at(0)), QJsonDocument::fromJson("[123]").array());
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_overload(null)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_overload(null)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 27);
QCOMPARE(o->actuals().count(), 1);
QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(QJsonValue::Null));
o->reset();
- QVERIFY(EVALUATE_VALUE("object.method_overload(undefined)", v8::Undefined()));
+ QVERIFY(EVALUATE_VALUE("object.method_overload(undefined)", QV4::Value::undefinedValue()));
QCOMPARE(o->error(), false);
QCOMPARE(o->invoked(), 27);
QCOMPARE(o->actuals().count(), 1);
@@ -3500,13 +3510,13 @@ void tst_qqmlecmascript::signalWithJSValueInVariant_data()
QTest::newRow("'ciao'") << "'ciao'" << compareStrict;
QString comparePropertiesStrict(
- "(function(a, b) {"
+ "(function compareMe(a, b) {"
" if (typeof b != 'object')"
" return a === b;"
" var props = Object.getOwnPropertyNames(b);"
" for (var i = 0; i < props.length; ++i) {"
" var p = props[i];"
- " return arguments.callee(a[p], b[p]);"
+ " return compareMe(a[p], b[p]);"
" }"
"})");
QTest::newRow("{ foo: 'bar' }") << "({ foo: 'bar' })" << comparePropertiesStrict;
@@ -3553,7 +3563,7 @@ void tst_qqmlecmascript::signalWithJSValueInVariant_twoEngines()
object->setProperty("compare", compare);
object->setProperty("pass", false);
- QTest::ignoreMessage(QtWarningMsg, "JSValue can't be rassigned to an another engine.");
+ QTest::ignoreMessage(QtWarningMsg, "JSValue can't be reassigned to another engine.");
emit object->signalWithVariant(QVariant::fromValue(value));
QVERIFY(!object->property("pass").toBool());
}
@@ -3645,7 +3655,8 @@ void tst_qqmlecmascript::singletonType_data()
QTest::newRow("qobject, writing + readonly constraints")
<< testFileUrl("singletontype/qobjectSingletonTypeWriting.qml")
<< QString()
- << (QStringList() << QString(testFileUrl("singletontype/qobjectSingletonTypeWriting.qml").toString() + QLatin1String(":15: Error: Cannot assign to read-only property \"qobjectTestProperty\"")))
+ << (QStringList() <<
+ QString(testFileUrl("singletontype/qobjectSingletonTypeWriting.qml").toString() + QLatin1String(":15: TypeError: Cannot assign to read-only property \"qobjectTestProperty\"")))
<< (QStringList() << "readOnlyProperty" << "writableProperty" << "writableFinalProperty")
<< (QVariantList() << 20 << 50 << 10)
<< (QStringList() << "firstProperty" << "secondProperty")
@@ -3656,7 +3667,7 @@ void tst_qqmlecmascript::singletonType_data()
QTest::newRow("script, writing + readonly constraints")
<< testFileUrl("singletontype/scriptSingletonTypeWriting.qml")
<< QString()
- << (QStringList() << QString(testFileUrl("singletontype/scriptSingletonTypeWriting.qml").toString() + QLatin1String(":21: Error: Cannot assign to read-only property \"scriptTestProperty\"")))
+ << (QStringList())
<< (QStringList() << "readBack" << "unchanged")
<< (QVariantList() << 15 << 42)
<< (QStringList() << "firstProperty" << "secondProperty")
@@ -3808,26 +3819,21 @@ void tst_qqmlecmascript::verifyContextLifetime(QQmlContextData *ctxt) {
if (!ctxt->importedScripts.isEmpty()) {
QV8Engine *engine = QV8Engine::get(ctxt->engine);
- foreach (v8::Persistent<v8::Object> qmlglobal, ctxt->importedScripts) {
+ foreach (const QV4::PersistentValue& qmlglobal, ctxt->importedScripts) {
QQmlContextData *scriptContext, *newContext;
- if (qmlglobal.IsEmpty())
+ if (qmlglobal.isEmpty())
continue;
- scriptContext = engine->contextWrapper()->context(qmlglobal);
+ scriptContext = QV4::QmlContextWrapper::getContext(qmlglobal);
{
- v8::HandleScope handle_scope;
- v8::Persistent<v8::Context> context = v8::Context::New();
- v8::Context::Scope context_scope(context);
- v8::Local<v8::Object> temporaryScope = engine->qmlScope(scriptContext, NULL);
+ QV4::Value temporaryScope = QV4::QmlContextWrapper::qmlScope(engine, scriptContext, 0);
Q_UNUSED(temporaryScope)
-
- context.Dispose();
}
- QV8Engine::gc();
- newContext = engine->contextWrapper()->context(qmlglobal);
+ engine->gc();
+ newContext = QV4::QmlContextWrapper::getContext(qmlglobal);
QVERIFY(scriptContext == newContext);
}
}
@@ -3962,7 +3968,7 @@ void tst_qqmlecmascript::importScripts_data()
QTest::newRow("malformed import statement")
<< testFileUrl("jsimportfail/malformedImport.qml")
<< QString()
- << (QStringList() << testFileUrl("jsimportfail/malformedImport.js").toString() + QLatin1String(":1: SyntaxError: Unexpected token ."))
+ << (QStringList() << testFileUrl("jsimportfail/malformedImport.js").toString() + QLatin1String(":1:1: Syntax error"))
<< QStringList()
<< QVariantList();
@@ -4091,6 +4097,7 @@ void tst_qqmlecmascript::scarceResources_other()
origPixmap.fill(Qt::blue);
QString srp_name, expectedWarning;
QQmlEnginePrivate *ep = QQmlEnginePrivate::get(&engine);
+ QV4::ExecutionEngine *v4 = QV8Engine::getV4(ep->v8engine());
ScarceResourceObject *eo = 0;
QObject *srsc = 0;
QObject *object = 0;
@@ -4116,7 +4123,7 @@ void tst_qqmlecmascript::scarceResources_other()
QCOMPARE(srsc->property("scarceResourceCopy").value<QPixmap>(), origPixmap);
eo = qobject_cast<ScarceResourceObject*>(QQmlProperty::read(object, "a").value<QObject*>());
QVERIFY(!(eo->scarceResourceIsDetached())); // should be another copy of the resource now.
- QVERIFY(ep->scarceResources.isEmpty()); // should have been released by this point.
+ QVERIFY(v4->scarceResources.isEmpty()); // should have been released by this point.
delete object;
// test that scarce resources are handled properly from js functions in qml files
@@ -4135,7 +4142,7 @@ void tst_qqmlecmascript::scarceResources_other()
QVERIFY(!object->property("scarceResourceCopy").isValid()); // just released, so should not be valid
eo = qobject_cast<ScarceResourceObject*>(QQmlProperty::read(object, "a").value<QObject*>());
QVERIFY(eo->scarceResourceIsDetached()); // should be no other copies of it at this stage.
- QVERIFY(ep->scarceResources.isEmpty()); // should have been released by this point.
+ QVERIFY(v4->scarceResources.isEmpty()); // should have been released by this point.
delete object;
// test that if an exception occurs while invoking js function from cpp, that the resources are released.
@@ -4145,13 +4152,14 @@ void tst_qqmlecmascript::scarceResources_other()
QVERIFY(!object->property("scarceResourceCopy").isValid()); // not yet assigned, so should not be valid
eo = qobject_cast<ScarceResourceObject*>(QQmlProperty::read(object, "a").value<QObject*>());
QVERIFY(eo->scarceResourceIsDetached()); // should be no other copies of it at this stage.
- expectedWarning = varComponentTwelve.url().toString() + QLatin1String(":16: TypeError: Property 'scarceResource' of object [object Object] is not a function");
+ expectedWarning = varComponentTwelve.url().toString() + QLatin1String(":16: TypeError: Property 'scarceResource' of object ScarceResourceObject(0x%1) is not a function");
+ expectedWarning = expectedWarning.arg(QString::number((qintptr)eo, 16));
QTest::ignoreMessage(QtWarningMsg, qPrintable(expectedWarning)); // we expect a meaningful warning to be printed.
QMetaObject::invokeMethod(object, "retrieveScarceResource");
QVERIFY(!object->property("scarceResourceCopy").isValid()); // due to exception, assignment will NOT have occurred.
eo = qobject_cast<ScarceResourceObject*>(QQmlProperty::read(object, "a").value<QObject*>());
QVERIFY(eo->scarceResourceIsDetached()); // should be no other copies of it at this stage.
- QVERIFY(ep->scarceResources.isEmpty()); // should have been released by this point.
+ QVERIFY(v4->scarceResources.isEmpty()); // should have been released by this point.
delete object;
// test that if an Item which has JS ownership but has a scarce resource property is garbage collected,
@@ -4161,9 +4169,9 @@ void tst_qqmlecmascript::scarceResources_other()
QVERIFY(object != 0);
QVERIFY(!object->property("varProperty").isValid()); // not assigned yet
QMetaObject::invokeMethod(object, "assignVarProperty");
- QVERIFY(ep->scarceResources.isEmpty()); // the scarce resource is a VME property.
+ QVERIFY(v4->scarceResources.isEmpty()); // the scarce resource is a VME property.
QMetaObject::invokeMethod(object, "deassignVarProperty");
- QVERIFY(ep->scarceResources.isEmpty()); // should still be empty; the resource should have been released on gc.
+ QVERIFY(v4->scarceResources.isEmpty()); // should still be empty; the resource should have been released on gc.
delete object;
/* property variant semantics */
@@ -4188,7 +4196,7 @@ void tst_qqmlecmascript::scarceResources_other()
QCOMPARE(srsc->property("scarceResourceCopy").value<QPixmap>(), origPixmap);
eo = qobject_cast<ScarceResourceObject*>(QQmlProperty::read(object, "a").value<QObject*>());
QVERIFY(!(eo->scarceResourceIsDetached())); // should be another copy of the resource now.
- QVERIFY(ep->scarceResources.isEmpty()); // should have been released by this point.
+ QVERIFY(v4->scarceResources.isEmpty()); // should have been released by this point.
delete object;
// test that scarce resources are handled properly from js functions in qml files
@@ -4207,7 +4215,7 @@ void tst_qqmlecmascript::scarceResources_other()
QVERIFY(!object->property("scarceResourceCopy").isValid()); // just released, so should not be valid
eo = qobject_cast<ScarceResourceObject*>(QQmlProperty::read(object, "a").value<QObject*>());
QVERIFY(eo->scarceResourceIsDetached()); // should be no other copies of it at this stage.
- QVERIFY(ep->scarceResources.isEmpty()); // should have been released by this point.
+ QVERIFY(v4->scarceResources.isEmpty()); // should have been released by this point.
delete object;
// test that if an exception occurs while invoking js function from cpp, that the resources are released.
@@ -4217,13 +4225,14 @@ void tst_qqmlecmascript::scarceResources_other()
QVERIFY(!object->property("scarceResourceCopy").isValid()); // not yet assigned, so should not be valid
eo = qobject_cast<ScarceResourceObject*>(QQmlProperty::read(object, "a").value<QObject*>());
QVERIFY(eo->scarceResourceIsDetached()); // should be no other copies of it at this stage.
- expectedWarning = variantComponentTwelve.url().toString() + QLatin1String(":16: TypeError: Property 'scarceResource' of object [object Object] is not a function");
+ expectedWarning = variantComponentTwelve.url().toString() + QLatin1String(":16: TypeError: Property 'scarceResource' of object ScarceResourceObject(0x%1) is not a function");
+ expectedWarning = expectedWarning.arg(QString::number((qintptr)eo, 16));
QTest::ignoreMessage(QtWarningMsg, qPrintable(expectedWarning)); // we expect a meaningful warning to be printed.
QMetaObject::invokeMethod(object, "retrieveScarceResource");
QVERIFY(!object->property("scarceResourceCopy").isValid()); // due to exception, assignment will NOT have occurred.
eo = qobject_cast<ScarceResourceObject*>(QQmlProperty::read(object, "a").value<QObject*>());
QVERIFY(eo->scarceResourceIsDetached()); // should be no other copies of it at this stage.
- QVERIFY(ep->scarceResources.isEmpty()); // should have been released by this point.
+ QVERIFY(v4->scarceResources.isEmpty()); // should have been released by this point.
delete object;
}
@@ -4459,6 +4468,7 @@ void tst_qqmlecmascript::scarceResources()
QFETCH(QStringList, expectedErrors);
QQmlEnginePrivate *ep = QQmlEnginePrivate::get(&engine);
+ QV4::ExecutionEngine *v4 = QV8Engine::getV4(ep->v8engine());
ScarceResourceObject *eo = 0;
QObject *object = 0;
@@ -4483,7 +4493,7 @@ void tst_qqmlecmascript::scarceResources()
QCOMPARE(eo->scarceResourceIsDetached(), expectedDetachStatus);
}
- QVERIFY(ep->scarceResources.isEmpty());
+ QVERIFY(v4->scarceResources.isEmpty());
delete object;
}
@@ -4881,16 +4891,8 @@ void tst_qqmlecmascript::propertyVarCircular2()
delete object;
}
-void tst_qqmlecmascript::propertyVarWeakRefCallback(v8::Persistent<v8::Value> object, void* parameter)
-{
- *(int*)(parameter) += 1;
- qPersistentDispose(object);
-}
-
void tst_qqmlecmascript::propertyVarInheritance()
{
- int propertyVarWeakRefCallbackCount = 0;
-
// enforce behaviour regarding element inheritance - ensure handle disposal.
// The particular component under test here has a chain of references.
QQmlComponent component(&engine, testFileUrl("propertyVar.inherit.qml"));
@@ -4902,22 +4904,22 @@ void tst_qqmlecmascript::propertyVarInheritance()
// we want to be able to track when the varProperties array of the last metaobject is disposed
QObject *cco5 = object->property("varProperty").value<QObject*>()->property("vp").value<QObject*>()->property("vp").value<QObject*>()->property("vp").value<QObject*>()->property("vp").value<QObject*>();
QObject *ico5 = object->property("varProperty").value<QObject*>()->property("inheritanceVarProperty").value<QObject*>()->property("vp").value<QObject*>()->property("vp").value<QObject*>()->property("vp").value<QObject*>()->property("vp").value<QObject*>();
+ QVERIFY(cco5);
+ QVERIFY(ico5);
QQmlVMEMetaObject *icovmemo = QQmlVMEMetaObject::get(ico5);
QQmlVMEMetaObject *ccovmemo = QQmlVMEMetaObject::get(cco5);
- v8::Persistent<v8::Value> icoCanaryHandle;
- v8::Persistent<v8::Value> ccoCanaryHandle;
+ QV4::WeakValue icoCanaryHandle;
+ QV4::WeakValue ccoCanaryHandle;
{
- v8::HandleScope hs;
// XXX NOTE: this is very implementation dependent. QDVMEMO->vmeProperty() is the only
// public function which can return us a handle to something in the varProperties array.
- icoCanaryHandle = qPersistentNew(icovmemo->vmeProperty(ico5->metaObject()->indexOfProperty("circ")));
- ccoCanaryHandle = qPersistentNew(ccovmemo->vmeProperty(cco5->metaObject()->indexOfProperty("circ")));
- // we make them weak and invoke the gc, but we should not hit the weak-callback yet
- // as the varproperties array of each vmemo still references the resource.
- icoCanaryHandle.MakeWeak(&propertyVarWeakRefCallbackCount, propertyVarWeakRefCallback);
- ccoCanaryHandle.MakeWeak(&propertyVarWeakRefCallbackCount, propertyVarWeakRefCallback);
+ icoCanaryHandle = icovmemo->vmeProperty(ico5->metaObject()->indexOfProperty("circ"));
+ ccoCanaryHandle = ccovmemo->vmeProperty(cco5->metaObject()->indexOfProperty("circ"));
+ QVERIFY(!icoCanaryHandle.isEmpty());
+ QVERIFY(!ccoCanaryHandle.isEmpty());
gc(engine);
- QVERIFY(propertyVarWeakRefCallbackCount == 0);
+ QVERIFY(!icoCanaryHandle.isEmpty());
+ QVERIFY(!ccoCanaryHandle.isEmpty());
}
// now we deassign the var prop, which should trigger collection of item subtrees.
QMetaObject::invokeMethod(object, "deassignCircular"); // cause deassignment and gc
@@ -4925,7 +4927,8 @@ void tst_qqmlecmascript::propertyVarInheritance()
QCoreApplication::processEvents();
// ensure that there are only weak handles to the underlying varProperties array remaining.
gc(engine);
- QCOMPARE(propertyVarWeakRefCallbackCount, 2); // should have been called for both, since all refs should be weak.
+ QVERIFY(icoCanaryHandle.isEmpty());
+ QVERIFY(ccoCanaryHandle.isEmpty());
delete object;
// since there are no parent vmemo's to keep implicit references alive, and the only handles
// to what remains are weak, all varProperties arrays must have been collected.
@@ -4933,8 +4936,6 @@ void tst_qqmlecmascript::propertyVarInheritance()
void tst_qqmlecmascript::propertyVarInheritance2()
{
- int propertyVarWeakRefCallbackCount = 0;
-
// The particular component under test here does NOT have a chain of references; the
// only link between rootObject and childObject is that rootObject is the parent of childObject.
QQmlComponent component(&engine, testFileUrl("propertyVar.circular.2.qml"));
@@ -4949,21 +4950,19 @@ void tst_qqmlecmascript::propertyVarInheritance2()
QVERIFY(childObject != 0);
QCOMPARE(rootObject->property("rectCanary").toInt(), 5);
QCOMPARE(childObject->property("textCanary").toInt(), 10);
- v8::Persistent<v8::Value> childObjectVarArrayValueHandle;
+ QV4::WeakValue childObjectVarArrayValueHandle;
{
- v8::HandleScope hs;
- propertyVarWeakRefCallbackCount = 0; // reset callback count.
- childObjectVarArrayValueHandle = qPersistentNew(QQmlVMEMetaObject::get(childObject)->vmeProperty(childObject->metaObject()->indexOfProperty("vp")));
- childObjectVarArrayValueHandle.MakeWeak(&propertyVarWeakRefCallbackCount, propertyVarWeakRefCallback);
+ childObjectVarArrayValueHandle = QQmlVMEMetaObject::get(childObject)->vmeProperty(childObject->metaObject()->indexOfProperty("vp"));
+ QVERIFY(!childObjectVarArrayValueHandle.isEmpty());
gc(engine);
- QVERIFY(propertyVarWeakRefCallbackCount == 0); // should not have been collected yet.
+ QVERIFY(!childObjectVarArrayValueHandle.isEmpty()); // should not have been collected yet.
QCOMPARE(childObject->property("vp").value<QObject*>(), rootObject);
QCOMPARE(childObject->property("textCanary").toInt(), 10);
}
QMetaObject::invokeMethod(object, "deassignCircular");
QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
QCoreApplication::processEvents();
- QVERIFY(propertyVarWeakRefCallbackCount == 1); // should have been collected now.
+ QVERIFY(childObjectVarArrayValueHandle.isEmpty()); // should have been collected now.
delete object;
}
@@ -5031,7 +5030,6 @@ void tst_qqmlecmascript::booleanConversion()
void tst_qqmlecmascript::handleReferenceManagement()
{
-
int dtorCount = 0;
{
// Linear QObject reference
@@ -5043,7 +5041,7 @@ void tst_qqmlecmascript::handleReferenceManagement()
cro->setEngine(&hrmEngine);
cro->setDtorCount(&dtorCount);
QMetaObject::invokeMethod(object, "createReference");
- gc(engine);
+ gc(hrmEngine);
QCOMPARE(dtorCount, 0); // second has JS ownership, kept alive by first's reference
delete object;
hrmEngine.collectGarbage();
@@ -5063,7 +5061,7 @@ void tst_qqmlecmascript::handleReferenceManagement()
cro->setEngine(&hrmEngine);
cro->setDtorCount(&dtorCount);
QMetaObject::invokeMethod(object, "circularReference");
- gc(engine);
+ gc(hrmEngine);
QCOMPARE(dtorCount, 2); // both should be cleaned up, since circular references shouldn't keep alive.
delete object;
hrmEngine.collectGarbage();
@@ -5072,230 +5070,6 @@ void tst_qqmlecmascript::handleReferenceManagement()
QCOMPARE(dtorCount, 3);
}
- dtorCount = 0;
- {
- // Linear handle reference
- QQmlEngine hrmEngine;
- QQmlComponent component(&hrmEngine, testFileUrl("handleReferenceManagement.handle.1.qml"));
- QObject *object = component.create();
- QVERIFY(object != 0);
- CircularReferenceHandle *crh = object->findChild<CircularReferenceHandle*>("crh");
- QVERIFY(crh != 0);
- crh->setEngine(&hrmEngine);
- crh->setDtorCount(&dtorCount);
- QMetaObject::invokeMethod(object, "createReference");
- CircularReferenceHandle *first = object->property("first").value<CircularReferenceHandle*>();
- CircularReferenceHandle *second = object->property("second").value<CircularReferenceHandle*>();
- QVERIFY(first != 0);
- QVERIFY(second != 0);
- first->addReference(QQmlData::get(second)->v8object); // create reference
- // now we have to reparent second and make second owned by JS.
- second->setParent(0);
- QQmlEngine::setObjectOwnership(second, QQmlEngine::JavaScriptOwnership);
- gc(engine);
- QCOMPARE(dtorCount, 0); // due to reference from first to second, second shouldn't be collected.
- delete object;
- hrmEngine.collectGarbage();
- QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
- QCoreApplication::processEvents();
- QCOMPARE(dtorCount, 3);
- }
-
- dtorCount = 0;
- {
- // Circular handle reference
- QQmlEngine hrmEngine;
- QQmlComponent component(&hrmEngine, testFileUrl("handleReferenceManagement.handle.2.qml"));
- QObject *object = component.create();
- QVERIFY(object != 0);
- CircularReferenceHandle *crh = object->findChild<CircularReferenceHandle*>("crh");
- QVERIFY(crh != 0);
- crh->setEngine(&hrmEngine);
- crh->setDtorCount(&dtorCount);
- QMetaObject::invokeMethod(object, "circularReference");
- CircularReferenceHandle *first = object->property("first").value<CircularReferenceHandle*>();
- CircularReferenceHandle *second = object->property("second").value<CircularReferenceHandle*>();
- QVERIFY(first != 0);
- QVERIFY(second != 0);
- first->addReference(QQmlData::get(second)->v8object); // create circular reference
- second->addReference(QQmlData::get(first)->v8object); // note: must be weak.
- // now we have to reparent and change ownership, and unset the property references.
- first->setParent(0);
- second->setParent(0);
- QQmlEngine::setObjectOwnership(first, QQmlEngine::JavaScriptOwnership);
- QQmlEngine::setObjectOwnership(second, QQmlEngine::JavaScriptOwnership);
- object->setProperty("first", QVariant::fromValue<QObject*>(0));
- object->setProperty("second", QVariant::fromValue<QObject*>(0));
- gc(engine);
- QCOMPARE(dtorCount, 2); // despite circular references, both will be collected.
- delete object;
- hrmEngine.collectGarbage();
- QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
- QCoreApplication::processEvents();
- QCOMPARE(dtorCount, 3);
- }
-
- dtorCount = 0;
- {
- // multiple engine interaction - linear reference
- QQmlEngine hrmEngine1;
- QQmlEngine hrmEngine2;
- QQmlComponent component1(&hrmEngine1, testFileUrl("handleReferenceManagement.handle.1.qml"));
- QQmlComponent component2(&hrmEngine2, testFileUrl("handleReferenceManagement.handle.1.qml"));
- QObject *object1 = component1.create();
- QObject *object2 = component2.create();
- QVERIFY(object1 != 0);
- QVERIFY(object2 != 0);
- CircularReferenceHandle *crh1 = object1->findChild<CircularReferenceHandle*>("crh");
- CircularReferenceHandle *crh2 = object2->findChild<CircularReferenceHandle*>("crh");
- QVERIFY(crh1 != 0);
- QVERIFY(crh2 != 0);
- crh1->setEngine(&hrmEngine1);
- crh2->setEngine(&hrmEngine2);
- crh1->setDtorCount(&dtorCount);
- crh2->setDtorCount(&dtorCount);
- QMetaObject::invokeMethod(object1, "createReference");
- QMetaObject::invokeMethod(object2, "createReference");
- CircularReferenceHandle *first1 = object1->property("first").value<CircularReferenceHandle*>();
- CircularReferenceHandle *second1 = object1->property("second").value<CircularReferenceHandle*>();
- CircularReferenceHandle *first2 = object2->property("first").value<CircularReferenceHandle*>();
- CircularReferenceHandle *second2 = object2->property("second").value<CircularReferenceHandle*>();
- QVERIFY(first1 != 0);
- QVERIFY(second1 != 0);
- QVERIFY(first2 != 0);
- QVERIFY(second2 != 0);
- first1->addReference(QQmlData::get(second2)->v8object); // create reference across engines
- // now we have to reparent second2 and make second2 owned by JS.
- second2->setParent(0);
- QQmlEngine::setObjectOwnership(second2, QQmlEngine::JavaScriptOwnership);
- gc(engine);
- QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
- QCoreApplication::processEvents();
- QCOMPARE(dtorCount, 0); // due to reference from first1 to second2, second2 shouldn't be collected.
- delete object1;
- delete object2;
- hrmEngine1.collectGarbage();
- hrmEngine2.collectGarbage();
- QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
- QCoreApplication::processEvents();
- QCOMPARE(dtorCount, 6);
- }
-
- dtorCount = 0;
- {
- // multiple engine interaction - circular reference
- QQmlEngine hrmEngine1;
- QQmlEngine hrmEngine2;
- QQmlComponent component1(&hrmEngine1, testFileUrl("handleReferenceManagement.handle.1.qml"));
- QQmlComponent component2(&hrmEngine2, testFileUrl("handleReferenceManagement.handle.1.qml"));
- QObject *object1 = component1.create();
- QObject *object2 = component2.create();
- QVERIFY(object1 != 0);
- QVERIFY(object2 != 0);
- CircularReferenceHandle *crh1 = object1->findChild<CircularReferenceHandle*>("crh");
- CircularReferenceHandle *crh2 = object2->findChild<CircularReferenceHandle*>("crh");
- QVERIFY(crh1 != 0);
- QVERIFY(crh2 != 0);
- crh1->setEngine(&hrmEngine1);
- crh2->setEngine(&hrmEngine2);
- crh1->setDtorCount(&dtorCount);
- crh2->setDtorCount(&dtorCount);
- QMetaObject::invokeMethod(object1, "createReference");
- QMetaObject::invokeMethod(object2, "createReference");
- CircularReferenceHandle *first1 = object1->property("first").value<CircularReferenceHandle*>();
- CircularReferenceHandle *second1 = object1->property("second").value<CircularReferenceHandle*>();
- CircularReferenceHandle *first2 = object2->property("first").value<CircularReferenceHandle*>();
- CircularReferenceHandle *second2 = object2->property("second").value<CircularReferenceHandle*>();
- QVERIFY(first1 != 0);
- QVERIFY(second1 != 0);
- QVERIFY(first2 != 0);
- QVERIFY(second2 != 0);
- first1->addReference(QQmlData::get(second1)->v8object); // create linear reference within engine1
- second1->addReference(QQmlData::get(second2)->v8object); // create linear reference across engines
- second2->addReference(QQmlData::get(first2)->v8object); // create linear reference within engine2
- first2->addReference(QQmlData::get(first1)->v8object); // close the loop - circular ref across engines
- // now we have to reparent and change ownership to JS, and remove property references.
- first1->setParent(0);
- second1->setParent(0);
- first2->setParent(0);
- second2->setParent(0);
- QQmlEngine::setObjectOwnership(first1, QQmlEngine::JavaScriptOwnership);
- QQmlEngine::setObjectOwnership(second1, QQmlEngine::JavaScriptOwnership);
- QQmlEngine::setObjectOwnership(first2, QQmlEngine::JavaScriptOwnership);
- QQmlEngine::setObjectOwnership(second2, QQmlEngine::JavaScriptOwnership);
- object1->setProperty("first", QVariant::fromValue<QObject*>(0));
- object1->setProperty("second", QVariant::fromValue<QObject*>(0));
- object2->setProperty("first", QVariant::fromValue<QObject*>(0));
- object2->setProperty("second", QVariant::fromValue<QObject*>(0));
- gc(engine);
- QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
- QCoreApplication::processEvents();
- QCOMPARE(dtorCount, 4); // circular references shouldn't keep them alive.
- delete object1;
- delete object2;
- hrmEngine1.collectGarbage();
- hrmEngine2.collectGarbage();
- QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
- QCoreApplication::processEvents();
- QCOMPARE(dtorCount, 6);
- }
-
- dtorCount = 0;
- {
- // multiple engine interaction - linear reference with engine deletion
- QQmlEngine *hrmEngine1 = new QQmlEngine;
- QQmlEngine *hrmEngine2 = new QQmlEngine;
- QQmlComponent component1(hrmEngine1, testFileUrl("handleReferenceManagement.handle.1.qml"));
- QQmlComponent component2(hrmEngine2, testFileUrl("handleReferenceManagement.handle.1.qml"));
- QObject *object1 = component1.create();
- QObject *object2 = component2.create();
- QVERIFY(object1 != 0);
- QVERIFY(object2 != 0);
- CircularReferenceHandle *crh1 = object1->findChild<CircularReferenceHandle*>("crh");
- CircularReferenceHandle *crh2 = object2->findChild<CircularReferenceHandle*>("crh");
- QVERIFY(crh1 != 0);
- QVERIFY(crh2 != 0);
- crh1->setEngine(hrmEngine1);
- crh2->setEngine(hrmEngine2);
- crh1->setDtorCount(&dtorCount);
- crh2->setDtorCount(&dtorCount);
- QMetaObject::invokeMethod(object1, "createReference");
- QMetaObject::invokeMethod(object2, "createReference");
- CircularReferenceHandle *first1 = object1->property("first").value<CircularReferenceHandle*>();
- CircularReferenceHandle *second1 = object1->property("second").value<CircularReferenceHandle*>();
- CircularReferenceHandle *first2 = object2->property("first").value<CircularReferenceHandle*>();
- CircularReferenceHandle *second2 = object2->property("second").value<CircularReferenceHandle*>();
- QVERIFY(first1 != 0);
- QVERIFY(second1 != 0);
- QVERIFY(first2 != 0);
- QVERIFY(second2 != 0);
- first1->addReference(QQmlData::get(second1)->v8object); // create linear reference within engine1
- second1->addReference(QQmlData::get(second2)->v8object); // create linear reference across engines
- second2->addReference(QQmlData::get(first2)->v8object); // create linear reference within engine2
- // now we have to reparent and change ownership to JS.
- first1->setParent(crh1);
- second1->setParent(0);
- first2->setParent(0);
- second2->setParent(0);
- QQmlEngine::setObjectOwnership(second1, QQmlEngine::JavaScriptOwnership);
- QQmlEngine::setObjectOwnership(first2, QQmlEngine::JavaScriptOwnership);
- QQmlEngine::setObjectOwnership(second2, QQmlEngine::JavaScriptOwnership);
- gc(*hrmEngine1);
- gc(*hrmEngine2);
- QCOMPARE(dtorCount, 0);
- delete hrmEngine2; // should trigger deletion of objects with JS ownership tracked by this engine
- gc(*hrmEngine1);
- QCOMPARE(dtorCount, 2); // first2 and second2 should have been deleted.
- delete object1;
- delete object2;
- gc(*hrmEngine1);
- QCOMPARE(dtorCount, 6); // deleting object1 and object2 should trigger deletion of first1 and first2.
- delete hrmEngine1;
- QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
- QCoreApplication::processEvents();
- QCOMPARE(dtorCount, 6); // all objects should have been cleaned up prior to deleting hrmEngine1.
- }
-
{
// Dynamic variant property reference keeps target alive
QQmlEngine hrmEngine;
@@ -5303,11 +5077,11 @@ void tst_qqmlecmascript::handleReferenceManagement()
QObject *object = component.create();
QVERIFY(object != 0);
QMetaObject::invokeMethod(object, "createReference");
- gc(engine);
+ gc(hrmEngine);
QMetaObject::invokeMethod(object, "ensureReference");
- gc(engine);
+ gc(hrmEngine);
QMetaObject::invokeMethod(object, "removeReference");
- gc(engine);
+ gc(hrmEngine);
QMetaObject::invokeMethod(object, "ensureDeletion");
QCOMPARE(object->property("success").toBool(), true);
delete object;
@@ -5320,11 +5094,11 @@ void tst_qqmlecmascript::handleReferenceManagement()
QObject *object = component.create();
QVERIFY(object != 0);
QMetaObject::invokeMethod(object, "createReference");
- gc(engine);
+ gc(hrmEngine);
QMetaObject::invokeMethod(object, "ensureReference");
- gc(engine);
+ gc(hrmEngine);
QMetaObject::invokeMethod(object, "removeReference");
- gc(engine);
+ gc(hrmEngine);
QMetaObject::invokeMethod(object, "ensureDeletion");
QCOMPARE(object->property("success").toBool(), true);
delete object;
@@ -5337,11 +5111,11 @@ void tst_qqmlecmascript::handleReferenceManagement()
QObject *object = component.create();
QVERIFY(object != 0);
QMetaObject::invokeMethod(object, "createReference");
- gc(engine);
+ gc(hrmEngine);
QMetaObject::invokeMethod(object, "ensureReference");
- gc(engine);
+ gc(hrmEngine);
QMetaObject::invokeMethod(object, "manuallyDelete");
- gc(engine);
+ gc(hrmEngine);
QMetaObject::invokeMethod(object, "ensureDeleted");
QCOMPARE(object->property("success").toBool(), true);
delete object;
@@ -5602,7 +5376,7 @@ void tst_qqmlecmascript::sequenceConversionBindings()
{
QUrl qmlFile = testFileUrl("sequenceConversion.bindings.error.qml");
- QString warning = QString(QLatin1String("%1:17: Unable to assign QList<int> to QList<bool>")).arg(qmlFile.toString());
+ QString warning = QString(QLatin1String("%1:17:27: Unable to assign QList<int> to QList<bool>")).arg(qmlFile.toString());
QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData());
QQmlComponent component(&engine, qmlFile);
QObject *object = component.create();
@@ -5969,11 +5743,11 @@ void tst_qqmlecmascript::functionAssignmentfromJS_invalid()
QVERIFY(!o->property("a").isValid());
QString url = component.url().toString();
- QString warning = url + ":67:17: Unable to assign QString to int";
+ QString warning = url + ":67: Unable to assign QString to int";
QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData());
o->setProperty("assignWrongType", true);
- warning = url + ":71:29: Unable to assign QString to int";
+ warning = url + ":71: Unable to assign QString to int";
QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData());
o->setProperty("assignWrongTypeToValueType", true);
@@ -6026,19 +5800,6 @@ void tst_qqmlecmascript::function()
delete o;
}
-void tst_qqmlecmascript::functionException()
-{
- // QTBUG-24037 - shouldn't crash.
- QString errstr = testFileUrl("v8functionException.qml").toString() + QLatin1String(":13: SyntaxError: Unexpected token ILLEGAL");
- QTest::ignoreMessage(QtWarningMsg, qPrintable(errstr));
- QTest::ignoreMessage(QtWarningMsg, "<Unknown File>: Exception occurred during compilation of function: dynamicSlot()");
- QQmlComponent component(&engine, testFileUrl("v8functionException.qml"));
- QObject *o = component.create();
- QVERIFY(o != 0);
- QMetaObject::invokeMethod(o, "dynamicSlot");
- delete o;
-}
-
// Test the "Qt.include" method
void tst_qqmlecmascript::include()
{
@@ -6704,9 +6465,7 @@ void tst_qqmlecmascript::doubleEvaluate()
void tst_qqmlecmascript::nonNotifyable()
{
- QV4Compiler::enableV4(false);
QQmlComponent component(&engine, testFileUrl("nonNotifyable.qml"));
- QV4Compiler::enableV4(true);
QQmlTestMessageHandler messageHandler;
@@ -6716,7 +6475,7 @@ void tst_qqmlecmascript::nonNotifyable()
QString expected1 = QLatin1String("QQmlExpression: Expression ") +
component.url().toString() +
- QLatin1String(":5 depends on non-NOTIFYable properties:");
+ QLatin1String(":5:24 depends on non-NOTIFYable properties:");
QString expected2 = QLatin1String(" ") +
QLatin1String(object->metaObject()->className()) +
QLatin1String("::value");
@@ -6791,8 +6550,8 @@ void tst_qqmlecmascript::qtbug_22843()
QQmlComponent component(&engine, testFileUrl(fileName));
QString url = component.url().toString();
- QString warning1 = url.left(url.length()-3) + QLatin1String("js:4: SyntaxError: Unexpected token )");
- QString warning2 = url + QLatin1String(":5: TypeError: Object [object Object] has no method 'func'");
+ QString warning1 = url.left(url.length()-3) + QLatin1String("js:4:16: Expected token `;'");
+ QString warning2 = url + QLatin1String(":5: TypeError: Property 'func' of object NaN is not a function");
qRegisterMetaType<QList<QQmlError> >("QList<QQmlError>");
QSignalSpy warningsSpy(&engine, SIGNAL(warnings(QList<QQmlError>)));
@@ -6887,7 +6646,7 @@ void tst_qqmlecmascript::switchStatement()
{
QQmlComponent component(&engine, testFileUrl("switchStatement.4.qml"));
- QString warning = component.url().toString() + ":4: Unable to assign [undefined] to int";
+ QString warning = component.url().toString() + ":4:12: Unable to assign [undefined] to int";
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
@@ -6962,7 +6721,8 @@ void tst_qqmlecmascript::switchStatement()
void tst_qqmlecmascript::withStatement()
{
{
- QQmlComponent component(&engine, testFileUrl("withStatement.1.qml"));
+ QUrl url = testFileUrl("withStatement.1.qml");
+ QQmlComponent component(&engine, url);
MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
QVERIFY(object != 0);