7d14485d13dd714b970a7be751770dddd1936504
[profile/ivi/qtdeclarative.git] / tests / auto / quick / qquickfocusscope / tst_qquickfocusscope.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
5 **
6 ** This file is part of the test suite of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16 **
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
20 **
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
28 **
29 ** Other Usage
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 #include <qtest.h>
42 #include <QSignalSpy>
43 #include <QtQml/qqmlengine.h>
44 #include <QtQml/qqmlcomponent.h>
45 #include <QtQuick/qquickview.h>
46 #include <QtQuick/private/qquickrectangle_p.h>
47 #include <private/qquicktextedit_p.h>
48 #include <QtQuick/private/qquicktext_p.h>
49 #include <QtQuick/private/qquickfocusscope_p.h>
50 #include "../../shared/util.h"
51 #include "../shared/visualtestutil.h"
52
53 using namespace QQuickVisualTestUtil;
54
55 class tst_qquickfocusscope : public QQmlDataTest
56 {
57     Q_OBJECT
58 public:
59     tst_qquickfocusscope() {}
60
61 private slots:
62     void basic();
63     void nested();
64     void noFocus();
65     void textEdit();
66     void forceFocus();
67     void noParentFocus();
68     void signalEmission();
69     void qtBug13380();
70     void forceActiveFocus();
71     void canvasFocus();
72 };
73
74 void tst_qquickfocusscope::basic()
75 {
76     QQuickView *view = new QQuickView;
77     view->setSource(testFileUrl("test.qml"));
78
79     QQuickFocusScope *item0 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item0"));
80     QQuickRectangle *item1 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item1"));
81     QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
82     QQuickRectangle *item3 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item3"));
83     QVERIFY(item0 != 0);
84     QVERIFY(item1 != 0);
85     QVERIFY(item2 != 0);
86     QVERIFY(item3 != 0);
87
88     view->show();
89     view->requestActivateWindow();
90
91     QTest::qWaitForWindowActive(view);
92     QTRY_VERIFY(view == qGuiApp->focusWindow());
93
94     QVERIFY(view->isTopLevel());
95     QVERIFY(item0->hasActiveFocus() == true);
96     QVERIFY(item1->hasActiveFocus() == true);
97     QVERIFY(item2->hasActiveFocus() == false);
98     QVERIFY(item3->hasActiveFocus() == false);
99
100     QTest::keyClick(view, Qt::Key_Right);
101     QTest::qWait(50);
102     QVERIFY(item0->hasActiveFocus() == true);
103     QVERIFY(item1->hasActiveFocus() == false);
104     QVERIFY(item2->hasActiveFocus() == true);
105     QVERIFY(item3->hasActiveFocus() == false);
106
107     QTest::keyClick(view, Qt::Key_Down);
108     QTest::qWait(50);
109     QVERIFY(item0->hasActiveFocus() == false);
110     QVERIFY(item1->hasActiveFocus() == false);
111     QVERIFY(item2->hasActiveFocus() == false);
112     QVERIFY(item3->hasActiveFocus() == true);
113
114     delete view;
115 }
116
117 void tst_qquickfocusscope::nested()
118 {
119     QQuickView *view = new QQuickView;
120     view->setSource(testFileUrl("test2.qml"));
121
122     QQuickFocusScope *item1 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item1"));
123     QQuickFocusScope *item2 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item2"));
124     QQuickFocusScope *item3 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item3"));
125     QQuickFocusScope *item4 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item4"));
126     QQuickFocusScope *item5 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item5"));
127     QVERIFY(item1 != 0);
128     QVERIFY(item2 != 0);
129     QVERIFY(item3 != 0);
130     QVERIFY(item4 != 0);
131     QVERIFY(item5 != 0);
132
133     view->show();
134     view->requestActivateWindow();
135
136     QTest::qWaitForWindowActive(view);
137     QTRY_VERIFY(view == qGuiApp->focusWindow());
138
139     QVERIFY(item1->hasActiveFocus() == true);
140     QVERIFY(item2->hasActiveFocus() == true);
141     QVERIFY(item3->hasActiveFocus() == true);
142     QVERIFY(item4->hasActiveFocus() == true);
143     QVERIFY(item5->hasActiveFocus() == true);
144     delete view;
145 }
146
147 void tst_qquickfocusscope::noFocus()
148 {
149     QQuickView *view = new QQuickView;
150     view->setSource(testFileUrl("test4.qml"));
151
152     QQuickRectangle *item0 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item0"));
153     QQuickRectangle *item1 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item1"));
154     QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
155     QQuickRectangle *item3 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item3"));
156     QVERIFY(item0 != 0);
157     QVERIFY(item1 != 0);
158     QVERIFY(item2 != 0);
159     QVERIFY(item3 != 0);
160
161     view->show();
162     view->requestActivateWindow();
163     QTest::qWaitForWindowShown(view);
164     QTRY_VERIFY(view == qGuiApp->focusWindow());
165
166     QVERIFY(item0->hasActiveFocus() == false);
167     QVERIFY(item1->hasActiveFocus() == false);
168     QVERIFY(item2->hasActiveFocus() == false);
169     QVERIFY(item3->hasActiveFocus() == false);
170
171     QTest::keyClick(view, Qt::Key_Right);
172     QVERIFY(item0->hasActiveFocus() == false);
173     QVERIFY(item1->hasActiveFocus() == false);
174     QVERIFY(item2->hasActiveFocus() == false);
175     QVERIFY(item3->hasActiveFocus() == false);
176
177     QTest::keyClick(view, Qt::Key_Down);
178     QVERIFY(item0->hasActiveFocus() == false);
179     QVERIFY(item1->hasActiveFocus() == false);
180     QVERIFY(item2->hasActiveFocus() == false);
181     QVERIFY(item3->hasActiveFocus() == false);
182
183     delete view;
184 }
185
186 void tst_qquickfocusscope::textEdit()
187 {
188     QQuickView *view = new QQuickView;
189     view->setSource(testFileUrl("test5.qml"));
190
191     QQuickFocusScope *item0 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item0"));
192     QQuickTextEdit *item1 = findItem<QQuickTextEdit>(view->rootObject(), QLatin1String("item1"));
193     QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
194     QQuickTextEdit *item3 = findItem<QQuickTextEdit>(view->rootObject(), QLatin1String("item3"));
195     QVERIFY(item0 != 0);
196     QVERIFY(item1 != 0);
197     QVERIFY(item2 != 0);
198     QVERIFY(item3 != 0);
199
200     view->show();
201     view->requestActivateWindow();
202
203     QTest::qWaitForWindowActive(view);
204
205     QTRY_VERIFY(view == qGuiApp->focusWindow());
206     QVERIFY(item0->hasActiveFocus() == true);
207     QVERIFY(item1->hasActiveFocus() == true);
208     QVERIFY(item2->hasActiveFocus() == false);
209     QVERIFY(item3->hasActiveFocus() == false);
210
211     QTest::keyClick(view, Qt::Key_Right);
212     QVERIFY(item0->hasActiveFocus() == true);
213     QVERIFY(item1->hasActiveFocus() == true);
214     QVERIFY(item2->hasActiveFocus() == false);
215     QVERIFY(item3->hasActiveFocus() == false);
216
217     QTest::keyClick(view, Qt::Key_Right);
218     QTest::keyClick(view, Qt::Key_Right);
219     QTest::keyClick(view, Qt::Key_Right);
220     QTest::keyClick(view, Qt::Key_Right);
221     QTest::keyClick(view, Qt::Key_Right);
222     QVERIFY(item0->hasActiveFocus() == true);
223     QVERIFY(item1->hasActiveFocus() == false);
224     QVERIFY(item2->hasActiveFocus() == true);
225     QVERIFY(item3->hasActiveFocus() == false);
226
227     QTest::keyClick(view, Qt::Key_Down);
228     QVERIFY(item0->hasActiveFocus() == false);
229     QVERIFY(item1->hasActiveFocus() == false);
230     QVERIFY(item2->hasActiveFocus() == false);
231     QVERIFY(item3->hasActiveFocus() == true);
232
233     delete view;
234 }
235
236 void tst_qquickfocusscope::forceFocus()
237 {
238     QQuickView *view = new QQuickView;
239     view->setSource(testFileUrl("forcefocus.qml"));
240
241     QQuickFocusScope *item0 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item0"));
242     QQuickRectangle *item1 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item1"));
243     QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
244     QQuickFocusScope *item3 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item3"));
245     QQuickRectangle *item4 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item4"));
246     QQuickRectangle *item5 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item5"));
247     QVERIFY(item0 != 0);
248     QVERIFY(item1 != 0);
249     QVERIFY(item2 != 0);
250     QVERIFY(item3 != 0);
251     QVERIFY(item4 != 0);
252     QVERIFY(item5 != 0);
253
254     view->show();
255     view->requestActivateWindow();
256     QTest::qWaitForWindowActive(view);
257     QTRY_VERIFY(view == qGuiApp->focusWindow());
258
259     QVERIFY(item0->hasActiveFocus() == true);
260     QVERIFY(item1->hasActiveFocus() == true);
261     QVERIFY(item2->hasActiveFocus() == false);
262     QVERIFY(item3->hasActiveFocus() == false);
263     QVERIFY(item4->hasActiveFocus() == false);
264     QVERIFY(item5->hasActiveFocus() == false);
265
266     QTest::keyClick(view, Qt::Key_4);
267     QVERIFY(item0->hasActiveFocus() == true);
268     QVERIFY(item1->hasActiveFocus() == true);
269     QVERIFY(item2->hasActiveFocus() == false);
270     QVERIFY(item3->hasActiveFocus() == false);
271     QVERIFY(item4->hasActiveFocus() == false);
272     QVERIFY(item5->hasActiveFocus() == false);
273
274     QTest::keyClick(view, Qt::Key_5);
275     QVERIFY(item0->hasActiveFocus() == false);
276     QVERIFY(item1->hasActiveFocus() == false);
277     QVERIFY(item2->hasActiveFocus() == false);
278     QVERIFY(item3->hasActiveFocus() == true);
279     QVERIFY(item4->hasActiveFocus() == false);
280     QVERIFY(item5->hasActiveFocus() == true);
281
282     delete view;
283 }
284
285 void tst_qquickfocusscope::noParentFocus()
286 {
287     QQuickView *view = new QQuickView;
288     view->setSource(testFileUrl("chain.qml"));
289     QVERIFY(view->rootObject());
290
291     view->show();
292     view->requestActivateWindow();
293     QTest::qWaitForWindowActive(view);
294     QTRY_VERIFY(view == qGuiApp->focusWindow());
295
296     QVERIFY(view->rootObject()->property("focus1") == false);
297     QVERIFY(view->rootObject()->property("focus2") == false);
298     QVERIFY(view->rootObject()->property("focus3") == true);
299     QVERIFY(view->rootObject()->property("focus4") == true);
300     QVERIFY(view->rootObject()->property("focus5") == true);
301
302     delete view;
303 }
304
305 void tst_qquickfocusscope::signalEmission()
306 {
307     QQuickView *view = new QQuickView;
308     view->setSource(testFileUrl("signalEmission.qml"));
309
310     QQuickRectangle *item1 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item1"));
311     QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
312     QQuickRectangle *item3 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item3"));
313     QQuickRectangle *item4 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item4"));
314     QVERIFY(item1 != 0);
315     QVERIFY(item2 != 0);
316     QVERIFY(item3 != 0);
317     QVERIFY(item4 != 0);
318
319     view->show();
320     view->requestActivateWindow();
321
322     QTest::qWaitForWindowActive(view);
323     QTRY_VERIFY(view == qGuiApp->focusWindow());
324
325     QVariant blue(QColor("blue"));
326     QVariant red(QColor("red"));
327
328     item1->setFocus(true);
329     QCOMPARE(item1->property("color"), red);
330     QCOMPARE(item2->property("color"), blue);
331     QCOMPARE(item3->property("color"), blue);
332     QCOMPARE(item4->property("color"), blue);
333
334     item2->setFocus(true);
335     QCOMPARE(item1->property("color"), blue);
336     QCOMPARE(item2->property("color"), red);
337     QCOMPARE(item3->property("color"), blue);
338     QCOMPARE(item4->property("color"), blue);
339
340     item3->setFocus(true);
341     QCOMPARE(item1->property("color"), blue);
342     QCOMPARE(item2->property("color"), red);
343     QCOMPARE(item3->property("color"), red);
344     QCOMPARE(item4->property("color"), blue);
345
346     item4->setFocus(true);
347     QCOMPARE(item1->property("color"), blue);
348     QCOMPARE(item2->property("color"), red);
349     QCOMPARE(item3->property("color"), blue);
350     QCOMPARE(item4->property("color"), red);
351
352     item4->setFocus(false);
353     QCOMPARE(item1->property("color"), blue);
354     QCOMPARE(item2->property("color"), red);
355     QCOMPARE(item3->property("color"), blue);
356     QCOMPARE(item4->property("color"), blue);
357
358     delete view;
359 }
360
361 void tst_qquickfocusscope::qtBug13380()
362 {
363     QQuickView *view = new QQuickView;
364     view->setSource(testFileUrl("qtBug13380.qml"));
365
366     view->show();
367     QVERIFY(view->rootObject());
368     view->requestActivateWindow();
369     qApp->processEvents();
370
371     QTest::qWaitForWindowShown(view);
372
373     QTRY_VERIFY(view == qGuiApp->focusWindow());
374     QVERIFY(view->rootObject()->property("noFocus").toBool());
375
376     view->rootObject()->setProperty("showRect", true);
377     QVERIFY(view->rootObject()->property("noFocus").toBool());
378
379     delete view;
380 }
381
382 void tst_qquickfocusscope::forceActiveFocus()
383 {
384     QQuickView *view = new QQuickView;
385     view->setSource(testFileUrl("forceActiveFocus.qml"));
386
387     view->show();
388     view->requestActivateWindow();
389     QTest::qWaitForWindowShown(view);
390     QTRY_VERIFY(view == qGuiApp->focusWindow());
391
392     QQuickItem *rootObject = view->rootObject();
393     QVERIFY(rootObject);
394
395     QQuickItem *scope = findItem<QQuickItem>(rootObject, QLatin1String("scope"));
396     QQuickItem *itemA1 = findItem<QQuickItem>(rootObject, QLatin1String("item-a1"));
397     QQuickItem *scopeA = findItem<QQuickItem>(rootObject, QLatin1String("scope-a"));
398     QQuickItem *itemA2 = findItem<QQuickItem>(rootObject, QLatin1String("item-a2"));
399     QQuickItem *itemB1 = findItem<QQuickItem>(rootObject, QLatin1String("item-b1"));
400     QQuickItem *scopeB = findItem<QQuickItem>(rootObject, QLatin1String("scope-b"));
401     QQuickItem *itemB2 = findItem<QQuickItem>(rootObject, QLatin1String("item-b2"));
402
403     QVERIFY(scope);
404     QVERIFY(itemA1);
405     QVERIFY(scopeA);
406     QVERIFY(itemA2);
407     QVERIFY(itemB1);
408     QVERIFY(scopeB);
409     QVERIFY(itemB2);
410
411     QSignalSpy rootSpy(rootObject, SIGNAL(activeFocusChanged(bool)));
412     QSignalSpy scopeSpy(scope, SIGNAL(activeFocusChanged(bool)));
413     QSignalSpy scopeASpy(scopeA, SIGNAL(activeFocusChanged(bool)));
414     QSignalSpy scopeBSpy(scopeB, SIGNAL(activeFocusChanged(bool)));
415
416     // First, walk the focus from item-a1 down to item-a2 and back again
417     itemA1->forceActiveFocus();
418     QVERIFY(itemA1->hasActiveFocus());
419     QVERIFY(!rootObject->hasActiveFocus());
420     QCOMPARE(rootSpy.count(), 0);
421     QCOMPARE(scopeSpy.count(), 1);
422
423     scopeA->forceActiveFocus();
424     QVERIFY(!itemA1->hasActiveFocus());
425     QVERIFY(scopeA->hasActiveFocus());
426     QCOMPARE(scopeASpy.count(), 1);
427     QCOMPARE(rootSpy.count(), 0);
428     QCOMPARE(scopeSpy.count(), 1);
429
430     itemA2->forceActiveFocus();
431     QVERIFY(!itemA1->hasActiveFocus());
432     QVERIFY(itemA2->hasActiveFocus());
433     QVERIFY(scopeA->hasActiveFocus());
434     QCOMPARE(scopeASpy.count(), 1);
435     QCOMPARE(rootSpy.count(), 0);
436     QCOMPARE(scopeSpy.count(), 1);
437
438     scopeA->forceActiveFocus();
439     QVERIFY(!itemA1->hasActiveFocus());
440     QVERIFY(itemA2->hasActiveFocus());
441     QVERIFY(scopeA->hasActiveFocus());
442     QCOMPARE(scopeASpy.count(), 1);
443     QCOMPARE(rootSpy.count(), 0);
444     QCOMPARE(scopeSpy.count(), 1);
445
446     itemA1->forceActiveFocus();
447     QVERIFY(itemA1->hasActiveFocus());
448     QVERIFY(!scopeA->hasActiveFocus());
449     QVERIFY(!itemA2->hasActiveFocus());
450     QCOMPARE(scopeASpy.count(), 2);
451     QCOMPARE(rootSpy.count(), 0);
452     QCOMPARE(scopeSpy.count(), 1);
453
454     // Then jump back and forth between branch 'a' and 'b'
455     itemB1->forceActiveFocus();
456     QVERIFY(itemB1->hasActiveFocus());
457     QCOMPARE(rootSpy.count(), 0);
458     QCOMPARE(scopeSpy.count(), 1);
459
460     scopeA->forceActiveFocus();
461     QVERIFY(!itemA1->hasActiveFocus());
462     QVERIFY(!itemB1->hasActiveFocus());
463     QVERIFY(scopeA->hasActiveFocus());
464     QCOMPARE(scopeASpy.count(), 3);
465     QCOMPARE(rootSpy.count(), 0);
466     QCOMPARE(scopeSpy.count(), 1);
467
468     scopeB->forceActiveFocus();
469     QVERIFY(!scopeA->hasActiveFocus());
470     QVERIFY(!itemB1->hasActiveFocus());
471     QVERIFY(scopeB->hasActiveFocus());
472     QCOMPARE(scopeASpy.count(), 4);
473     QCOMPARE(scopeBSpy.count(), 1);
474     QCOMPARE(rootSpy.count(), 0);
475     QCOMPARE(scopeSpy.count(), 1);
476
477     itemA2->forceActiveFocus();
478     QVERIFY(!scopeB->hasActiveFocus());
479     QVERIFY(itemA2->hasActiveFocus());
480     QCOMPARE(scopeASpy.count(), 5);
481     QCOMPARE(scopeBSpy.count(), 2);
482     QCOMPARE(rootSpy.count(), 0);
483     QCOMPARE(scopeSpy.count(), 1);
484
485     itemB2->forceActiveFocus();
486     QVERIFY(!itemA2->hasActiveFocus());
487     QVERIFY(itemB2->hasActiveFocus());
488     QCOMPARE(scopeASpy.count(), 6);
489     QCOMPARE(scopeBSpy.count(), 3);
490     QCOMPARE(rootSpy.count(), 0);
491     QCOMPARE(scopeSpy.count(), 1);
492
493     delete view;
494 }
495
496 void tst_qquickfocusscope::canvasFocus()
497 {
498     QQuickView *view = new QQuickView;
499     view->setSource(testFileUrl("canvasFocus.qml"));
500
501     QQuickView alternateView;
502
503     QQuickItem *rootObject = view->rootObject();
504     QVERIFY(rootObject);
505
506     QQuickItem *rootItem = view->rootItem();
507     QQuickItem *scope1 = findItem<QQuickItem>(rootObject, QLatin1String("scope1"));
508     QQuickItem *item1 = findItem<QQuickItem>(rootObject, QLatin1String("item1"));
509     QQuickItem *scope2 = findItem<QQuickItem>(rootObject, QLatin1String("scope2"));
510     QQuickItem *item2 = findItem<QQuickItem>(rootObject, QLatin1String("item2"));
511
512     QVERIFY(scope1);
513     QVERIFY(item1);
514     QVERIFY(scope2);
515     QVERIFY(item2);
516
517     QSignalSpy rootFocusSpy(rootItem, SIGNAL(focusChanged(bool)));
518     QSignalSpy scope1FocusSpy(scope1, SIGNAL(focusChanged(bool)));
519     QSignalSpy item1FocusSpy(item1, SIGNAL(focusChanged(bool)));
520     QSignalSpy scope2FocusSpy(scope2, SIGNAL(focusChanged(bool)));
521     QSignalSpy item2FocusSpy(item2, SIGNAL(focusChanged(bool)));
522     QSignalSpy rootActiveFocusSpy(rootItem, SIGNAL(activeFocusChanged(bool)));
523     QSignalSpy scope1ActiveFocusSpy(scope1, SIGNAL(activeFocusChanged(bool)));
524     QSignalSpy item1ActiveFocusSpy(item1, SIGNAL(activeFocusChanged(bool)));
525     QSignalSpy scope2ActiveFocusSpy(scope2, SIGNAL(activeFocusChanged(bool)));
526     QSignalSpy item2ActiveFocusSpy(item2, SIGNAL(activeFocusChanged(bool)));
527
528     QEXPECT_FAIL("", "QTBUG-22415", Abort);
529     QCOMPARE(rootItem->hasFocus(), false);
530     QCOMPARE(rootItem->hasActiveFocus(), false);
531     QCOMPARE(scope1->hasFocus(), true);
532     QCOMPARE(scope1->hasActiveFocus(), false);
533     QCOMPARE(item1->hasFocus(), true);
534     QCOMPARE(item1->hasActiveFocus(), false);
535     QCOMPARE(scope2->hasFocus(), false);
536     QCOMPARE(scope2->hasActiveFocus(), false);
537     QCOMPARE(item2->hasFocus(), false);
538     QCOMPARE(item2->hasActiveFocus(), false);
539
540     view->show();
541     view->requestActivateWindow();
542
543     QTest::qWaitForWindowShown(view);
544     QTRY_VERIFY(view == qGuiApp->focusWindow());
545
546     // Now the canvas has focus, active focus given to item1
547     QCOMPARE(rootItem->hasFocus(), true);
548     QCOMPARE(rootItem->hasActiveFocus(), true);
549     QCOMPARE(scope1->hasFocus(), true);
550     QCOMPARE(scope1->hasActiveFocus(), true);
551     QCOMPARE(item1->hasFocus(), true);
552     QCOMPARE(item1->hasActiveFocus(), true);
553     QCOMPARE(scope2->hasFocus(), false);
554     QCOMPARE(scope2->hasActiveFocus(), false);
555     QCOMPARE(item2->hasFocus(), false);
556     QCOMPARE(item2->hasActiveFocus(), false);
557
558     QCOMPARE(rootFocusSpy.count(), 1);
559     QCOMPARE(rootActiveFocusSpy.count(), 1);
560     QCOMPARE(scope1FocusSpy.count(), 0);
561     QCOMPARE(scope1ActiveFocusSpy.count(), 1);
562     QCOMPARE(item1FocusSpy.count(), 0);
563     QCOMPARE(item1ActiveFocusSpy.count(), 1);
564
565
566     //    view->hide(); // seemingly doesn't remove focus, so have an another view steal it.
567     alternateView.show();
568     alternateView.requestActivateWindow();
569     QTest::qWaitForWindowShown(&alternateView);
570     QTRY_VERIFY(QGuiApplication::focusWindow() == &alternateView);
571
572     QCOMPARE(rootItem->hasFocus(), false);
573     QCOMPARE(rootItem->hasActiveFocus(), false);
574     QCOMPARE(scope1->hasFocus(), true);
575     QCOMPARE(scope1->hasActiveFocus(), false);
576     QCOMPARE(item1->hasFocus(), true);
577     QCOMPARE(item1->hasActiveFocus(), false);
578
579     QCOMPARE(rootFocusSpy.count(), 2);
580     QCOMPARE(rootActiveFocusSpy.count(), 2);
581     QCOMPARE(scope1FocusSpy.count(), 0);
582     QCOMPARE(scope1ActiveFocusSpy.count(), 2);
583     QCOMPARE(item1FocusSpy.count(), 0);
584     QCOMPARE(item1ActiveFocusSpy.count(), 2);
585
586
587     // canvas does not have focus, so item2 will not get active focus
588     item2->forceActiveFocus();
589
590     QCOMPARE(rootItem->hasFocus(), false);
591     QCOMPARE(rootItem->hasActiveFocus(), false);
592     QCOMPARE(scope1->hasFocus(), false);
593     QCOMPARE(scope1->hasActiveFocus(), false);
594     QCOMPARE(item1->hasFocus(), true);
595     QCOMPARE(item1->hasActiveFocus(), false);
596     QCOMPARE(scope2->hasFocus(), true);
597     QCOMPARE(scope2->hasActiveFocus(), false);
598     QCOMPARE(item2->hasFocus(), true);
599     QCOMPARE(item2->hasActiveFocus(), false);
600
601     QCOMPARE(rootFocusSpy.count(), 2);
602     QCOMPARE(rootActiveFocusSpy.count(), 2);
603     QCOMPARE(scope1FocusSpy.count(), 1);
604     QCOMPARE(scope1ActiveFocusSpy.count(), 2);
605     QCOMPARE(item1FocusSpy.count(), 0);
606     QCOMPARE(item1ActiveFocusSpy.count(), 2);
607     QCOMPARE(scope2FocusSpy.count(), 1);
608     QCOMPARE(scope2ActiveFocusSpy.count(), 0);
609     QCOMPARE(item2FocusSpy.count(), 1);
610     QCOMPARE(item2ActiveFocusSpy.count(), 0);
611
612     // give the canvas focus, and item2 will get active focus
613     view->show();
614     view->requestActivateWindow();
615     QTest::qWaitForWindowShown(view);
616     QTRY_VERIFY(QGuiApplication::focusWindow() == view);
617
618     QCOMPARE(rootItem->hasFocus(), true);
619     QCOMPARE(rootItem->hasActiveFocus(), true);
620     QCOMPARE(scope2->hasFocus(), true);
621     QCOMPARE(scope2->hasActiveFocus(), true);
622     QCOMPARE(item2->hasFocus(), true);
623     QCOMPARE(item2->hasActiveFocus(), true);
624     QCOMPARE(rootFocusSpy.count(), 3);
625     QCOMPARE(rootActiveFocusSpy.count(), 3);
626     QCOMPARE(scope2FocusSpy.count(), 1);
627     QCOMPARE(scope2ActiveFocusSpy.count(), 1);
628     QCOMPARE(item2FocusSpy.count(), 1);
629     QCOMPARE(item2ActiveFocusSpy.count(), 1);
630
631     delete view;
632 }
633
634 QTEST_MAIN(tst_qquickfocusscope)
635
636 #include "tst_qquickfocusscope.moc"