| 1 | /**************************************************************************** |
| 2 | ** |
| 3 | ** Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com> |
| 4 | ** Copyright (C) 2019 Menlo Systems GmbH, author Arno Rehn <a.rehn@menlosystems.com> |
| 5 | ** Contact: https://www.qt.io/licensing/ |
| 6 | ** |
| 7 | ** This file is part of the QtWebChannel module of the Qt Toolkit. |
| 8 | ** |
| 9 | ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
| 10 | ** Commercial License Usage |
| 11 | ** Licensees holding valid commercial Qt licenses may use this file in |
| 12 | ** accordance with the commercial license agreement provided with the |
| 13 | ** Software or, alternatively, in accordance with the terms contained in |
| 14 | ** a written agreement between you and The Qt Company. For licensing terms |
| 15 | ** and conditions see https://www.qt.io/terms-conditions. For further |
| 16 | ** information use the contact form at https://www.qt.io/contact-us. |
| 17 | ** |
| 18 | ** GNU General Public License Usage |
| 19 | ** Alternatively, this file may be used under the terms of the GNU |
| 20 | ** General Public License version 3 as published by the Free Software |
| 21 | ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
| 22 | ** included in the packaging of this file. Please review the following |
| 23 | ** information to ensure the GNU General Public License requirements will |
| 24 | ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| 25 | ** |
| 26 | ** $QT_END_LICENSE$ |
| 27 | ** |
| 28 | ****************************************************************************/ |
| 29 | |
| 30 | #ifndef TST_WEBCHANNEL_H |
| 31 | #define TST_WEBCHANNEL_H |
| 32 | |
| 33 | #include <QObject> |
| 34 | #include <QVariant> |
| 35 | #include <QVector> |
| 36 | #include <QJsonValue> |
| 37 | #include <QJsonObject> |
| 38 | #include <QJsonArray> |
| 39 | |
| 40 | #include <QtWebChannel/QWebChannelAbstractTransport> |
| 41 | |
| 42 | struct TestStruct |
| 43 | { |
| 44 | TestStruct(int foo = 0, int bar = 0) |
| 45 | : foo(foo) |
| 46 | , bar(bar) |
| 47 | {} |
| 48 | int foo; |
| 49 | int bar; |
| 50 | }; |
| 51 | Q_DECLARE_METATYPE(TestStruct) |
| 52 | using TestStructVector = std::vector<TestStruct>; |
| 53 | Q_DECLARE_METATYPE(TestStructVector) |
| 54 | |
| 55 | QT_BEGIN_NAMESPACE |
| 56 | |
| 57 | class DummyTransport : public QWebChannelAbstractTransport |
| 58 | { |
| 59 | Q_OBJECT |
| 60 | public: |
| 61 | explicit DummyTransport(QObject *parent = nullptr) |
| 62 | : QWebChannelAbstractTransport(parent) |
| 63 | {} |
| 64 | ~DummyTransport() {}; |
| 65 | |
| 66 | void emitMessageReceived(const QJsonObject &message) |
| 67 | { |
| 68 | emit messageReceived(message, transport: this); |
| 69 | } |
| 70 | |
| 71 | QVector<QJsonObject> messagesSent() const |
| 72 | { |
| 73 | return mMessagesSent; |
| 74 | } |
| 75 | |
| 76 | public slots: |
| 77 | void sendMessage(const QJsonObject &message) override |
| 78 | { |
| 79 | mMessagesSent.push_back(t: message); |
| 80 | } |
| 81 | private: |
| 82 | QVector<QJsonObject> mMessagesSent; |
| 83 | }; |
| 84 | |
| 85 | class TestObject : public QObject |
| 86 | { |
| 87 | Q_OBJECT |
| 88 | Q_ENUMS(Foo) |
| 89 | |
| 90 | Q_PROPERTY(Foo foo READ foo CONSTANT) |
| 91 | Q_PROPERTY(int asdf READ asdf NOTIFY asdfChanged) |
| 92 | Q_PROPERTY(QString bar READ bar NOTIFY theBarHasChanged) |
| 93 | Q_PROPERTY(QObject * objectProperty READ objectProperty WRITE setObjectProperty NOTIFY objectPropertyChanged) |
| 94 | Q_PROPERTY(TestObject * returnedObject READ returnedObject WRITE setReturnedObject NOTIFY returnedObjectChanged) |
| 95 | Q_PROPERTY(QString prop READ prop WRITE setProp NOTIFY propChanged) |
| 96 | |
| 97 | public: |
| 98 | explicit TestObject(QObject *parent = 0) |
| 99 | : QObject(parent) |
| 100 | , mObjectProperty(0) |
| 101 | , mReturnedObject(Q_NULLPTR) |
| 102 | { } |
| 103 | |
| 104 | enum Foo { |
| 105 | Bar, |
| 106 | Asdf |
| 107 | }; |
| 108 | |
| 109 | enum TestFlag : quint16 { |
| 110 | FirstFlag = 0x1, |
| 111 | SecondFlag = 0x2 |
| 112 | }; |
| 113 | Q_DECLARE_FLAGS(TestFlags, TestFlag) |
| 114 | Q_FLAG(TestFlags) |
| 115 | |
| 116 | Foo foo() const {return Bar;} |
| 117 | int asdf() const {return 42;} |
| 118 | QString bar() const {return QString();} |
| 119 | |
| 120 | QObject *objectProperty() const |
| 121 | { |
| 122 | return mObjectProperty; |
| 123 | } |
| 124 | |
| 125 | TestObject *returnedObject() const |
| 126 | { |
| 127 | return mReturnedObject; |
| 128 | } |
| 129 | |
| 130 | QString prop() const |
| 131 | { |
| 132 | return mProp; |
| 133 | } |
| 134 | |
| 135 | Q_INVOKABLE void method1() {} |
| 136 | |
| 137 | protected: |
| 138 | Q_INVOKABLE void method2() {} |
| 139 | |
| 140 | private: |
| 141 | Q_INVOKABLE void method3() {} |
| 142 | |
| 143 | signals: |
| 144 | void sig1(); |
| 145 | void sig2(const QString&); |
| 146 | void asdfChanged(); |
| 147 | void theBarHasChanged(); |
| 148 | void objectPropertyChanged(); |
| 149 | void returnedObjectChanged(); |
| 150 | void propChanged(const QString&); |
| 151 | void replay(); |
| 152 | void overloadSignal(int); |
| 153 | void overloadSignal(float); |
| 154 | |
| 155 | public slots: |
| 156 | void slot1() {} |
| 157 | void slot2(const QString&) {} |
| 158 | |
| 159 | void setReturnedObject(TestObject *obj) |
| 160 | { |
| 161 | mReturnedObject = obj; |
| 162 | emit returnedObjectChanged(); |
| 163 | } |
| 164 | |
| 165 | void setObjectProperty(QObject *object) |
| 166 | { |
| 167 | mObjectProperty = object; |
| 168 | emit objectPropertyChanged(); |
| 169 | } |
| 170 | |
| 171 | void setProp(const QString&prop) {emit propChanged(mProp=prop);} |
| 172 | void fire() {emit replay();} |
| 173 | |
| 174 | double overload(double d) { return d + 1; } |
| 175 | int overload(int i) { return i * 2; } |
| 176 | QObject *overload(QObject *object) { return object; } |
| 177 | QString overload(const QString &str) { return str.toUpper(); } |
| 178 | QString overload(const QString &str, int i) { return str.toUpper() + QString::number(i + 1); } |
| 179 | QString overload(const QJsonArray &v) { return QString::number(v[1].toInt()) + v[0].toString(); } |
| 180 | |
| 181 | protected slots: |
| 182 | void slot3() {} |
| 183 | |
| 184 | private slots: |
| 185 | void slot4() {} |
| 186 | |
| 187 | public: |
| 188 | QObject *mObjectProperty; |
| 189 | TestObject *mReturnedObject; |
| 190 | QString mProp; |
| 191 | }; |
| 192 | |
| 193 | Q_DECLARE_OPERATORS_FOR_FLAGS(TestObject::TestFlags) |
| 194 | |
| 195 | class BenchObject : public QObject |
| 196 | { |
| 197 | Q_OBJECT |
| 198 | |
| 199 | Q_PROPERTY(int p0 MEMBER m_p0 NOTIFY p0Changed) |
| 200 | Q_PROPERTY(int p1 MEMBER m_p1 NOTIFY p1Changed) |
| 201 | Q_PROPERTY(int p2 MEMBER m_p2 NOTIFY p2Changed) |
| 202 | Q_PROPERTY(int p3 MEMBER m_p3 NOTIFY p3Changed) |
| 203 | Q_PROPERTY(int p4 MEMBER m_p4 NOTIFY p4Changed) |
| 204 | Q_PROPERTY(int p5 MEMBER m_p5 NOTIFY p5Changed) |
| 205 | Q_PROPERTY(int p6 MEMBER m_p6 NOTIFY p6Changed) |
| 206 | Q_PROPERTY(int p7 MEMBER m_p7 NOTIFY p7Changed) |
| 207 | Q_PROPERTY(int p8 MEMBER m_p8 NOTIFY p8Changed) |
| 208 | Q_PROPERTY(int p9 MEMBER m_p9 NOTIFY p9Changed) |
| 209 | public: |
| 210 | explicit BenchObject(QObject *parent = 0) |
| 211 | : QObject(parent) |
| 212 | , m_p0(0) |
| 213 | , m_p1(0) |
| 214 | , m_p2(0) |
| 215 | , m_p3(0) |
| 216 | , m_p4(0) |
| 217 | , m_p5(0) |
| 218 | , m_p6(0) |
| 219 | , m_p7(0) |
| 220 | , m_p8(0) |
| 221 | , m_p9(0) |
| 222 | { } |
| 223 | |
| 224 | void change() |
| 225 | { |
| 226 | m_p0++; |
| 227 | m_p1++; |
| 228 | m_p2++; |
| 229 | m_p3++; |
| 230 | m_p4++; |
| 231 | m_p5++; |
| 232 | m_p6++; |
| 233 | m_p7++; |
| 234 | m_p8++; |
| 235 | m_p9++; |
| 236 | emit p0Changed(m_p0); |
| 237 | emit p1Changed(m_p1); |
| 238 | emit p2Changed(m_p2); |
| 239 | emit p3Changed(m_p3); |
| 240 | emit p4Changed(m_p4); |
| 241 | emit p5Changed(m_p5); |
| 242 | emit p6Changed(m_p6); |
| 243 | emit p7Changed(m_p7); |
| 244 | emit p8Changed(m_p8); |
| 245 | emit p9Changed(m_p9); |
| 246 | } |
| 247 | |
| 248 | signals: |
| 249 | void s0(); |
| 250 | void s1(); |
| 251 | void s2(); |
| 252 | void s3(); |
| 253 | void s4(); |
| 254 | void s5(); |
| 255 | void s6(); |
| 256 | void s7(); |
| 257 | void s8(); |
| 258 | void s9(); |
| 259 | |
| 260 | void p0Changed(int); |
| 261 | void p1Changed(int); |
| 262 | void p2Changed(int); |
| 263 | void p3Changed(int); |
| 264 | void p4Changed(int); |
| 265 | void p5Changed(int); |
| 266 | void p6Changed(int); |
| 267 | void p7Changed(int); |
| 268 | void p8Changed(int); |
| 269 | void p9Changed(int); |
| 270 | |
| 271 | public slots: |
| 272 | void m0(){}; |
| 273 | void m1(){}; |
| 274 | void m2(){}; |
| 275 | void m3(){}; |
| 276 | void m4(){}; |
| 277 | void m5(){}; |
| 278 | void m6(){}; |
| 279 | void m7(){}; |
| 280 | void m8(){}; |
| 281 | void m9(){}; |
| 282 | |
| 283 | private: |
| 284 | int m_p0, m_p1, m_p2, m_p3, m_p4, m_p5, m_p6, m_p7, m_p8, m_p9; |
| 285 | }; |
| 286 | |
| 287 | class TestWebChannel : public QObject |
| 288 | { |
| 289 | Q_OBJECT |
| 290 | |
| 291 | Q_PROPERTY(int lastInt READ readInt WRITE setInt NOTIFY lastIntChanged); |
| 292 | Q_PROPERTY(bool lastBool READ readBool WRITE setBool NOTIFY lastBoolChanged); |
| 293 | Q_PROPERTY(double lastDouble READ readDouble WRITE setDouble NOTIFY lastDoubleChanged); |
| 294 | Q_PROPERTY(QVariant lastVariant READ readVariant WRITE setVariant NOTIFY lastVariantChanged); |
| 295 | Q_PROPERTY(QJsonValue lastJsonValue READ readJsonValue WRITE setJsonValue NOTIFY lastJsonValueChanged); |
| 296 | Q_PROPERTY(QJsonObject lastJsonObject READ readJsonObject WRITE setJsonObject NOTIFY lastJsonObjectChanged); |
| 297 | Q_PROPERTY(QJsonArray lastJsonArray READ readJsonArray WRITE setJsonArray NOTIFY lastJsonArrayChanged); |
| 298 | public: |
| 299 | explicit TestWebChannel(QObject *parent = 0); |
| 300 | virtual ~TestWebChannel(); |
| 301 | |
| 302 | public slots: |
| 303 | int readInt() const; |
| 304 | void setInt(int i); |
| 305 | bool readBool() const; |
| 306 | void setBool(bool b); |
| 307 | double readDouble() const; |
| 308 | void setDouble(double d); |
| 309 | QVariant readVariant() const; |
| 310 | void setVariant(const QVariant &v); |
| 311 | QJsonValue readJsonValue() const; |
| 312 | void setJsonValue(const QJsonValue &v); |
| 313 | QJsonObject readJsonObject() const; |
| 314 | void setJsonObject(const QJsonObject &v); |
| 315 | QJsonArray readJsonArray() const; |
| 316 | void setJsonArray(const QJsonArray &v); |
| 317 | |
| 318 | int readOverload(int i); |
| 319 | QString readOverload(const QString &arg); |
| 320 | QString readOverload(const QString &arg, int i); |
| 321 | |
| 322 | signals: |
| 323 | void lastIntChanged(); |
| 324 | void lastBoolChanged(); |
| 325 | void lastDoubleChanged(); |
| 326 | void lastVariantChanged(); |
| 327 | void lastJsonValueChanged(); |
| 328 | void lastJsonObjectChanged(); |
| 329 | void lastJsonArrayChanged(); |
| 330 | |
| 331 | private slots: |
| 332 | void testRegisterObjects(); |
| 333 | void testDeregisterObjects(); |
| 334 | void testDeregisterObjectAtStart(); |
| 335 | void testInfoForObject(); |
| 336 | void testInvokeMethodConversion(); |
| 337 | void testFunctionOverloading(); |
| 338 | void testSetPropertyConversion(); |
| 339 | void testInvokeMethodOverloadResolution(); |
| 340 | void testDisconnect(); |
| 341 | void testWrapRegisteredObject(); |
| 342 | void testUnwrapObject(); |
| 343 | void testTransportWrapObjectProperties(); |
| 344 | void testRemoveUnusedTransports(); |
| 345 | void testPassWrappedObjectBack(); |
| 346 | void testWrapValues(); |
| 347 | void testWrapObjectWithMultipleTransports(); |
| 348 | void testJsonToVariant(); |
| 349 | void testInfiniteRecursion(); |
| 350 | void testAsyncObject(); |
| 351 | void testDeletionDuringMethodInvocation_data(); |
| 352 | void testDeletionDuringMethodInvocation(); |
| 353 | |
| 354 | void benchClassInfo(); |
| 355 | void benchInitializeClients(); |
| 356 | void benchPropertyUpdates(); |
| 357 | void benchRegisterObjects(); |
| 358 | void benchRemoveTransport(); |
| 359 | |
| 360 | void qtbug46548_overriddenProperties(); |
| 361 | void qtbug62388_wrapObjectMultipleTransports(); |
| 362 | |
| 363 | private: |
| 364 | DummyTransport *m_dummyTransport; |
| 365 | |
| 366 | int m_lastInt; |
| 367 | bool m_lastBool; |
| 368 | double m_lastDouble; |
| 369 | QVariant m_lastVariant; |
| 370 | QJsonValue m_lastJsonValue; |
| 371 | QJsonObject m_lastJsonObject; |
| 372 | QJsonArray m_lastJsonArray; |
| 373 | }; |
| 374 | |
| 375 | QT_END_NAMESPACE |
| 376 | |
| 377 | Q_DECLARE_METATYPE(TestObject::Foo) |
| 378 | |
| 379 | #endif // TST_WEBCHANNEL_H |
| 380 | |