summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAlexandra Cherdantseva <neluhus.vagus@gmail.com>2019-02-18 14:57:27 +0300
committerKonstantin Tokarev <annulen@yandex.ru>2019-04-17 15:46:36 +0000
commit484e9de6d86d011bd349890cba87a25554b0f672 (patch)
treefbae02a39db4aa73557d9c70ffd120d678c508bb /tests
parentba51b7a53420a5de576f6d07b2f4feab5ea4d21a (diff)
downloadqtscript-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.cpp45
-rw-r--r--tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp2
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);