Remove "All rights reserved" line from license headers.
[profile/ivi/qtdeclarative.git] / tests / auto / declarative / qdeclarativeecmascript / testtypes.h
index 52b74af..d413209 100644 (file)
@@ -1,8 +1,7 @@
 /****************************************************************************
 **
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
 **
 ** This file is part of the test suite of the Qt Toolkit.
 **
@@ -35,6 +34,7 @@
 **
 **
 **
+**
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/
@@ -57,8 +57,8 @@
 #include <QtDeclarative/qdeclarativescriptstring.h>
 #include <QtDeclarative/qdeclarativecomponent.h>
 
-#include <private/qv8gccallback_p.h>
 #include <private/qdeclarativeengine_p.h>
+#include <private/qv8engine_p.h>
 
 class MyQmlAttachedObject : public QObject
 {
@@ -93,14 +93,16 @@ class MyQmlObject : public QObject
     Q_PROPERTY(int value READ value WRITE setValue)
     Q_PROPERTY(int console READ console CONSTANT)
     Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty NOTIFY stringChanged)
+    Q_PROPERTY(QUrl urlProperty READ urlProperty WRITE setUrlProperty NOTIFY urlChanged)
     Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty NOTIFY objectChanged)
     Q_PROPERTY(QDeclarativeListProperty<QObject> objectListProperty READ objectListProperty CONSTANT)
     Q_PROPERTY(int resettableProperty READ resettableProperty WRITE setResettableProperty RESET resetProperty)
     Q_PROPERTY(QRegExp regExp READ regExp WRITE setRegExp)
     Q_PROPERTY(int nonscriptable READ nonscriptable WRITE setNonscriptable SCRIPTABLE false)
+    Q_PROPERTY(int intProperty READ intProperty WRITE setIntProperty NOTIFY intChanged)
 
 public:
-    MyQmlObject(): myinvokableObject(0), m_methodCalled(false), m_methodIntCalled(false), m_object(0), m_value(0), m_resetProperty(13) {}
+    MyQmlObject(): myinvokableObject(0), m_methodCalled(false), m_methodIntCalled(false), m_object(0), m_value(0), m_resetProperty(13), m_intProperty(0) {}
 
     enum MyEnum { EnumValue1 = 0, EnumValue2 = 1 };
     enum MyEnum2 { EnumValue3 = 2, EnumValue4 = 3 };
@@ -117,6 +119,15 @@ public:
         emit stringChanged();
     }
 
+    QUrl urlProperty() const { return m_url; }
+    void setUrlProperty(const QUrl &url)
+    {
+        if (url == m_url)
+            return;
+        m_url = url;
+        emit urlChanged();
+    }
+
     QObject *objectProperty() const { return m_object; }
     void setObjectProperty(QObject *obj) { 
         if (obj == m_object)
@@ -161,15 +172,23 @@ public:
         int value;
     };
     QVariant variant() const { return m_variant; }
+    QJSValue qjsvalue() const { return m_qjsvalue; }
+
+    int intProperty() const { return m_intProperty; }
+    void setIntProperty(int i) { m_intProperty = i; emit intChanged(); }
     
 signals:
     void basicSignal();
     void argumentSignal(int a, QString b, qreal c, MyEnum2 d, Qt::MouseButtons e);
     void stringChanged();
+    void urlChanged();
     void objectChanged();
     void anotherBasicSignal();
     void thirdBasicSignal();
     void signalWithUnknownType(const MyQmlObject::MyType &arg);
+    void signalWithVariant(const QVariant &arg);
+    void signalWithQJSValue(const QJSValue &arg);
+    void intChanged();
 
 public slots:
     void deleteMe() { delete this; }
@@ -178,6 +197,8 @@ public slots:
     void setString(const QString &s) { m_string = s; }
     void myinvokable(MyQmlObject *o) { myinvokableObject = o; }
     void variantMethod(const QVariant &v) { m_variant = v; }
+    void qjsvalueMethod(const QJSValue &v) { m_qjsvalue = v; }
+    void v8function(QDeclarativeV8Function*);
 
 private:
     friend class tst_qdeclarativeecmascript;
@@ -186,11 +207,14 @@ private:
 
     QObject *m_object;
     QString m_string;
+    QUrl m_url;
     QList<QObject *> m_objectQList;
     int m_value;
     int m_resetProperty;
     QRegExp m_regExp;
     QVariant m_variant;
+    QJSValue m_qjsvalue;
+    int m_intProperty;
 };
 
 QML_DECLARE_TYPEINFO(MyQmlObject, QML_HAS_ATTACHED_PROPERTIES)
@@ -927,12 +951,24 @@ public:
 
     bool scarceResourceIsDetached() const { return m_value.isDetached(); }
 
+    // this particular one returns a new one each time
+    // this means that every Scarce Resource Copy will
+    // consume resources (so that we can track disposal
+    // of v8 handles with circular references).
+    Q_INVOKABLE QPixmap newScarceResource() const
+    {
+        QPixmap retn(800, 600);
+        retn.fill(QColor(100, 110, 120, 45));
+        return retn;
+    }
+
 signals:
     void scarceResourceChanged();
 
 private:
     QPixmap m_value;
 };
+QML_DECLARE_TYPE(ScarceResourceObject)
 
 class testQObjectApi : public QObject
 {
@@ -995,6 +1031,7 @@ public:
     {
         CircularReferenceObject *retn = new CircularReferenceObject(parent);
         retn->m_dtorCount = m_dtorCount;
+        retn->m_engine = m_engine;
         return retn;
     }
 
@@ -1003,17 +1040,23 @@ public:
         m_referenced = other;
     }
 
-    static void callback(QV8GCCallback::Referencer *r, QV8GCCallback::Node *n)
+    static void callback(QV8GCCallback::Node *n)
     {
         CircularReferenceObject *cro = static_cast<CircularReferenceObject*>(n);
         if (cro->m_referenced) {
-            r->addRelationship(cro, cro->m_referenced);
+            cro->m_engine->addRelationshipForGC(cro, cro->m_referenced);
         }
     }
 
+    void setEngine(QDeclarativeEngine* declarativeEngine)
+    {
+        m_engine = QDeclarativeEnginePrivate::get(declarativeEngine)->v8engine();
+    }
+
 private:
     QObject *m_referenced;
     int *m_dtorCount;
+    QV8Engine* m_engine;
 };
 Q_DECLARE_METATYPE(CircularReferenceObject*)
 
@@ -1024,7 +1067,7 @@ class CircularReferenceHandle : public QObject,
 
 public:
     CircularReferenceHandle(QObject *parent = 0)
-        : QObject(parent), QV8GCCallback::Node(gccallback), m_dtorCount(0)
+        : QObject(parent), QV8GCCallback::Node(gccallback), m_dtorCount(0), m_engine(0)
     {
         QV8GCCallback::addGcCallbackNode(this);
     }
@@ -1043,6 +1086,7 @@ public:
     {
         CircularReferenceHandle *retn = new CircularReferenceHandle(parent);
         retn->m_dtorCount = m_dtorCount;
+        retn->m_engine = m_engine;
         return retn;
     }
 
@@ -1059,18 +1103,189 @@ public:
         crh->m_referenced.Clear();
     }
 
-    static void gccallback(QV8GCCallback::Referencer *r, QV8GCCallback::Node *n)
+    static void gccallback(QV8GCCallback::Node *n)
     {
         CircularReferenceHandle *crh = static_cast<CircularReferenceHandle*>(n);
-        r->addRelationship(crh, crh->m_referenced);
+        crh->m_engine->addRelationshipForGC(crh, crh->m_referenced);
+    }
+
+    void setEngine(QDeclarativeEngine* declarativeEngine)
+    {
+        m_engine = QDeclarativeEnginePrivate::get(declarativeEngine)->v8engine();
     }
 
 private:
     v8::Persistent<v8::Value> m_referenced;
     int *m_dtorCount;
+    QV8Engine* m_engine;
 };
 Q_DECLARE_METATYPE(CircularReferenceHandle*)
 
+class MyDynamicCreationDestructionObject : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY (int intProperty READ intProperty WRITE setIntProperty NOTIFY intPropertyChanged)
+
+public:
+    MyDynamicCreationDestructionObject(QObject *parent = 0) : QObject(parent), m_intProperty(0), m_dtorCount(0)
+    {
+    }
+
+    ~MyDynamicCreationDestructionObject()
+    {
+        if (m_dtorCount) {
+            (*m_dtorCount)++;
+        }
+    }
+
+    int intProperty() const { return m_intProperty; }
+    void setIntProperty(int val) { m_intProperty = val; emit intPropertyChanged(); }
+
+    Q_INVOKABLE MyDynamicCreationDestructionObject *createNew()
+    {
+        // no parent == ownership transfers to JS; same dtor counter.
+        MyDynamicCreationDestructionObject *retn = new MyDynamicCreationDestructionObject;
+        retn->setDtorCount(m_dtorCount);
+        return retn;
+    }
+
+    void setDtorCount(int *dtorCount)
+    {
+        m_dtorCount = dtorCount;
+    }
+
+signals:
+    void intPropertyChanged();
+
+private:
+    int m_intProperty;
+    int *m_dtorCount;
+};
+
+class WriteCounter : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(int value READ value WRITE setValue);
+public:
+    WriteCounter() : m_value(0), m_count(0) {}
+
+    int value() const { return m_value; }
+    void setValue(int v) { m_value = v; ++m_count; }
+
+    int count() const { return m_count; }
+
+private:
+    int m_value;
+    int m_count;
+};
+
+class MySequenceConversionObject : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY (QList<int> intListProperty READ intListProperty WRITE setIntListProperty NOTIFY intListPropertyChanged)
+    Q_PROPERTY (QList<int> intListProperty2 READ intListProperty2 WRITE setIntListProperty2 NOTIFY intListProperty2Changed)
+    Q_PROPERTY (QList<qreal> qrealListProperty READ qrealListProperty WRITE setQrealListProperty NOTIFY qrealListPropertyChanged)
+    Q_PROPERTY (QList<bool> boolListProperty READ boolListProperty WRITE setBoolListProperty NOTIFY boolListPropertyChanged)
+    Q_PROPERTY (QList<QString> stringListProperty READ stringListProperty WRITE setStringListProperty NOTIFY stringListPropertyChanged)
+    Q_PROPERTY (QList<QUrl> urlListProperty READ urlListProperty WRITE setUrlListProperty NOTIFY urlListPropertyChanged)
+    Q_PROPERTY (QStringList qstringListProperty READ qstringListProperty WRITE setQStringListProperty NOTIFY qstringListPropertyChanged)
+
+    Q_PROPERTY (QList<QPoint> pointListProperty READ pointListProperty WRITE setPointListProperty NOTIFY pointListPropertyChanged)
+    Q_PROPERTY (QList<QVariant> variantListProperty READ variantListProperty WRITE setVariantListProperty NOTIFY variantListPropertyChanged)
+
+public:
+    MySequenceConversionObject()
+    {
+        m_intList << 1 << 2 << 3 << 4;
+        m_intList2 << 1 << 2 << 3 << 4;
+        m_qrealList << 1.1 << 2.2 << 3.3 << 4.4;
+        m_boolList << true << false << true << false;
+        m_stringList << QLatin1String("first") << QLatin1String("second") << QLatin1String("third") << QLatin1String("fourth");
+        m_urlList << QUrl("http://www.example1.com") << QUrl("http://www.example2.com") << QUrl("http://www.example3.com");
+        m_qstringList << QLatin1String("first") << QLatin1String("second") << QLatin1String("third") << QLatin1String("fourth");
+
+        m_pointList << QPoint(1, 2) << QPoint(3, 4) << QPoint(5, 6);
+        m_variantList << QVariant(QLatin1String("one")) << QVariant(true) << QVariant(3);
+    }
+
+    ~MySequenceConversionObject() {}
+
+    QList<int> intListProperty() const { return m_intList; }
+    void setIntListProperty(const QList<int> &list) { m_intList = list; emit intListPropertyChanged(); }
+    QList<int> intListProperty2() const { return m_intList2; }
+    void setIntListProperty2(const QList<int> &list) { m_intList2 = list; emit intListProperty2Changed(); }
+    QList<qreal> qrealListProperty() const { return m_qrealList; }
+    void setQrealListProperty(const QList<qreal> &list) { m_qrealList = list; emit qrealListPropertyChanged(); }
+    QList<bool> boolListProperty() const { return m_boolList; }
+    void setBoolListProperty(const QList<bool> &list) { m_boolList = list; emit boolListPropertyChanged(); }
+    QList<QString> stringListProperty() const { return m_stringList; }
+    void setStringListProperty(const QList<QString> &list) { m_stringList = list; emit stringListPropertyChanged(); }
+    QList<QUrl> urlListProperty() const { return m_urlList; }
+    void setUrlListProperty(const QList<QUrl> &list) { m_urlList = list; emit urlListPropertyChanged(); }
+    QStringList qstringListProperty() const { return m_qstringList; }
+    void setQStringListProperty(const QStringList &list) { m_qstringList = list; emit qstringListPropertyChanged(); }
+    QList<QPoint> pointListProperty() const { return m_pointList; }
+    void setPointListProperty(const QList<QPoint> &list) { m_pointList = list; emit pointListPropertyChanged(); }
+    QList<QVariant> variantListProperty() const { return m_variantList; }
+    void setVariantListProperty(const QList<QVariant> &list) { m_variantList = list; emit variantListPropertyChanged(); }
+
+    // now for "copy resource" sequences:
+    Q_INVOKABLE QList<int> generateIntSequence() const { QList<int> retn; retn << 1 << 2 << 3; return retn; }
+    Q_INVOKABLE QList<qreal> generateQrealSequence() const { QList<qreal> retn; retn << 1.1 << 2.2 << 3.3; return retn; }
+    Q_INVOKABLE QList<bool> generateBoolSequence() const { QList<bool> retn; retn << true << false << true; return retn; }
+    Q_INVOKABLE QList<QString> generateStringSequence() const { QList<QString> retn; retn << "one" << "two" << "three"; return retn; }
+    Q_INVOKABLE QList<QUrl> generateUrlSequence() const { QList<QUrl> retn; retn << QUrl("http://www.example1.com") << QUrl("http://www.example2.com") << QUrl("http://www.example3.com"); return retn; }
+    Q_INVOKABLE QStringList generateQStringSequence() const { QStringList retn; retn << "one" << "two" << "three"; return retn; }
+
+    // "reference resource" underlying qobject deletion test:
+    Q_INVOKABLE MySequenceConversionObject *generateTestObject() const { return new MySequenceConversionObject; }
+    Q_INVOKABLE void deleteTestObject(QObject *object) const { delete object; }
+
+signals:
+    void intListPropertyChanged();
+    void intListProperty2Changed();
+    void qrealListPropertyChanged();
+    void boolListPropertyChanged();
+    void stringListPropertyChanged();
+    void urlListPropertyChanged();
+    void qstringListPropertyChanged();
+    void pointListPropertyChanged();
+    void variantListPropertyChanged();
+
+private:
+    QList<int> m_intList;
+    QList<int> m_intList2;
+    QList<qreal> m_qrealList;
+    QList<bool> m_boolList;
+    QList<QString> m_stringList;
+    QList<QUrl> m_urlList;
+    QStringList m_qstringList;
+
+    QList<QPoint> m_pointList; // not a supported sequence type
+    QList<QVariant> m_variantList; // not a supported sequence type, but QVariantList support is hardcoded.
+};
+
+class MyDeleteObject : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(QObject *nestedObject READ nestedObject NOTIFY nestedObjectChanged);
+    Q_PROPERTY(int deleteNestedObject READ deleteNestedObject NOTIFY deleteNestedObjectChanged);
+
+public:
+    MyDeleteObject() : m_nestedObject(new MyQmlObject) {}
+
+    QObject *nestedObject() const { return m_nestedObject; }
+    int deleteNestedObject() { delete m_nestedObject; m_nestedObject = 0; return 1; }
+
+signals:
+    void nestedObjectChanged();
+    void deleteNestedObjectChanged();
+
+private:
+    MyQmlObject *m_nestedObject;
+};
+
 void registerTypes();
 
 #endif // TESTTYPES_H