summaryrefslogtreecommitdiff
path: root/www-client/chromium/files/chromium-73-xdg-current-desktop.patch
blob: 09e3b1d2aec29dd1d9053dda68e85378dc6c90cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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/+/1541077
Reviewed-by: Lei Zhang <thestig@chromium.org>
Reviewed-by: Thomas Anderson <thomasanderson@chromium.org>
Commit-Queue: Tomáš Popela <tomas.popela@gmail.com>
Cr-Commit-Position: refs/heads/master@{#645224}
diff --git a/base/nix/xdg_util.cc b/base/nix/xdg_util.cc
index 9ff4d88..f051080 100644
--- a/base/nix/xdg_util.cc
+++ b/base/nix/xdg_util.cc
@@ -11,6 +11,7 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/path_service.h"
+#include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/third_party/xdg_user_dirs/xdg_user_dir_lookup.h"
 
@@ -57,35 +58,37 @@
   // XDG_CURRENT_DESKTOP is the newest standard circa 2012.
   std::string xdg_current_desktop;
   if (env->GetVar("XDG_CURRENT_DESKTOP", &xdg_current_desktop)) {
-    // Not all desktop environments set this env var as of this writing.
-    if (base::StartsWith(xdg_current_desktop, "Unity",
-                         base::CompareCase::SENSITIVE)) {
-      // gnome-fallback sessions set XDG_CURRENT_DESKTOP to Unity
-      // DESKTOP_SESSION can be gnome-fallback or gnome-fallback-compiz
-      std::string desktop_session;
-      if (env->GetVar("DESKTOP_SESSION", &desktop_session) &&
-          desktop_session.find("gnome-fallback") != std::string::npos) {
-        return DESKTOP_ENVIRONMENT_GNOME;
-      }
-      return DESKTOP_ENVIRONMENT_UNITY;
-    }
-    if (xdg_current_desktop == "GNOME")
-      return DESKTOP_ENVIRONMENT_GNOME;
-    if (xdg_current_desktop == "X-Cinnamon")
-      return DESKTOP_ENVIRONMENT_CINNAMON;
-    if (xdg_current_desktop == "KDE") {
-      std::string kde_session;
-      if (env->GetVar(kKDESessionEnvVar, &kde_session)) {
-        if (kde_session == "5") {
-          return DESKTOP_ENVIRONMENT_KDE5;
+    // It could have multiple values separated by colon in priority order.
+    for (const auto& value : SplitStringPiece(
+             xdg_current_desktop, ":", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY)) {
+      if (value == "Unity") {
+        // gnome-fallback sessions set XDG_CURRENT_DESKTOP to Unity
+        // DESKTOP_SESSION can be gnome-fallback or gnome-fallback-compiz
+        std::string desktop_session;
+        if (env->GetVar("DESKTOP_SESSION", &desktop_session) &&
+            desktop_session.find("gnome-fallback") != std::string::npos) {
+          return DESKTOP_ENVIRONMENT_GNOME;
         }
+        return DESKTOP_ENVIRONMENT_UNITY;
       }
-      return DESKTOP_ENVIRONMENT_KDE4;
+      if (value == "GNOME")
+        return DESKTOP_ENVIRONMENT_GNOME;
+      if (value == "X-Cinnamon")
+        return DESKTOP_ENVIRONMENT_CINNAMON;
+      if (value == "KDE") {
+        std::string kde_session;
+        if (env->GetVar(kKDESessionEnvVar, &kde_session)) {
+          if (kde_session == "5") {
+            return DESKTOP_ENVIRONMENT_KDE5;
+          }
+        }
+        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.
diff --git a/base/nix/xdg_util_unittest.cc b/base/nix/xdg_util_unittest.cc
index e195303..ad81836 100644
--- a/base/nix/xdg_util_unittest.cc
+++ b/base/nix/xdg_util_unittest.cc
@@ -34,6 +34,7 @@
 const char* const kDesktopXFCE = "xfce";
 const char* const kXdgDesktopCinnamon = "X-Cinnamon";
 const char* const kXdgDesktopGNOME = "GNOME";
+const char* const kXdgDesktopGNOMEClassic = "GNOME:GNOME-Classic";
 const char* const kXdgDesktopKDE = "KDE";
 const char* const kXdgDesktopPantheon = "Pantheon";
 const char* const kXdgDesktopUnity = "Unity";
@@ -110,6 +111,15 @@
   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) {
   MockEnvironment getter;
   EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));