Revert "Bug 1945770 - Make call to host registry portal earlier before LookAndFeel is initialized r=emilio" for causing build bustages @WidgetUtilsGtk.cpp.

This reverts commit 79c1051e8a.
This commit is contained in:
agoloman
2025-05-09 11:58:25 +03:00
committed by agoloman@mozilla.com
parent fad0b21b7e
commit 27c1331540
5 changed files with 69 additions and 85 deletions

View File

@@ -4507,12 +4507,6 @@ int XREMain::XRE_mainInit(bool* aExitFlag) {
*aExitFlag = true; *aExitFlag = true;
return 0; return 0;
} }
# ifdef MOZ_WIDGET_GTK
if (XRE_IsParentProcess()) {
widget::RegisterHostApp();
}
# endif
#endif #endif
rv = XRE_InitCommandLine(gArgc, gArgv); rv = XRE_InitCommandLine(gArgc, gArgv);

View File

@@ -48,13 +48,6 @@ extern mozilla::LazyLogModule gWidgetLog;
namespace mozilla::widget { namespace mozilla::widget {
#ifdef MOZ_ENABLE_DBUS
constexpr char sXdpServiceName[] = "org.freedesktop.portal.Desktop";
constexpr char sXdpDBusPath[] = "/org/freedesktop/portal/desktop";
constexpr char sXdpRegistryInterfaceName[] =
"org.freedesktop.host.portal.Registry";
#endif
int32_t WidgetUtilsGTK::IsTouchDeviceSupportPresent() { int32_t WidgetUtilsGTK::IsTouchDeviceSupportPresent() {
int32_t result = 0; int32_t result = 0;
GdkDisplay* display = gdk_display_get_default(); GdkDisplay* display = gdk_display_get_default();
@@ -161,75 +154,6 @@ bool IsRunningUnderFlatpak() {
return sRunning; return sRunning;
} }
#ifdef MOZ_ENABLE_DBUS
static void DoRegisterHostApp() {
GUniquePtr<GError> error;
RefPtr<GDBusProxy> proxy = dont_AddRef(g_dbus_proxy_new_for_bus_sync(
G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, nullptr, sXdpServiceName,
sXdpDBusPath, sXdpRegistryInterfaceName, nullptr /* cancellable */,
getter_Transfers(error)));
if (error) {
NS_WARNING(
nsPrintfCString("Failed to create DBus proxy : %s\n", error->message)
.get());
return;
}
GVariantBuilder builder;
g_variant_builder_init(&builder, G_VARIANT_TYPE("(sa{sv})"));
g_variant_builder_add(&builder, "s", "org.mozilla.firefox");
GVariantBuilder dict_builder;
g_variant_builder_init(&dict_builder, G_VARIANT_TYPE("a{sv}"));
g_variant_builder_add_value(&builder, g_variant_builder_end(&dict_builder));
RefPtr<GVariant> args =
dont_AddRef(g_variant_ref_sink(g_variant_builder_end(&builder)));
widget::DBusProxyCall(proxy, "Register", args, G_DBUS_CALL_FLAGS_NONE, -1,
/* cancellable */ nullptr)
->Then(GetCurrentSerialEventTarget(), __func__,
[](const mozilla::widget::DBusCallPromise::ResolveOrRejectValue&
aValue) {
if (aValue.IsReject()) {
NS_WARNING(
"Failed to register host application for "
"portals\n");
}
});
}
void RegisterHostApp() {
static bool sInitialized = false;
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(XRE_IsParentProcess());
MOZ_ASSERT(!sInitialized);
sInitialized = true;
// Register unsandboxed application with an application ID that will be used
// in portals. It has to be called before any other portal call, which
// happens with gtk_init or in our LookAndFeel code. We also need to
// re-register again when the portal is restarted. Documentation:
// https://github.com/flatpak/xdg-desktop-portal/blob/main/data/org.freedesktop.host.portal.Registry.xml
if (IsRunningUnderFlatpakOrSnap() || g_getenv("XPCSHELL_TEST")) {
return;
}
uint32_t DBusID = g_bus_watch_name(
G_BUS_TYPE_SESSION, sXdpServiceName, G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
[](GDBusConnection*, const gchar*, const gchar*, gpointer data) -> void {
DoRegisterHostApp();
},
nullptr, nullptr, nullptr);
if (DBusID) {
RunOnShutdown([DBusID] { g_bus_unwatch_name(DBusID); });
}
}
#endif
bool IsPackagedAppFileExists() { bool IsPackagedAppFileExists() {
static bool sRunning = [] { static bool sRunning = [] {
nsresult rv; nsresult rv;

View File

@@ -49,9 +49,6 @@ bool IsPackagedAppFileExists();
inline bool IsRunningUnderFlatpakOrSnap() { inline bool IsRunningUnderFlatpakOrSnap() {
return IsRunningUnderFlatpak() || IsRunningUnderSnap(); return IsRunningUnderFlatpak() || IsRunningUnderSnap();
} }
#ifdef MOZ_ENABLE_DBUS
void RegisterHostApp();
#endif
enum class PortalKind { enum class PortalKind {
FilePicker, FilePicker,

View File

@@ -25,6 +25,7 @@
#include "nsIPowerManagerService.h" #include "nsIPowerManagerService.h"
#ifdef MOZ_ENABLE_DBUS #ifdef MOZ_ENABLE_DBUS
# include <gio/gio.h> # include <gio/gio.h>
# include "AsyncDBus.h"
# include "nsIObserverService.h" # include "nsIObserverService.h"
# include "WidgetUtilsGtk.h" # include "WidgetUtilsGtk.h"
#endif #endif
@@ -48,6 +49,13 @@ using mozilla::widget::ScreenManager;
#define NOTIFY_TOKEN 0xFA #define NOTIFY_TOKEN 0xFA
#define QUIT_TOKEN 0xFB #define QUIT_TOKEN 0xFB
#ifdef MOZ_ENABLE_DBUS
constexpr char sXdpServiceName[] = "org.freedesktop.portal.Desktop";
constexpr char sXdpDBusPath[] = "/org/freedesktop/portal/desktop";
constexpr char sXdpRegistryInterfaceName[] =
"org.freedesktop.host.portal.Registry";
#endif
LazyLogModule gWidgetLog("Widget"); LazyLogModule gWidgetLog("Widget");
LazyLogModule gWidgetDragLog("WidgetDrag"); LazyLogModule gWidgetDragLog("WidgetDrag");
LazyLogModule gWidgetWaylandLog("WidgetWayland"); LazyLogModule gWidgetWaylandLog("WidgetWayland");
@@ -165,6 +173,10 @@ nsAppShell::~nsAppShell() {
#ifdef MOZ_ENABLE_DBUS #ifdef MOZ_ENABLE_DBUS
StopDBusListening(); StopDBusListening();
if (mDBusID) {
g_bus_unwatch_name(mDBusID);
mDBusID = 0;
}
#endif #endif
mozilla::hal::Shutdown(); mozilla::hal::Shutdown();
@@ -324,6 +336,45 @@ void nsAppShell::StopDBusListening() {
} }
mTimedate1Proxy = nullptr; mTimedate1Proxy = nullptr;
} }
void nsAppShell::RegisterHostApp() {
GUniquePtr<GError> error;
RefPtr<GDBusProxy> proxy;
RefPtr<GVariant> result;
proxy = g_dbus_proxy_new_for_bus_sync(
G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, nullptr, sXdpServiceName,
sXdpDBusPath, sXdpRegistryInterfaceName, nullptr /* cancellable */,
getter_Transfers(error));
if (error) {
NS_WARNING(
nsPrintfCString("Failed to create DBus proxy : %s\n", error->message)
.get());
return;
}
GVariantBuilder builder;
g_variant_builder_init(&builder, G_VARIANT_TYPE("(sa{sv})"));
g_variant_builder_add(&builder, "s", "org.mozilla.firefox");
GVariantBuilder dict_builder;
g_variant_builder_init(&dict_builder, G_VARIANT_TYPE("a{sv}"));
g_variant_builder_add_value(&builder, g_variant_builder_end(&dict_builder));
RefPtr<GVariant> args =
dont_AddRef(g_variant_ref_sink(g_variant_builder_end(&builder)));
widget::DBusProxyCall(proxy, "Register", args, G_DBUS_CALL_FLAGS_NONE, -1,
/* cancellable */ nullptr)
->Then(GetCurrentSerialEventTarget(), __func__,
[](const mozilla::widget::DBusCallPromise::ResolveOrRejectValue&
aValue) {
if (aValue.IsReject()) {
NS_WARNING(
"Failed to register host application for "
"portals\n");
}
});
}
#endif #endif
void nsAppShell::TermSignalHandler(int signo) { void nsAppShell::TermSignalHandler(int signo) {
@@ -360,6 +411,23 @@ nsresult nsAppShell::Init() {
#ifdef MOZ_ENABLE_DBUS #ifdef MOZ_ENABLE_DBUS
if (XRE_IsParentProcess()) { if (XRE_IsParentProcess()) {
StartDBusListening(); StartDBusListening();
// Register unsandboxed application with an application ID that will be used
// in portals. It has to be called before any other portal call, which
// happens with gtk_init or in our LookAndFeel code. We also need to
// re-register again when the portal is restarted. Documentation:
// https://github.com/flatpak/xdg-desktop-portal/blob/main/data/org.freedesktop.host.portal.Registry.xml
if (!widget::IsRunningUnderFlatpakOrSnap() && !g_getenv("XPCSHELL_TEST")) {
mDBusID = g_bus_watch_name(
G_BUS_TYPE_SESSION, sXdpServiceName,
G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
[](GDBusConnection*, const gchar*, const gchar*,
gpointer data) -> void {
auto* appShell = static_cast<nsAppShell*>(data);
appShell->RegisterHostApp();
},
nullptr, this, nullptr);
}
} }
#endif #endif

View File

@@ -60,6 +60,7 @@ class nsAppShell : public nsBaseAppShell {
unsigned mTag = 0; unsigned mTag = 0;
#ifdef MOZ_ENABLE_DBUS #ifdef MOZ_ENABLE_DBUS
uint32_t mDBusID = 0;
RefPtr<GDBusProxy> mLogin1Proxy; RefPtr<GDBusProxy> mLogin1Proxy;
RefPtr<GCancellable> mLogin1ProxyCancellable; RefPtr<GCancellable> mLogin1ProxyCancellable;
RefPtr<GDBusProxy> mTimedate1Proxy; RefPtr<GDBusProxy> mTimedate1Proxy;