aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative
diff options
context:
space:
mode:
authorMartin Jones <martin.jones@nokia.com>2012-02-17 13:08:21 +1000
committerQt by Nokia <qt-info@nokia.com>2012-02-22 00:03:53 +0100
commitf60588237b230923c6a27f60669fa0230138f1ca (patch)
tree7fa24633c22c7aa06dcb395fab499c8abb8f9b6a /src/declarative
parenta73ad904c9a4ad188604de6c64a6c91cd514dc1b (diff)
Implement String.localeCompare() using QString::localeAwareCompare()
v8's localeCompare() implementation is not locale aware, so we use Qt's locale aware compare. Change-Id: Ia9092b3d6754545bb797adac26080ac7a29dcd92 Reviewed-by: Glenn Watson <glenn.watson@nokia.com>
Diffstat (limited to 'src/declarative')
-rw-r--r--src/declarative/qml/qdeclarativelocale.cpp30
-rw-r--r--src/declarative/qml/qdeclarativelocale_p.h4
-rw-r--r--src/declarative/qml/v8/qv8engine.cpp1
3 files changed, 35 insertions, 0 deletions
diff --git a/src/declarative/qml/qdeclarativelocale.cpp b/src/declarative/qml/qdeclarativelocale.cpp
index 8ec51b058c..39d0f6c378 100644
--- a/src/declarative/qml/qdeclarativelocale.cpp
+++ b/src/declarative/qml/qdeclarativelocale.cpp
@@ -834,6 +834,36 @@ v8::Handle<v8::Value> QDeclarativeLocale::locale(QV8Engine *v8engine, const QStr
return v8Value;
}
+static const char *localeCompareFunction =
+ "(function(localeCompareFunc) { "
+ " var orig_localeCompare;"
+ " orig_localeCompare = String.prototype.localeCompare;"
+ " String.prototype.localeCompare = (function() {"
+ " var val = localeCompareFunc.apply(this, arguments);"
+ " if (val == undefined) val = orig_localeCompare.call(this);"
+ " return val;"
+ " })"
+ "})";
+
+void QDeclarativeLocale::registerStringLocaleCompare(QV8Engine *engine)
+{
+ registerFunction(engine, localeCompareFunction, localeCompare);
+}
+
+v8::Handle<v8::Value> QDeclarativeLocale::localeCompare(const v8::Arguments &args)
+{
+ if (args.Length() != 1 || (!args[0]->IsString() && !args[0]->IsStringObject()))
+ return v8::Undefined();
+
+ if (!args.This()->IsString() && !args.This()->IsStringObject())
+ return v8::Undefined();
+
+ QString thisString = QJSConverter::toString(args.This()->ToString());
+ QString thatString = QJSConverter::toString(args[0]->ToString());
+
+ return v8::Integer::New(QString::localeAwareCompare(thisString, thatString));
+}
+
/*!
\enum QtQuick2::Locale::FormatType
diff --git a/src/declarative/qml/qdeclarativelocale_p.h b/src/declarative/qml/qdeclarativelocale_p.h
index 904e4e6b11..98370fbf8a 100644
--- a/src/declarative/qml/qdeclarativelocale_p.h
+++ b/src/declarative/qml/qdeclarativelocale_p.h
@@ -119,8 +119,12 @@ public:
static v8::Handle<v8::Value> locale(QV8Engine *v8engine, const QString &lang);
+ static void registerStringLocaleCompare(QV8Engine *engine);
+
private:
QDeclarativeLocale();
+
+ static v8::Handle<v8::Value> localeCompare(const v8::Arguments &args);
};
diff --git a/src/declarative/qml/v8/qv8engine.cpp b/src/declarative/qml/v8/qv8engine.cpp
index 92cd336e1c..04589fe244 100644
--- a/src/declarative/qml/v8/qv8engine.cpp
+++ b/src/declarative/qml/v8/qv8engine.cpp
@@ -636,6 +636,7 @@ void QV8Engine::initializeGlobal(v8::Handle<v8::Object> global)
#undef STRING_ARG
}
+ QDeclarativeLocale::registerStringLocaleCompare(this);
QDeclarativeDateExtension::registerExtension(this);
QDeclarativeNumberExtension::registerExtension(this);