author | Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> |
Mon, 03 May 2010 13:17:34 +0300 | |
changeset 19 | fcece45ef507 |
parent 18 | 2f34d5167611 |
child 30 | 5dc02b23752f |
permissions | -rw-r--r-- |
0 | 1 |
/* |
2 |
Copyright (C) 2008,2009 Nokia Corporation and/or its subsidiary(-ies) |
|
3 |
||
4 |
This library is free software; you can redistribute it and/or |
|
5 |
modify it under the terms of the GNU Library General Public |
|
6 |
License as published by the Free Software Foundation; either |
|
7 |
version 2 of the License, or (at your option) any later version. |
|
8 |
||
9 |
This library is distributed in the hope that it will be useful, |
|
10 |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
12 |
Library General Public License for more details. |
|
13 |
||
14 |
You should have received a copy of the GNU Library General Public License |
|
15 |
along with this library; see the file COPYING.LIB. If not, write to |
|
16 |
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
|
17 |
Boston, MA 02110-1301, USA. |
|
18 |
*/ |
|
19 |
||
20 |
||
21 |
#include <QtTest/QtTest> |
|
22 |
||
23 |
#include <qwebpage.h> |
|
24 |
#include <qwebelement.h> |
|
25 |
#include <qwidget.h> |
|
26 |
#include <qwebview.h> |
|
27 |
#include <qwebframe.h> |
|
28 |
#include <qwebhistory.h> |
|
29 |
#include <QAbstractItemView> |
|
30 |
#include <QApplication> |
|
31 |
#include <QComboBox> |
|
32 |
#include <QPicture> |
|
33 |
#include <QRegExp> |
|
34 |
#include <QNetworkRequest> |
|
35 |
#include <QNetworkReply> |
|
36 |
#ifndef QT_NO_OPENSSL |
|
37 |
#include <qsslerror.h> |
|
38 |
#endif |
|
39 |
#include "../util.h" |
|
40 |
||
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
41 |
#if defined(Q_OS_SYMBIAN) |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
42 |
# define SRCDIR "" |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
43 |
#endif |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
44 |
|
0 | 45 |
//TESTED_CLASS= |
46 |
//TESTED_FILES= |
|
47 |
||
48 |
// Task 160192 |
|
49 |
/** |
|
50 |
* Starts an event loop that runs until the given signal is received. |
|
51 |
Optionally the event loop |
|
52 |
* can return earlier on a timeout. |
|
53 |
* |
|
54 |
* \return \p true if the requested signal was received |
|
55 |
* \p false on timeout |
|
56 |
*/ |
|
57 |
static bool waitForSignal(QObject* obj, const char* signal, int timeout = 0) |
|
58 |
{ |
|
59 |
QEventLoop loop; |
|
60 |
QObject::connect(obj, signal, &loop, SLOT(quit())); |
|
61 |
QTimer timer; |
|
62 |
QSignalSpy timeoutSpy(&timer, SIGNAL(timeout())); |
|
63 |
if (timeout > 0) { |
|
64 |
QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); |
|
65 |
timer.setSingleShot(true); |
|
66 |
timer.start(timeout); |
|
67 |
} |
|
68 |
loop.exec(); |
|
69 |
return timeoutSpy.isEmpty(); |
|
70 |
} |
|
71 |
||
72 |
/* Mostly a test for the JavaScript related parts of QWebFrame */ |
|
73 |
||
74 |
||
75 |
struct CustomType { |
|
76 |
QString string; |
|
77 |
}; |
|
78 |
Q_DECLARE_METATYPE(CustomType) |
|
79 |
||
80 |
Q_DECLARE_METATYPE(QBrush*) |
|
81 |
Q_DECLARE_METATYPE(QObjectList) |
|
82 |
Q_DECLARE_METATYPE(QList<int>) |
|
83 |
Q_DECLARE_METATYPE(Qt::BrushStyle) |
|
84 |
Q_DECLARE_METATYPE(QVariantList) |
|
85 |
Q_DECLARE_METATYPE(QVariantMap) |
|
86 |
||
87 |
class MyQObject : public QObject |
|
88 |
{ |
|
89 |
Q_OBJECT |
|
90 |
||
91 |
Q_PROPERTY(int intProperty READ intProperty WRITE setIntProperty) |
|
92 |
Q_PROPERTY(QVariant variantProperty READ variantProperty WRITE setVariantProperty) |
|
93 |
Q_PROPERTY(QVariantList variantListProperty READ variantListProperty WRITE setVariantListProperty) |
|
94 |
Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty) |
|
95 |
Q_PROPERTY(QStringList stringListProperty READ stringListProperty WRITE setStringListProperty) |
|
96 |
Q_PROPERTY(QByteArray byteArrayProperty READ byteArrayProperty WRITE setByteArrayProperty) |
|
97 |
Q_PROPERTY(QBrush brushProperty READ brushProperty WRITE setBrushProperty) |
|
98 |
Q_PROPERTY(double hiddenProperty READ hiddenProperty WRITE setHiddenProperty SCRIPTABLE false) |
|
99 |
Q_PROPERTY(int writeOnlyProperty WRITE setWriteOnlyProperty) |
|
100 |
Q_PROPERTY(int readOnlyProperty READ readOnlyProperty) |
|
101 |
Q_PROPERTY(QKeySequence shortcut READ shortcut WRITE setShortcut) |
|
102 |
Q_PROPERTY(CustomType propWithCustomType READ propWithCustomType WRITE setPropWithCustomType) |
|
103 |
Q_ENUMS(Policy Strategy) |
|
104 |
Q_FLAGS(Ability) |
|
105 |
||
106 |
public: |
|
107 |
enum Policy { |
|
108 |
FooPolicy = 0, |
|
109 |
BarPolicy, |
|
110 |
BazPolicy |
|
111 |
}; |
|
112 |
||
113 |
enum Strategy { |
|
114 |
FooStrategy = 10, |
|
115 |
BarStrategy, |
|
116 |
BazStrategy |
|
117 |
}; |
|
118 |
||
119 |
enum AbilityFlag { |
|
120 |
NoAbility = 0x000, |
|
121 |
FooAbility = 0x001, |
|
122 |
BarAbility = 0x080, |
|
123 |
BazAbility = 0x200, |
|
124 |
AllAbility = FooAbility | BarAbility | BazAbility |
|
125 |
}; |
|
126 |
||
127 |
Q_DECLARE_FLAGS(Ability, AbilityFlag) |
|
128 |
||
129 |
MyQObject(QObject* parent = 0) |
|
130 |
: QObject(parent), |
|
131 |
m_intValue(123), |
|
132 |
m_variantValue(QLatin1String("foo")), |
|
133 |
m_variantListValue(QVariantList() << QVariant(123) << QVariant(QLatin1String("foo"))), |
|
134 |
m_stringValue(QLatin1String("bar")), |
|
135 |
m_stringListValue(QStringList() << QLatin1String("zig") << QLatin1String("zag")), |
|
136 |
m_brushValue(QColor(10, 20, 30, 40)), |
|
137 |
m_hiddenValue(456.0), |
|
138 |
m_writeOnlyValue(789), |
|
139 |
m_readOnlyValue(987), |
|
140 |
m_qtFunctionInvoked(-1) { } |
|
141 |
||
142 |
~MyQObject() { } |
|
143 |
||
144 |
int intProperty() const { |
|
145 |
return m_intValue; |
|
146 |
} |
|
147 |
void setIntProperty(int value) { |
|
148 |
m_intValue = value; |
|
149 |
} |
|
150 |
||
151 |
QVariant variantProperty() const { |
|
152 |
return m_variantValue; |
|
153 |
} |
|
154 |
void setVariantProperty(const QVariant &value) { |
|
155 |
m_variantValue = value; |
|
156 |
} |
|
157 |
||
158 |
QVariantList variantListProperty() const { |
|
159 |
return m_variantListValue; |
|
160 |
} |
|
161 |
void setVariantListProperty(const QVariantList &value) { |
|
162 |
m_variantListValue = value; |
|
163 |
} |
|
164 |
||
165 |
QString stringProperty() const { |
|
166 |
return m_stringValue; |
|
167 |
} |
|
168 |
void setStringProperty(const QString &value) { |
|
169 |
m_stringValue = value; |
|
170 |
} |
|
171 |
||
172 |
QStringList stringListProperty() const { |
|
173 |
return m_stringListValue; |
|
174 |
} |
|
175 |
void setStringListProperty(const QStringList &value) { |
|
176 |
m_stringListValue = value; |
|
177 |
} |
|
178 |
||
179 |
QByteArray byteArrayProperty() const { |
|
180 |
return m_byteArrayValue; |
|
181 |
} |
|
182 |
void setByteArrayProperty(const QByteArray &value) { |
|
183 |
m_byteArrayValue = value; |
|
184 |
} |
|
185 |
||
186 |
QBrush brushProperty() const { |
|
187 |
return m_brushValue; |
|
188 |
} |
|
189 |
Q_INVOKABLE void setBrushProperty(const QBrush &value) { |
|
190 |
m_brushValue = value; |
|
191 |
} |
|
192 |
||
193 |
double hiddenProperty() const { |
|
194 |
return m_hiddenValue; |
|
195 |
} |
|
196 |
void setHiddenProperty(double value) { |
|
197 |
m_hiddenValue = value; |
|
198 |
} |
|
199 |
||
200 |
int writeOnlyProperty() const { |
|
201 |
return m_writeOnlyValue; |
|
202 |
} |
|
203 |
void setWriteOnlyProperty(int value) { |
|
204 |
m_writeOnlyValue = value; |
|
205 |
} |
|
206 |
||
207 |
int readOnlyProperty() const { |
|
208 |
return m_readOnlyValue; |
|
209 |
} |
|
210 |
||
211 |
QKeySequence shortcut() const { |
|
212 |
return m_shortcut; |
|
213 |
} |
|
214 |
void setShortcut(const QKeySequence &seq) { |
|
215 |
m_shortcut = seq; |
|
216 |
} |
|
217 |
||
218 |
CustomType propWithCustomType() const { |
|
219 |
return m_customType; |
|
220 |
} |
|
221 |
void setPropWithCustomType(const CustomType &c) { |
|
222 |
m_customType = c; |
|
223 |
} |
|
224 |
||
225 |
int qtFunctionInvoked() const { |
|
226 |
return m_qtFunctionInvoked; |
|
227 |
} |
|
228 |
||
229 |
QVariantList qtFunctionActuals() const { |
|
230 |
return m_actuals; |
|
231 |
} |
|
232 |
||
233 |
void resetQtFunctionInvoked() { |
|
234 |
m_qtFunctionInvoked = -1; |
|
235 |
m_actuals.clear(); |
|
236 |
} |
|
237 |
||
238 |
Q_INVOKABLE void myInvokable() { |
|
239 |
m_qtFunctionInvoked = 0; |
|
240 |
} |
|
241 |
Q_INVOKABLE void myInvokableWithIntArg(int arg) { |
|
242 |
m_qtFunctionInvoked = 1; |
|
243 |
m_actuals << arg; |
|
244 |
} |
|
245 |
Q_INVOKABLE void myInvokableWithLonglongArg(qlonglong arg) { |
|
246 |
m_qtFunctionInvoked = 2; |
|
247 |
m_actuals << arg; |
|
248 |
} |
|
249 |
Q_INVOKABLE void myInvokableWithFloatArg(float arg) { |
|
250 |
m_qtFunctionInvoked = 3; |
|
251 |
m_actuals << arg; |
|
252 |
} |
|
253 |
Q_INVOKABLE void myInvokableWithDoubleArg(double arg) { |
|
254 |
m_qtFunctionInvoked = 4; |
|
255 |
m_actuals << arg; |
|
256 |
} |
|
257 |
Q_INVOKABLE void myInvokableWithStringArg(const QString &arg) { |
|
258 |
m_qtFunctionInvoked = 5; |
|
259 |
m_actuals << arg; |
|
260 |
} |
|
261 |
Q_INVOKABLE void myInvokableWithIntArgs(int arg1, int arg2) { |
|
262 |
m_qtFunctionInvoked = 6; |
|
263 |
m_actuals << arg1 << arg2; |
|
264 |
} |
|
265 |
Q_INVOKABLE int myInvokableReturningInt() { |
|
266 |
m_qtFunctionInvoked = 7; |
|
267 |
return 123; |
|
268 |
} |
|
269 |
Q_INVOKABLE qlonglong myInvokableReturningLongLong() { |
|
270 |
m_qtFunctionInvoked = 39; |
|
271 |
return 456; |
|
272 |
} |
|
273 |
Q_INVOKABLE QString myInvokableReturningString() { |
|
274 |
m_qtFunctionInvoked = 8; |
|
275 |
return QLatin1String("ciao"); |
|
276 |
} |
|
277 |
Q_INVOKABLE void myInvokableWithIntArg(int arg1, int arg2) { // overload |
|
278 |
m_qtFunctionInvoked = 9; |
|
279 |
m_actuals << arg1 << arg2; |
|
280 |
} |
|
281 |
Q_INVOKABLE void myInvokableWithEnumArg(Policy policy) { |
|
282 |
m_qtFunctionInvoked = 10; |
|
283 |
m_actuals << policy; |
|
284 |
} |
|
285 |
Q_INVOKABLE void myInvokableWithQualifiedEnumArg(MyQObject::Policy policy) { |
|
286 |
m_qtFunctionInvoked = 36; |
|
287 |
m_actuals << policy; |
|
288 |
} |
|
289 |
Q_INVOKABLE Policy myInvokableReturningEnum() { |
|
290 |
m_qtFunctionInvoked = 37; |
|
291 |
return BazPolicy; |
|
292 |
} |
|
293 |
Q_INVOKABLE MyQObject::Policy myInvokableReturningQualifiedEnum() { |
|
294 |
m_qtFunctionInvoked = 38; |
|
295 |
return BazPolicy; |
|
296 |
} |
|
297 |
Q_INVOKABLE QVector<int> myInvokableReturningVectorOfInt() { |
|
298 |
m_qtFunctionInvoked = 11; |
|
299 |
return QVector<int>(); |
|
300 |
} |
|
301 |
Q_INVOKABLE void myInvokableWithVectorOfIntArg(const QVector<int> &) { |
|
302 |
m_qtFunctionInvoked = 12; |
|
303 |
} |
|
304 |
Q_INVOKABLE QObject* myInvokableReturningQObjectStar() { |
|
305 |
m_qtFunctionInvoked = 13; |
|
306 |
return this; |
|
307 |
} |
|
308 |
Q_INVOKABLE QObjectList myInvokableWithQObjectListArg(const QObjectList &lst) { |
|
309 |
m_qtFunctionInvoked = 14; |
|
310 |
m_actuals << qVariantFromValue(lst); |
|
311 |
return lst; |
|
312 |
} |
|
313 |
Q_INVOKABLE QVariant myInvokableWithVariantArg(const QVariant &v) { |
|
314 |
m_qtFunctionInvoked = 15; |
|
315 |
m_actuals << v; |
|
316 |
return v; |
|
317 |
} |
|
318 |
Q_INVOKABLE QVariantMap myInvokableWithVariantMapArg(const QVariantMap &vm) { |
|
319 |
m_qtFunctionInvoked = 16; |
|
320 |
m_actuals << vm; |
|
321 |
return vm; |
|
322 |
} |
|
323 |
Q_INVOKABLE QList<int> myInvokableWithListOfIntArg(const QList<int> &lst) { |
|
324 |
m_qtFunctionInvoked = 17; |
|
325 |
m_actuals << qVariantFromValue(lst); |
|
326 |
return lst; |
|
327 |
} |
|
328 |
Q_INVOKABLE QObject* myInvokableWithQObjectStarArg(QObject* obj) { |
|
329 |
m_qtFunctionInvoked = 18; |
|
330 |
m_actuals << qVariantFromValue(obj); |
|
331 |
return obj; |
|
332 |
} |
|
333 |
Q_INVOKABLE QBrush myInvokableWithQBrushArg(const QBrush &brush) { |
|
334 |
m_qtFunctionInvoked = 19; |
|
335 |
m_actuals << qVariantFromValue(brush); |
|
336 |
return brush; |
|
337 |
} |
|
338 |
Q_INVOKABLE void myInvokableWithBrushStyleArg(Qt::BrushStyle style) { |
|
339 |
m_qtFunctionInvoked = 43; |
|
340 |
m_actuals << qVariantFromValue(style); |
|
341 |
} |
|
342 |
Q_INVOKABLE void myInvokableWithVoidStarArg(void* arg) { |
|
343 |
m_qtFunctionInvoked = 44; |
|
344 |
m_actuals << qVariantFromValue(arg); |
|
345 |
} |
|
346 |
Q_INVOKABLE void myInvokableWithAmbiguousArg(int arg) { |
|
347 |
m_qtFunctionInvoked = 45; |
|
348 |
m_actuals << qVariantFromValue(arg); |
|
349 |
} |
|
350 |
Q_INVOKABLE void myInvokableWithAmbiguousArg(uint arg) { |
|
351 |
m_qtFunctionInvoked = 46; |
|
352 |
m_actuals << qVariantFromValue(arg); |
|
353 |
} |
|
354 |
Q_INVOKABLE void myInvokableWithDefaultArgs(int arg1, const QString &arg2 = "") { |
|
355 |
m_qtFunctionInvoked = 47; |
|
356 |
m_actuals << qVariantFromValue(arg1) << qVariantFromValue(arg2); |
|
357 |
} |
|
358 |
Q_INVOKABLE QObject& myInvokableReturningRef() { |
|
359 |
m_qtFunctionInvoked = 48; |
|
360 |
return *this; |
|
361 |
} |
|
362 |
Q_INVOKABLE const QObject& myInvokableReturningConstRef() const { |
|
363 |
const_cast<MyQObject*>(this)->m_qtFunctionInvoked = 49; |
|
364 |
return *this; |
|
365 |
} |
|
366 |
Q_INVOKABLE void myInvokableWithPointArg(const QPoint &arg) { |
|
367 |
const_cast<MyQObject*>(this)->m_qtFunctionInvoked = 50; |
|
368 |
m_actuals << qVariantFromValue(arg); |
|
369 |
} |
|
370 |
Q_INVOKABLE void myInvokableWithPointArg(const QPointF &arg) { |
|
371 |
const_cast<MyQObject*>(this)->m_qtFunctionInvoked = 51; |
|
372 |
m_actuals << qVariantFromValue(arg); |
|
373 |
} |
|
374 |
Q_INVOKABLE void myInvokableWithBoolArg(bool arg) { |
|
375 |
m_qtFunctionInvoked = 52; |
|
376 |
m_actuals << arg; |
|
377 |
} |
|
378 |
||
379 |
void emitMySignal() { |
|
380 |
emit mySignal(); |
|
381 |
} |
|
382 |
void emitMySignalWithIntArg(int arg) { |
|
383 |
emit mySignalWithIntArg(arg); |
|
384 |
} |
|
385 |
void emitMySignal2(bool arg) { |
|
386 |
emit mySignal2(arg); |
|
387 |
} |
|
388 |
void emitMySignal2() { |
|
389 |
emit mySignal2(); |
|
390 |
} |
|
391 |
void emitMySignalWithDateTimeArg(QDateTime dt) { |
|
392 |
emit mySignalWithDateTimeArg(dt); |
|
393 |
} |
|
394 |
void emitMySignalWithRegexArg(QRegExp r) { |
|
395 |
emit mySignalWithRegexArg(r); |
|
396 |
} |
|
397 |
||
398 |
public Q_SLOTS: |
|
399 |
void mySlot() { |
|
400 |
m_qtFunctionInvoked = 20; |
|
401 |
} |
|
402 |
void mySlotWithIntArg(int arg) { |
|
403 |
m_qtFunctionInvoked = 21; |
|
404 |
m_actuals << arg; |
|
405 |
} |
|
406 |
void mySlotWithDoubleArg(double arg) { |
|
407 |
m_qtFunctionInvoked = 22; |
|
408 |
m_actuals << arg; |
|
409 |
} |
|
410 |
void mySlotWithStringArg(const QString &arg) { |
|
411 |
m_qtFunctionInvoked = 23; |
|
412 |
m_actuals << arg; |
|
413 |
} |
|
414 |
||
415 |
void myOverloadedSlot() { |
|
416 |
m_qtFunctionInvoked = 24; |
|
417 |
} |
|
418 |
void myOverloadedSlot(QObject* arg) { |
|
419 |
m_qtFunctionInvoked = 41; |
|
420 |
m_actuals << qVariantFromValue(arg); |
|
421 |
} |
|
422 |
void myOverloadedSlot(bool arg) { |
|
423 |
m_qtFunctionInvoked = 25; |
|
424 |
m_actuals << arg; |
|
425 |
} |
|
426 |
void myOverloadedSlot(const QStringList &arg) { |
|
427 |
m_qtFunctionInvoked = 42; |
|
428 |
m_actuals << arg; |
|
429 |
} |
|
430 |
void myOverloadedSlot(double arg) { |
|
431 |
m_qtFunctionInvoked = 26; |
|
432 |
m_actuals << arg; |
|
433 |
} |
|
434 |
void myOverloadedSlot(float arg) { |
|
435 |
m_qtFunctionInvoked = 27; |
|
436 |
m_actuals << arg; |
|
437 |
} |
|
438 |
void myOverloadedSlot(int arg) { |
|
439 |
m_qtFunctionInvoked = 28; |
|
440 |
m_actuals << arg; |
|
441 |
} |
|
442 |
void myOverloadedSlot(const QString &arg) { |
|
443 |
m_qtFunctionInvoked = 29; |
|
444 |
m_actuals << arg; |
|
445 |
} |
|
446 |
void myOverloadedSlot(const QColor &arg) { |
|
447 |
m_qtFunctionInvoked = 30; |
|
448 |
m_actuals << arg; |
|
449 |
} |
|
450 |
void myOverloadedSlot(const QBrush &arg) { |
|
451 |
m_qtFunctionInvoked = 31; |
|
452 |
m_actuals << arg; |
|
453 |
} |
|
454 |
void myOverloadedSlot(const QDateTime &arg) { |
|
455 |
m_qtFunctionInvoked = 32; |
|
456 |
m_actuals << arg; |
|
457 |
} |
|
458 |
void myOverloadedSlot(const QDate &arg) { |
|
459 |
m_qtFunctionInvoked = 33; |
|
460 |
m_actuals << arg; |
|
461 |
} |
|
462 |
void myOverloadedSlot(const QRegExp &arg) { |
|
463 |
m_qtFunctionInvoked = 34; |
|
464 |
m_actuals << arg; |
|
465 |
} |
|
466 |
void myOverloadedSlot(const QVariant &arg) { |
|
467 |
m_qtFunctionInvoked = 35; |
|
468 |
m_actuals << arg; |
|
469 |
} |
|
470 |
||
471 |
void qscript_call(int arg) { |
|
472 |
m_qtFunctionInvoked = 40; |
|
473 |
m_actuals << arg; |
|
474 |
} |
|
475 |
||
476 |
protected Q_SLOTS: |
|
477 |
void myProtectedSlot() { |
|
478 |
m_qtFunctionInvoked = 36; |
|
479 |
} |
|
480 |
||
481 |
private Q_SLOTS: |
|
482 |
void myPrivateSlot() { } |
|
483 |
||
484 |
Q_SIGNALS: |
|
485 |
void mySignal(); |
|
486 |
void mySignalWithIntArg(int arg); |
|
487 |
void mySignalWithDoubleArg(double arg); |
|
488 |
void mySignal2(bool arg = false); |
|
489 |
void mySignalWithDateTimeArg(QDateTime dt); |
|
490 |
void mySignalWithRegexArg(QRegExp r); |
|
491 |
||
492 |
private: |
|
493 |
int m_intValue; |
|
494 |
QVariant m_variantValue; |
|
495 |
QVariantList m_variantListValue; |
|
496 |
QString m_stringValue; |
|
497 |
QStringList m_stringListValue; |
|
498 |
QByteArray m_byteArrayValue; |
|
499 |
QBrush m_brushValue; |
|
500 |
double m_hiddenValue; |
|
501 |
int m_writeOnlyValue; |
|
502 |
int m_readOnlyValue; |
|
503 |
QKeySequence m_shortcut; |
|
504 |
CustomType m_customType; |
|
505 |
int m_qtFunctionInvoked; |
|
506 |
QVariantList m_actuals; |
|
507 |
}; |
|
508 |
||
509 |
class MyOtherQObject : public MyQObject |
|
510 |
{ |
|
511 |
public: |
|
512 |
MyOtherQObject(QObject* parent = 0) |
|
513 |
: MyQObject(parent) { } |
|
514 |
}; |
|
515 |
||
516 |
class MyEnumTestQObject : public QObject |
|
517 |
{ |
|
518 |
Q_OBJECT |
|
519 |
Q_PROPERTY(QString p1 READ p1) |
|
520 |
Q_PROPERTY(QString p2 READ p2) |
|
521 |
Q_PROPERTY(QString p3 READ p3 SCRIPTABLE false) |
|
522 |
Q_PROPERTY(QString p4 READ p4) |
|
523 |
Q_PROPERTY(QString p5 READ p5 SCRIPTABLE false) |
|
524 |
Q_PROPERTY(QString p6 READ p6) |
|
525 |
public: |
|
526 |
MyEnumTestQObject(QObject* parent = 0) |
|
527 |
: QObject(parent) { } |
|
528 |
QString p1() const { |
|
529 |
return QLatin1String("p1"); |
|
530 |
} |
|
531 |
QString p2() const { |
|
532 |
return QLatin1String("p2"); |
|
533 |
} |
|
534 |
QString p3() const { |
|
535 |
return QLatin1String("p3"); |
|
536 |
} |
|
537 |
QString p4() const { |
|
538 |
return QLatin1String("p4"); |
|
539 |
} |
|
540 |
QString p5() const { |
|
541 |
return QLatin1String("p5"); |
|
542 |
} |
|
543 |
QString p6() const { |
|
544 |
return QLatin1String("p5"); |
|
545 |
} |
|
546 |
public Q_SLOTS: |
|
547 |
void mySlot() { } |
|
548 |
void myOtherSlot() { } |
|
549 |
Q_SIGNALS: |
|
550 |
void mySignal(); |
|
551 |
}; |
|
552 |
||
553 |
class tst_QWebFrame : public QObject |
|
554 |
{ |
|
555 |
Q_OBJECT |
|
556 |
||
557 |
public: |
|
558 |
tst_QWebFrame(); |
|
559 |
virtual ~tst_QWebFrame(); |
|
560 |
bool eventFilter(QObject* watched, QEvent* event); |
|
561 |
||
562 |
public slots: |
|
563 |
void init(); |
|
564 |
void cleanup(); |
|
565 |
||
566 |
private slots: |
|
567 |
void getSetStaticProperty(); |
|
568 |
void getSetDynamicProperty(); |
|
569 |
void getSetChildren(); |
|
570 |
void callQtInvokable(); |
|
571 |
void connectAndDisconnect(); |
|
572 |
void classEnums(); |
|
573 |
void classConstructor(); |
|
574 |
void overrideInvokable(); |
|
575 |
void transferInvokable(); |
|
576 |
void findChild(); |
|
577 |
void findChildren(); |
|
578 |
void overloadedSlots(); |
|
579 |
void enumerate_data(); |
|
580 |
void enumerate(); |
|
581 |
void objectDeleted(); |
|
582 |
void typeConversion(); |
|
583 |
void symmetricUrl(); |
|
584 |
void progressSignal(); |
|
585 |
void urlChange(); |
|
586 |
void domCycles(); |
|
587 |
void requestedUrl(); |
|
588 |
void javaScriptWindowObjectCleared_data(); |
|
589 |
void javaScriptWindowObjectCleared(); |
|
590 |
void javaScriptWindowObjectClearedOnEvaluate(); |
|
591 |
void setHtml(); |
|
592 |
void setHtmlWithResource(); |
|
593 |
void setHtmlWithBaseURL(); |
|
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
594 |
void setHtmlWithJSAlert(); |
0 | 595 |
void ipv6HostEncoding(); |
596 |
void metaData(); |
|
597 |
void popupFocus(); |
|
598 |
void hitTestContent(); |
|
599 |
void jsByteArray(); |
|
600 |
void ownership(); |
|
601 |
void nullValue(); |
|
602 |
void baseUrl_data(); |
|
603 |
void baseUrl(); |
|
604 |
void hasSetFocus(); |
|
605 |
void render(); |
|
606 |
void scrollPosition(); |
|
607 |
void evaluateWillCauseRepaint(); |
|
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
608 |
void qObjectWrapperWithSameIdentity(); |
0 | 609 |
|
610 |
private: |
|
611 |
QString evalJS(const QString&s) { |
|
612 |
// Convert an undefined return variant to the string "undefined" |
|
613 |
QVariant ret = evalJSV(s); |
|
614 |
if (ret.userType() == QMetaType::Void) |
|
615 |
return "undefined"; |
|
616 |
else |
|
617 |
return ret.toString(); |
|
618 |
} |
|
619 |
QVariant evalJSV(const QString &s) { |
|
620 |
return m_page->mainFrame()->evaluateJavaScript(s); |
|
621 |
} |
|
622 |
||
623 |
QString evalJS(const QString&s, QString& type) { |
|
624 |
return evalJSV(s, type).toString(); |
|
625 |
} |
|
626 |
QVariant evalJSV(const QString &s, QString& type) { |
|
627 |
// As a special measure, if we get an exception we set the type to 'error' |
|
628 |
// (in ecma, an Error object has typeof object, but qtscript has a convenience function) |
|
629 |
// Similarly, an array is an object, but we'd prefer to have a type of 'array' |
|
630 |
// Also, consider a QMetaType::Void QVariant to be undefined |
|
631 |
QString escaped = s; |
|
632 |
escaped.replace('\'', "\\'"); // Don't preescape your single quotes! |
|
633 |
evalJS("var retvalue;\ |
|
634 |
var typevalue; \ |
|
635 |
try {\ |
|
636 |
retvalue = eval('" + escaped + "'); \ |
|
637 |
typevalue = typeof retvalue; \ |
|
638 |
if (retvalue instanceof Array) \ |
|
639 |
typevalue = 'array'; \ |
|
640 |
} \ |
|
641 |
catch(e) {\ |
|
642 |
retvalue = e.name + ': ' + e.message;\ |
|
643 |
typevalue = 'error';\ |
|
644 |
}"); |
|
645 |
QVariant ret = evalJSV("retvalue"); |
|
646 |
if (ret.userType() != QMetaType::Void) |
|
647 |
type = evalJS("typevalue"); |
|
648 |
else { |
|
649 |
ret = QString("undefined"); |
|
650 |
type = sUndefined; |
|
651 |
} |
|
652 |
evalJS("delete retvalue; delete typevalue"); |
|
653 |
return ret; |
|
654 |
} |
|
655 |
QObject* firstChildByClassName(QObject* parent, const char* className) { |
|
656 |
const QObjectList & children = parent->children(); |
|
657 |
foreach (QObject* child, children) { |
|
658 |
if (!strcmp(child->metaObject()->className(), className)) { |
|
659 |
return child; |
|
660 |
} |
|
661 |
} |
|
662 |
return 0; |
|
663 |
} |
|
664 |
||
665 |
const QString sTrue; |
|
666 |
const QString sFalse; |
|
667 |
const QString sUndefined; |
|
668 |
const QString sArray; |
|
669 |
const QString sFunction; |
|
670 |
const QString sError; |
|
671 |
const QString sString; |
|
672 |
const QString sObject; |
|
673 |
const QString sNumber; |
|
674 |
||
675 |
private: |
|
676 |
QWebView* m_view; |
|
677 |
QWebPage* m_page; |
|
678 |
MyQObject* m_myObject; |
|
679 |
QWebView* m_popupTestView; |
|
680 |
int m_popupTestPaintCount; |
|
681 |
}; |
|
682 |
||
683 |
tst_QWebFrame::tst_QWebFrame() |
|
684 |
: sTrue("true"), sFalse("false"), sUndefined("undefined"), sArray("array"), sFunction("function"), sError("error"), |
|
685 |
sString("string"), sObject("object"), sNumber("number"), m_popupTestView(0), m_popupTestPaintCount(0) |
|
686 |
{ |
|
687 |
} |
|
688 |
||
689 |
tst_QWebFrame::~tst_QWebFrame() |
|
690 |
{ |
|
691 |
} |
|
692 |
||
693 |
bool tst_QWebFrame::eventFilter(QObject* watched, QEvent* event) |
|
694 |
{ |
|
695 |
// used on the popupFocus test |
|
696 |
if (watched == m_popupTestView) { |
|
697 |
if (event->type() == QEvent::Paint) |
|
698 |
m_popupTestPaintCount++; |
|
699 |
} |
|
700 |
return QObject::eventFilter(watched, event); |
|
701 |
} |
|
702 |
||
703 |
void tst_QWebFrame::init() |
|
704 |
{ |
|
705 |
m_view = new QWebView(); |
|
706 |
m_page = m_view->page(); |
|
707 |
m_myObject = new MyQObject(); |
|
708 |
m_page->mainFrame()->addToJavaScriptWindowObject("myObject", m_myObject); |
|
709 |
QDir::setCurrent(SRCDIR); |
|
710 |
} |
|
711 |
||
712 |
void tst_QWebFrame::cleanup() |
|
713 |
{ |
|
714 |
delete m_view; |
|
715 |
delete m_myObject; |
|
716 |
} |
|
717 |
||
718 |
void tst_QWebFrame::getSetStaticProperty() |
|
719 |
{ |
|
720 |
QCOMPARE(evalJS("typeof myObject.noSuchProperty"), sUndefined); |
|
721 |
||
722 |
// initial value (set in MyQObject constructor) |
|
723 |
{ |
|
724 |
QString type; |
|
725 |
QVariant ret = evalJSV("myObject.intProperty", type); |
|
726 |
QCOMPARE(type, sNumber); |
|
727 |
QCOMPARE(ret.type(), QVariant::Double); |
|
728 |
QCOMPARE(ret.toInt(), 123); |
|
729 |
} |
|
730 |
QCOMPARE(evalJS("myObject.intProperty === 123.0"), sTrue); |
|
731 |
||
732 |
{ |
|
733 |
QString type; |
|
734 |
QVariant ret = evalJSV("myObject.variantProperty", type); |
|
735 |
QCOMPARE(type, sString); |
|
736 |
QCOMPARE(ret.type(), QVariant::String); |
|
737 |
QCOMPARE(ret.toString(), QLatin1String("foo")); |
|
738 |
} |
|
739 |
QCOMPARE(evalJS("myObject.variantProperty == 'foo'"), sTrue); |
|
740 |
||
741 |
{ |
|
742 |
QString type; |
|
743 |
QVariant ret = evalJSV("myObject.stringProperty", type); |
|
744 |
QCOMPARE(type, sString); |
|
745 |
QCOMPARE(ret.type(), QVariant::String); |
|
746 |
QCOMPARE(ret.toString(), QLatin1String("bar")); |
|
747 |
} |
|
748 |
QCOMPARE(evalJS("myObject.stringProperty === 'bar'"), sTrue); |
|
749 |
||
750 |
{ |
|
751 |
QString type; |
|
752 |
QVariant ret = evalJSV("myObject.variantListProperty", type); |
|
753 |
QCOMPARE(type, sArray); |
|
754 |
QCOMPARE(ret.type(), QVariant::List); |
|
755 |
QVariantList vl = ret.value<QVariantList>(); |
|
756 |
QCOMPARE(vl.size(), 2); |
|
757 |
QCOMPARE(vl.at(0).toInt(), 123); |
|
758 |
QCOMPARE(vl.at(1).toString(), QLatin1String("foo")); |
|
759 |
} |
|
760 |
QCOMPARE(evalJS("myObject.variantListProperty.length === 2"), sTrue); |
|
761 |
QCOMPARE(evalJS("myObject.variantListProperty[0] === 123"), sTrue); |
|
762 |
QCOMPARE(evalJS("myObject.variantListProperty[1] === 'foo'"), sTrue); |
|
763 |
||
764 |
{ |
|
765 |
QString type; |
|
766 |
QVariant ret = evalJSV("myObject.stringListProperty", type); |
|
767 |
QCOMPARE(type, sArray); |
|
768 |
QCOMPARE(ret.type(), QVariant::List); |
|
769 |
QVariantList vl = ret.value<QVariantList>(); |
|
770 |
QCOMPARE(vl.size(), 2); |
|
771 |
QCOMPARE(vl.at(0).toString(), QLatin1String("zig")); |
|
772 |
QCOMPARE(vl.at(1).toString(), QLatin1String("zag")); |
|
773 |
} |
|
774 |
QCOMPARE(evalJS("myObject.stringListProperty.length === 2"), sTrue); |
|
775 |
QCOMPARE(evalJS("typeof myObject.stringListProperty[0]"), sString); |
|
776 |
QCOMPARE(evalJS("myObject.stringListProperty[0]"), QLatin1String("zig")); |
|
777 |
QCOMPARE(evalJS("typeof myObject.stringListProperty[1]"), sString); |
|
778 |
QCOMPARE(evalJS("myObject.stringListProperty[1]"), QLatin1String("zag")); |
|
779 |
||
780 |
// property change in C++ should be reflected in script |
|
781 |
m_myObject->setIntProperty(456); |
|
782 |
QCOMPARE(evalJS("myObject.intProperty == 456"), sTrue); |
|
783 |
m_myObject->setIntProperty(789); |
|
784 |
QCOMPARE(evalJS("myObject.intProperty == 789"), sTrue); |
|
785 |
||
786 |
m_myObject->setVariantProperty(QLatin1String("bar")); |
|
787 |
QCOMPARE(evalJS("myObject.variantProperty === 'bar'"), sTrue); |
|
788 |
m_myObject->setVariantProperty(42); |
|
789 |
QCOMPARE(evalJS("myObject.variantProperty === 42"), sTrue); |
|
790 |
m_myObject->setVariantProperty(qVariantFromValue(QBrush())); |
|
791 |
//XFAIL |
|
792 |
// QCOMPARE(evalJS("typeof myObject.variantProperty"), sVariant); |
|
793 |
||
794 |
m_myObject->setStringProperty(QLatin1String("baz")); |
|
795 |
QCOMPARE(evalJS("myObject.stringProperty === 'baz'"), sTrue); |
|
796 |
m_myObject->setStringProperty(QLatin1String("zab")); |
|
797 |
QCOMPARE(evalJS("myObject.stringProperty === 'zab'"), sTrue); |
|
798 |
||
799 |
// property change in script should be reflected in C++ |
|
800 |
QCOMPARE(evalJS("myObject.intProperty = 123"), QLatin1String("123")); |
|
801 |
QCOMPARE(evalJS("myObject.intProperty == 123"), sTrue); |
|
802 |
QCOMPARE(m_myObject->intProperty(), 123); |
|
803 |
QCOMPARE(evalJS("myObject.intProperty = 'ciao!';" |
|
804 |
"myObject.intProperty == 0"), sTrue); |
|
805 |
QCOMPARE(m_myObject->intProperty(), 0); |
|
806 |
QCOMPARE(evalJS("myObject.intProperty = '123';" |
|
807 |
"myObject.intProperty == 123"), sTrue); |
|
808 |
QCOMPARE(m_myObject->intProperty(), 123); |
|
809 |
||
810 |
QCOMPARE(evalJS("myObject.stringProperty = 'ciao'"), QLatin1String("ciao")); |
|
811 |
QCOMPARE(evalJS("myObject.stringProperty"), QLatin1String("ciao")); |
|
812 |
QCOMPARE(m_myObject->stringProperty(), QLatin1String("ciao")); |
|
813 |
QCOMPARE(evalJS("myObject.stringProperty = 123;" |
|
814 |
"myObject.stringProperty"), QLatin1String("123")); |
|
815 |
QCOMPARE(m_myObject->stringProperty(), QLatin1String("123")); |
|
816 |
QCOMPARE(evalJS("myObject.stringProperty = null"), QString()); |
|
817 |
QCOMPARE(evalJS("myObject.stringProperty"), QString()); |
|
818 |
QCOMPARE(m_myObject->stringProperty(), QString()); |
|
819 |
QCOMPARE(evalJS("myObject.stringProperty = undefined"), sUndefined); |
|
820 |
QCOMPARE(evalJS("myObject.stringProperty"), QString()); |
|
821 |
QCOMPARE(m_myObject->stringProperty(), QString()); |
|
822 |
||
823 |
QCOMPARE(evalJS("myObject.variantProperty = new Number(1234);" |
|
824 |
"myObject.variantProperty").toDouble(), 1234.0); |
|
825 |
QCOMPARE(m_myObject->variantProperty().toDouble(), 1234.0); |
|
826 |
||
827 |
QCOMPARE(evalJS("myObject.variantProperty = new Boolean(1234);" |
|
828 |
"myObject.variantProperty"), sTrue); |
|
829 |
QCOMPARE(m_myObject->variantProperty().toBool(), true); |
|
830 |
||
831 |
QCOMPARE(evalJS("myObject.variantProperty = null;" |
|
832 |
"myObject.variantProperty.valueOf()"), sUndefined); |
|
833 |
QCOMPARE(m_myObject->variantProperty(), QVariant()); |
|
834 |
QCOMPARE(evalJS("myObject.variantProperty = undefined;" |
|
835 |
"myObject.variantProperty.valueOf()"), sUndefined); |
|
836 |
QCOMPARE(m_myObject->variantProperty(), QVariant()); |
|
837 |
||
838 |
QCOMPARE(evalJS("myObject.variantProperty = 'foo';" |
|
839 |
"myObject.variantProperty.valueOf()"), QLatin1String("foo")); |
|
840 |
QCOMPARE(m_myObject->variantProperty(), QVariant(QLatin1String("foo"))); |
|
841 |
QCOMPARE(evalJS("myObject.variantProperty = 42;" |
|
842 |
"myObject.variantProperty").toDouble(), 42.0); |
|
843 |
QCOMPARE(m_myObject->variantProperty().toDouble(), 42.0); |
|
844 |
||
845 |
QCOMPARE(evalJS("myObject.variantListProperty = [1, 'two', true];" |
|
846 |
"myObject.variantListProperty.length == 3"), sTrue); |
|
847 |
QCOMPARE(evalJS("myObject.variantListProperty[0] === 1"), sTrue); |
|
848 |
QCOMPARE(evalJS("myObject.variantListProperty[1]"), QLatin1String("two")); |
|
849 |
QCOMPARE(evalJS("myObject.variantListProperty[2] === true"), sTrue); |
|
850 |
||
851 |
QCOMPARE(evalJS("myObject.stringListProperty = [1, 'two', true];" |
|
852 |
"myObject.stringListProperty.length == 3"), sTrue); |
|
853 |
QCOMPARE(evalJS("typeof myObject.stringListProperty[0]"), sString); |
|
854 |
QCOMPARE(evalJS("myObject.stringListProperty[0] == '1'"), sTrue); |
|
855 |
QCOMPARE(evalJS("typeof myObject.stringListProperty[1]"), sString); |
|
856 |
QCOMPARE(evalJS("myObject.stringListProperty[1]"), QLatin1String("two")); |
|
857 |
QCOMPARE(evalJS("typeof myObject.stringListProperty[2]"), sString); |
|
858 |
QCOMPARE(evalJS("myObject.stringListProperty[2]"), QLatin1String("true")); |
|
859 |
||
860 |
// try to delete |
|
861 |
QCOMPARE(evalJS("delete myObject.intProperty"), sFalse); |
|
862 |
QCOMPARE(evalJS("myObject.intProperty == 123"), sTrue); |
|
863 |
||
864 |
QCOMPARE(evalJS("delete myObject.variantProperty"), sFalse); |
|
865 |
QCOMPARE(evalJS("myObject.variantProperty").toDouble(), 42.0); |
|
866 |
||
867 |
// custom property |
|
868 |
QCOMPARE(evalJS("myObject.customProperty"), sUndefined); |
|
869 |
QCOMPARE(evalJS("myObject.customProperty = 123;" |
|
870 |
"myObject.customProperty == 123"), sTrue); |
|
871 |
QVariant v = m_page->mainFrame()->evaluateJavaScript("myObject.customProperty"); |
|
872 |
QCOMPARE(v.type(), QVariant::Double); |
|
873 |
QCOMPARE(v.toInt(), 123); |
|
874 |
||
875 |
// non-scriptable property |
|
876 |
QCOMPARE(m_myObject->hiddenProperty(), 456.0); |
|
877 |
QCOMPARE(evalJS("myObject.hiddenProperty"), sUndefined); |
|
878 |
QCOMPARE(evalJS("myObject.hiddenProperty = 123;" |
|
879 |
"myObject.hiddenProperty == 123"), sTrue); |
|
880 |
QCOMPARE(m_myObject->hiddenProperty(), 456.0); |
|
881 |
||
882 |
// write-only property |
|
883 |
QCOMPARE(m_myObject->writeOnlyProperty(), 789); |
|
884 |
QCOMPARE(evalJS("typeof myObject.writeOnlyProperty"), sUndefined); |
|
885 |
QCOMPARE(evalJS("myObject.writeOnlyProperty = 123;" |
|
886 |
"typeof myObject.writeOnlyProperty"), sUndefined); |
|
887 |
QCOMPARE(m_myObject->writeOnlyProperty(), 123); |
|
888 |
||
889 |
// read-only property |
|
890 |
QCOMPARE(m_myObject->readOnlyProperty(), 987); |
|
891 |
QCOMPARE(evalJS("myObject.readOnlyProperty == 987"), sTrue); |
|
892 |
QCOMPARE(evalJS("myObject.readOnlyProperty = 654;" |
|
893 |
"myObject.readOnlyProperty == 987"), sTrue); |
|
894 |
QCOMPARE(m_myObject->readOnlyProperty(), 987); |
|
895 |
} |
|
896 |
||
897 |
void tst_QWebFrame::getSetDynamicProperty() |
|
898 |
{ |
|
899 |
// initially the object does not have the property |
|
900 |
// In WebKit, RuntimeObjects do not inherit Object, so don't have hasOwnProperty |
|
901 |
||
902 |
//QCOMPARE(evalJS("myObject.hasOwnProperty('dynamicProperty')"), sFalse); |
|
903 |
QCOMPARE(evalJS("typeof myObject.dynamicProperty"), sUndefined); |
|
904 |
||
905 |
// add a dynamic property in C++ |
|
906 |
QCOMPARE(m_myObject->setProperty("dynamicProperty", 123), false); |
|
907 |
//QCOMPARE(evalJS("myObject.hasOwnProperty('dynamicProperty')"), sTrue); |
|
908 |
QCOMPARE(evalJS("typeof myObject.dynamicProperty != 'undefined'"), sTrue); |
|
909 |
QCOMPARE(evalJS("myObject.dynamicProperty == 123"), sTrue); |
|
910 |
||
911 |
// property change in script should be reflected in C++ |
|
912 |
QCOMPARE(evalJS("myObject.dynamicProperty = 'foo';" |
|
913 |
"myObject.dynamicProperty"), QLatin1String("foo")); |
|
914 |
QCOMPARE(m_myObject->property("dynamicProperty").toString(), QLatin1String("foo")); |
|
915 |
||
916 |
// delete the property (XFAIL - can't delete properties) |
|
917 |
QEXPECT_FAIL("", "can't delete properties", Continue); |
|
918 |
QCOMPARE(evalJS("delete myObject.dynamicProperty"), sTrue); |
|
919 |
/* |
|
920 |
QCOMPARE(m_myObject->property("dynamicProperty").isValid(), false); |
|
921 |
QCOMPARE(evalJS("typeof myObject.dynamicProperty"), sUndefined); |
|
922 |
// QCOMPARE(evalJS("myObject.hasOwnProperty('dynamicProperty')"), sFalse); |
|
923 |
QCOMPARE(evalJS("typeof myObject.dynamicProperty"), sUndefined); |
|
924 |
*/ |
|
925 |
} |
|
926 |
||
927 |
void tst_QWebFrame::getSetChildren() |
|
928 |
{ |
|
929 |
// initially the object does not have the child |
|
930 |
// (again, no hasOwnProperty) |
|
931 |
||
932 |
//QCOMPARE(evalJS("myObject.hasOwnProperty('child')"), sFalse); |
|
933 |
QCOMPARE(evalJS("typeof myObject.child"), sUndefined); |
|
934 |
||
935 |
// add a child |
|
936 |
MyQObject* child = new MyQObject(m_myObject); |
|
937 |
child->setObjectName("child"); |
|
938 |
// QCOMPARE(evalJS("myObject.hasOwnProperty('child')"), sTrue); |
|
939 |
QCOMPARE(evalJS("typeof myObject.child != 'undefined'"), sTrue); |
|
940 |
||
941 |
// add a grandchild |
|
942 |
MyQObject* grandChild = new MyQObject(child); |
|
943 |
grandChild->setObjectName("grandChild"); |
|
944 |
// QCOMPARE(evalJS("myObject.child.hasOwnProperty('grandChild')"), sTrue); |
|
945 |
QCOMPARE(evalJS("typeof myObject.child.grandChild != 'undefined'"), sTrue); |
|
946 |
||
947 |
// delete grandchild |
|
948 |
delete grandChild; |
|
949 |
// QCOMPARE(evalJS("myObject.child.hasOwnProperty('grandChild')"), sFalse); |
|
950 |
QCOMPARE(evalJS("typeof myObject.child.grandChild == 'undefined'"), sTrue); |
|
951 |
||
952 |
// delete child |
|
953 |
delete child; |
|
954 |
// QCOMPARE(evalJS("myObject.hasOwnProperty('child')"), sFalse); |
|
955 |
QCOMPARE(evalJS("typeof myObject.child == 'undefined'"), sTrue); |
|
956 |
} |
|
957 |
||
958 |
Q_DECLARE_METATYPE(QVector<int>) |
|
959 |
Q_DECLARE_METATYPE(QVector<double>) |
|
960 |
Q_DECLARE_METATYPE(QVector<QString>) |
|
961 |
||
962 |
void tst_QWebFrame::callQtInvokable() |
|
963 |
{ |
|
964 |
qRegisterMetaType<QObjectList>(); |
|
965 |
||
966 |
m_myObject->resetQtFunctionInvoked(); |
|
967 |
QCOMPARE(evalJS("typeof myObject.myInvokable()"), sUndefined); |
|
968 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 0); |
|
969 |
QCOMPARE(m_myObject->qtFunctionActuals(), QVariantList()); |
|
970 |
||
971 |
// extra arguments should silently be ignored |
|
972 |
m_myObject->resetQtFunctionInvoked(); |
|
973 |
QCOMPARE(evalJS("typeof myObject.myInvokable(10, 20, 30)"), sUndefined); |
|
974 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 0); |
|
975 |
QCOMPARE(m_myObject->qtFunctionActuals(), QVariantList()); |
|
976 |
||
977 |
m_myObject->resetQtFunctionInvoked(); |
|
978 |
QCOMPARE(evalJS("typeof myObject.myInvokableWithIntArg(123)"), sUndefined); |
|
979 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 1); |
|
980 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
981 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 123); |
|
982 |
||
983 |
m_myObject->resetQtFunctionInvoked(); |
|
984 |
QCOMPARE(evalJS("typeof myObject.myInvokableWithIntArg('123')"), sUndefined); |
|
985 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 1); |
|
986 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
987 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 123); |
|
988 |
||
989 |
m_myObject->resetQtFunctionInvoked(); |
|
990 |
QCOMPARE(evalJS("typeof myObject.myInvokableWithLonglongArg(123)"), sUndefined); |
|
991 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 2); |
|
992 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
993 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toLongLong(), qlonglong(123)); |
|
994 |
||
995 |
m_myObject->resetQtFunctionInvoked(); |
|
996 |
QCOMPARE(evalJS("typeof myObject.myInvokableWithFloatArg(123.5)"), sUndefined); |
|
997 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 3); |
|
998 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
999 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toDouble(), 123.5); |
|
1000 |
||
1001 |
m_myObject->resetQtFunctionInvoked(); |
|
1002 |
QCOMPARE(evalJS("typeof myObject.myInvokableWithDoubleArg(123.5)"), sUndefined); |
|
1003 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 4); |
|
1004 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1005 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toDouble(), 123.5); |
|
1006 |
||
1007 |
m_myObject->resetQtFunctionInvoked(); |
|
1008 |
QCOMPARE(evalJS("typeof myObject.myInvokableWithDoubleArg(new Number(1234.5))"), sUndefined); |
|
1009 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 4); |
|
1010 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1011 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toDouble(), 1234.5); |
|
1012 |
||
1013 |
m_myObject->resetQtFunctionInvoked(); |
|
1014 |
QCOMPARE(evalJS("typeof myObject.myInvokableWithBoolArg(new Boolean(true))"), sUndefined); |
|
1015 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 52); |
|
1016 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1017 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toBool(), true); |
|
1018 |
||
1019 |
m_myObject->resetQtFunctionInvoked(); |
|
1020 |
QCOMPARE(evalJS("typeof myObject.myInvokableWithStringArg('ciao')"), sUndefined); |
|
1021 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 5); |
|
1022 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1023 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toString(), QLatin1String("ciao")); |
|
1024 |
||
1025 |
m_myObject->resetQtFunctionInvoked(); |
|
1026 |
QCOMPARE(evalJS("typeof myObject.myInvokableWithStringArg(123)"), sUndefined); |
|
1027 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 5); |
|
1028 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1029 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toString(), QLatin1String("123")); |
|
1030 |
||
1031 |
m_myObject->resetQtFunctionInvoked(); |
|
1032 |
QCOMPARE(evalJS("typeof myObject.myInvokableWithStringArg(null)"), sUndefined); |
|
1033 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 5); |
|
1034 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1035 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toString(), QString()); |
|
1036 |
QVERIFY(m_myObject->qtFunctionActuals().at(0).toString().isEmpty()); |
|
1037 |
||
1038 |
m_myObject->resetQtFunctionInvoked(); |
|
1039 |
QCOMPARE(evalJS("typeof myObject.myInvokableWithStringArg(undefined)"), sUndefined); |
|
1040 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 5); |
|
1041 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1042 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toString(), QString()); |
|
1043 |
QVERIFY(m_myObject->qtFunctionActuals().at(0).toString().isEmpty()); |
|
1044 |
||
1045 |
m_myObject->resetQtFunctionInvoked(); |
|
1046 |
QCOMPARE(evalJS("typeof myObject.myInvokableWithIntArgs(123, 456)"), sUndefined); |
|
1047 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 6); |
|
1048 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 2); |
|
1049 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 123); |
|
1050 |
QCOMPARE(m_myObject->qtFunctionActuals().at(1).toInt(), 456); |
|
1051 |
||
1052 |
m_myObject->resetQtFunctionInvoked(); |
|
1053 |
QCOMPARE(evalJS("myObject.myInvokableReturningInt()"), QLatin1String("123")); |
|
1054 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 7); |
|
1055 |
QCOMPARE(m_myObject->qtFunctionActuals(), QVariantList()); |
|
1056 |
||
1057 |
m_myObject->resetQtFunctionInvoked(); |
|
1058 |
QCOMPARE(evalJS("myObject.myInvokableReturningLongLong()"), QLatin1String("456")); |
|
1059 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 39); |
|
1060 |
QCOMPARE(m_myObject->qtFunctionActuals(), QVariantList()); |
|
1061 |
||
1062 |
m_myObject->resetQtFunctionInvoked(); |
|
1063 |
QCOMPARE(evalJS("myObject.myInvokableReturningString()"), QLatin1String("ciao")); |
|
1064 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 8); |
|
1065 |
QCOMPARE(m_myObject->qtFunctionActuals(), QVariantList()); |
|
1066 |
||
1067 |
m_myObject->resetQtFunctionInvoked(); |
|
1068 |
QCOMPARE(evalJS("typeof myObject.myInvokableWithIntArg(123, 456)"), sUndefined); |
|
1069 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 9); |
|
1070 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 2); |
|
1071 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 123); |
|
1072 |
QCOMPARE(m_myObject->qtFunctionActuals().at(1).toInt(), 456); |
|
1073 |
||
1074 |
m_myObject->resetQtFunctionInvoked(); |
|
1075 |
QCOMPARE(evalJS("typeof myObject.myInvokableWithVoidStarArg(null)"), sUndefined); |
|
1076 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 44); |
|
1077 |
m_myObject->resetQtFunctionInvoked(); |
|
1078 |
{ |
|
1079 |
QString type; |
|
1080 |
QString ret = evalJS("myObject.myInvokableWithVoidStarArg(123)", type); |
|
1081 |
QCOMPARE(type, sError); |
|
1082 |
QCOMPARE(ret, QLatin1String("TypeError: incompatible type of argument(s) in call to myInvokableWithVoidStarArg(); candidates were\n myInvokableWithVoidStarArg(void*)")); |
|
1083 |
QCOMPARE(m_myObject->qtFunctionInvoked(), -1); |
|
1084 |
} |
|
1085 |
||
1086 |
m_myObject->resetQtFunctionInvoked(); |
|
1087 |
{ |
|
1088 |
QString type; |
|
1089 |
QString ret = evalJS("myObject.myInvokableWithAmbiguousArg(123)", type); |
|
1090 |
QCOMPARE(type, sError); |
|
1091 |
QCOMPARE(ret, QLatin1String("TypeError: ambiguous call of overloaded function myInvokableWithAmbiguousArg(); candidates were\n myInvokableWithAmbiguousArg(int)\n myInvokableWithAmbiguousArg(uint)")); |
|
1092 |
} |
|
1093 |
||
1094 |
m_myObject->resetQtFunctionInvoked(); |
|
1095 |
{ |
|
1096 |
QString type; |
|
1097 |
QString ret = evalJS("myObject.myInvokableWithDefaultArgs(123, 'hello')", type); |
|
1098 |
QCOMPARE(type, sUndefined); |
|
1099 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 47); |
|
1100 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 2); |
|
1101 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 123); |
|
1102 |
QCOMPARE(m_myObject->qtFunctionActuals().at(1).toString(), QLatin1String("hello")); |
|
1103 |
} |
|
1104 |
||
1105 |
m_myObject->resetQtFunctionInvoked(); |
|
1106 |
{ |
|
1107 |
QString type; |
|
1108 |
QString ret = evalJS("myObject.myInvokableWithDefaultArgs(456)", type); |
|
1109 |
QCOMPARE(type, sUndefined); |
|
1110 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 47); |
|
1111 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 2); |
|
1112 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 456); |
|
1113 |
QCOMPARE(m_myObject->qtFunctionActuals().at(1).toString(), QString()); |
|
1114 |
} |
|
1115 |
||
1116 |
// calling function that returns (const)ref |
|
1117 |
m_myObject->resetQtFunctionInvoked(); |
|
1118 |
{ |
|
1119 |
QString type; |
|
1120 |
QString ret = evalJS("typeof myObject.myInvokableReturningRef()"); |
|
1121 |
QCOMPARE(ret, sUndefined); |
|
1122 |
//QVERIFY(!m_engine->hasUncaughtException()); |
|
1123 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 48); |
|
1124 |
} |
|
1125 |
||
1126 |
m_myObject->resetQtFunctionInvoked(); |
|
1127 |
{ |
|
1128 |
QString type; |
|
1129 |
QString ret = evalJS("typeof myObject.myInvokableReturningConstRef()"); |
|
1130 |
QCOMPARE(ret, sUndefined); |
|
1131 |
//QVERIFY(!m_engine->hasUncaughtException()); |
|
1132 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 49); |
|
1133 |
} |
|
1134 |
||
1135 |
m_myObject->resetQtFunctionInvoked(); |
|
1136 |
{ |
|
1137 |
QString type; |
|
1138 |
QVariant ret = evalJSV("myObject.myInvokableReturningQObjectStar()", type); |
|
1139 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 13); |
|
1140 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 0); |
|
1141 |
QCOMPARE(type, sObject); |
|
1142 |
QCOMPARE(ret.userType(), int(QMetaType::QObjectStar)); |
|
1143 |
} |
|
1144 |
||
1145 |
m_myObject->resetQtFunctionInvoked(); |
|
1146 |
{ |
|
1147 |
QString type; |
|
1148 |
QVariant ret = evalJSV("myObject.myInvokableWithQObjectListArg([myObject])", type); |
|
1149 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 14); |
|
1150 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1151 |
QCOMPARE(type, sArray); |
|
1152 |
QCOMPARE(ret.userType(), int(QVariant::List)); // All lists get downgraded to QVariantList |
|
1153 |
QVariantList vl = qvariant_cast<QVariantList>(ret); |
|
1154 |
QCOMPARE(vl.count(), 1); |
|
1155 |
} |
|
1156 |
||
1157 |
m_myObject->resetQtFunctionInvoked(); |
|
1158 |
{ |
|
1159 |
QString type; |
|
1160 |
m_myObject->setVariantProperty(QVariant(123)); |
|
1161 |
QVariant ret = evalJSV("myObject.myInvokableWithVariantArg(myObject.variantProperty)", type); |
|
1162 |
QCOMPARE(type, sNumber); |
|
1163 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 15); |
|
1164 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1165 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0), m_myObject->variantProperty()); |
|
1166 |
QCOMPARE(ret.userType(), int(QMetaType::Double)); // all JS numbers are doubles, even though this started as an int |
|
1167 |
QCOMPARE(ret.toInt(),123); |
|
1168 |
} |
|
1169 |
||
1170 |
m_myObject->resetQtFunctionInvoked(); |
|
1171 |
{ |
|
1172 |
QString type; |
|
1173 |
QVariant ret = evalJSV("myObject.myInvokableWithVariantArg(null)", type); |
|
1174 |
QCOMPARE(type, sObject); |
|
1175 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 15); |
|
1176 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1177 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0), QVariant()); |
|
1178 |
QVERIFY(!m_myObject->qtFunctionActuals().at(0).isValid()); |
|
1179 |
} |
|
1180 |
||
1181 |
m_myObject->resetQtFunctionInvoked(); |
|
1182 |
{ |
|
1183 |
QString type; |
|
1184 |
QVariant ret = evalJSV("myObject.myInvokableWithVariantArg(undefined)", type); |
|
1185 |
QCOMPARE(type, sObject); |
|
1186 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 15); |
|
1187 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1188 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0), QVariant()); |
|
1189 |
QVERIFY(!m_myObject->qtFunctionActuals().at(0).isValid()); |
|
1190 |
} |
|
1191 |
||
1192 |
/* XFAIL - variant support |
|
1193 |
m_myObject->resetQtFunctionInvoked(); |
|
1194 |
{ |
|
1195 |
m_myObject->setVariantProperty(qVariantFromValue(QBrush())); |
|
1196 |
QVariant ret = evalJS("myObject.myInvokableWithVariantArg(myObject.variantProperty)"); |
|
1197 |
QVERIFY(ret.isVariant()); |
|
1198 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 15); |
|
1199 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1200 |
QCOMPARE(ret.toVariant(), m_myObject->qtFunctionActuals().at(0)); |
|
1201 |
QCOMPARE(ret.toVariant(), m_myObject->variantProperty()); |
|
1202 |
} |
|
1203 |
*/ |
|
1204 |
||
1205 |
m_myObject->resetQtFunctionInvoked(); |
|
1206 |
{ |
|
1207 |
QString type; |
|
1208 |
QVariant ret = evalJSV("myObject.myInvokableWithVariantArg(123)", type); |
|
1209 |
QCOMPARE(type, sNumber); |
|
1210 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 15); |
|
1211 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1212 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0), QVariant(123)); |
|
1213 |
QCOMPARE(ret.userType(), int(QMetaType::Double)); |
|
1214 |
QCOMPARE(ret.toInt(),123); |
|
1215 |
} |
|
1216 |
||
1217 |
m_myObject->resetQtFunctionInvoked(); |
|
1218 |
{ |
|
1219 |
QString type; |
|
1220 |
QVariant ret = evalJSV("myObject.myInvokableWithVariantMapArg({ a:123, b:'ciao' })", type); |
|
1221 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 16); |
|
1222 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1223 |
||
1224 |
QVariant v = m_myObject->qtFunctionActuals().at(0); |
|
1225 |
QCOMPARE(v.userType(), int(QMetaType::QVariantMap)); |
|
1226 |
||
1227 |
QVariantMap vmap = qvariant_cast<QVariantMap>(v); |
|
1228 |
QCOMPARE(vmap.keys().size(), 2); |
|
1229 |
QCOMPARE(vmap.keys().at(0), QLatin1String("a")); |
|
1230 |
QCOMPARE(vmap.value("a"), QVariant(123)); |
|
1231 |
QCOMPARE(vmap.keys().at(1), QLatin1String("b")); |
|
1232 |
QCOMPARE(vmap.value("b"), QVariant("ciao")); |
|
1233 |
||
1234 |
QCOMPARE(type, sObject); |
|
1235 |
||
1236 |
QCOMPARE(ret.userType(), int(QMetaType::QVariantMap)); |
|
1237 |
vmap = qvariant_cast<QVariantMap>(ret); |
|
1238 |
QCOMPARE(vmap.keys().size(), 2); |
|
1239 |
QCOMPARE(vmap.keys().at(0), QLatin1String("a")); |
|
1240 |
QCOMPARE(vmap.value("a"), QVariant(123)); |
|
1241 |
QCOMPARE(vmap.keys().at(1), QLatin1String("b")); |
|
1242 |
QCOMPARE(vmap.value("b"), QVariant("ciao")); |
|
1243 |
} |
|
1244 |
||
1245 |
m_myObject->resetQtFunctionInvoked(); |
|
1246 |
{ |
|
1247 |
QString type; |
|
1248 |
QVariant ret = evalJSV("myObject.myInvokableWithListOfIntArg([1, 5])", type); |
|
1249 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 17); |
|
1250 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1251 |
QVariant v = m_myObject->qtFunctionActuals().at(0); |
|
1252 |
QCOMPARE(v.userType(), qMetaTypeId<QList<int> >()); |
|
1253 |
QList<int> ilst = qvariant_cast<QList<int> >(v); |
|
1254 |
QCOMPARE(ilst.size(), 2); |
|
1255 |
QCOMPARE(ilst.at(0), 1); |
|
1256 |
QCOMPARE(ilst.at(1), 5); |
|
1257 |
||
1258 |
QCOMPARE(type, sArray); |
|
1259 |
QCOMPARE(ret.userType(), int(QMetaType::QVariantList)); // ints get converted to doubles, so this is a qvariantlist |
|
1260 |
QVariantList vlst = qvariant_cast<QVariantList>(ret); |
|
1261 |
QCOMPARE(vlst.size(), 2); |
|
1262 |
QCOMPARE(vlst.at(0).toInt(), 1); |
|
1263 |
QCOMPARE(vlst.at(1).toInt(), 5); |
|
1264 |
} |
|
1265 |
||
1266 |
m_myObject->resetQtFunctionInvoked(); |
|
1267 |
{ |
|
1268 |
QString type; |
|
1269 |
QVariant ret = evalJSV("myObject.myInvokableWithQObjectStarArg(myObject)", type); |
|
1270 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 18); |
|
1271 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1272 |
QVariant v = m_myObject->qtFunctionActuals().at(0); |
|
1273 |
QCOMPARE(v.userType(), int(QMetaType::QObjectStar)); |
|
1274 |
QCOMPARE(qvariant_cast<QObject*>(v), (QObject*)m_myObject); |
|
1275 |
||
1276 |
QCOMPARE(ret.userType(), int(QMetaType::QObjectStar)); |
|
1277 |
QCOMPARE(qvariant_cast<QObject*>(ret), (QObject*)m_myObject); |
|
1278 |
||
1279 |
QCOMPARE(type, sObject); |
|
1280 |
} |
|
1281 |
||
1282 |
m_myObject->resetQtFunctionInvoked(); |
|
1283 |
{ |
|
1284 |
// no implicit conversion from integer to QObject* |
|
1285 |
QString type; |
|
1286 |
evalJS("myObject.myInvokableWithQObjectStarArg(123)", type); |
|
1287 |
QCOMPARE(type, sError); |
|
1288 |
} |
|
1289 |
||
1290 |
/* |
|
1291 |
m_myObject->resetQtFunctionInvoked(); |
|
1292 |
{ |
|
1293 |
QString fun = evalJS("myObject.myInvokableWithQBrushArg"); |
|
1294 |
Q_ASSERT(fun.isFunction()); |
|
1295 |
QColor color(10, 20, 30, 40); |
|
1296 |
// QColor should be converted to a QBrush |
|
1297 |
QVariant ret = fun.call(QString(), QStringList() |
|
1298 |
<< qScriptValueFromValue(m_engine, color)); |
|
1299 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 19); |
|
1300 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1301 |
QVariant v = m_myObject->qtFunctionActuals().at(0); |
|
1302 |
QCOMPARE(v.userType(), int(QMetaType::QBrush)); |
|
1303 |
QCOMPARE(qvariant_cast<QColor>(v), color); |
|
1304 |
||
1305 |
QCOMPARE(qscriptvalue_cast<QColor>(ret), color); |
|
1306 |
} |
|
1307 |
*/ |
|
1308 |
||
1309 |
// private slots should not be part of the QObject binding |
|
1310 |
QCOMPARE(evalJS("typeof myObject.myPrivateSlot"), sUndefined); |
|
1311 |
||
1312 |
// protected slots should be fine |
|
1313 |
m_myObject->resetQtFunctionInvoked(); |
|
1314 |
evalJS("myObject.myProtectedSlot()"); |
|
1315 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 36); |
|
1316 |
||
1317 |
// call with too few arguments |
|
1318 |
{ |
|
1319 |
QString type; |
|
1320 |
QString ret = evalJS("myObject.myInvokableWithIntArg()", type); |
|
1321 |
QCOMPARE(type, sError); |
|
1322 |
QCOMPARE(ret, QLatin1String("SyntaxError: too few arguments in call to myInvokableWithIntArg(); candidates are\n myInvokableWithIntArg(int,int)\n myInvokableWithIntArg(int)")); |
|
1323 |
} |
|
1324 |
||
1325 |
// call function where not all types have been registered |
|
1326 |
m_myObject->resetQtFunctionInvoked(); |
|
1327 |
{ |
|
1328 |
QString type; |
|
1329 |
QString ret = evalJS("myObject.myInvokableWithBrushStyleArg(0)", type); |
|
1330 |
QCOMPARE(type, sError); |
|
1331 |
QCOMPARE(ret, QLatin1String("TypeError: cannot call myInvokableWithBrushStyleArg(): unknown type `Qt::BrushStyle'")); |
|
1332 |
QCOMPARE(m_myObject->qtFunctionInvoked(), -1); |
|
1333 |
} |
|
1334 |
||
1335 |
// call function with incompatible argument type |
|
1336 |
m_myObject->resetQtFunctionInvoked(); |
|
1337 |
{ |
|
1338 |
QString type; |
|
1339 |
QString ret = evalJS("myObject.myInvokableWithQBrushArg(null)", type); |
|
1340 |
QCOMPARE(type, sError); |
|
1341 |
QCOMPARE(ret, QLatin1String("TypeError: incompatible type of argument(s) in call to myInvokableWithQBrushArg(); candidates were\n myInvokableWithQBrushArg(QBrush)")); |
|
1342 |
QCOMPARE(m_myObject->qtFunctionInvoked(), -1); |
|
1343 |
} |
|
1344 |
} |
|
1345 |
||
1346 |
void tst_QWebFrame::connectAndDisconnect() |
|
1347 |
{ |
|
1348 |
// connect(function) |
|
1349 |
QCOMPARE(evalJS("typeof myObject.mySignal"), sFunction); |
|
1350 |
QCOMPARE(evalJS("typeof myObject.mySignal.connect"), sFunction); |
|
1351 |
QCOMPARE(evalJS("typeof myObject.mySignal.disconnect"), sFunction); |
|
1352 |
||
1353 |
{ |
|
1354 |
QString type; |
|
1355 |
evalJS("myObject.mySignal.connect(123)", type); |
|
1356 |
QCOMPARE(type, sError); |
|
1357 |
} |
|
1358 |
||
1359 |
evalJS("myHandler = function() { window.gotSignal = true; window.signalArgs = arguments; window.slotThisObject = this; window.signalSender = __qt_sender__; }"); |
|
1360 |
||
1361 |
QCOMPARE(evalJS("myObject.mySignal.connect(myHandler)"), sUndefined); |
|
1362 |
||
1363 |
evalJS("gotSignal = false"); |
|
1364 |
evalJS("myObject.mySignal()"); |
|
1365 |
QCOMPARE(evalJS("gotSignal"), sTrue); |
|
1366 |
QCOMPARE(evalJS("signalArgs.length == 0"), sTrue); |
|
1367 |
QCOMPARE(evalJS("signalSender"),evalJS("myObject")); |
|
1368 |
QCOMPARE(evalJS("slotThisObject == window"), sTrue); |
|
1369 |
||
1370 |
evalJS("gotSignal = false"); |
|
1371 |
m_myObject->emitMySignal(); |
|
1372 |
QCOMPARE(evalJS("gotSignal"), sTrue); |
|
1373 |
QCOMPARE(evalJS("signalArgs.length == 0"), sTrue); |
|
1374 |
||
1375 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg.connect(myHandler)"), sUndefined); |
|
1376 |
||
1377 |
evalJS("gotSignal = false"); |
|
1378 |
m_myObject->emitMySignalWithIntArg(123); |
|
1379 |
QCOMPARE(evalJS("gotSignal"), sTrue); |
|
1380 |
QCOMPARE(evalJS("signalArgs.length == 1"), sTrue); |
|
1381 |
QCOMPARE(evalJS("signalArgs[0] == 123.0"), sTrue); |
|
1382 |
||
1383 |
QCOMPARE(evalJS("myObject.mySignal.disconnect(myHandler)"), sUndefined); |
|
1384 |
{ |
|
1385 |
QString type; |
|
1386 |
evalJS("myObject.mySignal.disconnect(myHandler)", type); |
|
1387 |
QCOMPARE(type, sError); |
|
1388 |
} |
|
1389 |
||
1390 |
evalJS("gotSignal = false"); |
|
1391 |
QCOMPARE(evalJS("myObject.mySignal2.connect(myHandler)"), sUndefined); |
|
1392 |
m_myObject->emitMySignal2(true); |
|
1393 |
QCOMPARE(evalJS("gotSignal"), sTrue); |
|
1394 |
QCOMPARE(evalJS("signalArgs.length == 1"), sTrue); |
|
1395 |
QCOMPARE(evalJS("signalArgs[0]"), sTrue); |
|
1396 |
||
1397 |
QCOMPARE(evalJS("myObject.mySignal2.disconnect(myHandler)"), sUndefined); |
|
1398 |
||
1399 |
QCOMPARE(evalJS("typeof myObject['mySignal2()']"), sFunction); |
|
1400 |
QCOMPARE(evalJS("typeof myObject['mySignal2()'].connect"), sFunction); |
|
1401 |
QCOMPARE(evalJS("typeof myObject['mySignal2()'].disconnect"), sFunction); |
|
1402 |
||
1403 |
QCOMPARE(evalJS("myObject['mySignal2()'].connect(myHandler)"), sUndefined); |
|
1404 |
||
1405 |
evalJS("gotSignal = false"); |
|
1406 |
m_myObject->emitMySignal2(); |
|
1407 |
QCOMPARE(evalJS("gotSignal"), sTrue); |
|
1408 |
||
1409 |
QCOMPARE(evalJS("myObject['mySignal2()'].disconnect(myHandler)"), sUndefined); |
|
1410 |
||
1411 |
// connect(object, function) |
|
1412 |
evalJS("otherObject = { name:'foo' }"); |
|
1413 |
QCOMPARE(evalJS("myObject.mySignal.connect(otherObject, myHandler)"), sUndefined); |
|
1414 |
QCOMPARE(evalJS("myObject.mySignal.disconnect(otherObject, myHandler)"), sUndefined); |
|
1415 |
evalJS("gotSignal = false"); |
|
1416 |
m_myObject->emitMySignal(); |
|
1417 |
QCOMPARE(evalJS("gotSignal"), sFalse); |
|
1418 |
||
1419 |
{ |
|
1420 |
QString type; |
|
1421 |
evalJS("myObject.mySignal.disconnect(otherObject, myHandler)", type); |
|
1422 |
QCOMPARE(type, sError); |
|
1423 |
} |
|
1424 |
||
1425 |
QCOMPARE(evalJS("myObject.mySignal.connect(otherObject, myHandler)"), sUndefined); |
|
1426 |
evalJS("gotSignal = false"); |
|
1427 |
m_myObject->emitMySignal(); |
|
1428 |
QCOMPARE(evalJS("gotSignal"), sTrue); |
|
1429 |
QCOMPARE(evalJS("signalArgs.length == 0"), sTrue); |
|
1430 |
QCOMPARE(evalJS("slotThisObject"),evalJS("otherObject")); |
|
1431 |
QCOMPARE(evalJS("signalSender"),evalJS("myObject")); |
|
1432 |
QCOMPARE(evalJS("slotThisObject.name"), QLatin1String("foo")); |
|
1433 |
QCOMPARE(evalJS("myObject.mySignal.disconnect(otherObject, myHandler)"), sUndefined); |
|
1434 |
||
1435 |
evalJS("yetAnotherObject = { name:'bar', func : function() { } }"); |
|
1436 |
QCOMPARE(evalJS("myObject.mySignal2.connect(yetAnotherObject, myHandler)"), sUndefined); |
|
1437 |
evalJS("gotSignal = false"); |
|
1438 |
m_myObject->emitMySignal2(true); |
|
1439 |
QCOMPARE(evalJS("gotSignal"), sTrue); |
|
1440 |
QCOMPARE(evalJS("signalArgs.length == 1"), sTrue); |
|
1441 |
QCOMPARE(evalJS("slotThisObject == yetAnotherObject"), sTrue); |
|
1442 |
QCOMPARE(evalJS("signalSender == myObject"), sTrue); |
|
1443 |
QCOMPARE(evalJS("slotThisObject.name"), QLatin1String("bar")); |
|
1444 |
QCOMPARE(evalJS("myObject.mySignal2.disconnect(yetAnotherObject, myHandler)"), sUndefined); |
|
1445 |
||
1446 |
QCOMPARE(evalJS("myObject.mySignal2.connect(myObject, myHandler)"), sUndefined); |
|
1447 |
evalJS("gotSignal = false"); |
|
1448 |
m_myObject->emitMySignal2(true); |
|
1449 |
QCOMPARE(evalJS("gotSignal"), sTrue); |
|
1450 |
QCOMPARE(evalJS("signalArgs.length == 1"), sTrue); |
|
1451 |
QCOMPARE(evalJS("slotThisObject == myObject"), sTrue); |
|
1452 |
QCOMPARE(evalJS("signalSender == myObject"), sTrue); |
|
1453 |
QCOMPARE(evalJS("myObject.mySignal2.disconnect(myObject, myHandler)"), sUndefined); |
|
1454 |
||
1455 |
// connect(obj, string) |
|
1456 |
QCOMPARE(evalJS("myObject.mySignal.connect(yetAnotherObject, 'func')"), sUndefined); |
|
1457 |
QCOMPARE(evalJS("myObject.mySignal.connect(myObject, 'mySlot')"), sUndefined); |
|
1458 |
QCOMPARE(evalJS("myObject.mySignal.disconnect(yetAnotherObject, 'func')"), sUndefined); |
|
1459 |
QCOMPARE(evalJS("myObject.mySignal.disconnect(myObject, 'mySlot')"), sUndefined); |
|
1460 |
||
1461 |
// check that emitting signals from script works |
|
1462 |
||
1463 |
// no arguments |
|
1464 |
QCOMPARE(evalJS("myObject.mySignal.connect(myObject.mySlot)"), sUndefined); |
|
1465 |
m_myObject->resetQtFunctionInvoked(); |
|
1466 |
QCOMPARE(evalJS("myObject.mySignal()"), sUndefined); |
|
1467 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 20); |
|
1468 |
QCOMPARE(evalJS("myObject.mySignal.disconnect(myObject.mySlot)"), sUndefined); |
|
1469 |
||
1470 |
// one argument |
|
1471 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg.connect(myObject.mySlotWithIntArg)"), sUndefined); |
|
1472 |
m_myObject->resetQtFunctionInvoked(); |
|
1473 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg(123)"), sUndefined); |
|
1474 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 21); |
|
1475 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1476 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 123); |
|
1477 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg.disconnect(myObject.mySlotWithIntArg)"), sUndefined); |
|
1478 |
||
1479 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg.connect(myObject.mySlotWithDoubleArg)"), sUndefined); |
|
1480 |
m_myObject->resetQtFunctionInvoked(); |
|
1481 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg(123)"), sUndefined); |
|
1482 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 22); |
|
1483 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1484 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toDouble(), 123.0); |
|
1485 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg.disconnect(myObject.mySlotWithDoubleArg)"), sUndefined); |
|
1486 |
||
1487 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg.connect(myObject.mySlotWithStringArg)"), sUndefined); |
|
1488 |
m_myObject->resetQtFunctionInvoked(); |
|
1489 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg(123)"), sUndefined); |
|
1490 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 23); |
|
1491 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1492 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toString(), QLatin1String("123")); |
|
1493 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg.disconnect(myObject.mySlotWithStringArg)"), sUndefined); |
|
1494 |
||
1495 |
// connecting to overloaded slot |
|
1496 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg.connect(myObject.myOverloadedSlot)"), sUndefined); |
|
1497 |
m_myObject->resetQtFunctionInvoked(); |
|
1498 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg(123)"), sUndefined); |
|
1499 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 26); // double overload |
|
1500 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1501 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 123); |
|
1502 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg.disconnect(myObject.myOverloadedSlot)"), sUndefined); |
|
1503 |
||
1504 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg.connect(myObject['myOverloadedSlot(int)'])"), sUndefined); |
|
1505 |
m_myObject->resetQtFunctionInvoked(); |
|
1506 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg(456)"), sUndefined); |
|
1507 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 28); // int overload |
|
1508 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1509 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 456); |
|
1510 |
QCOMPARE(evalJS("myObject.mySignalWithIntArg.disconnect(myObject['myOverloadedSlot(int)'])"), sUndefined); |
|
1511 |
||
1512 |
// erroneous input |
|
1513 |
{ |
|
1514 |
// ### QtScript adds .connect to all functions, WebKit does only to signals/slots |
|
1515 |
QString type; |
|
1516 |
QString ret = evalJS("(function() { }).connect()", type); |
|
1517 |
QCOMPARE(type, sError); |
|
1518 |
QCOMPARE(ret, QLatin1String("TypeError: Result of expression '(function() { }).connect' [undefined] is not a function.")); |
|
1519 |
} |
|
1520 |
{ |
|
1521 |
QString type; |
|
1522 |
QString ret = evalJS("var o = { }; o.connect = Function.prototype.connect; o.connect()", type); |
|
1523 |
QCOMPARE(type, sError); |
|
1524 |
QCOMPARE(ret, QLatin1String("TypeError: Result of expression 'o.connect' [undefined] is not a function.")); |
|
1525 |
} |
|
1526 |
||
1527 |
{ |
|
1528 |
QString type; |
|
1529 |
QString ret = evalJS("(function() { }).connect(123)", type); |
|
1530 |
QCOMPARE(type, sError); |
|
1531 |
QCOMPARE(ret, QLatin1String("TypeError: Result of expression '(function() { }).connect' [undefined] is not a function.")); |
|
1532 |
} |
|
1533 |
{ |
|
1534 |
QString type; |
|
1535 |
QString ret = evalJS("var o = { }; o.connect = Function.prototype.connect; o.connect(123)", type); |
|
1536 |
QCOMPARE(type, sError); |
|
1537 |
QCOMPARE(ret, QLatin1String("TypeError: Result of expression 'o.connect' [undefined] is not a function.")); |
|
1538 |
} |
|
1539 |
||
1540 |
{ |
|
1541 |
QString type; |
|
1542 |
QString ret = evalJS("myObject.myInvokable.connect(123)", type); |
|
1543 |
QCOMPARE(type, sError); |
|
1544 |
QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.connect: MyQObject::myInvokable() is not a signal")); |
|
1545 |
} |
|
1546 |
{ |
|
1547 |
QString type; |
|
1548 |
QString ret = evalJS("myObject.myInvokable.connect(function() { })", type); |
|
1549 |
QCOMPARE(type, sError); |
|
1550 |
QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.connect: MyQObject::myInvokable() is not a signal")); |
|
1551 |
} |
|
1552 |
||
1553 |
{ |
|
1554 |
QString type; |
|
1555 |
QString ret = evalJS("myObject.mySignal.connect(123)", type); |
|
1556 |
QCOMPARE(type, sError); |
|
1557 |
QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.connect: target is not a function")); |
|
1558 |
} |
|
1559 |
||
1560 |
{ |
|
1561 |
QString type; |
|
1562 |
QString ret = evalJS("myObject.mySignal.disconnect()", type); |
|
1563 |
QCOMPARE(type, sError); |
|
1564 |
QCOMPARE(ret, QLatin1String("Error: QtMetaMethod.disconnect: no arguments given")); |
|
1565 |
} |
|
1566 |
{ |
|
1567 |
QString type; |
|
1568 |
QString ret = evalJS("var o = { }; o.disconnect = myObject.mySignal.disconnect; o.disconnect()", type); |
|
1569 |
QCOMPARE(type, sError); |
|
1570 |
QCOMPARE(ret, QLatin1String("Error: QtMetaMethod.disconnect: no arguments given")); |
|
1571 |
} |
|
1572 |
||
1573 |
/* XFAIL - Function.prototype doesn't get connect/disconnect, just signals/slots |
|
1574 |
{ |
|
1575 |
QString type; |
|
1576 |
QString ret = evalJS("(function() { }).disconnect(123)", type); |
|
1577 |
QCOMPARE(type, sError); |
|
1578 |
QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.disconnect: this object is not a signal")); |
|
1579 |
} |
|
1580 |
*/ |
|
1581 |
||
1582 |
{ |
|
1583 |
QString type; |
|
1584 |
QString ret = evalJS("var o = { }; o.disconnect = myObject.myInvokable.disconnect; o.disconnect(123)", type); |
|
1585 |
QCOMPARE(type, sError); |
|
1586 |
QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.disconnect: MyQObject::myInvokable() is not a signal")); |
|
1587 |
} |
|
1588 |
||
1589 |
{ |
|
1590 |
QString type; |
|
1591 |
QString ret = evalJS("myObject.myInvokable.disconnect(123)", type); |
|
1592 |
QCOMPARE(type, sError); |
|
1593 |
QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.disconnect: MyQObject::myInvokable() is not a signal")); |
|
1594 |
} |
|
1595 |
{ |
|
1596 |
QString type; |
|
1597 |
QString ret = evalJS("myObject.myInvokable.disconnect(function() { })", type); |
|
1598 |
QCOMPARE(type, sError); |
|
1599 |
QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.disconnect: MyQObject::myInvokable() is not a signal")); |
|
1600 |
} |
|
1601 |
||
1602 |
{ |
|
1603 |
QString type; |
|
1604 |
QString ret = evalJS("myObject.mySignal.disconnect(123)", type); |
|
1605 |
QCOMPARE(type, sError); |
|
1606 |
QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.disconnect: target is not a function")); |
|
1607 |
} |
|
1608 |
||
1609 |
{ |
|
1610 |
QString type; |
|
1611 |
QString ret = evalJS("myObject.mySignal.disconnect(function() { })", type); |
|
1612 |
QCOMPARE(type, sError); |
|
1613 |
QCOMPARE(ret, QLatin1String("Error: QtMetaMethod.disconnect: failed to disconnect from MyQObject::mySignal()")); |
|
1614 |
} |
|
1615 |
||
1616 |
// when the wrapper dies, the connection stays alive |
|
1617 |
QCOMPARE(evalJS("myObject.mySignal.connect(myObject.mySlot)"), sUndefined); |
|
1618 |
m_myObject->resetQtFunctionInvoked(); |
|
1619 |
m_myObject->emitMySignal(); |
|
1620 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 20); |
|
1621 |
evalJS("myObject = null"); |
|
1622 |
evalJS("gc()"); |
|
1623 |
m_myObject->resetQtFunctionInvoked(); |
|
1624 |
m_myObject->emitMySignal(); |
|
1625 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 20); |
|
1626 |
} |
|
1627 |
||
1628 |
void tst_QWebFrame::classEnums() |
|
1629 |
{ |
|
1630 |
// We don't do the meta thing currently, unfortunately!!! |
|
1631 |
/* |
|
1632 |
QString myClass = m_engine->newQMetaObject(m_myObject->metaObject(), m_engine->undefinedValue()); |
|
1633 |
m_engine->globalObject().setProperty("MyQObject", myClass); |
|
1634 |
||
1635 |
QCOMPARE(static_cast<MyQObject::Policy>(evalJS("MyQObject.FooPolicy").toInt()), |
|
1636 |
MyQObject::FooPolicy); |
|
1637 |
QCOMPARE(static_cast<MyQObject::Policy>(evalJS("MyQObject.BarPolicy").toInt()), |
|
1638 |
MyQObject::BarPolicy); |
|
1639 |
QCOMPARE(static_cast<MyQObject::Policy>(evalJS("MyQObject.BazPolicy").toInt()), |
|
1640 |
MyQObject::BazPolicy); |
|
1641 |
||
1642 |
QCOMPARE(static_cast<MyQObject::Strategy>(evalJS("MyQObject.FooStrategy").toInt()), |
|
1643 |
MyQObject::FooStrategy); |
|
1644 |
QCOMPARE(static_cast<MyQObject::Strategy>(evalJS("MyQObject.BarStrategy").toInt()), |
|
1645 |
MyQObject::BarStrategy); |
|
1646 |
QCOMPARE(static_cast<MyQObject::Strategy>(evalJS("MyQObject.BazStrategy").toInt()), |
|
1647 |
MyQObject::BazStrategy); |
|
1648 |
||
1649 |
QCOMPARE(MyQObject::Ability(evalJS("MyQObject.NoAbility").toInt()), |
|
1650 |
MyQObject::NoAbility); |
|
1651 |
QCOMPARE(MyQObject::Ability(evalJS("MyQObject.FooAbility").toInt()), |
|
1652 |
MyQObject::FooAbility); |
|
1653 |
QCOMPARE(MyQObject::Ability(evalJS("MyQObject.BarAbility").toInt()), |
|
1654 |
MyQObject::BarAbility); |
|
1655 |
QCOMPARE(MyQObject::Ability(evalJS("MyQObject.BazAbility").toInt()), |
|
1656 |
MyQObject::BazAbility); |
|
1657 |
QCOMPARE(MyQObject::Ability(evalJS("MyQObject.AllAbility").toInt()), |
|
1658 |
MyQObject::AllAbility); |
|
1659 |
||
1660 |
// enums from Qt are inherited through prototype |
|
1661 |
QCOMPARE(static_cast<Qt::FocusPolicy>(evalJS("MyQObject.StrongFocus").toInt()), |
|
1662 |
Qt::StrongFocus); |
|
1663 |
QCOMPARE(static_cast<Qt::Key>(evalJS("MyQObject.Key_Left").toInt()), |
|
1664 |
Qt::Key_Left); |
|
1665 |
||
1666 |
QCOMPARE(evalJS("MyQObject.className()"), QLatin1String("MyQObject")); |
|
1667 |
||
1668 |
qRegisterMetaType<MyQObject::Policy>("Policy"); |
|
1669 |
||
1670 |
m_myObject->resetQtFunctionInvoked(); |
|
1671 |
QCOMPARE(evalJS("myObject.myInvokableWithEnumArg(MyQObject.BazPolicy)"), sUndefined); |
|
1672 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 10); |
|
1673 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1674 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), int(MyQObject::BazPolicy)); |
|
1675 |
||
1676 |
m_myObject->resetQtFunctionInvoked(); |
|
1677 |
QCOMPARE(evalJS("myObject.myInvokableWithQualifiedEnumArg(MyQObject.BazPolicy)"), sUndefined); |
|
1678 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 36); |
|
1679 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
1680 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), int(MyQObject::BazPolicy)); |
|
1681 |
||
1682 |
m_myObject->resetQtFunctionInvoked(); |
|
1683 |
{ |
|
1684 |
QVariant ret = evalJS("myObject.myInvokableReturningEnum()"); |
|
1685 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 37); |
|
1686 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 0); |
|
1687 |
QCOMPARE(ret.isVariant()); |
|
1688 |
} |
|
1689 |
m_myObject->resetQtFunctionInvoked(); |
|
1690 |
{ |
|
1691 |
QVariant ret = evalJS("myObject.myInvokableReturningQualifiedEnum()"); |
|
1692 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 38); |
|
1693 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 0); |
|
1694 |
QCOMPARE(ret.isNumber()); |
|
1695 |
} |
|
1696 |
*/ |
|
1697 |
} |
|
1698 |
||
1699 |
void tst_QWebFrame::classConstructor() |
|
1700 |
{ |
|
1701 |
/* |
|
1702 |
QString myClass = qScriptValueFromQMetaObject<MyQObject>(m_engine); |
|
1703 |
m_engine->globalObject().setProperty("MyQObject", myClass); |
|
1704 |
||
1705 |
QString myObj = evalJS("myObj = MyQObject()"); |
|
1706 |
QObject* qobj = myObj.toQObject(); |
|
1707 |
QVERIFY(qobj != 0); |
|
1708 |
QCOMPARE(qobj->metaObject()->className(), "MyQObject"); |
|
1709 |
QCOMPARE(qobj->parent(), (QObject*)0); |
|
1710 |
||
1711 |
QString qobjectClass = qScriptValueFromQMetaObject<QObject>(m_engine); |
|
1712 |
m_engine->globalObject().setProperty("QObject", qobjectClass); |
|
1713 |
||
1714 |
QString otherObj = evalJS("otherObj = QObject(myObj)"); |
|
1715 |
QObject* qqobj = otherObj.toQObject(); |
|
1716 |
QVERIFY(qqobj != 0); |
|
1717 |
QCOMPARE(qqobj->metaObject()->className(), "QObject"); |
|
1718 |
QCOMPARE(qqobj->parent(), qobj); |
|
1719 |
||
1720 |
delete qobj; |
|
1721 |
*/ |
|
1722 |
} |
|
1723 |
||
1724 |
void tst_QWebFrame::overrideInvokable() |
|
1725 |
{ |
|
1726 |
m_myObject->resetQtFunctionInvoked(); |
|
1727 |
QCOMPARE(evalJS("myObject.myInvokable()"), sUndefined); |
|
1728 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 0); |
|
1729 |
||
1730 |
/* XFAIL - can't write to functions with RuntimeObject |
|
1731 |
m_myObject->resetQtFunctionInvoked(); |
|
1732 |
evalJS("myObject.myInvokable = function() { window.a = 123; }"); |
|
1733 |
evalJS("myObject.myInvokable()"); |
|
1734 |
QCOMPARE(m_myObject->qtFunctionInvoked(), -1); |
|
1735 |
QCOMPARE(evalJS("window.a").toDouble(), 123.0); |
|
1736 |
||
1737 |
evalJS("myObject.myInvokable = function() { window.a = 456; }"); |
|
1738 |
evalJS("myObject.myInvokable()"); |
|
1739 |
QCOMPARE(m_myObject->qtFunctionInvoked(), -1); |
|
1740 |
QCOMPARE(evalJS("window.a").toDouble(), 456.0); |
|
1741 |
*/ |
|
1742 |
||
1743 |
evalJS("delete myObject.myInvokable"); |
|
1744 |
evalJS("myObject.myInvokable()"); |
|
1745 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 0); |
|
1746 |
||
1747 |
/* XFAIL - ditto |
|
1748 |
m_myObject->resetQtFunctionInvoked(); |
|
1749 |
evalJS("myObject.myInvokable = myObject.myInvokableWithIntArg"); |
|
1750 |
evalJS("myObject.myInvokable(123)"); |
|
1751 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 1); |
|
1752 |
*/ |
|
1753 |
||
1754 |
evalJS("delete myObject.myInvokable"); |
|
1755 |
m_myObject->resetQtFunctionInvoked(); |
|
1756 |
// this form (with the '()') is read-only |
|
1757 |
evalJS("myObject['myInvokable()'] = function() { window.a = 123; }"); |
|
1758 |
evalJS("myObject.myInvokable()"); |
|
1759 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 0); |
|
1760 |
} |
|
1761 |
||
1762 |
void tst_QWebFrame::transferInvokable() |
|
1763 |
{ |
|
1764 |
/* XFAIL - can't put to functions with RuntimeObject |
|
1765 |
m_myObject->resetQtFunctionInvoked(); |
|
1766 |
evalJS("myObject.foozball = myObject.myInvokable"); |
|
1767 |
evalJS("myObject.foozball()"); |
|
1768 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 0); |
|
1769 |
m_myObject->resetQtFunctionInvoked(); |
|
1770 |
evalJS("myObject.foozball = myObject.myInvokableWithIntArg"); |
|
1771 |
evalJS("myObject.foozball(123)"); |
|
1772 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 1); |
|
1773 |
m_myObject->resetQtFunctionInvoked(); |
|
1774 |
evalJS("myObject.myInvokable = myObject.myInvokableWithIntArg"); |
|
1775 |
evalJS("myObject.myInvokable(123)"); |
|
1776 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 1); |
|
1777 |
||
1778 |
MyOtherQObject other; |
|
1779 |
m_page->mainFrame()->addToJSWindowObject("myOtherObject", &other); |
|
1780 |
evalJS("myOtherObject.foo = myObject.foozball"); |
|
1781 |
other.resetQtFunctionInvoked(); |
|
1782 |
evalJS("myOtherObject.foo(456)"); |
|
1783 |
QCOMPARE(other.qtFunctionInvoked(), 1); |
|
1784 |
*/ |
|
1785 |
} |
|
1786 |
||
1787 |
void tst_QWebFrame::findChild() |
|
1788 |
{ |
|
1789 |
/* |
|
1790 |
QObject* child = new QObject(m_myObject); |
|
1791 |
child->setObjectName(QLatin1String("myChildObject")); |
|
1792 |
||
1793 |
{ |
|
1794 |
QString result = evalJS("myObject.findChild('noSuchChild')"); |
|
1795 |
QCOMPARE(result.isNull()); |
|
1796 |
} |
|
1797 |
||
1798 |
{ |
|
1799 |
QString result = evalJS("myObject.findChild('myChildObject')"); |
|
1800 |
QCOMPARE(result.isQObject()); |
|
1801 |
QCOMPARE(result.toQObject(), child); |
|
1802 |
} |
|
1803 |
||
1804 |
delete child; |
|
1805 |
*/ |
|
1806 |
} |
|
1807 |
||
1808 |
void tst_QWebFrame::findChildren() |
|
1809 |
{ |
|
1810 |
/* |
|
1811 |
QObject* child = new QObject(m_myObject); |
|
1812 |
child->setObjectName(QLatin1String("myChildObject")); |
|
1813 |
||
1814 |
{ |
|
1815 |
QString result = evalJS("myObject.findChildren('noSuchChild')"); |
|
1816 |
QCOMPARE(result.isArray()); |
|
1817 |
QCOMPARE(result.property(QLatin1String("length")).toDouble(), 0.0); |
|
1818 |
} |
|
1819 |
||
1820 |
{ |
|
1821 |
QString result = evalJS("myObject.findChildren('myChildObject')"); |
|
1822 |
QCOMPARE(result.isArray()); |
|
1823 |
QCOMPARE(result.property(QLatin1String("length")).toDouble(), 1.0); |
|
1824 |
QCOMPARE(result.property(QLatin1String("0")).toQObject(), child); |
|
1825 |
} |
|
1826 |
||
1827 |
QObject* namelessChild = new QObject(m_myObject); |
|
1828 |
||
1829 |
{ |
|
1830 |
QString result = evalJS("myObject.findChildren('myChildObject')"); |
|
1831 |
QCOMPARE(result.isArray()); |
|
1832 |
QCOMPARE(result.property(QLatin1String("length")).toDouble(), 1.0); |
|
1833 |
QCOMPARE(result.property(QLatin1String("0")).toQObject(), child); |
|
1834 |
} |
|
1835 |
||
1836 |
QObject* anotherChild = new QObject(m_myObject); |
|
1837 |
anotherChild->setObjectName(QLatin1String("anotherChildObject")); |
|
1838 |
||
1839 |
{ |
|
1840 |
QString result = evalJS("myObject.findChildren('anotherChildObject')"); |
|
1841 |
QCOMPARE(result.isArray()); |
|
1842 |
QCOMPARE(result.property(QLatin1String("length")).toDouble(), 1.0); |
|
1843 |
QCOMPARE(result.property(QLatin1String("0")).toQObject(), anotherChild); |
|
1844 |
} |
|
1845 |
||
1846 |
anotherChild->setObjectName(QLatin1String("myChildObject")); |
|
1847 |
{ |
|
1848 |
QString result = evalJS("myObject.findChildren('myChildObject')"); |
|
1849 |
QCOMPARE(result.isArray()); |
|
1850 |
QCOMPARE(result.property(QLatin1String("length")).toDouble(), 2.0); |
|
1851 |
QObject* o1 = result.property(QLatin1String("0")).toQObject(); |
|
1852 |
QObject* o2 = result.property(QLatin1String("1")).toQObject(); |
|
1853 |
if (o1 != child) { |
|
1854 |
QCOMPARE(o1, anotherChild); |
|
1855 |
QCOMPARE(o2, child); |
|
1856 |
} else { |
|
1857 |
QCOMPARE(o1, child); |
|
1858 |
QCOMPARE(o2, anotherChild); |
|
1859 |
} |
|
1860 |
} |
|
1861 |
||
1862 |
// find all |
|
1863 |
{ |
|
1864 |
QString result = evalJS("myObject.findChildren()"); |
|
1865 |
QVERIFY(result.isArray()); |
|
1866 |
int count = 3; |
|
1867 |
QCOMPARE(result.property("length"), QLatin1String(count); |
|
1868 |
for (int i = 0; i < 3; ++i) { |
|
1869 |
QObject* o = result.property(i).toQObject(); |
|
1870 |
if (o == namelessChild || o == child || o == anotherChild) |
|
1871 |
--count; |
|
1872 |
} |
|
1873 |
QVERIFY(count == 0); |
|
1874 |
} |
|
1875 |
||
1876 |
delete anotherChild; |
|
1877 |
delete namelessChild; |
|
1878 |
delete child; |
|
1879 |
*/ |
|
1880 |
} |
|
1881 |
||
1882 |
void tst_QWebFrame::overloadedSlots() |
|
1883 |
{ |
|
1884 |
// should pick myOverloadedSlot(double) |
|
1885 |
m_myObject->resetQtFunctionInvoked(); |
|
1886 |
evalJS("myObject.myOverloadedSlot(10)"); |
|
1887 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 26); |
|
1888 |
||
1889 |
// should pick myOverloadedSlot(double) |
|
1890 |
m_myObject->resetQtFunctionInvoked(); |
|
1891 |
evalJS("myObject.myOverloadedSlot(10.0)"); |
|
1892 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 26); |
|
1893 |
||
1894 |
// should pick myOverloadedSlot(QString) |
|
1895 |
m_myObject->resetQtFunctionInvoked(); |
|
1896 |
evalJS("myObject.myOverloadedSlot('10')"); |
|
1897 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 29); |
|
1898 |
||
1899 |
// should pick myOverloadedSlot(bool) |
|
1900 |
m_myObject->resetQtFunctionInvoked(); |
|
1901 |
evalJS("myObject.myOverloadedSlot(true)"); |
|
1902 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 25); |
|
1903 |
||
1904 |
// should pick myOverloadedSlot(QDateTime) |
|
1905 |
m_myObject->resetQtFunctionInvoked(); |
|
1906 |
evalJS("myObject.myOverloadedSlot(new Date())"); |
|
1907 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 32); |
|
1908 |
||
1909 |
// should pick myOverloadedSlot(QRegExp) |
|
1910 |
m_myObject->resetQtFunctionInvoked(); |
|
1911 |
evalJS("myObject.myOverloadedSlot(new RegExp())"); |
|
1912 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 34); |
|
1913 |
||
1914 |
// should pick myOverloadedSlot(QVariant) |
|
1915 |
/* XFAIL |
|
1916 |
m_myObject->resetQtFunctionInvoked(); |
|
1917 |
QString f = evalJS("myObject.myOverloadedSlot"); |
|
1918 |
f.call(QString(), QStringList() << m_engine->newVariant(QVariant("ciao"))); |
|
1919 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 35); |
|
1920 |
*/ |
|
1921 |
// should pick myOverloadedSlot(QObject*) |
|
1922 |
m_myObject->resetQtFunctionInvoked(); |
|
1923 |
evalJS("myObject.myOverloadedSlot(myObject)"); |
|
1924 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 41); |
|
1925 |
||
1926 |
// should pick myOverloadedSlot(QObject*) |
|
1927 |
m_myObject->resetQtFunctionInvoked(); |
|
1928 |
evalJS("myObject.myOverloadedSlot(null)"); |
|
1929 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 41); |
|
1930 |
||
1931 |
// should pick myOverloadedSlot(QStringList) |
|
1932 |
m_myObject->resetQtFunctionInvoked(); |
|
1933 |
evalJS("myObject.myOverloadedSlot(['hello'])"); |
|
1934 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 42); |
|
1935 |
} |
|
1936 |
||
1937 |
void tst_QWebFrame::enumerate_data() |
|
1938 |
{ |
|
1939 |
QTest::addColumn<QStringList>("expectedNames"); |
|
1940 |
||
1941 |
QTest::newRow("enumerate all") |
|
1942 |
<< (QStringList() |
|
1943 |
// meta-object-defined properties: |
|
1944 |
// inherited |
|
1945 |
<< "objectName" |
|
1946 |
// non-inherited |
|
1947 |
<< "p1" << "p2" << "p4" << "p6" |
|
1948 |
// dynamic properties |
|
1949 |
<< "dp1" << "dp2" << "dp3" |
|
1950 |
// inherited slots |
|
1951 |
<< "destroyed(QObject*)" << "destroyed()" |
|
1952 |
<< "deleteLater()" |
|
1953 |
// not included because it's private: |
|
1954 |
// << "_q_reregisterTimers(void*)" |
|
1955 |
// signals |
|
1956 |
<< "mySignal()" |
|
1957 |
// slots |
|
1958 |
<< "mySlot()" << "myOtherSlot()"); |
|
1959 |
} |
|
1960 |
||
1961 |
void tst_QWebFrame::enumerate() |
|
1962 |
{ |
|
1963 |
QFETCH(QStringList, expectedNames); |
|
1964 |
||
1965 |
MyEnumTestQObject enumQObject; |
|
1966 |
// give it some dynamic properties |
|
1967 |
enumQObject.setProperty("dp1", "dp1"); |
|
1968 |
enumQObject.setProperty("dp2", "dp2"); |
|
1969 |
enumQObject.setProperty("dp3", "dp3"); |
|
1970 |
m_page->mainFrame()->addToJavaScriptWindowObject("myEnumObject", &enumQObject); |
|
1971 |
||
1972 |
// enumerate in script |
|
1973 |
{ |
|
1974 |
evalJS("var enumeratedProperties = []"); |
|
1975 |
evalJS("for (var p in myEnumObject) { enumeratedProperties.push(p); }"); |
|
1976 |
QStringList result = evalJSV("enumeratedProperties").toStringList(); |
|
1977 |
QCOMPARE(result.size(), expectedNames.size()); |
|
1978 |
for (int i = 0; i < expectedNames.size(); ++i) |
|
1979 |
QCOMPARE(result.at(i), expectedNames.at(i)); |
|
1980 |
} |
|
1981 |
} |
|
1982 |
||
1983 |
void tst_QWebFrame::objectDeleted() |
|
1984 |
{ |
|
1985 |
MyQObject* qobj = new MyQObject(); |
|
1986 |
m_page->mainFrame()->addToJavaScriptWindowObject("bar", qobj); |
|
1987 |
evalJS("bar.objectName = 'foo';"); |
|
1988 |
QCOMPARE(qobj->objectName(), QLatin1String("foo")); |
|
1989 |
evalJS("bar.intProperty = 123;"); |
|
1990 |
QCOMPARE(qobj->intProperty(), 123); |
|
1991 |
qobj->resetQtFunctionInvoked(); |
|
1992 |
evalJS("bar.myInvokable.call(bar);"); |
|
1993 |
QCOMPARE(qobj->qtFunctionInvoked(), 0); |
|
1994 |
||
1995 |
// do this, to ensure that we cache that it implements call |
|
1996 |
evalJS("bar()"); |
|
1997 |
||
1998 |
// now delete the object |
|
1999 |
delete qobj; |
|
2000 |
||
2001 |
QCOMPARE(evalJS("typeof bar"), sObject); |
|
2002 |
||
2003 |
// any attempt to access properties of the object should result in an exception |
|
2004 |
{ |
|
2005 |
QString type; |
|
2006 |
QString ret = evalJS("bar.objectName", type); |
|
2007 |
QCOMPARE(type, sError); |
|
2008 |
QCOMPARE(ret, QLatin1String("Error: cannot access member `objectName' of deleted QObject")); |
|
2009 |
} |
|
2010 |
{ |
|
2011 |
QString type; |
|
2012 |
QString ret = evalJS("bar.objectName = 'foo'", type); |
|
2013 |
QCOMPARE(type, sError); |
|
2014 |
QCOMPARE(ret, QLatin1String("Error: cannot access member `objectName' of deleted QObject")); |
|
2015 |
} |
|
2016 |
||
2017 |
// myInvokable is stored in member table (since we've accessed it before deletion) |
|
2018 |
{ |
|
2019 |
QString type; |
|
2020 |
evalJS("bar.myInvokable", type); |
|
2021 |
QCOMPARE(type, sFunction); |
|
2022 |
} |
|
2023 |
||
2024 |
{ |
|
2025 |
QString type; |
|
2026 |
QString ret = evalJS("bar.myInvokable.call(bar);", type); |
|
2027 |
ret = evalJS("bar.myInvokable(bar)", type); |
|
2028 |
QCOMPARE(type, sError); |
|
2029 |
QCOMPARE(ret, QLatin1String("Error: cannot call function of deleted QObject")); |
|
2030 |
} |
|
2031 |
// myInvokableWithIntArg is not stored in member table (since we've not accessed it) |
|
2032 |
{ |
|
2033 |
QString type; |
|
2034 |
QString ret = evalJS("bar.myInvokableWithIntArg", type); |
|
2035 |
QCOMPARE(type, sError); |
|
2036 |
QCOMPARE(ret, QLatin1String("Error: cannot access member `myInvokableWithIntArg' of deleted QObject")); |
|
2037 |
} |
|
2038 |
||
2039 |
// access from script |
|
2040 |
evalJS("window.o = bar;"); |
|
2041 |
{ |
|
2042 |
QString type; |
|
2043 |
QString ret = evalJS("o.objectName", type); |
|
2044 |
QCOMPARE(type, sError); |
|
2045 |
QCOMPARE(ret, QLatin1String("Error: cannot access member `objectName' of deleted QObject")); |
|
2046 |
} |
|
2047 |
{ |
|
2048 |
QString type; |
|
2049 |
QString ret = evalJS("o.myInvokable()", type); |
|
2050 |
QCOMPARE(type, sError); |
|
2051 |
QCOMPARE(ret, QLatin1String("Error: cannot call function of deleted QObject")); |
|
2052 |
} |
|
2053 |
{ |
|
2054 |
QString type; |
|
2055 |
QString ret = evalJS("o.myInvokableWithIntArg(10)", type); |
|
2056 |
QCOMPARE(type, sError); |
|
2057 |
QCOMPARE(ret, QLatin1String("Error: cannot access member `myInvokableWithIntArg' of deleted QObject")); |
|
2058 |
} |
|
2059 |
} |
|
2060 |
||
2061 |
void tst_QWebFrame::typeConversion() |
|
2062 |
{ |
|
2063 |
m_myObject->resetQtFunctionInvoked(); |
|
2064 |
||
2065 |
QDateTime localdt(QDate(2008,1,18), QTime(12,31,0)); |
|
2066 |
QDateTime utclocaldt = localdt.toUTC(); |
|
2067 |
QDateTime utcdt(QDate(2008,1,18), QTime(12,31,0), Qt::UTC); |
|
2068 |
||
2069 |
// Dates in JS (default to local) |
|
2070 |
evalJS("myObject.myOverloadedSlot(new Date(2008,0,18,12,31,0))"); |
|
2071 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 32); |
|
2072 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
2073 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toDateTime().toUTC(), utclocaldt); |
|
2074 |
||
2075 |
m_myObject->resetQtFunctionInvoked(); |
|
2076 |
evalJS("myObject.myOverloadedSlot(new Date(Date.UTC(2008,0,18,12,31,0)))"); |
|
2077 |
QCOMPARE(m_myObject->qtFunctionInvoked(), 32); |
|
2078 |
QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); |
|
2079 |
QCOMPARE(m_myObject->qtFunctionActuals().at(0).toDateTime().toUTC(), utcdt); |
|
2080 |
||
2081 |
// Pushing QDateTimes into JS |
|
2082 |
// Local |
|
2083 |
evalJS("function checkDate(d) {window.__date_equals = (d.toString() == new Date(2008,0,18,12,31,0))?true:false;}"); |
|
2084 |
evalJS("myObject.mySignalWithDateTimeArg.connect(checkDate)"); |
|
2085 |
m_myObject->emitMySignalWithDateTimeArg(localdt); |
|
2086 |
QCOMPARE(evalJS("window.__date_equals"), sTrue); |
|
2087 |
evalJS("delete window.__date_equals"); |
|
2088 |
m_myObject->emitMySignalWithDateTimeArg(utclocaldt); |
|
2089 |
QCOMPARE(evalJS("window.__date_equals"), sTrue); |
|
2090 |
evalJS("delete window.__date_equals"); |
|
2091 |
evalJS("myObject.mySignalWithDateTimeArg.disconnect(checkDate); delete checkDate;"); |
|
2092 |
||
2093 |
// UTC |
|
2094 |
evalJS("function checkDate(d) {window.__date_equals = (d.toString() == new Date(Date.UTC(2008,0,18,12,31,0)))?true:false; }"); |
|
2095 |
evalJS("myObject.mySignalWithDateTimeArg.connect(checkDate)"); |
|
2096 |
m_myObject->emitMySignalWithDateTimeArg(utcdt); |
|
2097 |
QCOMPARE(evalJS("window.__date_equals"), sTrue); |
|
2098 |
evalJS("delete window.__date_equals"); |
|
2099 |
evalJS("myObject.mySignalWithDateTimeArg.disconnect(checkDate); delete checkDate;"); |
|
2100 |
||
2101 |
// ### RegExps |
|
2102 |
} |
|
2103 |
||
2104 |
void tst_QWebFrame::symmetricUrl() |
|
2105 |
{ |
|
2106 |
QVERIFY(m_view->url().isEmpty()); |
|
2107 |
||
2108 |
QCOMPARE(m_view->history()->count(), 0); |
|
2109 |
||
2110 |
QUrl dataUrl("data:text/html,<h1>Test"); |
|
2111 |
||
2112 |
m_view->setUrl(dataUrl); |
|
2113 |
QCOMPARE(m_view->url(), dataUrl); |
|
2114 |
QCOMPARE(m_view->history()->count(), 0); |
|
2115 |
||
2116 |
// loading is _not_ immediate, so the text isn't set just yet. |
|
2117 |
QVERIFY(m_view->page()->mainFrame()->toPlainText().isEmpty()); |
|
2118 |
||
2119 |
::waitForSignal(m_view, SIGNAL(loadFinished(bool))); |
|
2120 |
||
2121 |
QCOMPARE(m_view->history()->count(), 1); |
|
2122 |
QCOMPARE(m_view->page()->mainFrame()->toPlainText(), QString("Test")); |
|
2123 |
||
2124 |
QUrl dataUrl2("data:text/html,<h1>Test2"); |
|
2125 |
QUrl dataUrl3("data:text/html,<h1>Test3"); |
|
2126 |
||
2127 |
m_view->setUrl(dataUrl2); |
|
2128 |
m_view->setUrl(dataUrl3); |
|
2129 |
||
2130 |
QCOMPARE(m_view->url(), dataUrl3); |
|
2131 |
||
2132 |
::waitForSignal(m_view, SIGNAL(loadFinished(bool))); |
|
2133 |
||
2134 |
QCOMPARE(m_view->history()->count(), 2); |
|
2135 |
||
2136 |
QCOMPARE(m_view->page()->mainFrame()->toPlainText(), QString("Test3")); |
|
2137 |
} |
|
2138 |
||
2139 |
void tst_QWebFrame::progressSignal() |
|
2140 |
{ |
|
2141 |
QSignalSpy progressSpy(m_view, SIGNAL(loadProgress(int))); |
|
2142 |
||
2143 |
QUrl dataUrl("data:text/html,<h1>Test"); |
|
2144 |
m_view->setUrl(dataUrl); |
|
2145 |
||
2146 |
::waitForSignal(m_view, SIGNAL(loadFinished(bool))); |
|
2147 |
||
2148 |
QVERIFY(progressSpy.size() >= 2); |
|
2149 |
||
2150 |
// WebKit defines initialProgressValue as 10%, not 0% |
|
2151 |
QCOMPARE(progressSpy.first().first().toInt(), 10); |
|
2152 |
||
2153 |
// But we always end at 100% |
|
2154 |
QCOMPARE(progressSpy.last().first().toInt(), 100); |
|
2155 |
} |
|
2156 |
||
2157 |
void tst_QWebFrame::urlChange() |
|
2158 |
{ |
|
2159 |
QSignalSpy urlSpy(m_page->mainFrame(), SIGNAL(urlChanged(QUrl))); |
|
2160 |
||
2161 |
QUrl dataUrl("data:text/html,<h1>Test"); |
|
2162 |
m_view->setUrl(dataUrl); |
|
2163 |
||
2164 |
::waitForSignal(m_page->mainFrame(), SIGNAL(urlChanged(QUrl))); |
|
2165 |
||
2166 |
QCOMPARE(urlSpy.size(), 1); |
|
2167 |
||
2168 |
QUrl dataUrl2("data:text/html,<html><head><title>title</title></head><body><h1>Test</body></html>"); |
|
2169 |
m_view->setUrl(dataUrl2); |
|
2170 |
||
2171 |
::waitForSignal(m_page->mainFrame(), SIGNAL(urlChanged(QUrl))); |
|
2172 |
||
2173 |
QCOMPARE(urlSpy.size(), 2); |
|
2174 |
} |
|
2175 |
||
2176 |
||
2177 |
void tst_QWebFrame::domCycles() |
|
2178 |
{ |
|
2179 |
m_view->setHtml("<html><body>"); |
|
2180 |
QVariant v = m_page->mainFrame()->evaluateJavaScript("document"); |
|
2181 |
QVERIFY(v.type() == QVariant::Map); |
|
2182 |
} |
|
2183 |
||
2184 |
class FakeReply : public QNetworkReply { |
|
2185 |
Q_OBJECT |
|
2186 |
||
2187 |
public: |
|
2188 |
FakeReply(const QNetworkRequest& request, QObject* parent = 0) |
|
2189 |
: QNetworkReply(parent) |
|
2190 |
{ |
|
2191 |
setOperation(QNetworkAccessManager::GetOperation); |
|
2192 |
setRequest(request); |
|
2193 |
if (request.url() == QUrl("qrc:/test1.html")) { |
|
2194 |
setHeader(QNetworkRequest::LocationHeader, QString("qrc:/test2.html")); |
|
2195 |
setAttribute(QNetworkRequest::RedirectionTargetAttribute, QUrl("qrc:/test2.html")); |
|
2196 |
} |
|
2197 |
#ifndef QT_NO_OPENSSL |
|
2198 |
else if (request.url() == QUrl("qrc:/fake-ssl-error.html")) |
|
2199 |
setError(QNetworkReply::SslHandshakeFailedError, tr("Fake error !")); // force a ssl error |
|
2200 |
#endif |
|
2201 |
else if (request.url() == QUrl("http://abcdef.abcdef/")) |
|
2202 |
setError(QNetworkReply::HostNotFoundError, tr("Invalid URL")); |
|
2203 |
||
2204 |
open(QIODevice::ReadOnly); |
|
2205 |
QTimer::singleShot(0, this, SLOT(timeout())); |
|
2206 |
} |
|
2207 |
~FakeReply() |
|
2208 |
{ |
|
2209 |
close(); |
|
2210 |
} |
|
2211 |
virtual void abort() {} |
|
2212 |
virtual void close() {} |
|
2213 |
||
2214 |
protected: |
|
2215 |
qint64 readData(char*, qint64) |
|
2216 |
{ |
|
2217 |
return 0; |
|
2218 |
} |
|
2219 |
||
2220 |
private slots: |
|
2221 |
void timeout() |
|
2222 |
{ |
|
2223 |
if (request().url() == QUrl("qrc://test1.html")) |
|
2224 |
emit error(this->error()); |
|
2225 |
else if (request().url() == QUrl("http://abcdef.abcdef/")) |
|
2226 |
emit metaDataChanged(); |
|
2227 |
#ifndef QT_NO_OPENSSL |
|
2228 |
else if (request().url() == QUrl("qrc:/fake-ssl-error.html")) |
|
2229 |
return; |
|
2230 |
#endif |
|
2231 |
||
2232 |
emit readyRead(); |
|
2233 |
emit finished(); |
|
2234 |
} |
|
2235 |
}; |
|
2236 |
||
2237 |
class FakeNetworkManager : public QNetworkAccessManager { |
|
2238 |
Q_OBJECT |
|
2239 |
||
2240 |
public: |
|
2241 |
FakeNetworkManager(QObject* parent) : QNetworkAccessManager(parent) { } |
|
2242 |
||
2243 |
protected: |
|
2244 |
virtual QNetworkReply* createRequest(Operation op, const QNetworkRequest& request, QIODevice* outgoingData) |
|
2245 |
{ |
|
2246 |
QString url = request.url().toString(); |
|
2247 |
if (op == QNetworkAccessManager::GetOperation) |
|
2248 |
if (url == "qrc:/test1.html" || url == "http://abcdef.abcdef/") |
|
2249 |
return new FakeReply(request, this); |
|
2250 |
#ifndef QT_NO_OPENSSL |
|
2251 |
else if (url == "qrc:/fake-ssl-error.html") { |
|
2252 |
FakeReply* reply = new FakeReply(request, this); |
|
2253 |
QList<QSslError> errors; |
|
2254 |
emit sslErrors(reply, errors << QSslError(QSslError::UnspecifiedError)); |
|
2255 |
return reply; |
|
2256 |
} |
|
2257 |
#endif |
|
2258 |
||
2259 |
return QNetworkAccessManager::createRequest(op, request, outgoingData); |
|
2260 |
} |
|
2261 |
}; |
|
2262 |
||
2263 |
void tst_QWebFrame::requestedUrl() |
|
2264 |
{ |
|
2265 |
QWebPage page; |
|
2266 |
QWebFrame* frame = page.mainFrame(); |
|
2267 |
||
2268 |
// in few seconds, the image should be completely loaded |
|
2269 |
QSignalSpy spy(&page, SIGNAL(loadFinished(bool))); |
|
2270 |
FakeNetworkManager* networkManager = new FakeNetworkManager(&page); |
|
2271 |
page.setNetworkAccessManager(networkManager); |
|
2272 |
||
2273 |
frame->setUrl(QUrl("qrc:/test1.html")); |
|
2274 |
QTest::qWait(200); |
|
2275 |
QCOMPARE(spy.count(), 1); |
|
2276 |
QCOMPARE(frame->requestedUrl(), QUrl("qrc:/test1.html")); |
|
2277 |
QCOMPARE(frame->url(), QUrl("qrc:/test2.html")); |
|
2278 |
||
2279 |
frame->setUrl(QUrl("qrc:/non-existent.html")); |
|
2280 |
QTest::qWait(200); |
|
2281 |
QCOMPARE(spy.count(), 2); |
|
2282 |
QCOMPARE(frame->requestedUrl(), QUrl("qrc:/non-existent.html")); |
|
2283 |
QCOMPARE(frame->url(), QUrl("qrc:/non-existent.html")); |
|
2284 |
||
2285 |
frame->setUrl(QUrl("http://abcdef.abcdef")); |
|
2286 |
QTest::qWait(200); |
|
2287 |
QCOMPARE(spy.count(), 3); |
|
2288 |
QCOMPARE(frame->requestedUrl(), QUrl("http://abcdef.abcdef/")); |
|
2289 |
QCOMPARE(frame->url(), QUrl("http://abcdef.abcdef/")); |
|
2290 |
||
2291 |
#ifndef QT_NO_OPENSSL |
|
2292 |
qRegisterMetaType<QList<QSslError> >("QList<QSslError>"); |
|
2293 |
qRegisterMetaType<QNetworkReply* >("QNetworkReply*"); |
|
2294 |
||
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2295 |
QSignalSpy spy2(page.networkAccessManager(), SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>))); |
0 | 2296 |
frame->setUrl(QUrl("qrc:/fake-ssl-error.html")); |
2297 |
QTest::qWait(200); |
|
2298 |
QCOMPARE(spy2.count(), 1); |
|
2299 |
QCOMPARE(frame->requestedUrl(), QUrl("qrc:/fake-ssl-error.html")); |
|
2300 |
QCOMPARE(frame->url(), QUrl("qrc:/fake-ssl-error.html")); |
|
2301 |
#endif |
|
2302 |
} |
|
2303 |
||
2304 |
void tst_QWebFrame::javaScriptWindowObjectCleared_data() |
|
2305 |
{ |
|
2306 |
QTest::addColumn<QString>("html"); |
|
2307 |
QTest::addColumn<int>("signalCount"); |
|
2308 |
QTest::newRow("with <script>") << "<html><body><script></script><p>hello world</p></body></html>" << 1; |
|
2309 |
QTest::newRow("without <script>") << "<html><body><p>hello world</p></body></html>" << 0; |
|
2310 |
} |
|
2311 |
||
2312 |
void tst_QWebFrame::javaScriptWindowObjectCleared() |
|
2313 |
{ |
|
2314 |
QWebPage page; |
|
2315 |
QWebFrame* frame = page.mainFrame(); |
|
2316 |
QSignalSpy spy(frame, SIGNAL(javaScriptWindowObjectCleared())); |
|
2317 |
QFETCH(QString, html); |
|
2318 |
frame->setHtml(html); |
|
2319 |
||
2320 |
QFETCH(int, signalCount); |
|
2321 |
QCOMPARE(spy.count(), signalCount); |
|
2322 |
} |
|
2323 |
||
2324 |
void tst_QWebFrame::javaScriptWindowObjectClearedOnEvaluate() |
|
2325 |
{ |
|
2326 |
QWebPage page; |
|
2327 |
QWebFrame* frame = page.mainFrame(); |
|
2328 |
QSignalSpy spy(frame, SIGNAL(javaScriptWindowObjectCleared())); |
|
2329 |
frame->setHtml("<html></html>"); |
|
2330 |
QCOMPARE(spy.count(), 0); |
|
2331 |
frame->evaluateJavaScript("var a = 'a';"); |
|
2332 |
QCOMPARE(spy.count(), 1); |
|
2333 |
// no new clear for a new script: |
|
2334 |
frame->evaluateJavaScript("var a = 1;"); |
|
2335 |
QCOMPARE(spy.count(), 1); |
|
2336 |
} |
|
2337 |
||
2338 |
void tst_QWebFrame::setHtml() |
|
2339 |
{ |
|
2340 |
QString html("<html><head></head><body><p>hello world</p></body></html>"); |
|
2341 |
m_view->page()->mainFrame()->setHtml(html); |
|
2342 |
QCOMPARE(m_view->page()->mainFrame()->toHtml(), html); |
|
2343 |
} |
|
2344 |
||
2345 |
void tst_QWebFrame::setHtmlWithResource() |
|
2346 |
{ |
|
2347 |
QString html("<html><body><p>hello world</p><img src='qrc:/image.png'/></body></html>"); |
|
2348 |
||
2349 |
QWebPage page; |
|
2350 |
QWebFrame* frame = page.mainFrame(); |
|
2351 |
||
2352 |
// in few seconds, the image should be completey loaded |
|
2353 |
QSignalSpy spy(&page, SIGNAL(loadFinished(bool))); |
|
2354 |
frame->setHtml(html); |
|
2355 |
QTest::qWait(200); |
|
2356 |
QCOMPARE(spy.count(), 1); |
|
2357 |
||
2358 |
QCOMPARE(frame->evaluateJavaScript("document.images.length").toInt(), 1); |
|
2359 |
QCOMPARE(frame->evaluateJavaScript("document.images[0].width").toInt(), 128); |
|
2360 |
QCOMPARE(frame->evaluateJavaScript("document.images[0].height").toInt(), 128); |
|
2361 |
||
2362 |
QString html2 = |
|
2363 |
"<html>" |
|
2364 |
"<head>" |
|
2365 |
"<link rel='stylesheet' href='qrc:/style.css' type='text/css' />" |
|
2366 |
"</head>" |
|
2367 |
"<body>" |
|
2368 |
"<p id='idP'>some text</p>" |
|
2369 |
"</body>" |
|
2370 |
"</html>"; |
|
2371 |
||
2372 |
// in few seconds, the CSS should be completey loaded |
|
2373 |
frame->setHtml(html2); |
|
2374 |
QTest::qWait(200); |
|
2375 |
QCOMPARE(spy.size(), 2); |
|
2376 |
||
2377 |
QWebElement p = frame->documentElement().findAll("p").at(0); |
|
2378 |
QCOMPARE(p.styleProperty("color", QWebElement::CascadedStyle), QLatin1String("red")); |
|
2379 |
} |
|
2380 |
||
2381 |
void tst_QWebFrame::setHtmlWithBaseURL() |
|
2382 |
{ |
|
2383 |
QString html("<html><body><p>hello world</p><img src='resources/image2.png'/></body></html>"); |
|
2384 |
||
2385 |
QWebPage page; |
|
2386 |
QWebFrame* frame = page.mainFrame(); |
|
2387 |
||
2388 |
// in few seconds, the image should be completey loaded |
|
2389 |
QSignalSpy spy(&page, SIGNAL(loadFinished(bool))); |
|
2390 |
||
2391 |
frame->setHtml(html, QUrl::fromLocalFile(QDir::currentPath())); |
|
2392 |
QTest::qWait(200); |
|
2393 |
QCOMPARE(spy.count(), 1); |
|
2394 |
||
2395 |
QCOMPARE(frame->evaluateJavaScript("document.images.length").toInt(), 1); |
|
2396 |
QCOMPARE(frame->evaluateJavaScript("document.images[0].width").toInt(), 128); |
|
2397 |
QCOMPARE(frame->evaluateJavaScript("document.images[0].height").toInt(), 128); |
|
2398 |
||
2399 |
// no history item has to be added. |
|
2400 |
QCOMPARE(m_view->page()->history()->count(), 0); |
|
2401 |
} |
|
2402 |
||
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2403 |
class MyPage : public QWebPage |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2404 |
{ |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2405 |
public: |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2406 |
MyPage() : QWebPage(), alerts(0) {} |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2407 |
int alerts; |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2408 |
|
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2409 |
protected: |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2410 |
virtual void javaScriptAlert(QWebFrame*, const QString& msg) |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2411 |
{ |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2412 |
alerts++; |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2413 |
QCOMPARE(msg, QString("foo")); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2414 |
// Should not be enough to trigger deferred loading, since we've upped the HTML |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2415 |
// tokenizer delay in the Qt frameloader. See HTMLTokenizer::continueProcessing() |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2416 |
QTest::qWait(1000); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2417 |
} |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2418 |
}; |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2419 |
|
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2420 |
void tst_QWebFrame::setHtmlWithJSAlert() |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2421 |
{ |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2422 |
QString html("<html><head></head><body><script>alert('foo');</script><p>hello world</p></body></html>"); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2423 |
MyPage page; |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2424 |
m_view->setPage(&page); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2425 |
page.mainFrame()->setHtml(html); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2426 |
QCOMPARE(page.alerts, 1); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2427 |
QCOMPARE(m_view->page()->mainFrame()->toHtml(), html); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2428 |
} |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2429 |
|
0 | 2430 |
class TestNetworkManager : public QNetworkAccessManager |
2431 |
{ |
|
2432 |
public: |
|
2433 |
TestNetworkManager(QObject* parent) : QNetworkAccessManager(parent) {} |
|
2434 |
||
2435 |
QList<QUrl> requestedUrls; |
|
2436 |
||
2437 |
protected: |
|
2438 |
virtual QNetworkReply* createRequest(Operation op, const QNetworkRequest &request, QIODevice* outgoingData) { |
|
2439 |
requestedUrls.append(request.url()); |
|
2440 |
QNetworkRequest redirectedRequest = request; |
|
2441 |
redirectedRequest.setUrl(QUrl("data:text/html,<p>hello")); |
|
2442 |
return QNetworkAccessManager::createRequest(op, redirectedRequest, outgoingData); |
|
2443 |
} |
|
2444 |
}; |
|
2445 |
||
2446 |
void tst_QWebFrame::ipv6HostEncoding() |
|
2447 |
{ |
|
2448 |
TestNetworkManager* networkManager = new TestNetworkManager(m_page); |
|
2449 |
m_page->setNetworkAccessManager(networkManager); |
|
2450 |
networkManager->requestedUrls.clear(); |
|
2451 |
||
2452 |
QUrl baseUrl = QUrl::fromEncoded("http://[::1]/index.html"); |
|
2453 |
m_view->setHtml("<p>Hi", baseUrl); |
|
2454 |
m_view->page()->mainFrame()->evaluateJavaScript("var r = new XMLHttpRequest();" |
|
2455 |
"r.open('GET', 'http://[::1]/test.xml', false);" |
|
2456 |
"r.send(null);" |
|
2457 |
); |
|
2458 |
QCOMPARE(networkManager->requestedUrls.count(), 1); |
|
2459 |
QCOMPARE(networkManager->requestedUrls.at(0), QUrl::fromEncoded("http://[::1]/test.xml")); |
|
2460 |
} |
|
2461 |
||
2462 |
void tst_QWebFrame::metaData() |
|
2463 |
{ |
|
2464 |
m_view->setHtml("<html>" |
|
2465 |
" <head>" |
|
2466 |
" <meta name=\"description\" content=\"Test description\">" |
|
2467 |
" <meta name=\"keywords\" content=\"HTML, JavaScript, Css\">" |
|
2468 |
" </head>" |
|
2469 |
"</html>"); |
|
2470 |
||
2471 |
QMultiMap<QString, QString> metaData = m_view->page()->mainFrame()->metaData(); |
|
2472 |
||
2473 |
QCOMPARE(metaData.count(), 2); |
|
2474 |
||
2475 |
QCOMPARE(metaData.value("description"), QString("Test description")); |
|
2476 |
QCOMPARE(metaData.value("keywords"), QString("HTML, JavaScript, Css")); |
|
2477 |
QCOMPARE(metaData.value("nonexistant"), QString()); |
|
2478 |
||
2479 |
m_view->setHtml("<html>" |
|
2480 |
" <head>" |
|
2481 |
" <meta name=\"samekey\" content=\"FirstValue\">" |
|
2482 |
" <meta name=\"samekey\" content=\"SecondValue\">" |
|
2483 |
" </head>" |
|
2484 |
"</html>"); |
|
2485 |
||
2486 |
metaData = m_view->page()->mainFrame()->metaData(); |
|
2487 |
||
2488 |
QCOMPARE(metaData.count(), 2); |
|
2489 |
||
2490 |
QStringList values = metaData.values("samekey"); |
|
2491 |
QCOMPARE(values.count(), 2); |
|
2492 |
||
2493 |
QVERIFY(values.contains("FirstValue")); |
|
2494 |
QVERIFY(values.contains("SecondValue")); |
|
2495 |
||
2496 |
QCOMPARE(metaData.value("nonexistant"), QString()); |
|
2497 |
} |
|
2498 |
||
2499 |
void tst_QWebFrame::popupFocus() |
|
2500 |
{ |
|
2501 |
QWebView view; |
|
2502 |
view.setHtml("<html>" |
|
2503 |
" <body>" |
|
2504 |
" <select name=\"select\">" |
|
2505 |
" <option>1</option>" |
|
2506 |
" <option>2</option>" |
|
2507 |
" </select>" |
|
2508 |
" <input type=\"text\"> </input>" |
|
2509 |
" <textarea name=\"text_area\" rows=\"3\" cols=\"40\">" |
|
2510 |
"This test checks whether showing and hiding a popup" |
|
2511 |
"takes the focus away from the webpage." |
|
2512 |
" </textarea>" |
|
2513 |
" </body>" |
|
2514 |
"</html>"); |
|
2515 |
view.resize(400, 100); |
|
2516 |
view.show(); |
|
2517 |
view.setFocus(); |
|
2518 |
QTRY_VERIFY(view.hasFocus()); |
|
2519 |
||
2520 |
// open the popup by clicking. check if focus is on the popup |
|
2521 |
QTest::mouseClick(&view, Qt::LeftButton, 0, QPoint(25, 25)); |
|
2522 |
QObject* webpopup = firstChildByClassName(&view, "WebCore::QWebPopup"); |
|
2523 |
QComboBox* combo = qobject_cast<QComboBox*>(webpopup); |
|
2524 |
QTRY_VERIFY(!view.hasFocus() && combo->view()->hasFocus()); // Focus should be on the popup |
|
2525 |
||
2526 |
// hide the popup and check if focus is on the page |
|
2527 |
combo->hidePopup(); |
|
2528 |
QTRY_VERIFY(view.hasFocus() && !combo->view()->hasFocus()); // Focus should be back on the WebView |
|
2529 |
||
2530 |
// triple the flashing time, should at least blink twice already |
|
2531 |
int delay = qApp->cursorFlashTime() * 3; |
|
2532 |
||
2533 |
// focus the lineedit and check if it blinks |
|
2534 |
QTest::mouseClick(&view, Qt::LeftButton, 0, QPoint(200, 25)); |
|
2535 |
m_popupTestView = &view; |
|
2536 |
view.installEventFilter( this ); |
|
2537 |
QTest::qWait(delay); |
|
2538 |
QVERIFY2(m_popupTestPaintCount >= 4, |
|
2539 |
"The input field should have a blinking caret"); |
|
2540 |
} |
|
2541 |
||
2542 |
void tst_QWebFrame::hitTestContent() |
|
2543 |
{ |
|
2544 |
QString html("<html><body><p>A paragraph</p><br/><br/><br/><a href=\"about:blank\" target=\"_foo\">link text</a></body></html>"); |
|
2545 |
||
2546 |
QWebPage page; |
|
2547 |
QWebFrame* frame = page.mainFrame(); |
|
2548 |
frame->setHtml(html); |
|
2549 |
page.setViewportSize(QSize(200, 0)); //no height so link is not visible |
|
2550 |
QWebHitTestResult result = frame->hitTestContent(QPoint(10, 100)); |
|
2551 |
QCOMPARE(result.linkText(), QString("link text")); |
|
2552 |
QWebElement link = result.linkElement(); |
|
2553 |
QCOMPARE(link.attribute("target"), QString("_foo")); |
|
2554 |
} |
|
2555 |
||
2556 |
void tst_QWebFrame::jsByteArray() |
|
2557 |
{ |
|
2558 |
QByteArray ba("hello world"); |
|
2559 |
m_myObject->setByteArrayProperty(ba); |
|
2560 |
||
2561 |
// read-only property |
|
2562 |
QCOMPARE(m_myObject->byteArrayProperty(), ba); |
|
2563 |
QString type; |
|
2564 |
QVariant v = evalJSV("myObject.byteArrayProperty"); |
|
2565 |
QCOMPARE(int(v.type()), int(QVariant::ByteArray)); |
|
2566 |
||
2567 |
QCOMPARE(v.toByteArray(), ba); |
|
2568 |
} |
|
2569 |
||
2570 |
void tst_QWebFrame::ownership() |
|
2571 |
{ |
|
2572 |
// test ownership |
|
2573 |
{ |
|
2574 |
QPointer<QObject> ptr = new QObject(); |
|
2575 |
QVERIFY(ptr != 0); |
|
2576 |
{ |
|
2577 |
QWebPage page; |
|
2578 |
QWebFrame* frame = page.mainFrame(); |
|
2579 |
frame->addToJavaScriptWindowObject("test", ptr, QScriptEngine::ScriptOwnership); |
|
2580 |
} |
|
2581 |
QVERIFY(ptr == 0); |
|
2582 |
} |
|
2583 |
{ |
|
2584 |
QPointer<QObject> ptr = new QObject(); |
|
2585 |
QVERIFY(ptr != 0); |
|
2586 |
QObject* before = ptr; |
|
2587 |
{ |
|
2588 |
QWebPage page; |
|
2589 |
QWebFrame* frame = page.mainFrame(); |
|
2590 |
frame->addToJavaScriptWindowObject("test", ptr, QScriptEngine::QtOwnership); |
|
2591 |
} |
|
2592 |
QVERIFY(ptr == before); |
|
2593 |
delete ptr; |
|
2594 |
} |
|
2595 |
{ |
|
2596 |
QObject* parent = new QObject(); |
|
2597 |
QObject* child = new QObject(parent); |
|
2598 |
QWebPage page; |
|
2599 |
QWebFrame* frame = page.mainFrame(); |
|
2600 |
frame->addToJavaScriptWindowObject("test", child, QScriptEngine::QtOwnership); |
|
2601 |
QVariant v = frame->evaluateJavaScript("test"); |
|
2602 |
QCOMPARE(qvariant_cast<QObject*>(v), child); |
|
2603 |
delete parent; |
|
2604 |
v = frame->evaluateJavaScript("test"); |
|
2605 |
QCOMPARE(qvariant_cast<QObject*>(v), (QObject *)0); |
|
2606 |
} |
|
2607 |
{ |
|
2608 |
QPointer<QObject> ptr = new QObject(); |
|
2609 |
QVERIFY(ptr != 0); |
|
2610 |
{ |
|
2611 |
QWebPage page; |
|
2612 |
QWebFrame* frame = page.mainFrame(); |
|
2613 |
frame->addToJavaScriptWindowObject("test", ptr, QScriptEngine::AutoOwnership); |
|
2614 |
} |
|
2615 |
// no parent, so it should be like ScriptOwnership |
|
2616 |
QVERIFY(ptr == 0); |
|
2617 |
} |
|
2618 |
{ |
|
2619 |
QObject* parent = new QObject(); |
|
2620 |
QPointer<QObject> child = new QObject(parent); |
|
2621 |
QVERIFY(child != 0); |
|
2622 |
{ |
|
2623 |
QWebPage page; |
|
2624 |
QWebFrame* frame = page.mainFrame(); |
|
2625 |
frame->addToJavaScriptWindowObject("test", child, QScriptEngine::AutoOwnership); |
|
2626 |
} |
|
2627 |
// has parent, so it should be like QtOwnership |
|
2628 |
QVERIFY(child != 0); |
|
2629 |
delete parent; |
|
2630 |
} |
|
2631 |
} |
|
2632 |
||
2633 |
void tst_QWebFrame::nullValue() |
|
2634 |
{ |
|
2635 |
QVariant v = m_view->page()->mainFrame()->evaluateJavaScript("null"); |
|
2636 |
QVERIFY(v.isNull()); |
|
2637 |
} |
|
2638 |
||
2639 |
void tst_QWebFrame::baseUrl_data() |
|
2640 |
{ |
|
2641 |
QTest::addColumn<QString>("html"); |
|
2642 |
QTest::addColumn<QUrl>("loadUrl"); |
|
2643 |
QTest::addColumn<QUrl>("url"); |
|
2644 |
QTest::addColumn<QUrl>("baseUrl"); |
|
2645 |
||
2646 |
QTest::newRow("null") << QString() << QUrl() |
|
2647 |
<< QUrl("about:blank") << QUrl("about:blank"); |
|
2648 |
||
2649 |
QTest::newRow("foo") << QString() << QUrl("http://foobar.baz/") |
|
2650 |
<< QUrl("http://foobar.baz/") << QUrl("http://foobar.baz/"); |
|
2651 |
||
2652 |
QString html = "<html>" |
|
2653 |
"<head>" |
|
2654 |
"<base href=\"http://foobaz.bar/\" />" |
|
2655 |
"</head>" |
|
2656 |
"</html>"; |
|
2657 |
QTest::newRow("customBaseUrl") << html << QUrl("http://foobar.baz/") |
|
2658 |
<< QUrl("http://foobar.baz/") << QUrl("http://foobaz.bar/"); |
|
2659 |
} |
|
2660 |
||
2661 |
void tst_QWebFrame::baseUrl() |
|
2662 |
{ |
|
2663 |
QFETCH(QString, html); |
|
2664 |
QFETCH(QUrl, loadUrl); |
|
2665 |
QFETCH(QUrl, url); |
|
2666 |
QFETCH(QUrl, baseUrl); |
|
2667 |
||
2668 |
m_page->mainFrame()->setHtml(html, loadUrl); |
|
2669 |
QCOMPARE(m_page->mainFrame()->url(), url); |
|
2670 |
QCOMPARE(m_page->mainFrame()->baseUrl(), baseUrl); |
|
2671 |
} |
|
2672 |
||
2673 |
void tst_QWebFrame::hasSetFocus() |
|
2674 |
{ |
|
2675 |
QString html("<html><body><p>top</p>" \ |
|
2676 |
"<iframe width='80%' height='30%'/>" \ |
|
2677 |
"</body></html>"); |
|
2678 |
||
2679 |
QSignalSpy loadSpy(m_page, SIGNAL(loadFinished(bool))); |
|
2680 |
m_page->mainFrame()->setHtml(html); |
|
2681 |
||
2682 |
QTest::qWait(200); |
|
2683 |
QCOMPARE(loadSpy.size(), 1); |
|
2684 |
||
2685 |
QList<QWebFrame*> children = m_page->mainFrame()->childFrames(); |
|
2686 |
QWebFrame* frame = children.at(0); |
|
2687 |
QString innerHtml("<html><body><p>another iframe</p>" \ |
|
2688 |
"<iframe width='80%' height='30%'/>" \ |
|
2689 |
"</body></html>"); |
|
2690 |
frame->setHtml(innerHtml); |
|
2691 |
||
2692 |
QTest::qWait(200); |
|
2693 |
QCOMPARE(loadSpy.size(), 2); |
|
2694 |
||
2695 |
m_page->mainFrame()->setFocus(); |
|
2696 |
QTRY_VERIFY(m_page->mainFrame()->hasFocus()); |
|
2697 |
||
2698 |
for (int i = 0; i < children.size(); ++i) { |
|
2699 |
children.at(i)->setFocus(); |
|
2700 |
QTRY_VERIFY(children.at(i)->hasFocus()); |
|
2701 |
QVERIFY(!m_page->mainFrame()->hasFocus()); |
|
2702 |
} |
|
2703 |
||
2704 |
m_page->mainFrame()->setFocus(); |
|
2705 |
QTRY_VERIFY(m_page->mainFrame()->hasFocus()); |
|
2706 |
} |
|
2707 |
||
2708 |
void tst_QWebFrame::render() |
|
2709 |
{ |
|
2710 |
QString html("<html>" \ |
|
2711 |
"<head><style>" \ |
|
2712 |
"body, iframe { margin: 0px; border: none; }" \ |
|
2713 |
"</style></head>" \ |
|
2714 |
"<body><iframe width='100px' height='100px'/></body>" \ |
|
2715 |
"</html>"); |
|
2716 |
||
2717 |
QWebPage page; |
|
2718 |
page.mainFrame()->setHtml(html); |
|
2719 |
||
2720 |
QList<QWebFrame*> frames = page.mainFrame()->childFrames(); |
|
2721 |
QWebFrame *frame = frames.at(0); |
|
2722 |
QString innerHtml("<body style='margin: 0px;'><img src='qrc:/image.png'/></body>"); |
|
2723 |
frame->setHtml(innerHtml); |
|
2724 |
||
2725 |
QPicture picture; |
|
2726 |
||
2727 |
QSize size = page.mainFrame()->contentsSize(); |
|
2728 |
page.setViewportSize(size); |
|
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2729 |
|
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2730 |
// render contents layer only (the iframe is smaller than the image, so it will have scrollbars) |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2731 |
QPainter painter1(&picture); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2732 |
frame->render(&painter1, QWebFrame::ContentsLayer); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2733 |
painter1.end(); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2734 |
|
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2735 |
QCOMPARE(size.width(), picture.boundingRect().width() + frame->scrollBarGeometry(Qt::Vertical).width()); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2736 |
QCOMPARE(size.height(), picture.boundingRect().height() + frame->scrollBarGeometry(Qt::Horizontal).height()); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2737 |
|
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2738 |
// render everything, should be the size of the iframe |
0 | 2739 |
QPainter painter2(&picture); |
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2740 |
frame->render(&painter2, QWebFrame::AllLayers); |
0 | 2741 |
painter2.end(); |
2742 |
||
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2743 |
QCOMPARE(size.width(), picture.boundingRect().width()); // width: 100px |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2744 |
QCOMPARE(size.height(), picture.boundingRect().height()); // height: 100px |
0 | 2745 |
} |
2746 |
||
2747 |
void tst_QWebFrame::scrollPosition() |
|
2748 |
{ |
|
2749 |
// enlarged image in a small viewport, to provoke the scrollbars to appear |
|
2750 |
QString html("<html><body><img src='qrc:/image.png' height=500 width=500/></body></html>"); |
|
2751 |
||
2752 |
QWebPage page; |
|
2753 |
page.setViewportSize(QSize(200, 200)); |
|
2754 |
||
2755 |
QWebFrame* frame = page.mainFrame(); |
|
2756 |
frame->setHtml(html); |
|
2757 |
frame->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff); |
|
2758 |
frame->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff); |
|
2759 |
||
2760 |
// try to set the scroll offset programmatically |
|
2761 |
frame->setScrollPosition(QPoint(23, 29)); |
|
2762 |
QCOMPARE(frame->scrollPosition().x(), 23); |
|
2763 |
QCOMPARE(frame->scrollPosition().y(), 29); |
|
2764 |
||
2765 |
int x = frame->evaluateJavaScript("window.scrollX").toInt(); |
|
2766 |
int y = frame->evaluateJavaScript("window.scrollY").toInt(); |
|
2767 |
QCOMPARE(x, 23); |
|
2768 |
QCOMPARE(y, 29); |
|
2769 |
} |
|
2770 |
||
2771 |
void tst_QWebFrame::evaluateWillCauseRepaint() |
|
2772 |
{ |
|
2773 |
QWebView view; |
|
2774 |
QString html("<html><body>top<div id=\"junk\" style=\"display: block;\">" |
|
2775 |
"junk</div>bottom</body></html>"); |
|
2776 |
view.setHtml(html); |
|
2777 |
view.show(); |
|
2778 |
||
2779 |
QTest::qWait(200); |
|
2780 |
||
2781 |
view.page()->mainFrame()->evaluateJavaScript( |
|
2782 |
"document.getElementById('junk').style.display = 'none';"); |
|
2783 |
||
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2784 |
::waitForSignal(view.page(), SIGNAL(repaintRequested(QRect))); |
0 | 2785 |
|
2786 |
QTest::qWait(2000); |
|
2787 |
} |
|
2788 |
||
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2789 |
class TestFactory : public QObject |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2790 |
{ |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2791 |
Q_OBJECT |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2792 |
public: |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2793 |
TestFactory() |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2794 |
: obj(0), counter(0) |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2795 |
{} |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2796 |
|
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2797 |
Q_INVOKABLE QObject* getNewObject() |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2798 |
{ |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2799 |
delete obj; |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2800 |
obj = new QObject(this); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2801 |
obj->setObjectName(QLatin1String("test") + QString::number(++counter)); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2802 |
return obj; |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2803 |
|
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2804 |
} |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2805 |
|
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2806 |
QObject* obj; |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2807 |
int counter; |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2808 |
}; |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2809 |
|
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2810 |
void tst_QWebFrame::qObjectWrapperWithSameIdentity() |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2811 |
{ |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2812 |
m_view->setHtml("<script>function triggerBug() { document.getElementById('span1').innerText = test.getNewObject().objectName; }</script>" |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2813 |
"<body><span id='span1'>test</span></body>"); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2814 |
|
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2815 |
QWebFrame* mainFrame = m_view->page()->mainFrame(); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2816 |
QCOMPARE(mainFrame->toPlainText(), QString("test")); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2817 |
|
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2818 |
mainFrame->addToJavaScriptWindowObject("test", new TestFactory, QScriptEngine::ScriptOwnership); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2819 |
|
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2820 |
mainFrame->evaluateJavaScript("triggerBug();"); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2821 |
QCOMPARE(mainFrame->toPlainText(), QString("test1")); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2822 |
|
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2823 |
mainFrame->evaluateJavaScript("triggerBug();"); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2824 |
QCOMPARE(mainFrame->toPlainText(), QString("test2")); |
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
2825 |
} |
0 | 2826 |
|
2827 |
QTEST_MAIN(tst_QWebFrame) |
|
2828 |
#include "tst_qwebframe.moc" |