diff options
author | Kent Hansen <kent.hansen@nokia.com> | 2012-08-07 10:44:46 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-08-08 09:43:34 +0200 |
commit | 68458376c0db2f786b2c9ab3b8dfd21695a5645e (patch) | |
tree | 50388472030452f4881295ac4679b3d825573fba /tests | |
parent | 79ebd39d0d4846cb911ae122d2059e5add568d7e (diff) | |
download | qtscript-68458376c0db2f786b2c9ab3b8dfd21695a5645e.tar.gz |
QScriptEngine::pushContext(): Don't inherit parent context's scope
This was a regression introduced in Qt 4.6 (JavaScriptCore-based
backend). pushContext() should always create a context with a "clean"
scope (only the Global Object and the context's own activation object
should be in the scope chain).
The scope chain API is internal, but the wrong behavior could still
be observed e.g. through QScriptEngine::evaluate().
Task-number: QTBUG-18188
Change-Id: I138dabc665d7275fb85d3b5e1b473d56096a989e
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/qscriptengine/tst_qscriptengine.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/tests/auto/qscriptengine/tst_qscriptengine.cpp b/tests/auto/qscriptengine/tst_qscriptengine.cpp index b1b416c..514d29a 100644 --- a/tests/auto/qscriptengine/tst_qscriptengine.cpp +++ b/tests/auto/qscriptengine/tst_qscriptengine.cpp @@ -250,6 +250,7 @@ private slots: void stringListFromArrayWithEmptyElement(); void collectQObjectWithCachedWrapper_data(); void collectQObjectWithCachedWrapper(); + void pushContext_noInheritedScope(); }; tst_QScriptEngine::tst_QScriptEngine() @@ -6218,5 +6219,31 @@ void tst_QScriptEngine::collectQObjectWithCachedWrapper() QCOMPARE(ptr == 0, shouldBeCollected); } +// QTBUG-18188 +void tst_QScriptEngine::pushContext_noInheritedScope() +{ + QScriptEngine eng; + eng.globalObject().setProperty("foo", 123); + + QScriptContext *ctx1 = eng.pushContext(); + QCOMPARE(ctx1->scopeChain().size(), 2); + ctx1->activationObject().setProperty("foo", 456); + QCOMPARE(eng.evaluate("foo").toInt32(), 456); + + QScriptContext *ctx2 = eng.pushContext(); + // The parent context's scope should not be inherited. + QCOMPARE(ctx2->scopeChain().size(), 2); + QCOMPARE(eng.evaluate("foo").toInt32(), 123); + + ctx2->activationObject().setProperty("foo", 789); + QCOMPARE(eng.evaluate("foo").toInt32(), 789); + + eng.popContext(); + QCOMPARE(eng.evaluate("foo").toInt32(), 456); + + eng.popContext(); + QCOMPARE(eng.evaluate("foo").toInt32(), 123); +} + QTEST_MAIN(tst_QScriptEngine) #include "tst_qscriptengine.moc" |