Skip to content

Commit

Permalink
Add additional parameter when Safari extension starts application and…
Browse files Browse the repository at this point in the history
… bring in JavaScript changes from WebExtension

Refs WE2-92

Signed-off-by: Raul Metsma <raul@metsma.ee>
  • Loading branch information
metsma authored and mrts committed Sep 13, 2021
1 parent 8cc0cc3 commit afd6e83
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 28 deletions.
1 change: 1 addition & 0 deletions src/controller/application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
64 changes: 39 additions & 25 deletions src/mac/main.mm
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@

@implementation NSApplication (MacController)

+ (QVariant)toQVariant:(id)data {
+ (QVariant)toQVariant:(id)data
{
if (data == nil) {
return {};
}
Expand All @@ -55,7 +56,8 @@ + (QVariant)toQVariant:(id)data {
return {};
}

+ (QVariantList)toQVariantList:(NSArray *)data {
+ (QVariantList)toQVariantList:(NSArray*)data
{
QVariantList result;
if (data == nil) {
return result;
Expand All @@ -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;
Expand All @@ -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()];
Expand All @@ -86,23 +90,26 @@ + (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()];
}
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);
Expand All @@ -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<CommandWithArguments>(commandNameToCommandType(QString::fromNSString(req[@"command"])),
argumentJson.object().toVariantMap()));
const auto argumentJson =
QJsonDocument::fromJson(QByteArray::fromNSData(req[@"arguments"]));
Controller controller(std::make_unique<CommandWithArguments>(
commandNameToCommandType(QString::fromNSString(req[@"command"])),
argumentJson.object().toVariantMap()));
controller.run();
QEventLoop e;
QObject::connect(&controller, &Controller::quit, &e, &QEventLoop::quit);
Expand All @@ -144,22 +154,19 @@ Controller controller(std::make_unique<CommandWithArguments>(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;
};

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);

Expand All @@ -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");
Expand All @@ -192,8 +209,5 @@ int main(int argc, char* argv[])
qCritical() << error;
}

if (![(NSNumber*)starting boolValue]) {
WebEidDialog::showAboutPage();
}
return QApplication::exec();
return -1;
}
6 changes: 4 additions & 2 deletions src/mac/safari-extension.mm
Original file line number Diff line number Diff line change
Expand Up @@ -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]) {
Expand All @@ -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;
Expand Down

0 comments on commit afd6e83

Please sign in to comment.