summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 6805d17b6e..20c370dc38 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 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.
diff --git a/src/testlib/qtestutil_macos_p.h b/src/testlib/qtestutil_macos_p.h
index 36f27167c0..c9a152dfdb 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 0a0547688a..787df6b648 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)