0

Propagate LinuxUi state to print utility subprocess

This is required to prevent loading a different version of GTK in the
print utility process which may cause printer enumeration to differ.

R=thestig

Bug: 414635403, 411336538
Change-Id: I01df9fcf0f04a8259d7fa50e7fabe34b0a914d31
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6514352
Commit-Queue: Colin Blundell <blundell@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Auto-Submit: Thomas Anderson <thomasanderson@chromium.org>
Reviewed-by: Colin Blundell <blundell@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1456790}
This commit is contained in:
Tom Anderson
2025-05-07 00:44:57 -07:00
committed by Chromium LUCI CQ
parent fd829ced2b
commit 4d44e5915a
13 changed files with 54 additions and 10 deletions

@ -38,6 +38,7 @@
#if BUILDFLAG(IS_LINUX) #if BUILDFLAG(IS_LINUX)
#include "content/public/common/content_switches.h" #include "content/public/common/content_switches.h"
#include "ui/linux/linux_ui.h"
#endif #endif
#if BUILDFLAG(IS_WIN) #if BUILDFLAG(IS_WIN)
@ -878,14 +879,19 @@ PrintBackendServiceManager::GetServiceFromBundle(
<< (sandboxed ? "sandboxed" : "unsandboxed") << " for `" << (sandboxed ? "sandboxed" : "unsandboxed") << " for `"
<< remote_id << "`"; << remote_id << "`";
std::vector<std::string> extra_switches;
#if BUILDFLAG(IS_LINUX)
if (auto* linux_ui = ui::LinuxUi::instance()) {
extra_switches = linux_ui->GetCmdLineFlagsForCopy();
}
extra_switches.push_back(switches::kMessageLoopTypeUi);
#endif
mojo::Remote<T>& host = bundle->host; mojo::Remote<T>& host = bundle->host;
content::ServiceProcessHost::Launch( content::ServiceProcessHost::Launch(
host.BindNewPipeAndPassReceiver(), host.BindNewPipeAndPassReceiver(),
content::ServiceProcessHost::Options() content::ServiceProcessHost::Options()
.WithDisplayName(IDS_UTILITY_PROCESS_PRINT_BACKEND_SERVICE_NAME) .WithDisplayName(IDS_UTILITY_PROCESS_PRINT_BACKEND_SERVICE_NAME)
#if BUILDFLAG(IS_LINUX) .WithExtraCommandLineSwitches(std::move(extra_switches))
.WithExtraCommandLineSwitches({switches::kMessageLoopTypeUi})
#endif
.Pass()); .Pass());
host->BindBackend(service.BindNewPipeAndPassReceiver()); host->BindBackend(service.BindNewPipeAndPassReceiver());

@ -33,6 +33,10 @@ const char kSystemFontFamily[] = "system-font-family";
#if BUILDFLAG(IS_LINUX) #if BUILDFLAG(IS_LINUX)
// Specify the toolkit used to construct the Linux GUI. // Specify the toolkit used to construct the Linux GUI.
const char kUiToolkitFlag[] = "ui-toolkit"; const char kUiToolkitFlag[] = "ui-toolkit";
// Specify the GTK version to be loaded.
const char kGtkVersionFlag[] = "gtk-version";
// Specify the QT version to be loaded.
const char kQtVersionFlag[] = "qt-version";
// Disables GTK IME integration. // Disables GTK IME integration.
const char kDisableGtkIme[] = "disable-gtk-ime"; const char kDisableGtkIme[] = "disable-gtk-ime";
#endif #endif

@ -28,6 +28,8 @@ COMPONENT_EXPORT(UI_BASE) extern const char kSystemFontFamily[];
#if BUILDFLAG(IS_LINUX) #if BUILDFLAG(IS_LINUX)
COMPONENT_EXPORT(UI_BASE) extern const char kUiToolkitFlag[]; COMPONENT_EXPORT(UI_BASE) extern const char kUiToolkitFlag[];
COMPONENT_EXPORT(UI_BASE) extern const char kGtkVersionFlag[];
COMPONENT_EXPORT(UI_BASE) extern const char kQtVersionFlag[];
COMPONENT_EXPORT(UI_BASE) extern const char kDisableGtkIme[]; COMPONENT_EXPORT(UI_BASE) extern const char kDisableGtkIme[];
#endif #endif

@ -15,6 +15,7 @@
#include "base/nix/xdg_util.h" #include "base/nix/xdg_util.h"
#include "base/no_destructor.h" #include "base/no_destructor.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "ui/base/ui_base_switches.h"
#include "ui/gfx/color_palette.h" #include "ui/gfx/color_palette.h"
#include "ui/gtk/gtk_stubs.h" #include "ui/gtk/gtk_stubs.h"
#include "ui/gtk/ime_compat_check.h" #include "ui/gtk/ime_compat_check.h"
@ -26,8 +27,6 @@ namespace gtk {
namespace { namespace {
const char kGtkVersionFlag[] = "gtk-version";
struct Gdk3Rgba { struct Gdk3Rgba {
gdouble r; gdouble r;
gdouble g; gdouble g;
@ -136,7 +135,7 @@ bool LoadGtkImpl() {
auto* cmd = base::CommandLine::ForCurrentProcess(); auto* cmd = base::CommandLine::ForCurrentProcess();
unsigned int gtk_version; unsigned int gtk_version;
if (!base::StringToUint(cmd->GetSwitchValueASCII(kGtkVersionFlag), if (!base::StringToUint(cmd->GetSwitchValueASCII(switches::kGtkVersionFlag),
&gtk_version)) { &gtk_version)) {
gtk_version = 0; gtk_version = 0;
} }

@ -30,6 +30,7 @@
#include "base/nix/xdg_util.h" #include "base/nix/xdg_util.h"
#include "base/numerics/safe_conversions.h" #include "base/numerics/safe_conversions.h"
#include "base/observer_list.h" #include "base/observer_list.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h" #include "base/strings/string_split.h"
#include "chrome/browser/themes/theme_properties.h" // nogncheck #include "chrome/browser/themes/theme_properties.h" // nogncheck
#include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkBitmap.h"
@ -552,6 +553,15 @@ bool GtkUi::PreferDarkTheme() const {
return dark; return dark;
} }
std::vector<std::string> GtkUi::GetCmdLineFlagsForCopy() const {
const auto& gtk_version = GtkVersion();
uint32_t major_version =
gtk_version.IsValid() ? gtk_version.components()[0] : 0;
return {std::string(switches::kUiToolkitFlag) + "=gtk",
std::string(switches::kGtkVersionFlag) + "=" +
base::NumberToString(major_version)};
}
void GtkUi::SetDarkTheme(bool dark) { void GtkUi::SetDarkTheme(bool dark) {
auto* settings = gtk_settings_get_default(); auto* settings = gtk_settings_get_default();
g_object_set(settings, "gtk-application-prefer-dark-theme", dark, nullptr); g_object_set(settings, "gtk-application-prefer-dark-theme", dark, nullptr);

@ -94,6 +94,7 @@ class GtkUi : public ui::LinuxUiAndTheme {
ui::WindowButtonOrderObserver* observer) override; ui::WindowButtonOrderObserver* observer) override;
WindowFrameAction GetWindowFrameAction( WindowFrameAction GetWindowFrameAction(
WindowFrameActionSource source) override; WindowFrameActionSource source) override;
std::vector<std::string> GetCmdLineFlagsForCopy() const override;
// ui::LinuxUiTheme: // ui::LinuxUiTheme:
ui::NativeTheme* GetNativeTheme() const override; ui::NativeTheme* GetNativeTheme() const override;

@ -89,6 +89,10 @@ LinuxUi::WindowFrameAction FakeLinuxUi::GetWindowFrameAction(
return WindowFrameAction::kNone; return WindowFrameAction::kNone;
} }
std::vector<std::string> FakeLinuxUi::GetCmdLineFlagsForCopy() const {
return {};
}
bool FakeLinuxUi::PreferDarkTheme() const { bool FakeLinuxUi::PreferDarkTheme() const {
return false; return false;
} }

@ -47,6 +47,7 @@ class FakeLinuxUi : public LinuxUiAndTheme {
ui::WindowButtonOrderObserver* observer) override; ui::WindowButtonOrderObserver* observer) override;
WindowFrameAction GetWindowFrameAction( WindowFrameAction GetWindowFrameAction(
WindowFrameActionSource source) override; WindowFrameActionSource source) override;
std::vector<std::string> GetCmdLineFlagsForCopy() const override;
// ui::LinuxUiTheme: // ui::LinuxUiTheme:
ui::NativeTheme* GetNativeTheme() const override; ui::NativeTheme* GetNativeTheme() const override;

@ -6,6 +6,7 @@
#include "base/time/time.h" #include "base/time/time.h"
#include "ui/base/ime/linux/linux_input_method_context.h" #include "ui/base/ime/linux/linux_input_method_context.h"
#include "ui/base/ui_base_switches.h"
#include "ui/events/keycodes/dom/dom_keyboard_layout_map.h" #include "ui/events/keycodes/dom/dom_keyboard_layout_map.h"
#include "ui/gfx/font_render_params.h" #include "ui/gfx/font_render_params.h"
#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size.h"
@ -116,6 +117,10 @@ LinuxUi::WindowFrameAction FallbackLinuxUi::GetWindowFrameAction(
} }
} }
std::vector<std::string> FallbackLinuxUi::GetCmdLineFlagsForCopy() const {
return {std::string(switches::kUiToolkitFlag) + "=fallback"};
}
bool FallbackLinuxUi::PreferDarkTheme() const { bool FallbackLinuxUi::PreferDarkTheme() const {
return theme_is_dark_; return theme_is_dark_;
} }

@ -50,6 +50,7 @@ class FallbackLinuxUi : public LinuxUiAndTheme {
ui::WindowButtonOrderObserver* observer) override; ui::WindowButtonOrderObserver* observer) override;
WindowFrameAction GetWindowFrameAction( WindowFrameAction GetWindowFrameAction(
WindowFrameActionSource source) override; WindowFrameActionSource source) override;
std::vector<std::string> GetCmdLineFlagsForCopy() const override;
// ui::LinuxUiTheme: // ui::LinuxUiTheme:
ui::NativeTheme* GetNativeTheme() const override; ui::NativeTheme* GetNativeTheme() const override;

@ -205,6 +205,10 @@ class COMPONENT_EXPORT(LINUX_UI) LinuxUi {
virtual WindowFrameAction GetWindowFrameAction( virtual WindowFrameAction GetWindowFrameAction(
WindowFrameActionSource source) = 0; WindowFrameActionSource source) = 0;
// Returns the command line flags that should be copied to subprocesses
// to have the same toolkit and version as this process.
virtual std::vector<std::string> GetCmdLineFlagsForCopy() const = 0;
protected: protected:
struct CmdLineArgs { struct CmdLineArgs {
CmdLineArgs(); CmdLineArgs();

@ -33,6 +33,7 @@
#include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/ime/linux/linux_input_method_context.h" #include "ui/base/ime/linux/linux_input_method_context.h"
#include "ui/base/ime/text_edit_commands.h" #include "ui/base/ime/text_edit_commands.h"
#include "ui/base/ui_base_switches.h"
#include "ui/color/color_mixer.h" #include "ui/color/color_mixer.h"
#include "ui/color/color_provider.h" #include "ui/color/color_provider.h"
#include "ui/color/color_provider_manager.h" #include "ui/color/color_provider_manager.h"
@ -61,16 +62,15 @@ namespace qt {
namespace { namespace {
const char kQtVersionFlag[] = "qt-version";
void* LoadLibrary(const base::FilePath& path) { void* LoadLibrary(const base::FilePath& path) {
return dlopen(path.value().c_str(), RTLD_NOW | RTLD_GLOBAL); return dlopen(path.value().c_str(), RTLD_NOW | RTLD_GLOBAL);
} }
bool PreferQt6() { bool PreferQt6() {
auto* cmd = base::CommandLine::ForCurrentProcess(); auto* cmd = base::CommandLine::ForCurrentProcess();
if (cmd->HasSwitch(kQtVersionFlag)) { if (cmd->HasSwitch(switches::kQtVersionFlag)) {
std::string qt_version_string = cmd->GetSwitchValueASCII(kQtVersionFlag); std::string qt_version_string =
cmd->GetSwitchValueASCII(switches::kQtVersionFlag);
unsigned int qt_version = 0; unsigned int qt_version = 0;
if (base::StringToUint(qt_version_string, &qt_version)) { if (base::StringToUint(qt_version_string, &qt_version)) {
switch (qt_version) { switch (qt_version) {
@ -395,6 +395,12 @@ QtUi::WindowFrameAction QtUi::GetWindowFrameAction(
} }
} }
std::vector<std::string> QtUi::GetCmdLineFlagsForCopy() const {
return {std::string(switches::kUiToolkitFlag) + "=qt",
std::string(switches::kQtVersionFlag) + "=" +
base::NumberToString(qt_version_)};
}
DISABLE_CFI_VCALL DISABLE_CFI_VCALL
bool QtUi::PreferDarkTheme() const { bool QtUi::PreferDarkTheme() const {
return color_utils::IsDark( return color_utils::IsDark(

@ -65,6 +65,7 @@ class QtUi : public ui::LinuxUiAndTheme, QtInterface::Delegate {
ui::WindowButtonOrderObserver* observer) override; ui::WindowButtonOrderObserver* observer) override;
WindowFrameAction GetWindowFrameAction( WindowFrameAction GetWindowFrameAction(
WindowFrameActionSource source) override; WindowFrameActionSource source) override;
std::vector<std::string> GetCmdLineFlagsForCopy() const override;
// ui::LinuxUiTheme: // ui::LinuxUiTheme:
ui::NativeTheme* GetNativeTheme() const override; ui::NativeTheme* GetNativeTheme() const override;