diff options
-rw-r--r-- | src/testlib/qtestcase.cpp | 15 | ||||
-rw-r--r-- | src/testlib/qtestutil_macos.mm | 28 | ||||
-rw-r--r-- | src/testlib/qtestutil_macos_p.h | 1 | ||||
-rw-r--r-- | src/testlib/testlib.pro | 2 |
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) |