From 69df09dc90e990a6282992b1d25ac694a0187dc8 Mon Sep 17 00:00:00 2001 From: Orko Garai Date: Thu, 5 Sep 2024 14:07:10 -0400 Subject: [PATCH] fix: Launch apps with XDG_ACTIVATION_TOKEN in ozone/wayland (#43480) * fix: Launch apps with XDG_ACTIVATION_TOKEN in ozone/wayland Ensure apps are launched with the activation token received from xdg_activation_v1 protocol. * add focus_launched_process option --- shell/common/platform_util_linux.cc | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/shell/common/platform_util_linux.cc b/shell/common/platform_util_linux.cc index bfa76da244..820135237e 100644 --- a/shell/common/platform_util_linux.cc +++ b/shell/common/platform_util_linux.cc @@ -23,6 +23,7 @@ #include "base/posix/eintr_wrapper.h" #include "base/process/kill.h" #include "base/process/launch.h" +#include "base/run_loop.h" #include "base/strings/escape.h" #include "base/strings/string_util.h" #include "base/threading/thread_restrictions.h" @@ -270,8 +271,21 @@ std::string GetErrorDescription(int error_code) { bool XDGUtil(const std::vector& argv, const base::FilePath& working_directory, const bool wait_for_exit, + const bool focus_launched_process, platform_util::OpenCallback callback) { base::LaunchOptions options; + if (focus_launched_process) { + base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed); + base::RepeatingClosure quit_loop = run_loop.QuitClosure(); + base::nix::CreateLaunchOptionsWithXdgActivation(base::BindOnce( + [](base::RepeatingClosure quit_loop, base::LaunchOptions* options_out, + base::LaunchOptions options) { + *options_out = std::move(options); + std::move(quit_loop).Run(); + }, + std::move(quit_loop), &options)); + run_loop.Run(); + } options.current_directory = working_directory; options.allow_new_privs = true; // xdg-open can fall back on mailcap which eventually might plumb through @@ -303,11 +317,12 @@ bool XDGOpen(const base::FilePath& working_directory, const bool wait_for_exit, platform_util::OpenCallback callback) { return XDGUtil({"xdg-open", path}, working_directory, wait_for_exit, - std::move(callback)); + /*focus_launched_process=*/true, std::move(callback)); } bool XDGEmail(const std::string& email, const bool wait_for_exit) { return XDGUtil({"xdg-email", email}, base::FilePath(), wait_for_exit, + /*focus_launched_process=*/true, platform_util::OpenCallback()); } @@ -376,7 +391,8 @@ bool MoveItemToTrash(const base::FilePath& full_path, bool delete_on_fail) { argv = {"gio", "trash", filename}; } - return XDGUtil(argv, base::FilePath(), true, platform_util::OpenCallback()); + return XDGUtil(argv, base::FilePath(), true, /*focus_launched_process=*/false, + platform_util::OpenCallback()); } namespace internal {