diff options
author | Mikolaj Boc <[email protected]> | 2022-09-12 10:43:07 +0200 |
---|---|---|
committer | Mikolaj Boc <[email protected]> | 2022-09-12 20:09:03 +0200 |
commit | 91d7dcea1123d32807ba56269004bcd3c9afa202 (patch) | |
tree | 5369b6444273e5bef96dff28d73a80fd7eab430c | |
parent | 0c1368c7e407d2a7f7814b703c6e6de6a40efa8b (diff) |
Fix QWasmWindowStack::topWindow when the stack is empty
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 <[email protected]>
-rw-r--r-- | src/plugins/platforms/wasm/qwasmwindowstack.cpp | 2 | ||||
-rw-r--r-- | tests/auto/wasm/tst_qwasmwindowstack.cpp | 27 |
2 files changed, 28 insertions, 1 deletions
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: <empty> + verifyTopWindowChangedCalled(); + QCOMPARE(nullptr, stack.topWindow()); + QCOMPARE(0u, stack.size()); +} + QTEST_MAIN(tst_QWasmWindowStack) #include "tst_qwasmwindowstack.moc" |