diff --git a/src/controller/application.cpp b/src/controller/application.cpp index 348d4097..75608753 100644 --- a/src/controller/application.cpp +++ b/src/controller/application.cpp @@ -50,6 +50,7 @@ Application::Application(int& argc, char** argv, const QString& name) : QApplica setApplicationVersion(QStringLiteral(PROJECT_VERSION)); setOrganizationDomain(QStringLiteral("web-eid.eu")); setOrganizationName(QStringLiteral("RIA")); + setQuitOnLastWindowClosed(false); translator = new QTranslator(this); QApplication::installTranslator(translator); diff --git a/src/mac/js b/src/mac/js index 33ea04cf..a51e4419 160000 --- a/src/mac/js +++ b/src/mac/js @@ -1 +1 @@ -Subproject commit 33ea04cf08dc30e6abad7de1e31758f71c75b5c3 +Subproject commit a51e4419ddd2913ea32640ccbcf2a49c805d2844 diff --git a/src/mac/main.mm b/src/mac/main.mm index 878c7807..39497187 100644 --- a/src/mac/main.mm +++ b/src/mac/main.mm @@ -36,7 +36,8 @@ @implementation NSApplication (MacController) -+ (QVariant)toQVariant:(id)data { ++ (QVariant)toQVariant:(id)data +{ if (data == nil) { return {}; } @@ -55,7 +56,8 @@ + (QVariant)toQVariant:(id)data { return {}; } -+ (QVariantList)toQVariantList:(NSArray *)data { ++ (QVariantList)toQVariantList:(NSArray*)data +{ QVariantList result; if (data == nil) { return result; @@ -66,7 +68,8 @@ + (QVariantList)toQVariantList:(NSArray *)data { return result; } -+ (QVariantMap)toQVariantMap:(NSDictionary *)data { ++ (QVariantMap)toQVariantMap:(NSDictionary*)data +{ QVariantMap result; if (data == nil) { return result; @@ -77,7 +80,8 @@ + (QVariantMap)toQVariantMap:(NSDictionary *)data { return result; } -+ (id)toID:(const QVariant&)data { ++ (id)toID:(const QVariant&)data +{ switch (data.type()) { case QVariant::String: return data.toString().toNSString(); case QVariant::Map: return [NSApplication toNSDictionary:data.toMap()]; @@ -86,15 +90,17 @@ + (id)toID:(const QVariant&)data { } } -+ (NSArray*)toNSArray:(const QVariantList&)data { ++ (NSArray*)toNSArray:(const QVariantList&)data +{ NSMutableArray *result = [[NSMutableArray alloc] init]; - for (const QVariant &item: data) { + for (const QVariant& item : data) { [result addObject:[NSApplication toID:item]]; } return result; } -+ (NSDictionary*)toNSDictionary:(const QVariantMap&)data { ++ (NSDictionary*)toNSDictionary:(const QVariantMap&)data +{ NSMutableDictionary *result = [[NSMutableDictionary alloc] init]; for (QVariantMap::const_iterator i = data.cbegin(); i != data.cend(); ++i) { result[i.key().toNSString()] = [NSApplication toID:i.value()]; @@ -102,7 +108,8 @@ + (NSDictionary*)toNSDictionary:(const QVariantMap&)data { return result; } -- (void)notificationEvent:(NSNotification *)notification { +- (void)notificationEvent:(NSNotification*)notification +{ NSString *nonce = notification.object; NSDictionary *req = takeValue(nonce); NSLog(@"web-eid-safari: msg from extension nonce (%@) request: %@", nonce, req); @@ -111,13 +118,16 @@ - (void)notificationEvent:(NSNotification *)notification { } NSDictionary *resp; - if([@"status" isEqualToString:req[@"command"]]) { - resp = [NSApplication toNSDictionary:{{QStringLiteral("version"), qApp->applicationVersion()}}]; + if ([@"status" isEqualToString:req[@"command"]]) { + resp = [NSApplication + toNSDictionary: {{QStringLiteral("version"), qApp->applicationVersion()}}]; } else { try { - const auto argumentJson = QJsonDocument::fromJson(QByteArray::fromNSData(req[@"arguments"])); - Controller controller(std::make_unique(commandNameToCommandType(QString::fromNSString(req[@"command"])), - argumentJson.object().toVariantMap())); + const auto argumentJson = + QJsonDocument::fromJson(QByteArray::fromNSData(req[@"arguments"])); + Controller controller(std::make_unique( + commandNameToCommandType(QString::fromNSString(req[@"command"])), + argumentJson.object().toVariantMap())); controller.run(); QEventLoop e; QObject::connect(&controller, &Controller::quit, &e, &QEventLoop::quit); @@ -144,12 +154,12 @@ Controller controller(std::make_unique(commandNameToComman bool isSafariExtensionContainingApp() override { return true; } bool isSafariExtensionEnabled() override { return safariExtensionEnabled; } - void showSafariSettings() override { - [SFSafariApplication showPreferencesForExtensionWithIdentifier:WebEidExtension completionHandler:nil]; - } - void setSafariExtensionEnabled(bool value) { - safariExtensionEnabled = value; + void showSafariSettings() override + { + [SFSafariApplication showPreferencesForExtensionWithIdentifier:WebEidExtension + completionHandler:nil]; } + void setSafariExtensionEnabled(bool value) { safariExtensionEnabled = value; } private: bool safariExtensionEnabled = false; @@ -157,9 +167,6 @@ void setSafariExtensionEnabled(bool value) { int main(int argc, char* argv[]) { - id starting = takeValue(WebEidStarting); - NSLog(@"web-eid-safari: is starting %@", starting); - Q_INIT_RESOURCE(web_eid_resources); Q_INIT_RESOURCE(translations); @@ -172,6 +179,16 @@ int main(int argc, char* argv[]) appPtr->setSafariExtensionEnabled(bool(state.enabled)); }]; + id starting = [getUserDefaults() objectForKey:WebEidStarting]; + NSLog(@"web-eid-safari: is starting %@", starting); + if ([(NSNumber*)starting boolValue]) { + QTimer::singleShot(0, appPtr, [] { + id starting = takeValue(WebEidStarting); + NSLog(@"web-eid-safari: started %@", starting); + }); + return QApplication::exec(); + } + try { if (auto args = app.parseArgs()) { NSLog(@"web-eid-safari: running with arguments"); @@ -192,8 +209,5 @@ int main(int argc, char* argv[]) qCritical() << error; } - if (![(NSNumber*)starting boolValue]) { - WebEidDialog::showAboutPage(); - } - return QApplication::exec(); + return -1; } diff --git a/src/mac/safari-extension.mm b/src/mac/safari-extension.mm index f373bea6..522fd1fa 100644 --- a/src/mac/safari-extension.mm +++ b/src/mac/safari-extension.mm @@ -78,8 +78,8 @@ - (BOOL)execNativeApp { return NO; } NSLog(@"web-eid-safari-extension: started app"); - for (int i = 0; i < 10 && [getUserDefaults() boolForKey:WebEidStarting]; ++i) { - [NSThread sleepForTimeInterval:1.0]; + for (int i = 0; i < 20 && [getUserDefaults() boolForKey:WebEidStarting]; ++i) { + [NSThread sleepForTimeInterval:0.5]; NSLog(@"web-eid-safari-extension: waiting to be running %@", [getUserDefaults() objectForKey:WebEidStarting]); } if ([(NSNumber*)takeValue(WebEidStarting) boolValue]) { @@ -103,6 +103,8 @@ - (void)beginRequestWithExtensionContext:(NSExtensionContext *)context return; } + NSLog(@"web-eid-safari-extension: sending message to app %@", message); + // Save context NSString *nonce = [[[NSUUID alloc] init] UUIDString]; contexts[nonce] = context;