Add .arg() for Javascript String type
authorCharles Yin <charles.yin@nokia.com>
Tue, 26 Jul 2011 00:47:13 +0000 (10:47 +1000)
committerQt by Nokia <qt-info@nokia.com>
Fri, 29 Jul 2011 00:47:11 +0000 (02:47 +0200)
Change-Id: I973032189c40bfa4d5450396f5bad1a7c81ac68b
Task-number:QTBUG-16734
Reviewed-by:Michael Brasser
Reviewed-on: http://codereview.qt.nokia.com/2134
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
src/declarative/qml/v8/qv8engine.cpp
src/declarative/qml/v8/qv8engine_p.h
tests/auto/declarative/qdeclarativeecmascript/data/dynamicString.qml [new file with mode: 0644]
tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp

index 0569242..0294a60 100644 (file)
@@ -578,6 +578,10 @@ void QV8Engine::initializeGlobal(v8::Handle<v8::Object> global)
     global->Set(v8::String::New("Qt"), qt);
     global->Set(v8::String::New("gc"), V8FUNCTION(gc, this));
 
+    v8::Local<v8::Object> string = v8::Local<v8::Object>::Cast(global->Get(v8::String::New("String")));
+    v8::Local<v8::Object> stringPrototype = v8::Local<v8::Object>::Cast(string->Get(v8::String::New("prototype")));
+    stringPrototype->Set(v8::String::New("arg"), V8FUNCTION(stringArg, this));
+
     m_xmlHttpRequestData = qt_add_qmlxmlhttprequest(this);
     m_sqlDatabaseData = qt_add_qmlsqldatabase(this);
 
@@ -721,6 +725,23 @@ v8::Handle<v8::Value> QV8Engine::print(const v8::Arguments &args)
     return v8::Undefined();
 }
 
+v8::Handle<v8::Value> QV8Engine::stringArg(const v8::Arguments &args)
+{
+    QString value = V8ENGINE()->toString(args.This()->ToString());
+    if (args.Length() != 1)
+        V8THROW_ERROR("String.arg(): Invalid arguments");
+
+    if (args[0]->IsUint32())
+        return V8ENGINE()->toString(value.arg(args[0]->Uint32Value()));
+    else if (args[0]->IsInt32())
+        return V8ENGINE()->toString(value.arg(args[0]->Int32Value()));
+    else if (args[0]->IsNumber())
+        return V8ENGINE()->toString(value.arg(args[0]->NumberValue()));
+    else if (args[0]->IsBoolean())
+        return V8ENGINE()->toString(value.arg(args[0]->BooleanValue()));
+
+    return V8ENGINE()->toString(value.arg(V8ENGINE()->toString(args[0])));
+}
 /*!
 \qmlmethod bool Qt::isQtObject(object)
 Returns true if \c object is a valid reference to a Qt or QML object, otherwise false.
index 5058eee..7dc3336 100644 (file)
@@ -351,6 +351,7 @@ private:
     static v8::Handle<v8::Value> qsTrNoOp(const v8::Arguments &args);
     static v8::Handle<v8::Value> qsTrId(const v8::Arguments &args);
     static v8::Handle<v8::Value> qsTrIdNoOp(const v8::Arguments &args);
+    static v8::Handle<v8::Value> stringArg(const v8::Arguments &args);
 
     double qtDateTimeToJsDate(const QDateTime &dt);
     QDateTime qtDateTimeFromJsDate(double jsDate);
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/dynamicString.qml b/tests/auto/declarative/qdeclarativeecmascript/data/dynamicString.qml
new file mode 100644 (file)
index 0000000..5693794
--- /dev/null
@@ -0,0 +1,16 @@
+import Qt.test 1.0
+import QtQuick 2.0
+
+MyTypeObject {
+  stringProperty:"string:%0 false:%1 true:%2 uint32:%3 int32:%4 double:%5 date:%6!"
+  Component.onCompleted: {
+     var date = new Date();
+     date.setDate(11);
+     date.setMonth(1);
+     date.setFullYear(2011);
+     date.setHours(5);
+     date.setMinutes(30);
+     date.setSeconds(50);
+     stringProperty = stringProperty.arg("Hello World").arg(false).arg(true).arg(100).arg(-100).arg(3.1415926).arg(Qt.formatDateTime(date, "yyyy-MM-dd hh::mm:ss"));
+  }
+}
index 2b02ad2..bc33932 100644 (file)
@@ -184,7 +184,7 @@ private slots:
     void aliasWritesOverrideBindings();
     void aliasToCompositeElement();
     void realToInt();
-
+    void dynamicString();
     void include();
 
     void callQtInvokables();
@@ -3644,6 +3644,14 @@ void tst_qdeclarativeecmascript::realToInt()
     QMetaObject::invokeMethod(object, "test2");
     QCOMPARE(object->value(), int(8));
 }
+void tst_qdeclarativeecmascript::dynamicString()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("dynamicString.qml"));
+    QObject *object = component.create();
+    QVERIFY(object != 0);
+    QCOMPARE(object->property("stringProperty").toString(),
+             QString::fromLatin1("string:Hello World false:0 true:1 uint32:100 int32:-100 double:3.14159 date:2011-02-11 05::30:50!"));
+}
 
 QTEST_MAIN(tst_qdeclarativeecmascript)