From fb348ee38d22f046f9dda476310dfca55925c3c6 Mon Sep 17 00:00:00 2001 From: Lleyton Gray Date: Sun, 4 Feb 2024 02:08:56 -0800 Subject: [PATCH] feat: begin work on IPC --- README.md | 1 + src/MainWindow.vala | 19 ++++++++++++++++--- src/MessageHandler.vala | 40 ++++++++++++++++++++++++++++++++++++++++ src/meson.build | 2 ++ 4 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 src/MessageHandler.vala diff --git a/README.md b/README.md index 5fa054a..0b4a03f 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ meson vala blueprint-compiler webkitgtk-6.0 +json-glib-1.0 ``` ## 🏗️ Building diff --git a/src/MainWindow.vala b/src/MainWindow.vala index e82350f..800ba7d 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -9,7 +9,16 @@ public class SkiffDesktop.MainWindow : He.ApplicationWindow { private unowned Gtk.Box main_box; private WebKit.WebView webview = new WebKit.WebView (); private WebKit.UserScript script = new WebKit.UserScript ( - "window.IsSkiffWindowsDesktop = true;", + """ + window.IsSkiffWindowsDesktop = true + window.chrome = { + webview: { + postMessage: (v) => window.webkit.messageHandlers.skiffDesktop.postMessage(v), + addEventListener: (_, listener) => window._skiffListener = listener, + removeEventListener: (_, listener) => delete window._skiffListener, + } + } + """, WebKit.UserContentInjectedFrames.TOP_FRAME, WebKit.UserScriptInjectionTime.START, null, @@ -98,8 +107,12 @@ public class SkiffDesktop.MainWindow : He.ApplicationWindow { } construct { - // var content_manager = webview.get_user_content_manager (); - // content_manager.add_script (script); + var message_handler = new MessageHandler (); + + var content_manager = webview.get_user_content_manager (); + content_manager.add_script (script); + content_manager.script_message_received.connect (message_handler.on_script_message); + content_manager.register_script_message_handler ("skiffDesktop", null); var network_session = webview.get_network_session (); var website_data_manager = network_session.get_website_data_manager (); diff --git a/src/MessageHandler.vala b/src/MessageHandler.vala new file mode 100644 index 0000000..a357c80 --- /dev/null +++ b/src/MessageHandler.vala @@ -0,0 +1,40 @@ +public class SkiffDesktop.MessageHandler { + private class NotificationItem : Object { + public string title { get; set; } + public string body { get; set; } + public string threadID { get; set; } + public string emailID { get; set; } + } + + private class NotificationData : Object { + public NotificationItem[] notificationData { get; set; } + } + + private class UnreadData : Object { + public int numUnread { get; set; } + } + + public void on_script_message (JSC.Value val) { + var parser = new Json.Parser (); + parser.load_from_data (val.to_string ()); + + var root = parser.get_root (); + var message_type = root.get_object ().get_string_member ("type"); + + switch (message_type) { + case "unreadMailCount": + var unread_data = Json.gobject_deserialize (typeof (UnreadData), root) as UnreadData; + assert (unread_data != null); + print ("unread count: %d\n", unread_data.numUnread); + break; + case "newMessageNotifications": + var notification_data = Json.gobject_deserialize (typeof (NotificationData), root) as NotificationData; + assert (notification_data != null); + print ("notifications: %d\n", notification_data.notificationData.length); + break; + default: + print ("Received unknown message %s\n", val.to_string ()); + break; + } + } +} diff --git a/src/meson.build b/src/meson.build index 2b4d972..5c54de1 100644 --- a/src/meson.build +++ b/src/meson.build @@ -36,6 +36,7 @@ sources = [ 'Config.vapi', 'Application.vala', 'MainWindow.vala', + 'MessageHandler.vala', ] dependencies = [ @@ -47,6 +48,7 @@ dependencies = [ dependency('libhelium-1'), dependency('gmodule-2.0'), dependency('webkitgtk-6.0'), + dependency('json-glib-1.0'), ] executable(