aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKent Hansen <kent.hansen@nokia.com>2012-01-18 10:00:02 +0100
committerQt by Nokia <qt-info@nokia.com>2012-01-20 23:35:18 +0100
commit23805ae47898a1ae4b5c8d8bb30b8b69d2fc435a (patch)
tree487d8a346511974e210393a416dbeb95880387f7
parent45a83b43ea431a27a7ea05e7e621013dfcfe409a (diff)
Add QJSValue::deleteProperty() function
This makes it possible to delete a property without relying on passing a QJSValue of invalid type to setProperty() (the invalid type is going to be removed). Task-number: QTBUG-23604 Change-Id: I653b3349050ad1aac1cf6ccc8547c753abbb9f1d Reviewed-by: Simon Hausmann <simon.hausmann@nokia.com> Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@nokia.com>
-rw-r--r--src/declarative/qml/v8/qjsvalue.cpp29
-rw-r--r--src/declarative/qml/v8/qjsvalue.h2
-rw-r--r--tests/auto/declarative/qjsvalue/tst_qjsvalue.cpp44
-rw-r--r--tests/auto/declarative/qjsvalue/tst_qjsvalue.h4
4 files changed, 78 insertions, 1 deletions
diff --git a/src/declarative/qml/v8/qjsvalue.cpp b/src/declarative/qml/v8/qjsvalue.cpp
index 9980463a8f..9d21a1db28 100644
--- a/src/declarative/qml/v8/qjsvalue.cpp
+++ b/src/declarative/qml/v8/qjsvalue.cpp
@@ -915,7 +915,7 @@ QJSValue QJSValue::property(quint32 arrayIndex) const
built-in properties, such as the \c{length} property of Array objects
or meta properties of QObject objects.
- \sa property()
+ \sa property(), deleteProperty()
*/
void QJSValue::setProperty(const QString& name, const QJSValue& value)
{
@@ -944,6 +944,33 @@ void QJSValue::setProperty(quint32 arrayIndex, const QJSValue& value)
}
/*!
+ Attempts to delete this object's property of the given \a name.
+ Returns true if the property was deleted, otherwise returns false.
+
+ The behavior of this function is consistent with the JavaScript
+ delete operator. In particular:
+
+ \list
+ \o Non-configurable properties cannot be deleted.
+ \o This function will return true even if this object doesn't
+ have a property of the given \a name (i.e., non-existent
+ properties are "trivially deletable").
+ \o If this object doesn't have an own property of the given
+ \a name, but an object in the prototype() chain does, the
+ prototype object's property is not deleted, and this function
+ returns true.
+ \endlist
+
+ \sa setProperty(), hasOwnProperty()
+*/
+bool QJSValue::deleteProperty(const QString &name)
+{
+ Q_D(QJSValue);
+ QScriptIsolate api(d->engine());
+ return d->deleteProperty(name);
+}
+
+/*!
Returns true if this object has a property of the given \a name,
otherwise returns false.
diff --git a/src/declarative/qml/v8/qjsvalue.h b/src/declarative/qml/v8/qjsvalue.h
index 756081d842..280f44e924 100644
--- a/src/declarative/qml/v8/qjsvalue.h
+++ b/src/declarative/qml/v8/qjsvalue.h
@@ -134,6 +134,8 @@ public:
QJSValue property(quint32 arrayIndex) const;
void setProperty(quint32 arrayIndex, const QJSValue &value);
+ bool deleteProperty(const QString &name);
+
QJSValue::PropertyFlags propertyFlags(const QString &name) const;
QJSValue call(const QJSValue &thisObject = QJSValue(),
diff --git a/tests/auto/declarative/qjsvalue/tst_qjsvalue.cpp b/tests/auto/declarative/qjsvalue/tst_qjsvalue.cpp
index e8073bc69a..caff7fc065 100644
--- a/tests/auto/declarative/qjsvalue/tst_qjsvalue.cpp
+++ b/tests/auto/declarative/qjsvalue/tst_qjsvalue.cpp
@@ -1843,6 +1843,50 @@ void tst_QJSValue::hasProperty_changePrototype()
QVERIFY(obj.hasOwnProperty("foo"));
}
+void tst_QJSValue::deleteProperty_basic()
+{
+ QJSEngine eng;
+ QJSValue obj = eng.newObject();
+ // deleteProperty() behavior matches JS delete operator
+ QVERIFY(obj.deleteProperty("foo"));
+
+ obj.setProperty("foo", 123);
+ QVERIFY(obj.deleteProperty("foo"));
+ QVERIFY(!obj.hasOwnProperty("foo"));
+}
+
+void tst_QJSValue::deleteProperty_globalObject()
+{
+ QJSEngine eng;
+ QJSValue global = eng.globalObject();
+ // deleteProperty() behavior matches JS delete operator
+ QVERIFY(global.deleteProperty("foo"));
+
+ global.setProperty("foo", 123);
+ QVERIFY(global.deleteProperty("foo"));
+ QVERIFY(!global.hasProperty("foo"));
+
+ QVERIFY(global.deleteProperty("Math"));
+ QVERIFY(!global.hasProperty("Math"));
+
+ QVERIFY(!global.deleteProperty("NaN")); // read-only
+ QVERIFY(global.hasProperty("NaN"));
+}
+
+void tst_QJSValue::deleteProperty_inPrototype()
+{
+ QJSEngine eng;
+ QJSValue obj = eng.newObject();
+ QJSValue proto = eng.newObject();
+ obj.setPrototype(proto);
+
+ proto.setProperty("foo", 123);
+ QVERIFY(obj.hasProperty("foo"));
+ // deleteProperty() behavior matches JS delete operator
+ QVERIFY(obj.deleteProperty("foo"));
+ QVERIFY(obj.hasProperty("foo"));
+}
+
void tst_QJSValue::getSetProperty_HooliganTask162051()
{
QJSEngine eng;
diff --git a/tests/auto/declarative/qjsvalue/tst_qjsvalue.h b/tests/auto/declarative/qjsvalue/tst_qjsvalue.h
index 7f7c04abe8..7696f61a06 100644
--- a/tests/auto/declarative/qjsvalue/tst_qjsvalue.h
+++ b/tests/auto/declarative/qjsvalue/tst_qjsvalue.h
@@ -117,6 +117,10 @@ private slots:
void hasProperty_globalObject();
void hasProperty_changePrototype();
+ void deleteProperty_basic();
+ void deleteProperty_globalObject();
+ void deleteProperty_inPrototype();
+
void getSetPrototype_cyclicPrototype();
void getSetPrototype_evalCyclicPrototype();
void getSetPrototype_eval();