From 91d7dcea1123d32807ba56269004bcd3c9afa202 Mon Sep 17 00:00:00 2001 From: Mikolaj Boc Date: Mon, 12 Sep 2022 10:43:07 +0200 Subject: [PATCH] Fix QWasmWindowStack::topWindow when the stack is empty MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The method should by contract return nullptr when the stack is empty, but it crashes in this case. Also, unit-test the case. Pick-to: 6.4 Change-Id: If64b71e761efd9a5cd5af407cd68cba7f8dbc8e2 Reviewed-by: Morten Johan Sørvig --- .../platforms/wasm/qwasmwindowstack.cpp | 2 +- tests/auto/wasm/tst_qwasmwindowstack.cpp | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/wasm/qwasmwindowstack.cpp b/src/plugins/platforms/wasm/qwasmwindowstack.cpp index cc1a3cad6af..c73ecde9fbe 100644 --- a/src/plugins/platforms/wasm/qwasmwindowstack.cpp +++ b/src/plugins/platforms/wasm/qwasmwindowstack.cpp @@ -111,7 +111,7 @@ QWasmWindow *QWasmWasmWindowStack::rootWindow() const QWasmWindow *QWasmWasmWindowStack::topWindow() const { - return m_windowStack.last(); + return m_windowStack.empty() ? nullptr : m_windowStack.last(); } QWasmWasmWindowStack::StorageType::iterator QWasmWasmWindowStack::regularWindowsBegin() diff --git a/tests/auto/wasm/tst_qwasmwindowstack.cpp b/tests/auto/wasm/tst_qwasmwindowstack.cpp index f978679a15e..62b47bca6db 100644 --- a/tests/auto/wasm/tst_qwasmwindowstack.cpp +++ b/tests/auto/wasm/tst_qwasmwindowstack.cpp @@ -36,6 +36,7 @@ private slots: void lowering(); void removing(); void removingTheRoot(); + void clearing(); private: void onTopWindowChanged() @@ -241,5 +242,31 @@ void tst_QWasmWindowStack::removingTheRoot() getWindowsFrontToBack(&stack).begin())); } +void tst_QWasmWindowStack::clearing() +{ + QWasmWasmWindowStack stack(m_mockCallback); + + stack.pushWindow(&m_root); + stack.pushWindow(&m_window1); + // Window order: 1 R + + clearCallbackCounter(); + + QCOMPARE(&m_window1, stack.topWindow()); + + m_onTopLevelChangedAction = [this, &stack]() { QVERIFY(stack.topWindow() == &m_root); }; + stack.removeWindow(&m_window1); + // Window order: R + verifyTopWindowChangedCalled(); + QCOMPARE(&m_root, stack.topWindow()); + + m_onTopLevelChangedAction = [&stack]() { QVERIFY(stack.topWindow() == nullptr); }; + stack.removeWindow(&m_root); + // Window order: + verifyTopWindowChangedCalled(); + QCOMPARE(nullptr, stack.topWindow()); + QCOMPARE(0u, stack.size()); +} + QTEST_MAIN(tst_QWasmWindowStack) #include "tst_qwasmwindowstack.moc"