diff options
author | Alexandra Cherdantseva <neluhus.vagus@gmail.com> | 2019-02-18 14:57:27 +0300 |
---|---|---|
committer | Konstantin Tokarev <annulen@yandex.ru> | 2019-04-17 15:46:36 +0000 |
commit | 484e9de6d86d011bd349890cba87a25554b0f672 (patch) | |
tree | fbae02a39db4aa73557d9c70ffd120d678c508bb /tests | |
parent | ba51b7a53420a5de576f6d07b2f4feab5ea4d21a (diff) | |
download | qtscript-484e9de6d86d011bd349890cba87a25554b0f672.tar.gz |
Fix thisObject() of QScriptable argument for String(), etc
When `String(object)` is evaluated, and `object` is a QObject or some
custom object with native prototype, then `object.toString()` will be
called with incorrect `this`. This also applies for Number(), Boolean()
and other built-in constructors.
Change-Id: I0219f0e119c1e29d80e4c0f856421352715e9e6e
Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/qscriptable/tst_qscriptable.cpp | 45 | ||||
-rw-r--r-- | tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp | 2 |
2 files changed, 46 insertions, 1 deletions
diff --git a/tests/auto/qscriptable/tst_qscriptable.cpp b/tests/auto/qscriptable/tst_qscriptable.cpp index 1a0fbe1..b800613 100644 --- a/tests/auto/qscriptable/tst_qscriptable.cpp +++ b/tests/auto/qscriptable/tst_qscriptable.cpp @@ -73,6 +73,9 @@ public slots: QScriptValue getArguments(); int getArgumentCount(); + QString toString() const; + int valueOf() const; + signals: void sig(int); @@ -172,6 +175,16 @@ bool MyScriptable::isBar() return str.contains(QLatin1Char('@')); } +QString MyScriptable::toString() const +{ + return thisObject().property("objectName").toString(); +} + +int MyScriptable::valueOf() const +{ + return thisObject().property("baz").toInt32(); +} + class tst_QScriptable : public QObject { Q_OBJECT @@ -188,6 +201,8 @@ private slots: void thisObject(); void arguments(); void throwError(); + void stringConstructor(); + void numberConstructor(); private: QScriptEngine m_engine; @@ -386,5 +401,35 @@ void tst_QScriptable::throwError() QCOMPARE(ret.toString(), QString("Error: MyScriptable.foo")); } +void tst_QScriptable::stringConstructor() +{ + m_scriptable.setObjectName("TestObject"); + + m_engine.globalObject().setProperty("js_obj", m_engine.newObject()); + m_engine.evaluate( + "js_obj.str = scriptable.toString();" + "js_obj.toString = function() { return this.str }"); + + QCOMPARE(m_engine.evaluate("String(scriptable)").toString(), + m_engine.evaluate("String(js_obj)").toString()); + + QCOMPARE(m_engine.evaluate("String(scriptable)").toString(), + m_engine.evaluate("scriptable.toString()").toString()); +} + +void tst_QScriptable::numberConstructor() +{ + m_engine.globalObject().setProperty("js_obj", m_engine.newObject()); + m_engine.evaluate( + "js_obj.num = scriptable.valueOf();" + "js_obj.valueOf = function() { return this.num }"); + + QCOMPARE(m_engine.evaluate("Number(scriptable)").toInt32(), + m_engine.evaluate("Number(js_obj)").toInt32()); + + QCOMPARE(m_engine.evaluate("Number(scriptable)").toInt32(), + m_engine.evaluate("scriptable.valueOf()").toInt32()); +} + QTEST_MAIN(tst_QScriptable) #include "tst_qscriptable.moc" diff --git a/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp b/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp index e199d71..58fee07 100644 --- a/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp +++ b/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp @@ -1354,7 +1354,7 @@ void tst_QScriptExtQObject::callQtInvokable2() // first time we expect failure because the metatype is not registered m_myObject->resetQtFunctionInvoked(); - QCOMPARE(QMetaType::type("QVector<CustomType>"), QMetaType::UnknownType); // this type should not be registered yet + QCOMPARE(QMetaType::Type(QMetaType::type("QVector<CustomType>")), QMetaType::UnknownType); // this type should not be registered yet QCOMPARE(m_engine->evaluate("myObject.myInvokableReturningVectorOfCustomType()").isError(), true); QCOMPARE(m_myObject->qtFunctionInvoked(), -1); |