/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* * Copyright © 2017 Igalia S.L. * * This file is part of Epiphany. * * Epiphany is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Epiphany is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Epiphany. If not, see . */ /* For O_PATH */ #define _GNU_SOURCE #include #include "ephy-flatpak-utils.h" #include #include #include #include #if USE_LIBPORTAL #include #endif #include #include #include static gboolean is_web_process = FALSE; void ephy_flatpak_utils_set_is_web_process_extension (void) { g_assert (!is_web_process); is_web_process = TRUE; } gboolean ephy_is_running_inside_flatpak (void) { static _Thread_local gboolean decided = FALSE; static _Thread_local gboolean under_flatpak = FALSE; if (decided) return under_flatpak; /* This function cannot be used in the web process extension, because WebKit * creates a .flatpak-info in its web process sandbox even when we are not * running under flatpak. It would always return TRUE. */ g_assert (!is_web_process); under_flatpak = g_file_test ("/.flatpak-info", G_FILE_TEST_EXISTS); decided = TRUE; return under_flatpak; } #if USE_LIBPORTAL static void opened_uri (GObject *object, GAsyncResult *result, gpointer data) { g_autoptr (XdpPortal) portal = XDP_PORTAL (object); g_autoptr (GError) error = NULL; gboolean open_dir = GPOINTER_TO_INT (data); gboolean res; if (open_dir) res = xdp_portal_open_directory_finish (portal, result, &error); else res = xdp_portal_open_uri_finish (portal, result, &error); if (!res) g_warning ("%s", error->message); } #endif static void ephy_open_uri (const char *uri, gboolean is_dir) { #if USE_LIBPORTAL GApplication *application; GtkWindow *window; XdpParent *parent; g_autoptr (XdpPortal) portal = xdp_portal_new (); application = g_application_get_default (); window = gtk_application_get_active_window (GTK_APPLICATION (application)); parent = xdp_parent_new_gtk (window); if (is_dir) xdp_portal_open_directory (g_steal_pointer (&portal), parent, uri, XDP_OPEN_URI_FLAG_ASK, NULL, opened_uri, GINT_TO_POINTER (TRUE)); else xdp_portal_open_uri (g_steal_pointer (&portal), parent, uri, XDP_OPEN_URI_FLAG_ASK, NULL, opened_uri, GINT_TO_POINTER (FALSE)); xdp_parent_free (parent); #else g_warning ("Flatpak portal support disabled at compile time, cannot open %s", uri); #endif } void ephy_open_directory_via_flatpak_portal (const char *uri) { ephy_open_uri (uri, TRUE); } void ephy_open_uri_via_flatpak_portal (const char *uri) { ephy_open_uri (uri, FALSE); }