blob: e59bb7266c13b6209c2850644dffe19fc362521e [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <qtest.h>
#include <QSignalSpy>
#include <QtQml/qqmlengine.h>
#include <QtQml/qqmlcomponent.h>
#include <QtQuick/qquickview.h>
#include <QtQuick/private/qquickrectangle_p.h>
#include <private/qquicktextedit_p.h>
#include <QtQuick/private/qquicktext_p.h>
#include <QtQuick/private/qquickfocusscope_p.h>
#include "../../shared/util.h"
#include "../shared/visualtestutil.h"
using namespace QQuickVisualTestUtil;
class tst_qquickfocusscope : public QQmlDataTest
{
Q_OBJECT
public:
tst_qquickfocusscope() {}
private slots:
void basic();
void nested();
void noFocus();
void textEdit();
void forceFocus();
void noParentFocus();
void signalEmission();
void qtBug13380();
void forceActiveFocus();
void canvasFocus();
};
void tst_qquickfocusscope::basic()
{
QQuickView *view = new QQuickView;
view->setSource(testFileUrl("test.qml"));
QQuickFocusScope *item0 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item0"));
QQuickRectangle *item1 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item1"));
QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
QQuickRectangle *item3 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item3"));
QVERIFY(item0 != nullptr);
QVERIFY(item1 != nullptr);
QVERIFY(item2 != nullptr);
QVERIFY(item3 != nullptr);
view->show();
view->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(view));
QTRY_COMPARE(view, qGuiApp->focusWindow());
QVERIFY(view->isTopLevel());
QVERIFY(item0->hasActiveFocus());
QVERIFY(item1->hasActiveFocus());
QVERIFY(!item2->hasActiveFocus());
QVERIFY(!item3->hasActiveFocus());
QTest::keyClick(view, Qt::Key_Right);
QTest::qWait(50);
QVERIFY(item0->hasActiveFocus());
QVERIFY(!item1->hasActiveFocus());
QVERIFY(item2->hasActiveFocus());
QVERIFY(!item3->hasActiveFocus());
QTest::keyClick(view, Qt::Key_Down);
QTest::qWait(50);
QVERIFY(!item0->hasActiveFocus());
QVERIFY(!item1->hasActiveFocus());
QVERIFY(!item2->hasActiveFocus());
QVERIFY(item3->hasActiveFocus());
delete view;
}
void tst_qquickfocusscope::nested()
{
QQuickView *view = new QQuickView;
view->setSource(testFileUrl("test2.qml"));
QQuickFocusScope *item1 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item1"));
QQuickFocusScope *item2 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item2"));
QQuickFocusScope *item3 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item3"));
QQuickFocusScope *item4 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item4"));
QQuickFocusScope *item5 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item5"));
QVERIFY(item1 != nullptr);
QVERIFY(item2 != nullptr);
QVERIFY(item3 != nullptr);
QVERIFY(item4 != nullptr);
QVERIFY(item5 != nullptr);
view->show();
view->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(view));
QTRY_COMPARE(view, qGuiApp->focusWindow());
QVERIFY(item1->hasActiveFocus());
QVERIFY(item2->hasActiveFocus());
QVERIFY(item3->hasActiveFocus());
QVERIFY(item4->hasActiveFocus());
QVERIFY(item5->hasActiveFocus());
delete view;
}
void tst_qquickfocusscope::noFocus()
{
QQuickView *view = new QQuickView;
view->setSource(testFileUrl("test4.qml"));
QQuickRectangle *item0 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item0"));
QQuickRectangle *item1 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item1"));
QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
QQuickRectangle *item3 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item3"));
QVERIFY(item0 != nullptr);
QVERIFY(item1 != nullptr);
QVERIFY(item2 != nullptr);
QVERIFY(item3 != nullptr);
view->show();
view->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(view));
QCOMPARE(view, qGuiApp->focusWindow());
QVERIFY(!item0->hasActiveFocus());
QVERIFY(!item1->hasActiveFocus());
QVERIFY(!item2->hasActiveFocus());
QVERIFY(!item3->hasActiveFocus());
QTest::keyClick(view, Qt::Key_Right);
QVERIFY(!item0->hasActiveFocus());
QVERIFY(!item1->hasActiveFocus());
QVERIFY(!item2->hasActiveFocus());
QVERIFY(!item3->hasActiveFocus());
QTest::keyClick(view, Qt::Key_Down);
QVERIFY(!item0->hasActiveFocus());
QVERIFY(!item1->hasActiveFocus());
QVERIFY(!item2->hasActiveFocus());
QVERIFY(!item3->hasActiveFocus());
delete view;
}
void tst_qquickfocusscope::textEdit()
{
QQuickView *view = new QQuickView;
view->setSource(testFileUrl("test5.qml"));
QQuickFocusScope *item0 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item0"));
QQuickTextEdit *item1 = findItem<QQuickTextEdit>(view->rootObject(), QLatin1String("item1"));
QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
QQuickTextEdit *item3 = findItem<QQuickTextEdit>(view->rootObject(), QLatin1String("item3"));
QVERIFY(item0 != nullptr);
QVERIFY(item1 != nullptr);
QVERIFY(item2 != nullptr);
QVERIFY(item3 != nullptr);
view->show();
view->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(view));
QTRY_COMPARE(view, qGuiApp->focusWindow());
QVERIFY(item0->hasActiveFocus());
QVERIFY(item1->hasActiveFocus());
QVERIFY(!item2->hasActiveFocus());
QVERIFY(!item3->hasActiveFocus());
QTest::keyClick(view, Qt::Key_Right);
QVERIFY(item0->hasActiveFocus());
QVERIFY(item1->hasActiveFocus());
QVERIFY(!item2->hasActiveFocus());
QVERIFY(!item3->hasActiveFocus());
QTest::keyClick(view, Qt::Key_Right);
QTest::keyClick(view, Qt::Key_Right);
QTest::keyClick(view, Qt::Key_Right);
QTest::keyClick(view, Qt::Key_Right);
QTest::keyClick(view, Qt::Key_Right);
QVERIFY(item0->hasActiveFocus());
QVERIFY(!item1->hasActiveFocus());
QVERIFY(item2->hasActiveFocus());
QVERIFY(!item3->hasActiveFocus());
QTest::keyClick(view, Qt::Key_Down);
QVERIFY(!item0->hasActiveFocus());
QVERIFY(!item1->hasActiveFocus());
QVERIFY(!item2->hasActiveFocus());
QVERIFY(item3->hasActiveFocus());
delete view;
}
void tst_qquickfocusscope::forceFocus()
{
QQuickView *view = new QQuickView;
view->setSource(testFileUrl("forcefocus.qml"));
QQuickFocusScope *item0 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item0"));
QQuickRectangle *item1 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item1"));
QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
QQuickFocusScope *item3 = findItem<QQuickFocusScope>(view->rootObject(), QLatin1String("item3"));
QQuickRectangle *item4 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item4"));
QQuickRectangle *item5 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item5"));
QVERIFY(item0 != nullptr);
QVERIFY(item1 != nullptr);
QVERIFY(item2 != nullptr);
QVERIFY(item3 != nullptr);
QVERIFY(item4 != nullptr);
QVERIFY(item5 != nullptr);
view->show();
view->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(view));
QTRY_COMPARE(view, qGuiApp->focusWindow());
QVERIFY(item0->hasActiveFocus());
QVERIFY(item1->hasActiveFocus());
QVERIFY(!item2->hasActiveFocus());
QVERIFY(!item3->hasActiveFocus());
QVERIFY(!item4->hasActiveFocus());
QVERIFY(!item5->hasActiveFocus());
QTest::keyClick(view, Qt::Key_4);
QVERIFY(item0->hasActiveFocus());
QVERIFY(item1->hasActiveFocus());
QVERIFY(!item2->hasActiveFocus());
QVERIFY(!item3->hasActiveFocus());
QVERIFY(!item4->hasActiveFocus());
QVERIFY(!item5->hasActiveFocus());
QTest::keyClick(view, Qt::Key_5);
QVERIFY(!item0->hasActiveFocus());
QVERIFY(!item1->hasActiveFocus());
QVERIFY(!item2->hasActiveFocus());
QVERIFY(item3->hasActiveFocus());
QVERIFY(!item4->hasActiveFocus());
QVERIFY(item5->hasActiveFocus());
delete view;
}
void tst_qquickfocusscope::noParentFocus()
{
QQuickView *view = new QQuickView;
view->setSource(testFileUrl("chain.qml"));
QVERIFY(view->rootObject());
view->show();
view->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(view));
QTRY_COMPARE(view, qGuiApp->focusWindow());
QVERIFY(!view->rootObject()->property("focus1").toBool());
QVERIFY(!view->rootObject()->property("focus2").toBool());
QVERIFY(view->rootObject()->property("focus3").toBool());
QVERIFY(view->rootObject()->property("focus4").toBool());
QVERIFY(view->rootObject()->property("focus5").toBool());
delete view;
}
void tst_qquickfocusscope::signalEmission()
{
QQuickView *view = new QQuickView;
view->setSource(testFileUrl("signalEmission.qml"));
QQuickRectangle *item1 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item1"));
QQuickRectangle *item2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item2"));
QQuickRectangle *item3 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item3"));
QQuickRectangle *item4 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("item4"));
QVERIFY(item1 != nullptr);
QVERIFY(item2 != nullptr);
QVERIFY(item3 != nullptr);
QVERIFY(item4 != nullptr);
view->show();
view->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(view));
QTRY_COMPARE(view, qGuiApp->focusWindow());
QVariant blue(QColor("blue"));
QVariant red(QColor("red"));
item1->setFocus(true);
QCOMPARE(item1->property("color"), red);
QCOMPARE(item2->property("color"), blue);
QCOMPARE(item3->property("color"), blue);
QCOMPARE(item4->property("color"), blue);
item2->setFocus(true);
QCOMPARE(item1->property("color"), blue);
QCOMPARE(item2->property("color"), red);
QCOMPARE(item3->property("color"), blue);
QCOMPARE(item4->property("color"), blue);
item3->setFocus(true);
QCOMPARE(item1->property("color"), blue);
QCOMPARE(item2->property("color"), red);
QCOMPARE(item3->property("color"), red);
QCOMPARE(item4->property("color"), blue);
item4->setFocus(true);
QCOMPARE(item1->property("color"), blue);
QCOMPARE(item2->property("color"), red);
QCOMPARE(item3->property("color"), blue);
QCOMPARE(item4->property("color"), red);
item4->setFocus(false);
QCOMPARE(item1->property("color"), blue);
QCOMPARE(item2->property("color"), red);
QCOMPARE(item3->property("color"), blue);
QCOMPARE(item4->property("color"), blue);
delete view;
}
void tst_qquickfocusscope::qtBug13380()
{
QQuickView *view = new QQuickView;
view->setSource(testFileUrl("qtBug13380.qml"));
view->show();
QVERIFY(view->rootObject());
view->requestActivate();
qApp->processEvents();
QVERIFY(QTest::qWaitForWindowExposed(view));
QTRY_COMPARE(view, qGuiApp->focusWindow());
QVERIFY(view->rootObject()->property("noFocus").toBool());
view->rootObject()->setProperty("showRect", true);
QVERIFY(view->rootObject()->property("noFocus").toBool());
delete view;
}
void tst_qquickfocusscope::forceActiveFocus()
{
QQuickView *view = new QQuickView;
view->setSource(testFileUrl("forceActiveFocus.qml"));
view->show();
view->requestActivate();
QVERIFY(QTest::qWaitForWindowExposed(view));
QTRY_COMPARE(view, qGuiApp->focusWindow());
QQuickItem *rootObject = view->rootObject();
QVERIFY(rootObject);
QQuickItem *scope = findItem<QQuickItem>(rootObject, QLatin1String("scope"));
QQuickItem *itemA1 = findItem<QQuickItem>(rootObject, QLatin1String("item-a1"));
QQuickItem *scopeA = findItem<QQuickItem>(rootObject, QLatin1String("scope-a"));
QQuickItem *itemA2 = findItem<QQuickItem>(rootObject, QLatin1String("item-a2"));
QQuickItem *itemB1 = findItem<QQuickItem>(rootObject, QLatin1String("item-b1"));
QQuickItem *scopeB = findItem<QQuickItem>(rootObject, QLatin1String("scope-b"));
QQuickItem *itemB2 = findItem<QQuickItem>(rootObject, QLatin1String("item-b2"));
QVERIFY(scope);
QVERIFY(itemA1);
QVERIFY(scopeA);
QVERIFY(itemA2);
QVERIFY(itemB1);
QVERIFY(scopeB);
QVERIFY(itemB2);
QSignalSpy rootSpy(rootObject, SIGNAL(activeFocusChanged(bool)));
QSignalSpy scopeSpy(scope, SIGNAL(activeFocusChanged(bool)));
QSignalSpy scopeASpy(scopeA, SIGNAL(activeFocusChanged(bool)));
QSignalSpy scopeBSpy(scopeB, SIGNAL(activeFocusChanged(bool)));
// First, walk the focus from item-a1 down to item-a2 and back again
itemA1->forceActiveFocus();
QVERIFY(itemA1->hasActiveFocus());
QVERIFY(!rootObject->hasActiveFocus());
QCOMPARE(rootSpy.count(), 0);
QCOMPARE(scopeSpy.count(), 1);
scopeA->forceActiveFocus();
QVERIFY(!itemA1->hasActiveFocus());
QVERIFY(scopeA->hasActiveFocus());
QCOMPARE(scopeASpy.count(), 1);
QCOMPARE(rootSpy.count(), 0);
QCOMPARE(scopeSpy.count(), 1);
itemA2->forceActiveFocus();
QVERIFY(!itemA1->hasActiveFocus());
QVERIFY(itemA2->hasActiveFocus());
QVERIFY(scopeA->hasActiveFocus());
QCOMPARE(scopeASpy.count(), 1);
QCOMPARE(rootSpy.count(), 0);
QCOMPARE(scopeSpy.count(), 1);
scopeA->forceActiveFocus();
QVERIFY(!itemA1->hasActiveFocus());
QVERIFY(itemA2->hasActiveFocus());
QVERIFY(scopeA->hasActiveFocus());
QCOMPARE(scopeASpy.count(), 1);
QCOMPARE(rootSpy.count(), 0);
QCOMPARE(scopeSpy.count(), 1);
itemA1->forceActiveFocus();
QVERIFY(itemA1->hasActiveFocus());
QVERIFY(!scopeA->hasActiveFocus());
QVERIFY(!itemA2->hasActiveFocus());
QCOMPARE(scopeASpy.count(), 2);
QCOMPARE(rootSpy.count(), 0);
QCOMPARE(scopeSpy.count(), 1);
// Then jump back and forth between branch 'a' and 'b'
itemB1->forceActiveFocus();
QVERIFY(itemB1->hasActiveFocus());
QCOMPARE(rootSpy.count(), 0);
QCOMPARE(scopeSpy.count(), 1);
scopeA->forceActiveFocus();
QVERIFY(!itemA1->hasActiveFocus());
QVERIFY(!itemB1->hasActiveFocus());
QVERIFY(scopeA->hasActiveFocus());
QCOMPARE(scopeASpy.count(), 3);
QCOMPARE(rootSpy.count(), 0);
QCOMPARE(scopeSpy.count(), 1);
scopeB->forceActiveFocus();
QVERIFY(!scopeA->hasActiveFocus());
QVERIFY(!itemB1->hasActiveFocus());
QVERIFY(scopeB->hasActiveFocus());
QCOMPARE(scopeASpy.count(), 4);
QCOMPARE(scopeBSpy.count(), 1);
QCOMPARE(rootSpy.count(), 0);
QCOMPARE(scopeSpy.count(), 1);
itemA2->forceActiveFocus();
QVERIFY(!scopeB->hasActiveFocus());
QVERIFY(itemA2->hasActiveFocus());
QCOMPARE(scopeASpy.count(), 5);
QCOMPARE(scopeBSpy.count(), 2);
QCOMPARE(rootSpy.count(), 0);
QCOMPARE(scopeSpy.count(), 1);
itemB2->forceActiveFocus();
QVERIFY(!itemA2->hasActiveFocus());
QVERIFY(itemB2->hasActiveFocus());
QCOMPARE(scopeASpy.count(), 6);
QCOMPARE(scopeBSpy.count(), 3);
QCOMPARE(rootSpy.count(), 0);
QCOMPARE(scopeSpy.count(), 1);
delete view;
}
void tst_qquickfocusscope::canvasFocus()
{
QQuickView *view = new QQuickView;
view->setSource(testFileUrl("canvasFocus.qml"));
QQuickView alternateView;
QQuickItem *rootObject = view->rootObject();
QVERIFY(rootObject);
QQuickItem *rootItem = view->contentItem();
QQuickItem *scope1 = findItem<QQuickItem>(rootObject, QLatin1String("scope1"));
QQuickItem *item1 = findItem<QQuickItem>(rootObject, QLatin1String("item1"));
QQuickItem *scope2 = findItem<QQuickItem>(rootObject, QLatin1String("scope2"));
QQuickItem *item2 = findItem<QQuickItem>(rootObject, QLatin1String("item2"));
QVERIFY(scope1);
QVERIFY(item1);
QVERIFY(scope2);
QVERIFY(item2);
QSignalSpy rootFocusSpy(rootItem, SIGNAL(focusChanged(bool)));
QSignalSpy scope1FocusSpy(scope1, SIGNAL(focusChanged(bool)));
QSignalSpy item1FocusSpy(item1, SIGNAL(focusChanged(bool)));
QSignalSpy scope2FocusSpy(scope2, SIGNAL(focusChanged(bool)));
QSignalSpy item2FocusSpy(item2, SIGNAL(focusChanged(bool)));
QSignalSpy rootActiveFocusSpy(rootItem, SIGNAL(activeFocusChanged(bool)));
QSignalSpy scope1ActiveFocusSpy(scope1, SIGNAL(activeFocusChanged(bool)));
QSignalSpy item1ActiveFocusSpy(item1, SIGNAL(activeFocusChanged(bool)));
QSignalSpy scope2ActiveFocusSpy(scope2, SIGNAL(activeFocusChanged(bool)));
QSignalSpy item2ActiveFocusSpy(item2, SIGNAL(activeFocusChanged(bool)));
QCOMPARE(rootItem->hasFocus(), false);
QCOMPARE(rootItem->hasActiveFocus(), false);
QCOMPARE(scope1->hasFocus(), true);
QCOMPARE(scope1->hasActiveFocus(), false);
QCOMPARE(item1->hasFocus(), true);
QCOMPARE(item1->hasActiveFocus(), false);
QCOMPARE(scope2->hasFocus(), false);
QCOMPARE(scope2->hasActiveFocus(), false);
QCOMPARE(item2->hasFocus(), false);
QCOMPARE(item2->hasActiveFocus(), false);
view->show();
view->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(view));
QCOMPARE(view, qGuiApp->focusWindow());
// Now the window has focus, active focus given to item1
QCOMPARE(rootItem->hasFocus(), true);
QCOMPARE(rootItem->hasActiveFocus(), true);
QCOMPARE(scope1->hasFocus(), true);
QCOMPARE(scope1->hasActiveFocus(), true);
QCOMPARE(item1->hasFocus(), true);
QCOMPARE(item1->hasActiveFocus(), true);
QCOMPARE(scope2->hasFocus(), false);
QCOMPARE(scope2->hasActiveFocus(), false);
QCOMPARE(item2->hasFocus(), false);
QCOMPARE(item2->hasActiveFocus(), false);
QCOMPARE(rootFocusSpy.count(), 1);
QCOMPARE(rootActiveFocusSpy.count(), 1);
QCOMPARE(scope1FocusSpy.count(), 0);
QCOMPARE(scope1ActiveFocusSpy.count(), 1);
QCOMPARE(item1FocusSpy.count(), 0);
QCOMPARE(item1ActiveFocusSpy.count(), 1);
// view->hide(); // seemingly doesn't remove focus, so have an another view steal it.
alternateView.show();
alternateView.requestActivate();
QVERIFY(QTest::qWaitForWindowActive(&alternateView));
QCOMPARE(QGuiApplication::focusWindow(), &alternateView);
QCOMPARE(rootItem->hasFocus(), false);
QCOMPARE(rootItem->hasActiveFocus(), false);
QCOMPARE(scope1->hasFocus(), true);
QCOMPARE(scope1->hasActiveFocus(), false);
QCOMPARE(item1->hasFocus(), true);
QCOMPARE(item1->hasActiveFocus(), false);
QCOMPARE(rootFocusSpy.count(), 2);
QCOMPARE(rootActiveFocusSpy.count(), 2);
QCOMPARE(scope1FocusSpy.count(), 0);
QCOMPARE(scope1ActiveFocusSpy.count(), 2);
QCOMPARE(item1FocusSpy.count(), 0);
QCOMPARE(item1ActiveFocusSpy.count(), 2);
// window does not have focus, so item2 will not get active focus
item2->forceActiveFocus();
QCOMPARE(rootItem->hasFocus(), false);
QCOMPARE(rootItem->hasActiveFocus(), false);
QCOMPARE(scope1->hasFocus(), false);
QCOMPARE(scope1->hasActiveFocus(), false);
QCOMPARE(item1->hasFocus(), true);
QCOMPARE(item1->hasActiveFocus(), false);
QCOMPARE(scope2->hasFocus(), true);
QCOMPARE(scope2->hasActiveFocus(), false);
QCOMPARE(item2->hasFocus(), true);
QCOMPARE(item2->hasActiveFocus(), false);
QCOMPARE(rootFocusSpy.count(), 2);
QCOMPARE(rootActiveFocusSpy.count(), 2);
QCOMPARE(scope1FocusSpy.count(), 1);
QCOMPARE(scope1ActiveFocusSpy.count(), 2);
QCOMPARE(item1FocusSpy.count(), 0);
QCOMPARE(item1ActiveFocusSpy.count(), 2);
QCOMPARE(scope2FocusSpy.count(), 1);
QCOMPARE(scope2ActiveFocusSpy.count(), 0);
QCOMPARE(item2FocusSpy.count(), 1);
QCOMPARE(item2ActiveFocusSpy.count(), 0);
// give the window focus, and item2 will get active focus
view->show();
view->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(view));
QCOMPARE(QGuiApplication::focusWindow(), view);
QCOMPARE(rootItem->hasFocus(), true);
QCOMPARE(rootItem->hasActiveFocus(), true);
QCOMPARE(scope2->hasFocus(), true);
QCOMPARE(scope2->hasActiveFocus(), true);
QCOMPARE(item2->hasFocus(), true);
QCOMPARE(item2->hasActiveFocus(), true);
QCOMPARE(rootFocusSpy.count(), 3);
QCOMPARE(rootActiveFocusSpy.count(), 3);
QCOMPARE(scope2FocusSpy.count(), 1);
QCOMPARE(scope2ActiveFocusSpy.count(), 1);
QCOMPARE(item2FocusSpy.count(), 1);
QCOMPARE(item2ActiveFocusSpy.count(), 1);
delete view;
}
QTEST_MAIN(tst_qquickfocusscope)
#include "tst_qquickfocusscope.moc"