Commit dd407d41 authored by Tomas Popela's avatar Tomas Popela Committed by Commit Bot

Correct the parsing of the XDG_CURRENT_DESKTOP

The XDG_CURRENT_DESKTOP could contain multiple values in priority order
separated by colon. Go through them in the loop and return on the first
one that we recognize/support.

The previous state was causing problems with Chrome on the GNOME Classic
mode (used in Red Hat Enterprise Linux 7) where the users with multiple
Google accounts set in Chrome couldn't switch between them - only one was
shown in the account switcher in i.e. GMail. The reason for that was that
the XDG_CURRENT_DESKTOP's value GNOME:GNOME-Classic was parsed as
not as base::nix::DesktopEnvironment::DESKTOP_ENVIRONMENT_GNOME.

base: :nix::DesktopEnvironment::DESKTOP_ENVIRONMENT_OTHER and
Change-Id: I122f24fd1cf5a0f932c3fccd5220152a9944609d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1541077Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Reviewed-by: default avatarThomas Anderson <thomasanderson@chromium.org>
Commit-Queue: Tomáš Popela <tomas.popela@gmail.com>
Cr-Commit-Position: refs/heads/master@{#645224}
parent 281f390d
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/files/file_util.h" #include "base/files/file_util.h"
#include "base/path_service.h" #include "base/path_service.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/third_party/xdg_user_dirs/xdg_user_dir_lookup.h" #include "base/third_party/xdg_user_dirs/xdg_user_dir_lookup.h"
...@@ -57,35 +58,37 @@ DesktopEnvironment GetDesktopEnvironment(Environment* env) { ...@@ -57,35 +58,37 @@ DesktopEnvironment GetDesktopEnvironment(Environment* env) {
// XDG_CURRENT_DESKTOP is the newest standard circa 2012. // XDG_CURRENT_DESKTOP is the newest standard circa 2012.
std::string xdg_current_desktop; std::string xdg_current_desktop;
if (env->GetVar("XDG_CURRENT_DESKTOP", &xdg_current_desktop)) { if (env->GetVar("XDG_CURRENT_DESKTOP", &xdg_current_desktop)) {
// Not all desktop environments set this env var as of this writing. // It could have multiple values separated by colon in priority order.
if (base::StartsWith(xdg_current_desktop, "Unity", for (const auto& value : SplitStringPiece(
base::CompareCase::SENSITIVE)) { xdg_current_desktop, ":", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY)) {
// gnome-fallback sessions set XDG_CURRENT_DESKTOP to Unity if (value == "Unity") {
// DESKTOP_SESSION can be gnome-fallback or gnome-fallback-compiz // gnome-fallback sessions set XDG_CURRENT_DESKTOP to Unity
std::string desktop_session; // DESKTOP_SESSION can be gnome-fallback or gnome-fallback-compiz
if (env->GetVar("DESKTOP_SESSION", &desktop_session) && std::string desktop_session;
desktop_session.find("gnome-fallback") != std::string::npos) { if (env->GetVar("DESKTOP_SESSION", &desktop_session) &&
return DESKTOP_ENVIRONMENT_GNOME; desktop_session.find("gnome-fallback") != std::string::npos) {
return DESKTOP_ENVIRONMENT_GNOME;
}
return DESKTOP_ENVIRONMENT_UNITY;
} }
return DESKTOP_ENVIRONMENT_UNITY; if (value == "GNOME")
} return DESKTOP_ENVIRONMENT_GNOME;
if (xdg_current_desktop == "GNOME") if (value == "X-Cinnamon")
return DESKTOP_ENVIRONMENT_GNOME; return DESKTOP_ENVIRONMENT_CINNAMON;
if (xdg_current_desktop == "X-Cinnamon") if (value == "KDE") {
return DESKTOP_ENVIRONMENT_CINNAMON; std::string kde_session;
if (xdg_current_desktop == "KDE") { if (env->GetVar(kKDESessionEnvVar, &kde_session)) {
std::string kde_session; if (kde_session == "5") {
if (env->GetVar(kKDESessionEnvVar, &kde_session)) { return DESKTOP_ENVIRONMENT_KDE5;
if (kde_session == "5") { }
return DESKTOP_ENVIRONMENT_KDE5;
} }
return DESKTOP_ENVIRONMENT_KDE4;
} }
return DESKTOP_ENVIRONMENT_KDE4; if (value == "Pantheon")
return DESKTOP_ENVIRONMENT_PANTHEON;
if (value == "XFCE")
return DESKTOP_ENVIRONMENT_XFCE;
} }
if (xdg_current_desktop == "Pantheon")
return DESKTOP_ENVIRONMENT_PANTHEON;
if (xdg_current_desktop == "XFCE")
return DESKTOP_ENVIRONMENT_XFCE;
} }
// DESKTOP_SESSION was what everyone used in 2010. // DESKTOP_SESSION was what everyone used in 2010.
......
...@@ -34,6 +34,7 @@ const char* const kDesktopKDE = "kde"; ...@@ -34,6 +34,7 @@ const char* const kDesktopKDE = "kde";
const char* const kDesktopXFCE = "xfce"; const char* const kDesktopXFCE = "xfce";
const char* const kXdgDesktopCinnamon = "X-Cinnamon"; const char* const kXdgDesktopCinnamon = "X-Cinnamon";
const char* const kXdgDesktopGNOME = "GNOME"; const char* const kXdgDesktopGNOME = "GNOME";
const char* const kXdgDesktopGNOMEClassic = "GNOME:GNOME-Classic";
const char* const kXdgDesktopKDE = "KDE"; const char* const kXdgDesktopKDE = "KDE";
const char* const kXdgDesktopPantheon = "Pantheon"; const char* const kXdgDesktopPantheon = "Pantheon";
const char* const kXdgDesktopUnity = "Unity"; const char* const kXdgDesktopUnity = "Unity";
...@@ -110,6 +111,15 @@ TEST(XDGUtilTest, GetXdgDesktopGnome) { ...@@ -110,6 +111,15 @@ TEST(XDGUtilTest, GetXdgDesktopGnome) {
EXPECT_EQ(DESKTOP_ENVIRONMENT_GNOME, GetDesktopEnvironment(&getter)); EXPECT_EQ(DESKTOP_ENVIRONMENT_GNOME, GetDesktopEnvironment(&getter));
} }
TEST(XDGUtilTest, GetXdgDesktopGnomeClassic) {
MockEnvironment getter;
EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
EXPECT_CALL(getter, GetVar(Eq(kXdgDesktop), _))
.WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopGNOMEClassic), Return(true)));
EXPECT_EQ(DESKTOP_ENVIRONMENT_GNOME, GetDesktopEnvironment(&getter));
}
TEST(XDGUtilTest, GetXdgDesktopGnomeFallback) { TEST(XDGUtilTest, GetXdgDesktopGnomeFallback) {
MockEnvironment getter; MockEnvironment getter;
EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false)); EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment