// Copyright 2009 Google Inc. All Rights Reserved. // Author: xdong@google.com (Tiger Dong) #include #include #include #include #include static bool flag = false; class ResolveClass : public QScriptClass { public: ResolveClass(QScriptEngine *engine) : QScriptClass(engine) {} QScriptValue property(const QScriptValue &obj, const QScriptString &name, uint id) { if (name.toString() == "b") { return QScriptValue(200); } else { return QScriptValue(); } } QueryFlags queryProperty(const QScriptValue &obj, const QScriptString &name, QueryFlags flags, uint *id) { if (name.toString() == "a") return 0; return HandlesReadAccess | HandlesWriteAccess; } }; static void Verify(const QString &method, QScriptEngine &engine) { engine.evaluate("var a = 100; a = b;"); QScriptValue a = engine.globalObject().property("a"); if (a.toInteger() == 200) { qDebug() << method << " OK"; } else { qDebug() << method << " Fail:" << a.toInteger(); } } static void Method1() { QScriptEngine engine; ResolveClass resolve_class(&engine); engine.globalObject().setScriptClass(&resolve_class); Verify("method1", engine); } static void Method2() { QScriptEngine engine; ResolveClass resolve_class(&engine); engine.globalObject().setPrototype(engine.newObject(&resolve_class)); Verify("method2", engine); } static void Method3() { QScriptEngine engine; ResolveClass resolve_class(&engine); engine.setGlobalObject(engine.newObject(&resolve_class)); Verify("method3", engine); } static void Method4() { QScriptEngine engine; ResolveClass resolve_class(&engine); QScriptValue global = engine.newObject(); global.setPrototype(engine.newObject(&resolve_class)); engine.setGlobalObject(global); Verify("method4", engine); } static void Method5() { QScriptEngine engine; ResolveClass resolve_class(&engine); QScriptValue global = engine.newObject(); global.setProperty("b", 200); engine.setGlobalObject(global); Verify("method5", engine); } int main(int argc, char **argv) { QCoreApplication app(argc, argv); Method1(); Method2(); Method3(); Method4(); Method5(); return 0; }