From c8b2aeb2263c50428e2a465aebc0103e73582ffc Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Mon, 20 Jul 2026 15:00:40 +0100 Subject: [PATCH 1/2] qt: Avoid implicit `NSApplication` instantiation `[NSApplication sharedApplication]` creates the shared application object if it does not yet exist. When running with the `minimal` or `offscreen` QPA plugins, which is common for testing purposes, the Cocoa platform plugin never creates it, so these call sites were instantiating `NSApplication` as a side effect. Use the `NSApp` global instead and return early when it is `nil`. --- src/qt/macdockiconhandler.mm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/qt/macdockiconhandler.mm b/src/qt/macdockiconhandler.mm index b7b1b98eef3..1b62032c1e6 100644 --- a/src/qt/macdockiconhandler.mm +++ b/src/qt/macdockiconhandler.mm @@ -20,7 +20,8 @@ bool dockClickHandler(id self, SEL _cmd, ...) { } void setupDockClickHandler() { - Class delClass = (Class)[[[NSApplication sharedApplication] delegate] class]; + if (NSApp == nil) return; + Class delClass = (Class)[[NSApp delegate] class]; SEL shouldHandle = sel_registerName("applicationShouldHandleReopen:hasVisibleWindows:"); class_replaceMethod(delClass, shouldHandle, (IMP)dockClickHandler, "B@:"); } @@ -49,5 +50,6 @@ void setupDockClickHandler() { */ void ForceActivation() { - [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; + if (NSApp == nil) return; + [NSApp activateIgnoringOtherApps:YES]; } From fd59d68c2629440e544ffa6c9a96b4252ebf45c3 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Mon, 20 Jul 2026 15:09:59 +0100 Subject: [PATCH 2/2] qt, test: Enable tests on macOS with `minimal` QPA plugin The crash source, implicit `NSApplication` instantiation with a non-Cocoa QPA plugin, was fixed in the previous commit. --- src/qt/test/addressbooktests.cpp | 11 ----------- src/qt/test/apptests.cpp | 12 ------------ src/qt/test/wallettests.cpp | 11 ----------- 3 files changed, 34 deletions(-) diff --git a/src/qt/test/addressbooktests.cpp b/src/qt/test/addressbooktests.cpp index 58b8a6d2ea2..fae94ef0f7c 100644 --- a/src/qt/test/addressbooktests.cpp +++ b/src/qt/test/addressbooktests.cpp @@ -212,16 +212,5 @@ void TestAddAddressesToSendBook(interfaces::Node& node) void AddressBookTests::addressBookTests() { -#ifdef Q_OS_MACOS - if (QApplication::platformName() == "minimal") { - // Disable for mac on "minimal" platform to avoid crashes inside the Qt - // framework when it tries to look up unimplemented cocoa functions, - // and fails to handle returned nulls - // (https://bugreports.qt.io/browse/QTBUG-49686). - qWarning() << "Skipping AddressBookTests on mac build with 'minimal' platform set due to Qt bugs. To run AppTests, invoke " - "with 'QT_QPA_PLATFORM=cocoa test_bitcoin-qt' on mac, or else use a linux or windows build."; - return; - } -#endif TestAddAddressesToSendBook(m_node); } diff --git a/src/qt/test/apptests.cpp b/src/qt/test/apptests.cpp index 752c8773810..7802696d5f3 100644 --- a/src/qt/test/apptests.cpp +++ b/src/qt/test/apptests.cpp @@ -54,18 +54,6 @@ void TestRpcCommand(RPCConsole* console) //! Entry point for BitcoinApplication tests. void AppTests::appTests() { -#ifdef Q_OS_MACOS - if (QApplication::platformName() == "minimal") { - // Disable for mac on "minimal" platform to avoid crashes inside the Qt - // framework when it tries to look up unimplemented cocoa functions, - // and fails to handle returned nulls - // (https://bugreports.qt.io/browse/QTBUG-49686). - qWarning() << "Skipping AppTests on mac build with 'minimal' platform set due to Qt bugs. To run AppTests, invoke " - "with 'QT_QPA_PLATFORM=cocoa test_bitcoin-qt' on mac, or else use a linux or windows build."; - return; - } -#endif - qRegisterMetaType("interfaces::BlockAndHeaderTipInfo"); m_app.parameterSetup(); QVERIFY(m_app.createOptionsModel(/*resetSettings=*/true)); diff --git a/src/qt/test/wallettests.cpp b/src/qt/test/wallettests.cpp index a2983c23979..af620b67382 100644 --- a/src/qt/test/wallettests.cpp +++ b/src/qt/test/wallettests.cpp @@ -455,16 +455,5 @@ void TestGUI(interfaces::Node& node) void WalletTests::walletTests() { -#ifdef Q_OS_MACOS - if (QApplication::platformName() == "minimal") { - // Disable for mac on "minimal" platform to avoid crashes inside the Qt - // framework when it tries to look up unimplemented cocoa functions, - // and fails to handle returned nulls - // (https://bugreports.qt.io/browse/QTBUG-49686). - qWarning() << "Skipping WalletTests on mac build with 'minimal' platform set due to Qt bugs. To run AppTests, invoke " - "with 'QT_QPA_PLATFORM=cocoa test_bitcoin-qt' on mac, or else use a linux or windows build."; - return; - } -#endif TestGUI(m_node); }