aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/v8
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2011-07-01 16:31:05 +1000
committerQt by Nokia <qt-info@nokia.com>2011-07-01 08:32:43 +0200
commit628a5cd0669dbfb6a4f2b60f5b59b044f8ca2bbb (patch)
tree5c6a7dc2b130b71c1d029fb2f051d63728928b60 /src/declarative/qml/v8
parentce8a1ef6f1a2868c6e4c19a56e94ca623b6b9889 (diff)
Variants should compare as equal
We need to implement an object comparison callback to ensure that two variants with identical values (although different JS objects) compare as equal. We also add a v8 autotest for this callback. Change-Id: Idd1ab602d31b398a937d4df4a7bd091aa205de24 Reviewed-on: http://codereview.qt.nokia.com/989 Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
Diffstat (limited to 'src/declarative/qml/v8')
-rw-r--r--src/declarative/qml/v8/qv8engine.cpp31
-rw-r--r--src/declarative/qml/v8/qv8variantwrapper.cpp2
2 files changed, 33 insertions, 0 deletions
diff --git a/src/declarative/qml/v8/qv8engine.cpp b/src/declarative/qml/v8/qv8engine.cpp
index cb89d0f57f..67679b9dae 100644
--- a/src/declarative/qml/v8/qv8engine.cpp
+++ b/src/declarative/qml/v8/qv8engine.cpp
@@ -66,6 +66,34 @@
// QDeclarativeEngine is not available
QT_BEGIN_NAMESPACE
+static bool ObjectComparisonCallback(v8::Local<v8::Object> lhs, v8::Local<v8::Object> rhs)
+{
+ if (lhs == rhs)
+ return true;
+
+ QV8ObjectResource *lhsr = static_cast<QV8ObjectResource*>(lhs->GetExternalResource());
+ QV8ObjectResource *rhsr = static_cast<QV8ObjectResource*>(rhs->GetExternalResource());
+
+ Q_ASSERT(lhsr->engine == rhsr->engine);
+
+ if (lhsr && rhsr) {
+ QV8ObjectResource::ResourceType lhst = lhsr->resourceType();
+ QV8ObjectResource::ResourceType rhst = rhsr->resourceType();
+
+ switch (lhst) {
+ case QV8ObjectResource::VariantType:
+ if (rhst == QV8ObjectResource::VariantType)
+ return lhsr->engine->variantWrapper()->toVariant(lhsr) ==
+ lhsr->engine->variantWrapper()->toVariant(rhsr);
+ break;
+ default:
+ break;
+ }
+ }
+
+ return false;
+}
+
QV8Engine::QV8Engine()
: m_xmlHttpRequestData(0), m_sqlDatabaseData(0), m_listModelData(0)
{
@@ -109,6 +137,8 @@ void QV8Engine::init(QDeclarativeEngine *engine)
qPersistentRegister(m_context);
v8::Context::Scope context_scope(m_context);
+ v8::V8::SetUserObjectComparisonCallbackFunction(ObjectComparisonCallback);
+
m_stringWrapper.init();
m_contextWrapper.init(this);
m_qobjectWrapper.init(this);
@@ -658,6 +688,7 @@ void QV8Engine::setExtensionData(int index, Deletable *data)
v8::Handle<v8::Value> QV8Engine::gc(const v8::Arguments &args)
{
+ Q_UNUSED(args);
gc();
return v8::Undefined();
}
diff --git a/src/declarative/qml/v8/qv8variantwrapper.cpp b/src/declarative/qml/v8/qv8variantwrapper.cpp
index 9d486d05b7..a5602fbbad 100644
--- a/src/declarative/qml/v8/qv8variantwrapper.cpp
+++ b/src/declarative/qml/v8/qv8variantwrapper.cpp
@@ -76,6 +76,7 @@ void QV8VariantWrapper::init(QV8Engine *engine)
v8::Local<v8::FunctionTemplate> ft = v8::FunctionTemplate::New();
ft->InstanceTemplate()->SetFallbackPropertyHandler(Getter, Setter);
ft->InstanceTemplate()->SetHasExternalResource(true);
+ ft->InstanceTemplate()->MarkAsUseUserObjectComparison();
ft->InstanceTemplate()->SetAccessor(v8::String::New("toString"), ToStringGetter, 0,
m_toString, v8::DEFAULT,
v8::PropertyAttribute(v8::ReadOnly | v8::DontDelete));
@@ -87,6 +88,7 @@ void QV8VariantWrapper::init(QV8Engine *engine)
v8::Local<v8::FunctionTemplate> ft = v8::FunctionTemplate::New();
ft->InstanceTemplate()->SetFallbackPropertyHandler(Getter, Setter);
ft->InstanceTemplate()->SetHasExternalResource(true);
+ ft->InstanceTemplate()->MarkAsUseUserObjectComparison();
ft->InstanceTemplate()->SetAccessor(v8::String::New("preserve"), PreserveGetter, 0,
m_preserve, v8::DEFAULT,
v8::PropertyAttribute(v8::ReadOnly | v8::DontDelete));