[epiphany/mwleeds/webapp-dbus-api: 1/4] Allow launching apps and URIs from Flatpak
- From: Phaedrus Leeds <mwleeds src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany/mwleeds/webapp-dbus-api: 1/4] Allow launching apps and URIs from Flatpak
- Date: Fri, 17 Dec 2021 23:00:11 +0000 (UTC)
commit 0dc6310864d323bad437ffcc04198337d88c27f9
Author: Phaedrus Leeds <mwleeds protonmail com>
Date: Fri Dec 17 14:03:13 2021 -0800
Allow launching apps and URIs from Flatpak
It is possible to launch a web app (initiated by the user clicking on
the install completed notification) from within Flatpak, and it's
possible to open a URI from within Flatpak, so let these code paths
execute from Flatpaks. Follow-up commits will enable the rest of the web
app functionality under Flatpak.
lib/ephy-file-helpers.c | 53 ++++++++++++++++--------------------------------
lib/ephy-file-helpers.h | 31 ++++++++--------------------
lib/ephy-flatpak-utils.c | 14 +++++++++++++
lib/ephy-flatpak-utils.h | 1 +
org.gnome.Epiphany.json | 3 ++-
src/ephy-shell.c | 8 ++------
src/ephy-window.c | 12 ++---------
src/window-commands.c | 6 ++----
8 files changed, 50 insertions(+), 78 deletions(-)
---
diff --git a/lib/ephy-file-helpers.c b/lib/ephy-file-helpers.c
index d1ad88e26..17adb338c 100644
--- a/lib/ephy-file-helpers.c
+++ b/lib/ephy-file-helpers.c
@@ -551,11 +551,6 @@ launch_application (GAppInfo *app,
GdkScreen *screen;
gboolean res;
- /* This is impossible to implement inside sandbox. Higher layers must
- * ensure we don't get here.
- */
- g_assert (!ephy_is_running_inside_sandbox ());
-
display = gdk_display_get_default ();
screen = gdk_screen_get_default ();
@@ -572,28 +567,20 @@ launch_application (GAppInfo *app,
}
/**
- * ephy_file_launch_desktop_file:
- * @filename: the path to the .desktop file
- * @tag: used to guard against improper usage
+ * ephy_file_launch_webapp_desktop_file:
+ * @filename: the path to the .desktop file of a web app
*
* Launches the application described by the desktop file @filename.
*
* Returns: %TRUE if the application launch was successful
**/
gboolean
-ephy_file_launch_desktop_file (const char *filename,
- guint32 user_time,
- EphyFileHelpersNotFlatpakTag tag)
+ephy_file_launch_webapp_desktop_file (const char *filename,
+ guint32 user_time)
{
g_autoptr (GDesktopAppInfo) app = NULL;
- /* This is impossible to implement inside sandbox. Higher layers must
- * ensure we don't get here.
- */
- g_assert (tag == EPHY_FILE_HELPERS_I_UNDERSTAND_I_MUST_NOT_USE_THIS_FUNCTION_UNDER_FLATPAK);
- g_assert (!ephy_is_running_inside_sandbox ());
-
- app = g_desktop_app_info_new (filename);
+ app = g_desktop_app_info_new_from_filename (filename);
return launch_application (G_APP_INFO (app), NULL, user_time);
}
@@ -662,23 +649,16 @@ ephy_file_launch_handler (GFile *file,
}
static gboolean
-open_in_default_handler (const char *uri,
- const char *mime_type,
- guint32 timestamp,
- GdkScreen *screen,
- EphyFileHelpersNotFlatpakTag tag)
+open_in_default_handler (const char *uri,
+ const char *mime_type,
+ guint32 timestamp,
+ GdkScreen *screen)
{
g_autoptr (GdkAppLaunchContext) context = NULL;
g_autoptr (GAppInfo) appinfo = NULL;
g_autoptr (GError) error = NULL;
GList uris;
- /* This is impossible to implement inside sandbox. Higher layers must
- * ensure we don't get here.
- */
- g_assert (tag == EPHY_FILE_HELPERS_I_UNDERSTAND_I_MUST_NOT_USE_THIS_FUNCTION_UNDER_FLATPAK);
- g_assert (!ephy_is_running_inside_sandbox ());
-
context = gdk_display_get_app_launch_context (screen ? gdk_screen_get_display (screen) :
gdk_display_get_default ());
gdk_app_launch_context_set_screen (context, screen);
gdk_app_launch_context_set_timestamp (context, timestamp);
@@ -701,12 +681,15 @@ open_in_default_handler (const char *uri,
}
gboolean
-ephy_file_open_uri_in_default_browser (const char *uri,
- guint32 user_time,
- GdkScreen *screen,
- EphyFileHelpersNotFlatpakTag tag)
+ephy_file_open_uri_in_default_browser (const char *uri,
+ guint32 user_time,
+ GdkScreen *screen)
{
- return open_in_default_handler (uri, "x-scheme-handler/http", user_time, screen, tag);
+ if (ephy_is_running_inside_sandbox ()) {
+ ephy_open_uri_via_flatpak_portal (uri);
+ return TRUE;
+ } else
+ return open_in_default_handler (uri, "x-scheme-handler/http", user_time, screen);
}
/**
@@ -731,7 +714,7 @@ ephy_file_browse_to (GFile *file,
return TRUE;
}
- return open_in_default_handler (uri, "inode/directory", user_time, NULL,
EPHY_FILE_HELPERS_I_UNDERSTAND_I_MUST_NOT_USE_THIS_FUNCTION_UNDER_FLATPAK);
+ return open_in_default_handler (uri, "inode/directory", user_time, NULL);
}
/**
diff --git a/lib/ephy-file-helpers.h b/lib/ephy-file-helpers.h
index c09d145c8..581160d0c 100644
--- a/lib/ephy-file-helpers.h
+++ b/lib/ephy-file-helpers.h
@@ -41,11 +41,6 @@ typedef enum
EPHY_FILE_HELPERS_TESTING_MODE = 1 << 5
} EphyFileHelpersFlags;
-typedef enum
-{
- EPHY_FILE_HELPERS_I_UNDERSTAND_I_MUST_NOT_USE_THIS_FUNCTION_UNDER_FLATPAK
-} EphyFileHelpersNotFlatpakTag;
-
gboolean ephy_file_helpers_init (const char *profile_dir,
EphyFileHelpersFlags flags,
GError **error);
@@ -72,22 +67,14 @@ gboolean ephy_file_delete_dir_recursively (const char
char * ephy_sanitize_filename (char *filename);
void ephy_open_default_instance_window (void);
void ephy_open_incognito_window (const char *uri);
-
-/* These functions attempt to launch a particular application chosen by
- * Epiphany, which is not possible to do when running inside flatpak. Be
- * careful!
- */
-gboolean ephy_file_launch_desktop_file (const char *filename,
- guint32 user_time,
- EphyFileHelpersNotFlatpakTag tag);
-gboolean ephy_file_open_uri_in_default_browser (const char *uri,
- guint32 user_time,
- GdkScreen *screen,
- EphyFileHelpersNotFlatpakTag tag);
-gboolean ephy_file_browse_to (GFile *file,
- guint32 user_time);
-
-void ephy_copy_directory (const char *source,
- const char *target);
+gboolean ephy_file_launch_webapp_desktop_file (const char *filepath,
+ guint32 user_time);
+gboolean ephy_file_open_uri_in_default_browser (const char *uri,
+ guint32 user_time,
+ GdkScreen *screen);
+gboolean ephy_file_browse_to (GFile *file,
+ guint32 user_time);
+void ephy_copy_directory (const char *source,
+ const char *target);
G_END_DECLS
diff --git a/lib/ephy-flatpak-utils.c b/lib/ephy-flatpak-utils.c
index 6fc9a5dec..96fae9c96 100644
--- a/lib/ephy-flatpak-utils.c
+++ b/lib/ephy-flatpak-utils.c
@@ -140,3 +140,17 @@ ephy_open_uri_via_flatpak_portal (const char *uri)
{
ephy_open_uri (uri, FALSE);
}
+
+gboolean
+ephy_can_install_web_apps (void)
+{
+ if (!ephy_is_running_inside_sandbox ())
+ return TRUE;
+
+#if USE_LIBPORTAL
+ /* TODO bump version requirement of libportal and also check that the portal is available */
+ return TRUE;
+#else
+ return FALSE;
+#endif
+}
diff --git a/lib/ephy-flatpak-utils.h b/lib/ephy-flatpak-utils.h
index 15b85ac9b..289663efb 100644
--- a/lib/ephy-flatpak-utils.h
+++ b/lib/ephy-flatpak-utils.h
@@ -30,3 +30,4 @@ void ephy_open_uri_via_flatpak_portal (const char *uri);
void ephy_open_directory_via_flatpak_portal (const char *uri);
+gboolean ephy_can_install_web_apps (void);
diff --git a/org.gnome.Epiphany.json b/org.gnome.Epiphany.json
index d58f3bd86..f9a81ccd9 100644
--- a/org.gnome.Epiphany.json
+++ b/org.gnome.Epiphany.json
@@ -18,7 +18,8 @@
"--socket=pulseaudio",
"--socket=wayland",
"--system-talk-name=org.freedesktop.GeoClue2",
- "--own-name=org.gnome.Epiphany.WebAppProvider"
+ "--own-name=org.gnome.Epiphany.WebAppProvider",
+ "--own-name=org.gnome.Epiphany.*"
],
"modules" : [
{
diff --git a/src/ephy-shell.c b/src/ephy-shell.c
index 0ace095aa..d356ee168 100644
--- a/src/ephy-shell.c
+++ b/src/ephy-shell.c
@@ -335,12 +335,8 @@ launch_app (GSimpleAction *action,
{
const gchar *desktop_file = g_variant_get_string (parameter, NULL);
- /* We can't get here under flatpak because all web app functionality
- * is disabled when running under flatpak.
- */
- ephy_file_launch_desktop_file (desktop_file,
- gtk_get_current_event_time (),
- EPHY_FILE_HELPERS_I_UNDERSTAND_I_MUST_NOT_USE_THIS_FUNCTION_UNDER_FLATPAK);
+ ephy_file_launch_webapp_desktop_file (desktop_file,
+ gtk_get_current_event_time ());
}
static void
diff --git a/src/ephy-window.c b/src/ephy-window.c
index ab8caedf5..640eefc74 100644
--- a/src/ephy-window.c
+++ b/src/ephy-window.c
@@ -2126,12 +2126,8 @@ decide_navigation_policy (WebKitWebView *web_view,
if (ephy_web_application_is_uri_allowed (uri)) {
gtk_widget_show (GTK_WIDGET (window));
} else {
- /* We can't get here under sandbox because this code only
- * executes in web app mode.
- */
ephy_file_open_uri_in_default_browser (uri, GDK_CURRENT_TIME,
- gtk_window_get_screen (GTK_WINDOW (window)),
-
EPHY_FILE_HELPERS_I_UNDERSTAND_I_MUST_NOT_USE_THIS_FUNCTION_UNDER_FLATPAK);
+ gtk_window_get_screen (GTK_WINDOW (window)));
webkit_policy_decision_ignore (decision);
gtk_widget_destroy (GTK_WIDGET (window));
@@ -2145,12 +2141,8 @@ decide_navigation_policy (WebKitWebView *web_view,
if (ephy_web_application_is_uri_allowed (uri))
return accept_navigation_policy_decision (window, decision, uri);
- /* We can't get here under sandbox because this code only
- * executes in web app mode.
- */
ephy_file_open_uri_in_default_browser (uri, GDK_CURRENT_TIME,
- gtk_window_get_screen (GTK_WINDOW (window)),
-
EPHY_FILE_HELPERS_I_UNDERSTAND_I_MUST_NOT_USE_THIS_FUNCTION_UNDER_FLATPAK);
+ gtk_window_get_screen (GTK_WINDOW (window)));
webkit_policy_decision_ignore (decision);
return TRUE;
diff --git a/src/window-commands.c b/src/window-commands.c
index 07ed22cea..ab629630a 100644
--- a/src/window-commands.c
+++ b/src/window-commands.c
@@ -1807,11 +1807,9 @@ save_as_application_proceed (EphyApplicationDialogData *data)
}
if (desktop_file) {
- g_autofree char *basename = g_path_get_basename (desktop_file);
-
/* Translators: Desktop notification when a new web app is created. */
- g_notification_add_button_with_target (notification, _("Launch"), "app.launch-app", "s", basename);
- g_notification_set_default_action_and_target (notification, "app.launch-app", "s", basename);
+ g_notification_add_button_with_target (notification, _("Launch"), "app.launch-app", "s", desktop_file);
+ g_notification_set_default_action_and_target (notification, "app.launch-app", "s", desktop_file);
ephy_focus_desktop_app (desktop_file);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]