Skip to content

Commit

Permalink
Add QJSValue::deleteProperty() function
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Kent Hansen authored and Qt by Nokia committed Jan 20, 2012
1 parent 45a83b4 commit 23805ae
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 1 deletion.
29 changes: 28 additions & 1 deletion src/declarative/qml/v8/qjsvalue.cpp
Expand Up @@ -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)
{
Expand Down Expand Up @@ -943,6 +943,33 @@ void QJSValue::setProperty(quint32 arrayIndex, const QJSValue& value)
d->setProperty(arrayIndex, QJSValuePrivate::get(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.
Expand Down
2 changes: 2 additions & 0 deletions src/declarative/qml/v8/qjsvalue.h
Expand Up @@ -134,6 +134,8 @@ class Q_DECLARATIVE_EXPORT QJSValue
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(),
Expand Down
44 changes: 44 additions & 0 deletions tests/auto/declarative/qjsvalue/tst_qjsvalue.cpp
Expand Up @@ -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;
Expand Down
4 changes: 4 additions & 0 deletions tests/auto/declarative/qjsvalue/tst_qjsvalue.h
Expand Up @@ -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();
Expand Down

0 comments on commit 23805ae

Please sign in to comment.