1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the test suite of the Qt Toolkit.
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.
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.
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.
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.
40 ****************************************************************************/
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"
53 using namespace QQuickVisualTestUtil;
55 class tst_qquickfocusscope : public QQmlDataTest
59 tst_qquickfocusscope() {}
68 void signalEmission();
70 void forceActiveFocus();
74 void tst_qquickfocusscope::basic()
76 QQuickView *view = new QQuickView;
77 view->setSource(testFileUrl("test.qml"));
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"));
89 view->requestActivateWindow();
91 QTest::qWaitForWindowShown(view);
92 QTRY_VERIFY(view == qGuiApp->focusWindow());
94 QVERIFY(view->isTopLevel());
95 QVERIFY(item0->hasActiveFocus() == true);
96 QVERIFY(item1->hasActiveFocus() == true);
97 QVERIFY(item2->hasActiveFocus() == false);
98 QVERIFY(item3->hasActiveFocus() == false);
100 QTest::keyClick(view, Qt::Key_Right);
102 QVERIFY(item0->hasActiveFocus() == true);
103 QVERIFY(item1->hasActiveFocus() == false);
104 QVERIFY(item2->hasActiveFocus() == true);
105 QVERIFY(item3->hasActiveFocus() == false);
107 QTest::keyClick(view, Qt::Key_Down);
109 QVERIFY(item0->hasActiveFocus() == false);
110 QVERIFY(item1->hasActiveFocus() == false);
111 QVERIFY(item2->hasActiveFocus() == false);
112 QVERIFY(item3->hasActiveFocus() == true);
117 void tst_qquickfocusscope::nested()
119 QQuickView *view = new QQuickView;
120 view->setSource(testFileUrl("test2.qml"));
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"));
134 view->requestActivateWindow();
136 QTest::qWaitForWindowShown(view);
137 QTRY_VERIFY(view == qGuiApp->focusWindow());
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);
147 void tst_qquickfocusscope::noFocus()
149 QQuickView *view = new QQuickView;
150 view->setSource(testFileUrl("test4.qml"));
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"));
162 view->requestActivateWindow();
163 QTest::qWaitForWindowShown(view);
164 QTRY_VERIFY(view == qGuiApp->focusWindow());
166 QVERIFY(item0->hasActiveFocus() == false);
167 QVERIFY(item1->hasActiveFocus() == false);
168 QVERIFY(item2->hasActiveFocus() == false);
169 QVERIFY(item3->hasActiveFocus() == false);
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);
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);
186 void tst_qquickfocusscope::textEdit()
188 QQuickView *view = new QQuickView;
189 view->setSource(testFileUrl("test5.qml"));
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"));
201 view->requestActivateWindow();
203 QTest::qWaitForWindowShown(view);
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);
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);
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);
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);
236 void tst_qquickfocusscope::forceFocus()
238 QQuickView *view = new QQuickView;
239 view->setSource(testFileUrl("forcefocus.qml"));
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"));
255 view->requestActivateWindow();
256 QTest::qWaitForWindowShown(view);
257 QTRY_VERIFY(view == qGuiApp->focusWindow());
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);
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);
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);
285 void tst_qquickfocusscope::noParentFocus()
287 QQuickView *view = new QQuickView;
288 view->setSource(testFileUrl("chain.qml"));
289 QVERIFY(view->rootObject());
292 view->requestActivateWindow();
293 QTest::qWaitForWindowShown(view);
294 QTRY_VERIFY(view == qGuiApp->focusWindow());
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);
305 void tst_qquickfocusscope::signalEmission()
307 QQuickView *view = new QQuickView;
308 view->setSource(testFileUrl("signalEmission.qml"));
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"));
320 view->requestActivateWindow();
322 QTest::qWaitForWindowShown(view);
323 QTRY_VERIFY(view == qGuiApp->focusWindow());
325 QVariant blue(QColor("blue"));
326 QVariant red(QColor("red"));
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);
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);
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);
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);
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);
361 void tst_qquickfocusscope::qtBug13380()
363 QQuickView *view = new QQuickView;
364 view->setSource(testFileUrl("qtBug13380.qml"));
367 QVERIFY(view->rootObject());
368 view->requestActivateWindow();
369 qApp->processEvents();
371 QTest::qWaitForWindowShown(view);
373 QTRY_VERIFY(view == qGuiApp->focusWindow());
374 QVERIFY(view->rootObject()->property("noFocus").toBool());
376 view->rootObject()->setProperty("showRect", true);
377 QVERIFY(view->rootObject()->property("noFocus").toBool());
382 void tst_qquickfocusscope::forceActiveFocus()
384 QQuickView *view = new QQuickView;
385 view->setSource(testFileUrl("forceActiveFocus.qml"));
388 view->requestActivateWindow();
389 QTest::qWaitForWindowShown(view);
390 QTRY_VERIFY(view == qGuiApp->focusWindow());
392 QQuickItem *rootObject = view->rootObject();
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"));
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)));
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
496 void tst_qquickfocusscope::canvasFocus()
498 QQuickView *view = new QQuickView;
499 view->setSource(testFileUrl("canvasFocus.qml"));
501 QQuickView alternateView;
503 QQuickItem *rootObject = view->rootObject();
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"));
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)));
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);
541 view->requestActivateWindow();
543 QTest::qWaitForWindowShown(view);
544 QTRY_VERIFY(view == qGuiApp->focusWindow());
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);
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);
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);
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);
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);
587 // canvas does not have focus, so item2 will not get active focus
588 item2->forceActiveFocus();
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);
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);
612 // give the canvas focus, and item2 will get active focus
614 view->requestActivateWindow();
615 QTest::qWaitForWindowShown(view);
616 QTRY_VERIFY(QGuiApplication::focusWindow() == view);
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);
634 QTEST_MAIN(tst_qquickfocusscope)
636 #include "tst_qquickfocusscope.moc"