diff --git a/tests/auto/activeFocusOnTab/data/activeFocusOnTab.qml b/tests/auto/activeFocusOnTab/data/activeFocusOnTab.qml index 5955b61eff8bfbe791a6701fb679e5cc62c30bc5..20f1a77f4731eee629c92c45cc1caddd1315445c 100644 --- a/tests/auto/activeFocusOnTab/data/activeFocusOnTab.qml +++ b/tests/auto/activeFocusOnTab/data/activeFocusOnTab.qml @@ -44,8 +44,8 @@ import QtQuick.Controls 1.0 Item { id: main objectName: "main" - width: 800 - height: 600 + width: 400 + height: 800 focus: true Component.onCompleted: button1.focus = true Column { @@ -197,6 +197,10 @@ Item { objectName: "textfield" text: "abc" } + TableView { + id: tableview + objectName: "tableview" + } TextArea { id: textarea objectName: "textarea" diff --git a/tests/auto/activeFocusOnTab/tst_activeFocusOnTab.cpp b/tests/auto/activeFocusOnTab/tst_activeFocusOnTab.cpp index 19d0d194cebf374b9f3123a9d7ee51c500835f2d..6278149ec80a9d939199d635e1e0782658bcf14f 100644 --- a/tests/auto/activeFocusOnTab/tst_activeFocusOnTab.cpp +++ b/tests/auto/activeFocusOnTab/tst_activeFocusOnTab.cpp @@ -45,6 +45,8 @@ #include <QtQml/qqmlcontext.h> #include <QtQuick/qquickview.h> #include <QtQuick/private/qquickitem_p.h> +#include <QtGui/private/qguiapplication_p.h> +#include <QtGui/qpa/qplatformtheme.h> #include "../shared/util.h" #include "../shared/visualtestutil.h" @@ -61,8 +63,14 @@ private slots: void cleanup(); void activeFocusOnTab(); + void activeFocusOnTab2(); private: QQmlEngine engine; + bool qt_tab_all_widgets() { + if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) + return theme->themeHint(QPlatformTheme::TabAllWidgets).toBool(); + return true; + } }; tst_activeFocusOnTab::tst_activeFocusOnTab() @@ -80,6 +88,9 @@ void tst_activeFocusOnTab::cleanup() void tst_activeFocusOnTab::activeFocusOnTab() { + if (!qt_tab_all_widgets()) + QSKIP("This function doesn't support NOT iterating all."); + QQuickView *window = new QQuickView(0); window->setBaseSize(QSize(800,600)); @@ -215,7 +226,16 @@ void tst_activeFocusOnTab::activeFocusOnTab() QVERIFY(item); QVERIFY(item->hasActiveFocus()); - // Tab: textfield->textarea + // Tab: textfield->tableview + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "tableview"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: tableview->textarea key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); QGuiApplication::sendEvent(window, &key); QVERIFY(key.isAccepted()); @@ -224,7 +244,16 @@ void tst_activeFocusOnTab::activeFocusOnTab() QVERIFY(item); QVERIFY(item->hasActiveFocus()); - // BackTab: textarea->textfield + // BackTab: textarea->tableview + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "tableview"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: tableview->textfield key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); QGuiApplication::sendEvent(window, &key); QVERIFY(key.isAccepted()); @@ -422,6 +451,101 @@ void tst_activeFocusOnTab::activeFocusOnTab() delete window; } +void tst_activeFocusOnTab::activeFocusOnTab2() +{ + if (qt_tab_all_widgets()) + QSKIP("This function doesn't support iterating all."); + + QQuickView *window = new QQuickView(0); + window->setBaseSize(QSize(800,600)); + + window->setSource(testFileUrl("activeFocusOnTab.qml")); + window->show(); + window->requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(window)); + QVERIFY(QGuiApplication::focusWindow() == window); + + // original: spinbox + QQuickItem *item = findItem<QQuickItem>(window->rootObject(), "spinbox"); + QVERIFY(item); + item->forceActiveFocus(); + QVERIFY(item->hasActiveFocus()); + + // Tab: spinbox->textfield + QKeyEvent key(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "textfield"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: textfield->tableview + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "tableview"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: tableview->textarea + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "textarea"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: textarea->tableview + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "tableview"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: tableview->textfield + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "textfield"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: textfield->spinbox + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "spinbox"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: spinbox->textarea + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "textarea"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: textarea->tableview + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "tableview"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + delete window; +} + QTEST_MAIN(tst_activeFocusOnTab) #include "tst_activeFocusOnTab.moc" diff --git a/tests/auto/applicationwindow/data/activefocusontab.qml b/tests/auto/applicationwindow/data/activefocusontab.qml index 4ca3a2506953c8a150c4518e1f20c25ffd5815ba..bd4c482625fae5cee1287ee25c7e0029c7ddc116 100644 --- a/tests/auto/applicationwindow/data/activefocusontab.qml +++ b/tests/auto/applicationwindow/data/activefocusontab.qml @@ -59,6 +59,7 @@ ApplicationWindow { id: sub1 objectName: "sub1" activeFocusOnTab: true + Accessible.role: Accessible.Table width: 100 height: 50 Rectangle { @@ -70,6 +71,7 @@ ApplicationWindow { id: sub2 objectName: "sub2" activeFocusOnTab: true + Accessible.role: Accessible.Table width: 100 height: 50 Rectangle { diff --git a/tests/auto/controls/data/tst_button.qml b/tests/auto/controls/data/tst_button.qml index f949ec6ea335fdddc83a4a6fb13275c1db2dc641..29e2a3f630846a9c6ff49531de801b2cd9801bab 100644 --- a/tests/auto/controls/data/tst_button.qml +++ b/tests/auto/controls/data/tst_button.qml @@ -40,6 +40,7 @@ import QtQuick 2.1 import QtTest 1.0 +import QtQuickControlsTests 1.0 Item { id: container @@ -122,6 +123,9 @@ TestCase { } function test_activeFocusOnTab() { + if (!SystemInfo.tabAllWidgets) + skip("This function doesn't support NOT iterating all.") + var test_control = 'import QtQuick 2.1; \ import QtQuick.Controls 1.0; \ Item { \ diff --git a/tests/auto/controls/data/tst_checkbox.qml b/tests/auto/controls/data/tst_checkbox.qml index 1c74e34d81147225b076db52f15ea45391227d24..40600d9e3cd31449160260abb3ef638588b7adc4 100644 --- a/tests/auto/controls/data/tst_checkbox.qml +++ b/tests/auto/controls/data/tst_checkbox.qml @@ -40,6 +40,7 @@ import QtQuick 2.1 import QtTest 1.0 +import QtQuickControlsTests 1.0 Item { id: container @@ -237,6 +238,10 @@ Item { function test_activeFocusOnTab() { checkBox.destroy() wait(0) //QTBUG-30523 so processEvents is called + + if (!SystemInfo.tabAllWidgets) + skip("This function doesn't support NOT iterating all.") + var test_control = 'import QtQuick 2.1; \ import QtQuick.Controls 1.0; \ Item { \ diff --git a/tests/auto/controls/data/tst_combobox.qml b/tests/auto/controls/data/tst_combobox.qml index 9110eb1cf73ff87c92056e845c2e3117f79b0b03..c36218a31734325f418ca787b3c9f63fddd09ebe 100644 --- a/tests/auto/controls/data/tst_combobox.qml +++ b/tests/auto/controls/data/tst_combobox.qml @@ -40,6 +40,7 @@ import QtQuick 2.1 import QtTest 1.0 +import QtQuickControlsTests 1.0 Item { id: container @@ -144,6 +145,9 @@ TestCase { } function test_activeFocusOnTab() { + if (!SystemInfo.tabAllWidgets) + skip("This function doesn't support NOT iterating all.") + var test_control = 'import QtQuick 2.1; \ import QtQuick.Controls 1.0; \ Item { \ diff --git a/tests/auto/controls/data/tst_groupbox.qml b/tests/auto/controls/data/tst_groupbox.qml index 12784b48e393ea2276acabcdde636f67cae4a897..5599ca5f3a4d4920fdfc8204c0fb7030466aa9fc 100644 --- a/tests/auto/controls/data/tst_groupbox.qml +++ b/tests/auto/controls/data/tst_groupbox.qml @@ -41,6 +41,7 @@ import QtQuick 2.1 import QtTest 1.0 import QtQuick.Controls 1.0 +import QtQuickControlsTests 1.0 Item { id: container @@ -113,6 +114,9 @@ TestCase { } function test_activeFocusOnTab() { + if (!SystemInfo.tabAllWidgets) + skip("This function doesn't support NOT iterating all.") + var test_control = 'import QtQuick 2.1; \ import QtQuick.Controls 1.0; \ Item { \ diff --git a/tests/auto/controls/data/tst_label.qml b/tests/auto/controls/data/tst_label.qml index a507869137468a9c53ff6db4cbda3b88e48bab53..9b416d6a7709d54b5de2f9ff2b025bad8f9e31ca 100644 --- a/tests/auto/controls/data/tst_label.qml +++ b/tests/auto/controls/data/tst_label.qml @@ -40,6 +40,7 @@ import QtQuick 2.1 import QtTest 1.0 +import QtQuickControlsTests 1.0 Item { id: container @@ -59,6 +60,9 @@ TestCase { } function test_activeFocusOnTab() { + if (!SystemInfo.tabAllWidgets) + skip("This function doesn't support NOT iterating all.") + var test_control = 'import QtQuick 2.1; \ import QtQuick.Controls 1.0; \ Item { \ diff --git a/tests/auto/controls/data/tst_progressbar.qml b/tests/auto/controls/data/tst_progressbar.qml index 3dc7a29abafbd5a9f761e77458fc609d7696f630..7febd6619858e5fdbff81ad55d7a497bccac88ae 100644 --- a/tests/auto/controls/data/tst_progressbar.qml +++ b/tests/auto/controls/data/tst_progressbar.qml @@ -40,6 +40,7 @@ import QtQuick 2.1 import QtTest 1.0 +import QtQuickControlsTests 1.0 Item { id: container @@ -130,6 +131,9 @@ TestCase { } function test_activeFocusOnTab() { + if (!SystemInfo.tabAllWidgets) + skip("This function doesn't support NOT iterating all.") + var test_control = 'import QtQuick 2.1; \ import QtQuick.Controls 1.0; \ Item { \ diff --git a/tests/auto/controls/data/tst_radiobutton.qml b/tests/auto/controls/data/tst_radiobutton.qml index 855f8c7a6196d30907925adac9b1f4c3a8c8afa0..7d04c0c36194a4f9f4fb831d5de43c7eee1745d9 100644 --- a/tests/auto/controls/data/tst_radiobutton.qml +++ b/tests/auto/controls/data/tst_radiobutton.qml @@ -40,6 +40,7 @@ import QtQuick 2.1 import QtTest 1.0 +import QtQuickControlsTests 1.0 Item { id: container @@ -190,6 +191,10 @@ Item { function test_activeFocusOnTab() { radioButton.destroy() wait(0) //QTBUG-30523 so processEvents is called + + if (!SystemInfo.tabAllWidgets) + skip("This function doesn't support NOT iterating all.") + var test_control = 'import QtQuick 2.1; \ import QtQuick.Controls 1.0; \ Item { \ diff --git a/tests/auto/controls/data/tst_scrollview.qml b/tests/auto/controls/data/tst_scrollview.qml index c273c16b787ec776fcc9f537d531b6adce66dae4..d5c3e0086b99e5faec68fc799702067f0b0a3443 100644 --- a/tests/auto/controls/data/tst_scrollview.qml +++ b/tests/auto/controls/data/tst_scrollview.qml @@ -41,6 +41,7 @@ import QtQuick 2.1 import QtTest 1.0 import QtQuick.Controls 1.0 +import QtQuickControlsTests 1.0 Item { id: container @@ -114,6 +115,9 @@ TestCase { } function test_activeFocusOnTab() { + if (!SystemInfo.tabAllWidgets) + skip("This function doesn't support NOT iterating all.") + var test_control = 'import QtQuick 2.1; \ import QtQuick.Controls 1.0; \ Item { \ diff --git a/tests/auto/controls/data/tst_slider.qml b/tests/auto/controls/data/tst_slider.qml index cf9e8db1993cea19a1c384eb67a92734904d7593..7c07ba4cb848ba4d7ee292e0f69a02186c76e286 100644 --- a/tests/auto/controls/data/tst_slider.qml +++ b/tests/auto/controls/data/tst_slider.qml @@ -40,6 +40,7 @@ import QtQuick 2.1 import QtTest 1.0 +import QtQuickControlsTests 1.0 Item { id: container @@ -165,6 +166,9 @@ Item { } function test_activeFocusOnTab() { + if (!SystemInfo.tabAllWidgets) + skip("This function doesn't support NOT iterating all.") + var test_control = 'import QtQuick 2.1; \ import QtQuick.Controls 1.0; \ Item { \ diff --git a/tests/auto/controls/data/tst_statusbar.qml b/tests/auto/controls/data/tst_statusbar.qml index aa8a7d54df968a610102a7b54eb27bb6d00d8ac0..e95e14bbbd82b71d03c9bb561c3bb5105d1870ab 100644 --- a/tests/auto/controls/data/tst_statusbar.qml +++ b/tests/auto/controls/data/tst_statusbar.qml @@ -40,6 +40,7 @@ import QtQuick 2.1 import QtTest 1.0 +import QtQuickControlsTests 1.0 Item { id: container @@ -59,6 +60,9 @@ TestCase { } function test_activeFocusOnTab() { + if (!SystemInfo.tabAllWidgets) + skip("This function doesn't support NOT iterating all.") + var test_control = 'import QtQuick 2.1; \ import QtQuick.Controls 1.0; \ Item { \ diff --git a/tests/auto/controls/data/tst_tabview.qml b/tests/auto/controls/data/tst_tabview.qml index ad1322658bf3674d304d10d5c39620e210de54a5..43c42c99e888112cd55355bc70e127c2ac8c7abc 100644 --- a/tests/auto/controls/data/tst_tabview.qml +++ b/tests/auto/controls/data/tst_tabview.qml @@ -236,16 +236,16 @@ TestCase { active: true; \ Column { \ objectName: "column1"; \ - property alias button1: _button1; \ - property alias button2: _button2; \ + property alias child1: _child1; \ + property alias child2: _child2; \ anchors.fill: parent; \ - Button { \ - id: _button1; \ - text: "button 1 in Tab1"; \ + TextField { \ + id: _child1; \ + text: "textfile 1 in Tab1"; \ } \ - Button { \ - id: _button2; \ - text: "button 2 in Tab1"; \ + TextField { \ + id: _child2; \ + text: "textfile 2 in Tab1"; \ } \ } \ } \ @@ -255,16 +255,16 @@ TestCase { active: true; \ Column { \ objectName: "column2"; \ - property alias button3: _button3; \ - property alias button4: _button4; \ + property alias child3: _child3; \ + property alias child4: _child4; \ anchors.fill: parent; \ - Button { \ - id: _button3; \ - text: "button 1 in Tab2"; \ + TextField { \ + id: _child3; \ + text: "textfile 1 in Tab2"; \ } \ - Button { \ - id: _button4; \ - text: "button 2 in Tab2"; \ + TextField { \ + id: _child4; \ + text: "textfile 2 in Tab2"; \ } \ } \ } \ @@ -280,10 +280,10 @@ TestCase { var column2 = getColumnItem(tabView.tab2, "column2") verify(column2 !== null) - var button1 = column1.button1 - verify(button1 !== null) - var button3 = column2.button3 - verify(button3 !== null) + var child1 = column1.child1 + verify(child1 !== null) + var child3 = column2.child3 + verify(child3 !== null) var tabbarItem = getTabBarItem(tabView) verify(tabbarItem !== null) @@ -300,7 +300,7 @@ TestCase { waitForRendering(tab1) mouseClick(tab1, tab1.width/2, tab1.height/2) - verify(button1.activeFocus) + verify(child1.activeFocus) var tab2 = mouseareas[1].parent verify(tab2 !== null) @@ -308,15 +308,15 @@ TestCase { waitForRendering(tab2) mouseClick(tab2, tab2.width/2, tab2.height/2) - verify(button3.activeFocus) + verify(child3.activeFocus) waitForRendering(tab1) mouseClick(tab1, tab1.width/2, tab1.height/2) - verify(button1.activeFocus) + verify(child1.activeFocus) waitForRendering(tab2) mouseClick(tab2, tab2.width/2, tab2.height/2) - verify(button3.activeFocus) + verify(child3.activeFocus) tabView.destroy() } diff --git a/tests/auto/controls/data/tst_toolbar.qml b/tests/auto/controls/data/tst_toolbar.qml index fc545bd5ed5fe414bd0cd406519625b0b4c9113e..97106ff4b4f644a83081f15b7e2c380c92756b78 100644 --- a/tests/auto/controls/data/tst_toolbar.qml +++ b/tests/auto/controls/data/tst_toolbar.qml @@ -40,6 +40,7 @@ import QtQuick 2.1 import QtTest 1.0 +import QtQuickControlsTests 1.0 Item { id: container @@ -59,6 +60,9 @@ TestCase { } function test_activeFocusOnTab() { + if (!SystemInfo.tabAllWidgets) + skip("This function doesn't support NOT iterating all.") + var test_control = 'import QtQuick 2.1; \ import QtQuick.Controls 1.0; \ Item { \ diff --git a/tests/auto/controls/data/tst_toolbutton.qml b/tests/auto/controls/data/tst_toolbutton.qml index 9ce7b14342f30de8a03c4b67c4f28ace57c5ebc8..b02587430719862a85fbf0b6b93fdd412c8afbd9 100644 --- a/tests/auto/controls/data/tst_toolbutton.qml +++ b/tests/auto/controls/data/tst_toolbutton.qml @@ -40,6 +40,7 @@ import QtQuick 2.1 import QtTest 1.0 +import QtQuickControlsTests 1.0 Item { id: container @@ -72,6 +73,9 @@ TestCase { } function test_activeFocusOnTab() { + if (!SystemInfo.tabAllWidgets) + skip("This function doesn't support NOT iterating all.") + var test_control = 'import QtQuick 2.1; \ import QtQuick.Controls 1.0; \ Item { \ diff --git a/tests/auto/testplugin/testcppmodels.h b/tests/auto/testplugin/testcppmodels.h index 8a1b686eaa48b7f822a916e085bbd54ff0ab3d6f..e495af0bcb2699e7d68f0844bd74c1a740e35b0b 100644 --- a/tests/auto/testplugin/testcppmodels.h +++ b/tests/auto/testplugin/testcppmodels.h @@ -44,6 +44,33 @@ #include <QAbstractListModel> #include <QVariant> +#include <QtGui/private/qguiapplication_p.h> +#include <qpa/qplatformtheme.h> +#include <QtQml/QQmlEngine> +#include <QtQml/QJSEngine> + +class SystemInfo : public QObject +{ + Q_OBJECT + Q_PROPERTY(bool tabAllWidgets READ tabAllWidgets CONSTANT) + +public: + SystemInfo() {} + bool tabAllWidgets() const { + if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) + return theme->themeHint(QPlatformTheme::TabAllWidgets).toBool(); + return true; + } +}; + +static QObject *systeminfo_provider(QQmlEngine *engine, QJSEngine *scriptEngine) +{ + Q_UNUSED(engine) + Q_UNUSED(scriptEngine) + + SystemInfo *systemInfo = new SystemInfo(); + return systemInfo; +} class TestObject : public QObject { diff --git a/tests/auto/testplugin/testplugin.cpp b/tests/auto/testplugin/testplugin.cpp index d0eaa8586b57aee785705baebff50c8d14dd2841..df8e6e1cdd6dcc94fb21577c7870dee2ae2b6dd8 100644 --- a/tests/auto/testplugin/testplugin.cpp +++ b/tests/auto/testplugin/testplugin.cpp @@ -51,6 +51,7 @@ void TestPlugin::registerTypes(const char *uri) // cpp models qmlRegisterType<TestObject>(uri, 1, 0, "TestObject"); qmlRegisterType<TestItemModel>(uri, 1, 0, "TestItemModel"); + qmlRegisterSingletonType<SystemInfo>(uri, 1, 0, "SystemInfo", systeminfo_provider); } void TestPlugin::initializeEngine(QQmlEngine *engine, const char * /*uri*/) diff --git a/tests/auto/testplugin/testplugin.pro b/tests/auto/testplugin/testplugin.pro index d25d3a9f1d87032d59b18ba349e6bcca28be30cf..3800a80eb1fac08d2c281663e9e9ed9ce765dff2 100644 --- a/tests/auto/testplugin/testplugin.pro +++ b/tests/auto/testplugin/testplugin.pro @@ -3,7 +3,7 @@ CONFIG += plugin TARGET = testplugin TARGETPATH = QtQuickControlsTests -QT += qml quick +QT += qml quick core-private gui-private qtHaveModule(widgets) { QT += widgets }