summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/widgets/widgets')
-rw-r--r--tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp56
-rw-r--r--tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp36
2 files changed, 82 insertions, 10 deletions
diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
index 207327f073..8ad4324c9e 100644
--- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
+++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
@@ -40,6 +40,7 @@
#include <QWidgetAction>
#include <QDesktopWidget>
#include <QScreen>
+#include <QSpinBox>
#include <qdialog.h>
#include <qmenu.h>
@@ -114,6 +115,7 @@ private slots:
void QTBUG30595_rtl_submenu();
void QTBUG20403_nested_popup_on_shortcut_trigger();
void QTBUG47515_widgetActionEnterLeave();
+ void QTBUG8122_widgetActionCrashOnClose();
void QTBUG_10735_crashWithDialog();
#ifdef Q_OS_MAC
@@ -1352,6 +1354,60 @@ void tst_QMenu::QTBUG47515_widgetActionEnterLeave()
}
}
+void tst_QMenu::QTBUG8122_widgetActionCrashOnClose()
+{
+ if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation))
+ QSKIP("Window activation is not supported");
+ if (QGuiApplication::platformName() == QLatin1String("cocoa"))
+ QSKIP("See QTBUG-63031");
+#ifdef Q_OS_WINRT
+ QSKIP("WinRT does not support QTest::mouseMove");
+#endif
+
+ const QRect availableGeometry = QGuiApplication::primaryScreen()->availableGeometry();
+ QRect geometry(QPoint(), availableGeometry.size() / 3);
+ geometry.moveCenter(availableGeometry.center());
+ QPoint pointOutsideMenu = geometry.bottomRight() - QPoint(5, 5);
+
+ QMainWindow topLevel;
+ topLevel.setGeometry(geometry);
+
+ auto menuBar = topLevel.menuBar();
+ auto menu = menuBar->addMenu("Menu");
+ auto wAct = new QWidgetAction(menu);
+ auto spinBox1 = new QSpinBox(menu);
+ wAct->setDefaultWidget(spinBox1);
+ menu->addAction(wAct);
+ auto subMenu = menu->addMenu("Submenu");
+ auto nextMenuAct = menu->addMenu(subMenu);
+ auto wAct2 = new QWidgetAction(menu);
+ auto spinBox2 = new QSpinBox(menu);
+ wAct2->setDefaultWidget(spinBox2);
+ subMenu->addAction(wAct2);
+ QObject::connect(spinBox2, &QSpinBox::editingFinished, menu, &QMenu::hide);
+
+ topLevel.show();
+ topLevel.setWindowTitle(QTest::currentTestFunction());
+ QVERIFY(QTest::qWaitForWindowActive(&topLevel));
+ QWindow *topLevelWindow = topLevel.windowHandle();
+ QVERIFY(topLevelWindow);
+
+ const QPoint menuActionPos = menuBar->mapTo(&topLevel, menuBar->actionGeometry(menu->menuAction()).center());
+ QTest::mouseClick(topLevelWindow, Qt::LeftButton, Qt::KeyboardModifiers(), menuActionPos);
+ QVERIFY(QTest::qWaitForWindowExposed(menu));
+
+ QPoint w1Center = topLevel.mapFromGlobal(spinBox1->mapToGlobal(spinBox1->rect().center()));
+ QTest::mouseClick(topLevelWindow, Qt::LeftButton, Qt::KeyboardModifiers(), w1Center);
+ menu->setActiveAction(nextMenuAct);
+ QVERIFY(QTest::qWaitForWindowExposed(subMenu));
+
+ QPoint w2Center = topLevel.mapFromGlobal(spinBox2->mapToGlobal(spinBox2->rect().center()));
+ QTest::mouseClick(topLevelWindow, Qt::LeftButton, Qt::KeyboardModifiers(), w2Center);
+ QTest::mouseMove(topLevelWindow, topLevel.mapFromGlobal(pointOutsideMenu));
+ QTRY_VERIFY(menu->isHidden());
+}
+
+
class MyMenu : public QMenu
{
Q_OBJECT
diff --git a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp
index bc1496d0f6..e27600bad2 100644
--- a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp
+++ b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp
@@ -33,6 +33,7 @@
#include <qpushbutton.h>
#include <qstyle.h>
+#include <qstyleoption.h>
class tst_QTabBar : public QObject
{
@@ -279,30 +280,53 @@ void tst_QTabBar::hideTab()
QTEST(tabbar.currentIndex(), "finalIndex");
}
+class TabBar : public QTabBar
+{
+public:
+ using QTabBar::QTabBar;
+ using QTabBar::initStyleOption;
+ using QTabBar::moveTab;
+};
+
void tst_QTabBar::hideAllTabs()
{
- QTabBar tabbar;
+ TabBar tabbar;
+ auto checkPositions = [&tabbar](const QVector<int> &positions)
+ {
+ QStyleOptionTab option;
+ int iPos = 0;
+ for (int i = 0; i < tabbar.count(); ++i) {
+ if (!tabbar.isTabVisible(i))
+ continue;
+ tabbar.initStyleOption(&option, i);
+ QCOMPARE(option.position, positions.at(iPos++));
+ }
+ };
tabbar.addTab("foo");
tabbar.addTab("bar");
tabbar.addTab("baz");
tabbar.setCurrentIndex(0);
+ checkPositions({QStyleOptionTab::Beginning, QStyleOptionTab::Middle, QStyleOptionTab::End});
// Check we don't crash trying to hide an unexistant tab
QSize prevSizeHint = tabbar.sizeHint();
tabbar.setTabVisible(3, false);
+ checkPositions({QStyleOptionTab::Beginning, QStyleOptionTab::Middle, QStyleOptionTab::End});
QCOMPARE(tabbar.currentIndex(), 0);
QSize sizeHint = tabbar.sizeHint();
QVERIFY(sizeHint.width() == prevSizeHint.width());
prevSizeHint = sizeHint;
tabbar.setTabVisible(1, false);
+ checkPositions({QStyleOptionTab::Beginning, QStyleOptionTab::End});
QCOMPARE(tabbar.currentIndex(), 0);
sizeHint = tabbar.sizeHint();
QVERIFY(sizeHint.width() < prevSizeHint.width());
prevSizeHint = sizeHint;
tabbar.setTabVisible(2, false);
+ checkPositions({QStyleOptionTab::OnlyOneTab});
QCOMPARE(tabbar.currentIndex(), 0);
sizeHint = tabbar.sizeHint();
QVERIFY(sizeHint.width() < prevSizeHint.width());
@@ -571,14 +595,6 @@ void tst_QTabBar::selectionBehaviorOnRemove()
QCOMPARE(tabbar.currentIndex(), expected);
}
-class TabBar : public QTabBar
-{
- Q_OBJECT
-public:
- void callMoveTab(int from, int to){ moveTab(from, to); }
-};
-
-
Q_DECLARE_METATYPE(QTabBar::Shape)
void tst_QTabBar::moveTab_data()
{
@@ -613,7 +629,7 @@ void tst_QTabBar::moveTab()
bar.setShape(shape);
while(--tabs >= 0)
bar.addTab(QString::number(tabs));
- bar.callMoveTab(from, to);
+ bar.moveTab(from, to);
}