fix: Use XDG_ACTIVATION_TOKEN in wayland when launched by other app (#43481)

When an electron app is launched by another app ensure that the
XDG_ACTIVATION_TOKEN env var is read and used for activation using
xdg_activation_v1 protocol.
This commit is contained in:
Orko Garai 2024-09-04 06:54:00 -04:00 коммит произвёл GitHub
Родитель 635d421123
Коммит 53dcda1fe9
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
2 изменённых файлов: 25 добавлений и 0 удалений

Просмотреть файл

@ -406,6 +406,11 @@ std::optional<int> ElectronMainDelegate::PreBrowserMain() {
content::InitializeMojoCore();
#if BUILDFLAG(IS_MAC)
RegisterAtomCrApp();
#endif
#if BUILDFLAG(IS_LINUX)
// Set the global activation token sent as an environment variable.
auto env = base::Environment::Create();
base::nix::ExtractXdgActivationTokenFromEnv(*env);
#endif
return std::nullopt;
}

Просмотреть файл

@ -92,6 +92,11 @@
#include "shell/browser/ui/cocoa/electron_bundle_mover.h"
#endif
#if BUILDFLAG(IS_LINUX)
#include "base/nix/scoped_xdg_activation_token_injector.h"
#include "base/nix/xdg_util.h"
#endif
using electron::Browser;
namespace gin {
@ -411,6 +416,12 @@ bool NotificationCallbackWrapper(
base::CommandLine cmd,
const base::FilePath& cwd,
const std::vector<uint8_t> additional_data) {
#if BUILDFLAG(IS_LINUX)
// Set the global activation token sent as a command line switch by another
// electron app instance. This also removes the switch after use to prevent
// any side effects of leaving it in the command line after this point.
base::nix::ExtractXdgActivationTokenFromCmdLine(cmd);
#endif
// Make sure the callback is called after app gets ready.
if (Browser::Get()->is_ready()) {
callback.Run(std::move(cmd), cwd, std::move(additional_data));
@ -1022,6 +1033,15 @@ bool App::RequestSingleInstanceLock(gin::Arguments* args) {
base::BindRepeating(NotificationCallbackWrapper, cb));
#endif
#if BUILDFLAG(IS_LINUX)
// Read the xdg-activation token and set it in the command line for the
// duration of the notification in order to ensure this is propagated to an
// already running electron app instance if it exists.
// The activation token received from the launching app is used later when
// activating the existing electron app instance window.
base::nix::ScopedXdgActivationTokenInjector activation_token_injector(
*base::CommandLine::ForCurrentProcess(), *base::Environment::Create());
#endif
switch (process_singleton_->NotifyOtherProcessOrCreate()) {
case ProcessSingleton::NotifyResult::PROCESS_NONE:
if (content::BrowserThread::IsThreadInitialized(