summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Arne Vestbø <[email protected]>2020-01-31 18:19:14 +0100
committerTor Arne Vestbø <[email protected]>2020-02-06 23:42:55 +0100
commit1a58e78db0e41da0423a50ffa900a6d90e83a0d5 (patch)
tree4cf89d6ec5b5df275b70fafcaf55ef1974f76803
parent19510abbffc433c2d6435e558047e55aa5800531 (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 <[email protected]> Reviewed-by: Timur Pocheptsov <[email protected]>
-rw-r--r--src/testlib/qtestcase.cpp15
-rw-r--r--src/testlib/qtestutil_macos.mm28
-rw-r--r--src/testlib/qtestutil_macos_p.h1
-rw-r--r--src/testlib/testlib.pro2
4 files changed, 31 insertions, 15 deletions
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index 6805d17b6ee..20c370dc38c 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -180,20 +180,7 @@ static bool debuggerPresent()
static bool hasSystemCrashReporter()
{
#if defined(Q_OS_MACOS)
- CFStringRef crashReporterType = static_cast<CFStringRef>(
- CFPreferencesCopyAppValue(CFSTR("DialogType"), CFSTR("com.apple.CrashReporter")));
- if (crashReporterType == nullptr)
- return true;
-
- auto equals = [](CFStringRef str1, CFStringRef str2) -> bool {
- return CFStringCompare(str1, str2, kCFCompareCaseInsensitive) == kCFCompareEqualTo;
- };
-
- const bool createsStackTrace =
- !equals(crashReporterType, CFSTR("server")) &&
- !equals(crashReporterType, CFSTR("none"));
- CFRelease(crashReporterType);
- return createsStackTrace;
+ return QTestPrivate::macCrashReporterWillShowDialog();
#else
return false;
#endif
diff --git a/src/testlib/qtestutil_macos.mm b/src/testlib/qtestutil_macos.mm
index 7579c3b1641..880cd0f91f3 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.
diff --git a/src/testlib/qtestutil_macos_p.h b/src/testlib/qtestutil_macos_p.h
index 36f27167c0f..c9a152dfdb7 100644
--- a/src/testlib/qtestutil_macos_p.h
+++ b/src/testlib/qtestutil_macos_p.h
@@ -58,6 +58,7 @@ QT_BEGIN_NAMESPACE
namespace QTestPrivate {
void disableWindowRestore();
+ bool macCrashReporterWillShowDialog();
class AppNapDisabler
{
diff --git a/src/testlib/testlib.pro b/src/testlib/testlib.pro
index 0a0547688aa..787df6b6484 100644
--- a/src/testlib/testlib.pro
+++ b/src/testlib/testlib.pro
@@ -112,7 +112,7 @@ mac {
macos {
HEADERS += qtestutil_macos_p.h
OBJECTIVE_SOURCES += qtestutil_macos.mm
- LIBS += -framework Foundation -framework ApplicationServices -framework IOKit
+ LIBS += -framework Foundation -framework ApplicationServices -framework IOKit -framework AppKit
}
# XCTest support (disabled for now)