summaryrefslogtreecommitdiffstats
path: root/tests/auto/qscriptclass/tst_qscriptclass.cpp
diff options
context:
space:
mode:
authorKent Hansen <kent.hansen@nokia.com>2010-11-08 14:03:05 (GMT)
committerKent Hansen <kent.hansen@nokia.com>2010-11-08 14:50:00 (GMT)
commit626f13421baf258407f03e3bf21ed67138d55ea4 (patch)
tree9d445d9b709f57734c515e752c46d8c3bf9704cd /tests/auto/qscriptclass/tst_qscriptclass.cpp
parenta3a84a872bb731d375a431626ccfcde5a660dd72 (diff)
downloadQt-626f13421baf258407f03e3bf21ed67138d55ea4.zip
Qt-626f13421baf258407f03e3bf21ed67138d55ea4.tar.gz
Qt-626f13421baf258407f03e3bf21ed67138d55ea4.tar.bz2
Don't crash if QScriptClass property getter returns an invalid value
It's possible that a class claims to have a property of a given name (i.e. queryProperty() returns true), but returns an invalid value for that property. In that case we should silently convert the value to undefined, otherwise the value may wreak havoc in JS. This is a regression from Qt 4.5 (pre-JavaScriptCore-based), which had this check. Task-number: QTBUG-15079 Reviewed-by: Jedrzej Nowacki
Diffstat (limited to 'tests/auto/qscriptclass/tst_qscriptclass.cpp')
-rw-r--r--tests/auto/qscriptclass/tst_qscriptclass.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/tests/auto/qscriptclass/tst_qscriptclass.cpp b/tests/auto/qscriptclass/tst_qscriptclass.cpp
index b4dbe73..da6c76f 100644
--- a/tests/auto/qscriptclass/tst_qscriptclass.cpp
+++ b/tests/auto/qscriptclass/tst_qscriptclass.cpp
@@ -66,6 +66,7 @@ public:
private slots:
void newInstance();
void getAndSetProperty();
+ void getProperty_invalidValue();
void enumerate();
void extension();
};
@@ -741,6 +742,26 @@ void tst_QScriptClass::getAndSetProperty()
QVERIFY(!obj1.property(bar).isValid());
}
+void tst_QScriptClass::getProperty_invalidValue()
+{
+ QScriptEngine eng;
+ TestClass cls(&eng);
+ cls.addCustomProperty(eng.toStringHandle("foo"), QScriptClass::HandlesReadAccess,
+ /*id=*/0, QScriptValue::ReadOnly, QScriptValue());
+ QScriptValue obj = eng.newObject(&cls);
+
+ QVERIFY(obj.property("foo").isUndefined());
+
+ eng.globalObject().setProperty("obj", obj);
+ QVERIFY(eng.evaluate("obj.hasOwnProperty('foo'))").toBool());
+ // The JS environment expects that a valid value is returned,
+ // otherwise we could crash.
+ QVERIFY(eng.evaluate("obj.foo").isUndefined());
+ QVERIFY(eng.evaluate("obj.foo + ''").isString());
+ QVERIFY(eng.evaluate("Object.getOwnPropertyDescriptor(obj, 'foo').value").isUndefined());
+ QVERIFY(eng.evaluate("Object.getOwnPropertyDescriptor(obj, 'foo').value +''").isString());
+}
+
void tst_QScriptClass::enumerate()
{
QScriptEngine eng;