1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the test suite of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
43 #include <QtDeclarative/qdeclarativeengine.h>
44 #include <QtDeclarative/qdeclarativecomponent.h>
45 #include <QtDeclarative/qquickview.h>
46 #include <private/qquickrectangle_p.h>
47 #include <private/qquicktextedit_p.h>
48 #include <private/qquicktext_p.h>
49 #include <QtDeclarative/private/qquickfocusscope_p.h>
50 #include "../shared/util.h"
52 class tst_qquickfocusscope : public QObject
56 tst_qquickfocusscope() {}
59 T *findItem(QQuickItem *parent, const QString &id);
63 void cleanupTestCase();
70 void signalEmission();
72 void forceActiveFocus();
75 void tst_qquickfocusscope::initTestCase()
79 void tst_qquickfocusscope::cleanupTestCase()
85 Find an item with the specified id.
88 T *tst_qquickfocusscope::findItem(QQuickItem *parent, const QString &objectName)
90 const QMetaObject &mo = T::staticMetaObject;
91 QList<QQuickItem *> children = parent->childItems();
92 for (int i = 0; i < children.count(); ++i) {
93 QQuickItem *item = children.at(i);
95 if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) {
96 return static_cast<T*>(item);
98 item = findItem<T>(item, objectName);
100 return static_cast<T*>(item);
106 void tst_qquickfocusscope::basic()
108 QQuickView *view = new QQuickView;
109 view->setSource(QUrl::fromLocalFile(TESTDATA("test.qml")));
111 QQuickFocusScope *item0 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item0"));
112 QQuickRectangle *item1 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item1"));
113 QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
114 QQuickRectangle *item3 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item3"));
121 view->requestActivateWindow();
123 QTest::qWaitForWindowShown(view);
125 QVERIFY(view->isTopLevel());
126 QVERIFY(item0->hasActiveFocus() == true);
127 QVERIFY(item1->hasActiveFocus() == true);
128 QVERIFY(item2->hasActiveFocus() == false);
129 QVERIFY(item3->hasActiveFocus() == false);
131 QTest::keyClick(view, Qt::Key_Right);
133 QVERIFY(item0->hasActiveFocus() == true);
134 QVERIFY(item1->hasActiveFocus() == false);
135 QVERIFY(item2->hasActiveFocus() == true);
136 QVERIFY(item3->hasActiveFocus() == false);
138 QTest::keyClick(view, Qt::Key_Down);
140 QVERIFY(item0->hasActiveFocus() == false);
141 QVERIFY(item1->hasActiveFocus() == false);
142 QVERIFY(item2->hasActiveFocus() == false);
143 QVERIFY(item3->hasActiveFocus() == true);
148 void tst_qquickfocusscope::nested()
150 QQuickView *view = new QQuickView;
151 view->setSource(QUrl::fromLocalFile(TESTDATA("test2.qml")));
153 QQuickFocusScope *item1 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item1"));
154 QQuickFocusScope *item2 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item2"));
155 QQuickFocusScope *item3 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item3"));
156 QQuickFocusScope *item4 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item4"));
157 QQuickFocusScope *item5 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item5"));
165 view->requestActivateWindow();
167 QTest::qWaitForWindowShown(view);
169 QVERIFY(item1->hasActiveFocus() == true);
170 QVERIFY(item2->hasActiveFocus() == true);
171 QVERIFY(item3->hasActiveFocus() == true);
172 QVERIFY(item4->hasActiveFocus() == true);
173 QVERIFY(item5->hasActiveFocus() == true);
177 void tst_qquickfocusscope::noFocus()
179 QQuickView *view = new QQuickView;
180 view->setSource(QUrl::fromLocalFile(TESTDATA("test4.qml")));
182 QQuickRectangle *item0 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item0"));
183 QQuickRectangle *item1 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item1"));
184 QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
185 QQuickRectangle *item3 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item3"));
192 view->requestActivateWindow();
193 QTest::qWaitForWindowShown(view);
195 QVERIFY(item0->hasActiveFocus() == false);
196 QVERIFY(item1->hasActiveFocus() == false);
197 QVERIFY(item2->hasActiveFocus() == false);
198 QVERIFY(item3->hasActiveFocus() == false);
200 QTest::keyClick(view, Qt::Key_Right);
201 QVERIFY(item0->hasActiveFocus() == false);
202 QVERIFY(item1->hasActiveFocus() == false);
203 QVERIFY(item2->hasActiveFocus() == false);
204 QVERIFY(item3->hasActiveFocus() == false);
206 QTest::keyClick(view, Qt::Key_Down);
207 QVERIFY(item0->hasActiveFocus() == false);
208 QVERIFY(item1->hasActiveFocus() == false);
209 QVERIFY(item2->hasActiveFocus() == false);
210 QVERIFY(item3->hasActiveFocus() == false);
215 void tst_qquickfocusscope::textEdit()
217 QQuickView *view = new QQuickView;
218 view->setSource(QUrl::fromLocalFile(TESTDATA("test5.qml")));
220 QQuickFocusScope *item0 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item0"));
221 QQuickTextEdit *item1 = findItem<QQuickTextEdit>(view->rootObject(), QLatin1String("item1"));
222 QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
223 QQuickTextEdit *item3 = findItem<QQuickTextEdit>(view->rootObject(), QLatin1String("item3"));
230 view->requestActivateWindow();
232 QTest::qWaitForWindowShown(view);
234 QTRY_VERIFY(view == qGuiApp->focusWindow());
235 QVERIFY(item0->hasActiveFocus() == true);
236 QVERIFY(item1->hasActiveFocus() == true);
237 QVERIFY(item2->hasActiveFocus() == false);
238 QVERIFY(item3->hasActiveFocus() == false);
240 QTest::keyClick(view, Qt::Key_Right);
241 QVERIFY(item0->hasActiveFocus() == true);
242 QVERIFY(item1->hasActiveFocus() == true);
243 QVERIFY(item2->hasActiveFocus() == false);
244 QVERIFY(item3->hasActiveFocus() == false);
246 QTest::keyClick(view, Qt::Key_Right);
247 QTest::keyClick(view, Qt::Key_Right);
248 QTest::keyClick(view, Qt::Key_Right);
249 QTest::keyClick(view, Qt::Key_Right);
250 QTest::keyClick(view, Qt::Key_Right);
251 QVERIFY(item0->hasActiveFocus() == true);
252 QVERIFY(item1->hasActiveFocus() == false);
253 QVERIFY(item2->hasActiveFocus() == true);
254 QVERIFY(item3->hasActiveFocus() == false);
256 QTest::keyClick(view, Qt::Key_Down);
257 QVERIFY(item0->hasActiveFocus() == false);
258 QVERIFY(item1->hasActiveFocus() == false);
259 QVERIFY(item2->hasActiveFocus() == false);
260 QVERIFY(item3->hasActiveFocus() == true);
265 void tst_qquickfocusscope::forceFocus()
267 QQuickView *view = new QQuickView;
268 view->setSource(QUrl::fromLocalFile(TESTDATA("forcefocus.qml")));
270 QQuickFocusScope *item0 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item0"));
271 QQuickRectangle *item1 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item1"));
272 QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
273 QQuickFocusScope *item3 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item3"));
274 QQuickRectangle *item4 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item4"));
275 QQuickRectangle *item5 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item5"));
284 view->requestActivateWindow();
285 QTest::qWaitForWindowShown(view);
287 QVERIFY(item0->hasActiveFocus() == true);
288 QVERIFY(item1->hasActiveFocus() == true);
289 QVERIFY(item2->hasActiveFocus() == false);
290 QVERIFY(item3->hasActiveFocus() == false);
291 QVERIFY(item4->hasActiveFocus() == false);
292 QVERIFY(item5->hasActiveFocus() == false);
294 QTest::keyClick(view, Qt::Key_4);
295 QVERIFY(item0->hasActiveFocus() == true);
296 QVERIFY(item1->hasActiveFocus() == true);
297 QVERIFY(item2->hasActiveFocus() == false);
298 QVERIFY(item3->hasActiveFocus() == false);
299 QVERIFY(item4->hasActiveFocus() == false);
300 QVERIFY(item5->hasActiveFocus() == false);
302 QTest::keyClick(view, Qt::Key_5);
303 QVERIFY(item0->hasActiveFocus() == false);
304 QVERIFY(item1->hasActiveFocus() == false);
305 QVERIFY(item2->hasActiveFocus() == false);
306 QVERIFY(item3->hasActiveFocus() == true);
307 QVERIFY(item4->hasActiveFocus() == false);
308 QVERIFY(item5->hasActiveFocus() == true);
313 void tst_qquickfocusscope::noParentFocus()
315 QQuickView *view = new QQuickView;
316 view->setSource(QUrl::fromLocalFile(TESTDATA("chain.qml")));
317 QVERIFY(view->rootObject());
320 view->requestActivateWindow();
321 qApp->processEvents();
324 // to be safe and avoid failing setFocus with window managers
325 qt_x11_wait_for_window_manager(view);
328 QVERIFY(view->rootObject()->property("focus1") == false);
329 QVERIFY(view->rootObject()->property("focus2") == false);
330 QVERIFY(view->rootObject()->property("focus3") == true);
331 QVERIFY(view->rootObject()->property("focus4") == true);
332 QVERIFY(view->rootObject()->property("focus5") == true);
337 void tst_qquickfocusscope::signalEmission()
339 QQuickView *view = new QQuickView;
340 view->setSource(QUrl::fromLocalFile(TESTDATA("signalEmission.qml")));
342 QQuickRectangle *item1 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item1"));
343 QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
344 QQuickRectangle *item3 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item3"));
345 QQuickRectangle *item4 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item4"));
352 view->requestActivateWindow();
354 QTest::qWaitForWindowShown(view);
356 QVariant blue(QColor("blue"));
357 QVariant red(QColor("red"));
359 item1->setFocus(true);
360 QCOMPARE(item1->property("color"), red);
361 QCOMPARE(item2->property("color"), blue);
362 QCOMPARE(item3->property("color"), blue);
363 QCOMPARE(item4->property("color"), blue);
365 item2->setFocus(true);
366 QCOMPARE(item1->property("color"), blue);
367 QCOMPARE(item2->property("color"), red);
368 QCOMPARE(item3->property("color"), blue);
369 QCOMPARE(item4->property("color"), blue);
371 item3->setFocus(true);
372 QCOMPARE(item1->property("color"), blue);
373 QCOMPARE(item2->property("color"), red);
374 QCOMPARE(item3->property("color"), red);
375 QCOMPARE(item4->property("color"), blue);
377 item4->setFocus(true);
378 QCOMPARE(item1->property("color"), blue);
379 QCOMPARE(item2->property("color"), red);
380 QCOMPARE(item3->property("color"), blue);
381 QCOMPARE(item4->property("color"), red);
383 item4->setFocus(false);
384 QCOMPARE(item1->property("color"), blue);
385 QCOMPARE(item2->property("color"), red);
386 QCOMPARE(item3->property("color"), blue);
387 QCOMPARE(item4->property("color"), blue);
392 void tst_qquickfocusscope::qtBug13380()
394 QQuickView *view = new QQuickView;
395 view->setSource(QUrl::fromLocalFile(TESTDATA("qtBug13380.qml")));
398 QVERIFY(view->rootObject());
399 view->requestActivateWindow();
400 qApp->processEvents();
402 QTest::qWaitForWindowShown(view);
404 QTRY_VERIFY(view == qGuiApp->focusWindow());
405 QVERIFY(view->rootObject()->property("noFocus").toBool());
407 view->rootObject()->setProperty("showRect", true);
408 QVERIFY(view->rootObject()->property("noFocus").toBool());
413 void tst_qquickfocusscope::forceActiveFocus()
415 QQuickView *view = new QQuickView;
416 view->setSource(QUrl::fromLocalFile(TESTDATA("forceActiveFocus.qml")));
419 view->requestActivateWindow();
420 qApp->processEvents();
423 // to be safe and avoid failing setFocus with window managers
424 qt_x11_wait_for_window_manager(view);
427 QQuickItem *rootObject = view->rootObject();
430 QQuickItem *scope = findItem<QQuickItem>(rootObject, QLatin1String("scope"));
431 QQuickItem *itemA1 = findItem<QQuickItem>(rootObject, QLatin1String("item-a1"));
432 QQuickItem *scopeA = findItem<QQuickItem>(rootObject, QLatin1String("scope-a"));
433 QQuickItem *itemA2 = findItem<QQuickItem>(rootObject, QLatin1String("item-a2"));
434 QQuickItem *itemB1 = findItem<QQuickItem>(rootObject, QLatin1String("item-b1"));
435 QQuickItem *scopeB = findItem<QQuickItem>(rootObject, QLatin1String("scope-b"));
436 QQuickItem *itemB2 = findItem<QQuickItem>(rootObject, QLatin1String("item-b2"));
446 QSignalSpy rootSpy(rootObject, SIGNAL(activeFocusChanged(bool)));
447 QSignalSpy scopeSpy(scope, SIGNAL(activeFocusChanged(bool)));
448 QSignalSpy scopeASpy(scopeA, SIGNAL(activeFocusChanged(bool)));
449 QSignalSpy scopeBSpy(scopeB, SIGNAL(activeFocusChanged(bool)));
451 // First, walk the focus from item-a1 down to item-a2 and back again
452 itemA1->forceActiveFocus();
453 QVERIFY(itemA1->hasActiveFocus());
454 QVERIFY(!rootObject->hasActiveFocus());
455 QCOMPARE(rootSpy.count(), 0);
456 QCOMPARE(scopeSpy.count(), 1);
458 scopeA->forceActiveFocus();
459 QVERIFY(!itemA1->hasActiveFocus());
460 QVERIFY(scopeA->hasActiveFocus());
461 QCOMPARE(scopeASpy.count(), 1);
462 QCOMPARE(rootSpy.count(), 0);
463 QCOMPARE(scopeSpy.count(), 1);
465 itemA2->forceActiveFocus();
466 QVERIFY(!itemA1->hasActiveFocus());
467 QVERIFY(itemA2->hasActiveFocus());
468 QVERIFY(scopeA->hasActiveFocus());
469 QCOMPARE(scopeASpy.count(), 1);
470 QCOMPARE(rootSpy.count(), 0);
471 QCOMPARE(scopeSpy.count(), 1);
473 scopeA->forceActiveFocus();
474 QVERIFY(!itemA1->hasActiveFocus());
475 QVERIFY(itemA2->hasActiveFocus());
476 QVERIFY(scopeA->hasActiveFocus());
477 QCOMPARE(scopeASpy.count(), 1);
478 QCOMPARE(rootSpy.count(), 0);
479 QCOMPARE(scopeSpy.count(), 1);
481 itemA1->forceActiveFocus();
482 QVERIFY(itemA1->hasActiveFocus());
483 QVERIFY(!scopeA->hasActiveFocus());
484 QVERIFY(!itemA2->hasActiveFocus());
485 QCOMPARE(scopeASpy.count(), 2);
486 QCOMPARE(rootSpy.count(), 0);
487 QCOMPARE(scopeSpy.count(), 1);
489 // Then jump back and forth between branch 'a' and 'b'
490 itemB1->forceActiveFocus();
491 QVERIFY(itemB1->hasActiveFocus());
492 QCOMPARE(rootSpy.count(), 0);
493 QCOMPARE(scopeSpy.count(), 1);
495 scopeA->forceActiveFocus();
496 QVERIFY(!itemA1->hasActiveFocus());
497 QVERIFY(!itemB1->hasActiveFocus());
498 QVERIFY(scopeA->hasActiveFocus());
499 QCOMPARE(scopeASpy.count(), 3);
500 QCOMPARE(rootSpy.count(), 0);
501 QCOMPARE(scopeSpy.count(), 1);
503 scopeB->forceActiveFocus();
504 QVERIFY(!scopeA->hasActiveFocus());
505 QVERIFY(!itemB1->hasActiveFocus());
506 QVERIFY(scopeB->hasActiveFocus());
507 QCOMPARE(scopeASpy.count(), 4);
508 QCOMPARE(scopeBSpy.count(), 1);
509 QCOMPARE(rootSpy.count(), 0);
510 QCOMPARE(scopeSpy.count(), 1);
512 itemA2->forceActiveFocus();
513 QVERIFY(!scopeB->hasActiveFocus());
514 QVERIFY(itemA2->hasActiveFocus());
515 QCOMPARE(scopeASpy.count(), 5);
516 QCOMPARE(scopeBSpy.count(), 2);
517 QCOMPARE(rootSpy.count(), 0);
518 QCOMPARE(scopeSpy.count(), 1);
520 itemB2->forceActiveFocus();
521 QVERIFY(!itemA2->hasActiveFocus());
522 QVERIFY(itemB2->hasActiveFocus());
523 QCOMPARE(scopeASpy.count(), 6);
524 QCOMPARE(scopeBSpy.count(), 3);
525 QCOMPARE(rootSpy.count(), 0);
526 QCOMPARE(scopeSpy.count(), 1);
531 void tst_qquickfocusscope::canvasFocus()
533 QQuickView *view = new QQuickView;
534 view->setSource(QUrl::fromLocalFile(TESTDATA("canvasFocus.qml")));
536 QQuickItem *rootObject = view->rootObject();
539 QQuickItem *rootItem = view->rootItem();
540 QQuickItem *scope1 = findItem<QQuickItem>(rootObject, QLatin1String("scope1"));
541 QQuickItem *item1 = findItem<QQuickItem>(rootObject, QLatin1String("item1"));
542 QQuickItem *scope2 = findItem<QQuickItem>(rootObject, QLatin1String("scope2"));
543 QQuickItem *item2 = findItem<QQuickItem>(rootObject, QLatin1String("item2"));
550 QSignalSpy rootFocusSpy(rootItem, SIGNAL(focusChanged(bool)));
551 QSignalSpy scope1FocusSpy(scope1, SIGNAL(focusChanged(bool)));
552 QSignalSpy item1FocusSpy(item1, SIGNAL(focusChanged(bool)));
553 QSignalSpy scope2FocusSpy(scope2, SIGNAL(focusChanged(bool)));
554 QSignalSpy item2FocusSpy(item2, SIGNAL(focusChanged(bool)));
555 QSignalSpy rootActiveFocusSpy(rootItem, SIGNAL(activeFocusChanged(bool)));
556 QSignalSpy scope1ActiveFocusSpy(scope1, SIGNAL(activeFocusChanged(bool)));
557 QSignalSpy item1ActiveFocusSpy(item1, SIGNAL(activeFocusChanged(bool)));
558 QSignalSpy scope2ActiveFocusSpy(scope2, SIGNAL(activeFocusChanged(bool)));
559 QSignalSpy item2ActiveFocusSpy(item2, SIGNAL(activeFocusChanged(bool)));
561 QEXPECT_FAIL("", "QTBUG-21054 - Root item hasFocus returns true already", Abort);
563 QCOMPARE(rootItem->hasFocus(), false);
564 QCOMPARE(rootItem->hasActiveFocus(), false);
565 QCOMPARE(scope1->hasFocus(), true);
566 QCOMPARE(scope1->hasActiveFocus(), false);
567 QCOMPARE(item1->hasFocus(), true);
568 QCOMPARE(item1->hasActiveFocus(), false);
569 QCOMPARE(scope2->hasFocus(), false);
570 QCOMPARE(scope2->hasActiveFocus(), false);
571 QCOMPARE(item2->hasFocus(), false);
572 QCOMPARE(item2->hasActiveFocus(), false);
575 view->requestActivateWindow();
577 QTest::qWaitForWindowShown(view);
579 // Now the canvas has focus, active focus given to item1
580 QCOMPARE(rootItem->hasFocus(), true);
581 QCOMPARE(rootItem->hasActiveFocus(), true);
582 QCOMPARE(scope1->hasFocus(), true);
583 QCOMPARE(scope1->hasActiveFocus(), true);
584 QCOMPARE(item1->hasFocus(), true);
585 QCOMPARE(item1->hasActiveFocus(), true);
586 QCOMPARE(scope2->hasFocus(), false);
587 QCOMPARE(scope2->hasActiveFocus(), false);
588 QCOMPARE(item2->hasFocus(), false);
589 QCOMPARE(item2->hasActiveFocus(), false);
590 QCOMPARE(rootFocusSpy.count(), 1);
591 QCOMPARE(rootActiveFocusSpy.count(), 1);
592 QCOMPARE(scope1FocusSpy.count(), 0);
593 QCOMPARE(scope1ActiveFocusSpy.count(), 1);
594 QCOMPARE(item1FocusSpy.count(), 0);
595 QCOMPARE(item1ActiveFocusSpy.count(), 1);
599 QCOMPARE(rootItem->hasFocus(), false);
600 QCOMPARE(rootItem->hasActiveFocus(), false);
601 QCOMPARE(scope1->hasFocus(), true);
602 QCOMPARE(scope1->hasActiveFocus(), false);
603 QCOMPARE(item1->hasFocus(), true);
604 QCOMPARE(item1->hasActiveFocus(), false);
605 QCOMPARE(rootFocusSpy.count(), 2);
606 QCOMPARE(rootActiveFocusSpy.count(), 2);
607 QCOMPARE(scope1FocusSpy.count(), 0);
608 QCOMPARE(scope1ActiveFocusSpy.count(), 2);
609 QCOMPARE(item1FocusSpy.count(), 0);
610 QCOMPARE(item1ActiveFocusSpy.count(), 2);
612 // canvas does not have focus, so item2 will not get active focus
613 item2->forceActiveFocus();
615 QCOMPARE(rootItem->hasFocus(), false);
616 QCOMPARE(rootItem->hasActiveFocus(), false);
617 QCOMPARE(scope1->hasFocus(), false);
618 QCOMPARE(scope1->hasActiveFocus(), false);
619 QCOMPARE(item1->hasFocus(), true);
620 QCOMPARE(item1->hasActiveFocus(), false);
621 QCOMPARE(scope2->hasFocus(), true);
622 QCOMPARE(scope2->hasActiveFocus(), false);
623 QCOMPARE(item2->hasFocus(), true);
624 QCOMPARE(item2->hasActiveFocus(), false);
626 QCOMPARE(rootFocusSpy.count(), 2);
627 QCOMPARE(rootActiveFocusSpy.count(), 2);
628 QCOMPARE(scope1FocusSpy.count(), 1);
629 QCOMPARE(scope1ActiveFocusSpy.count(), 2);
630 QCOMPARE(item1FocusSpy.count(), 0);
631 QCOMPARE(item1ActiveFocusSpy.count(), 2);
632 QCOMPARE(scope2FocusSpy.count(), 1);
633 QCOMPARE(scope2ActiveFocusSpy.count(), 0);
634 QCOMPARE(item2FocusSpy.count(), 1);
635 QCOMPARE(item2ActiveFocusSpy.count(), 0);
637 // give the canvas focus, and item2 will get active focus
640 QCOMPARE(rootItem->hasFocus(), true);
641 QCOMPARE(rootItem->hasActiveFocus(), true);
642 QCOMPARE(scope2->hasFocus(), true);
643 QCOMPARE(scope2->hasActiveFocus(), true);
644 QCOMPARE(item2->hasFocus(), true);
645 QCOMPARE(item2->hasActiveFocus(), true);
646 QCOMPARE(rootFocusSpy.count(), 3);
647 QCOMPARE(rootActiveFocusSpy.count(), 3);
648 QCOMPARE(scope2FocusSpy.count(), 1);
649 QCOMPARE(scope2ActiveFocusSpy.count(), 1);
650 QCOMPARE(item2FocusSpy.count(), 1);
651 QCOMPARE(item2ActiveFocusSpy.count(), 1);
656 QTEST_MAIN(tst_qquickfocusscope)
658 #include "tst_qquickfocusscope.moc"