diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2020-01-31 18:19:14 +0100 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2020-02-06 23:42:55 +0100 |
commit | 1a58e78db0e41da0423a50ffa900a6d90e83a0d5 (patch) | |
tree | 4cf89d6ec5b5df275b70fafcaf55ef1974f76803 /src/testlib/qtestutil_macos.mm | |
parent | 19510abbffc433c2d6435e558047e55aa5800531 (diff) |
testlib: Be more selective in choosing to show stacktraces on macOS
The built in crash reporter on macOS will by default not show the
dialog if the application is not one that will run in the foreground.
Change-Id: I0020520ae2f14a0e2f84fdca1d80ec6fe1247ffd
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Diffstat (limited to 'src/testlib/qtestutil_macos.mm')
-rw-r--r-- | src/testlib/qtestutil_macos.mm | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/testlib/qtestutil_macos.mm b/src/testlib/qtestutil_macos.mm index 7579c3b164..880cd0f91f 100644 --- a/src/testlib/qtestutil_macos.mm +++ b/src/testlib/qtestutil_macos.mm @@ -39,6 +39,8 @@ #include "qtestutil_macos_p.h" +#include "QtCore/private/qcore_mac_p.h" + #import <AppKit/AppKit.h> QT_BEGIN_NAMESPACE @@ -55,6 +57,32 @@ namespace QTestPrivate { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"ApplePersistenceIgnoreState"]; } + bool macCrashReporterWillShowDialog() + { + auto dialogType = QCFType<CFStringRef>(CFPreferencesCopyAppValue( + CFSTR("DialogType"), CFSTR("com.apple.CrashReporter"))); + + auto stringCompare = [](CFStringRef str1, CFStringRef str2) -> bool { + return CFStringCompare(str1, str2, kCFCompareCaseInsensitive) == kCFCompareEqualTo; + }; + + if (!dialogType || stringCompare(dialogType, CFSTR("basic"))) { + // The default (basic) dialog type only shows up if the + // application is 'user visible', as indicated by the + // activation policy. + auto *runningApp = NSRunningApplication.currentApplication; + return runningApp && runningApp.activationPolicy == NSApplicationActivationPolicyRegular; + } else if (stringCompare(dialogType, CFSTR("developer")) + || stringCompare(dialogType, CFSTR("crashreport"))) { + // While in developer mode the dialog will show for all + // crashed applications, including backgrounded ones. + return true; + } else { + // Finally, 'server' or 'none' will result in no dialog + return false; + } + } + /*! \internal \class AppNapDisabler \brief Disables App Nap by registereing a bacground activity. |