src/declarative/qml/qdeclarativeglobalscriptclass.cpp
changeset 33 3e2da88830cd
parent 30 5dc02b23752f
--- a/src/declarative/qml/qdeclarativeglobalscriptclass.cpp	Tue Jul 06 15:10:48 2010 +0300
+++ b/src/declarative/qml/qdeclarativeglobalscriptclass.cpp	Wed Aug 18 10:37:55 2010 +0300
@@ -41,10 +41,14 @@
 
 #include "private/qdeclarativeglobalscriptclass_p.h"
 
+#include <QtCore/qstringlist.h>
+#include <QtCore/qvector.h>
 #include <QtScript/qscriptstring.h>
 #include <QtScript/qscriptengine.h>
 #include <QtScript/qscriptvalueiterator.h>
 
+#include <private/qscriptdeclarativeclass_p.h>
+
 QT_BEGIN_NAMESPACE
 
 /*
@@ -54,24 +58,36 @@
 : QScriptClass(engine)
 {
     QString eval = QLatin1String("eval");
+    QString version = QLatin1String("version");
 
-    QScriptValue globalObject = engine->globalObject();
+    QScriptValue originalGlobalObject = engine->globalObject();
 
-    m_globalObject = engine->newObject();
     QScriptValue newGlobalObject = engine->newObject();
 
-    QScriptValueIterator iter(globalObject);
+    {
+        QScriptValueIterator iter(originalGlobalObject);
+        QVector<QString> names;
+        QVector<QScriptValue> values;
+        QVector<QScriptValue::PropertyFlags> flags;
+        while (iter.hasNext()) {
+            iter.next();
 
-    while (iter.hasNext()) {
-        iter.next();
+            QString name = iter.name();
 
-        QString name = iter.name();
+            if (name == version)
+                continue;
 
-        if (name != eval)
-            m_globalObject.setProperty(iter.scriptName(), iter.value());
-        newGlobalObject.setProperty(iter.scriptName(), iter.value());
+            if (name != eval) {
+                names.append(name);
+                values.append(iter.value());
+                flags.append(iter.flags() | QScriptValue::Undeletable);
+            }
+            newGlobalObject.setProperty(iter.scriptName(), iter.value());
 
-        m_illegalNames.insert(name);
+            m_illegalNames.insert(name);
+        }
+        m_staticGlobalObject = QScriptDeclarativeClass::newStaticScopeObject(
+            engine, names.size(), names.constData(), values.constData(), flags.constData());
     }
 
     newGlobalObject.setScriptClass(this);
@@ -87,18 +103,7 @@
     Q_UNUSED(name);
     Q_UNUSED(flags);
     Q_UNUSED(id);
-    return HandlesReadAccess | HandlesWriteAccess;
-}
-
-QScriptValue 
-QDeclarativeGlobalScriptClass::property(const QScriptValue &object,
-                               const QScriptString &name, 
-                               uint id)
-{
-    Q_UNUSED(object);
-    Q_UNUSED(name);
-    Q_UNUSED(id);
-    return engine()->undefinedValue();
+    return HandlesWriteAccess;
 }
 
 void QDeclarativeGlobalScriptClass::setProperty(QScriptValue &object, 
@@ -114,8 +119,9 @@
 }
 
 /* This method is for the use of tst_qdeclarativeecmascript::callQtInvokables() only */
-void QDeclarativeGlobalScriptClass::explicitSetProperty(const QString &name, const QScriptValue &value)
+void QDeclarativeGlobalScriptClass::explicitSetProperty(const QStringList &names, const QList<QScriptValue> &values)
 {
+    Q_ASSERT(names.count() == values.count());
     QScriptValue globalObject = engine()->globalObject();
 
     QScriptValue v = engine()->newObject();
@@ -126,7 +132,12 @@
         v.setProperty(iter.scriptName(), iter.value());
     }
 
-    v.setProperty(name, value);
+    for (int ii = 0; ii < names.count(); ++ii) {
+        const QString &name = names.at(ii);
+        const QScriptValue &value = values.at(ii);
+        v.setProperty(name, value);
+    }
+
     v.setScriptClass(this);
 
     engine()->setGlobalObject(v);