diff options
author | Jüri Valdmann <juri.valdmann@qt.io> | 2020-08-13 15:12:32 +0200 |
---|---|---|
committer | Jüri Valdmann <juri.valdmann@qt.io> | 2020-08-13 13:59:08 +0000 |
commit | c153fafb306d118a610d1a0acc55b54c564ae87d (patch) | |
tree | 0f0e5864a6ee8eeb157f883acfe3c14f051c9c83 | |
parent | 30a0c954b97ae86385ff022d6c101fe900295695 (diff) | |
download | qtwebengine-chromium-c153fafb306d118a610d1a0acc55b54c564ae87d.tar.gz |
Fix invalid dbus bus name error in MPRIS
Task-number: QTBUG-85626
Change-Id: I67544564d352d86d559cac21448a78ea4de38cb8
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r-- | chromium/components/system_media_controls/linux/system_media_controls_linux.cc | 23 | ||||
-rw-r--r-- | chromium/dbus/string_util.cc | 16 | ||||
-rw-r--r-- | chromium/dbus/string_util.h | 3 |
3 files changed, 38 insertions, 4 deletions
diff --git a/chromium/components/system_media_controls/linux/system_media_controls_linux.cc b/chromium/components/system_media_controls/linux/system_media_controls_linux.cc index fcaa2fbca0e..5e136979537 100644 --- a/chromium/components/system_media_controls/linux/system_media_controls_linux.cc +++ b/chromium/components/system_media_controls/linux/system_media_controls_linux.cc @@ -25,6 +25,7 @@ #include "dbus/message.h" #include "dbus/object_path.h" #include "dbus/property.h" +#include "dbus/string_util.h" #include "media/audio/audio_manager.h" namespace system_media_controls { @@ -43,6 +44,14 @@ namespace { constexpr int kNumMethodsToExport = 11; +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +const char kMprisAPIServiceNameFallback[] = + "chrome"; +#else +const char kMprisAPIServiceNameFallback[] = + "chromium"; +#endif + } // namespace const char kMprisAPIServiceNamePrefix[] = @@ -57,11 +66,17 @@ SystemMediaControlsLinux* SystemMediaControlsLinux::GetInstance() { return base::Singleton<SystemMediaControlsLinux>::get(); } +static std::string MakeServiceName() { + std::string baseName = media::AudioManager::GetGlobalAppName(); + if (baseName.size() > 100 || !dbus::IsValidServiceNameElement(baseName)) + baseName = kMprisAPIServiceNameFallback; + return std::string(kMprisAPIServiceNamePrefix) + baseName + + std::string(".instance") + + base::NumberToString(base::Process::Current().Pid()); +} + SystemMediaControlsLinux::SystemMediaControlsLinux() - : service_name_(std::string(kMprisAPIServiceNamePrefix) + - base::ToLowerASCII(media::AudioManager::GetGlobalAppName()) + - std::string(".instance") + - base::NumberToString(base::Process::Current().Pid())) + : service_name_(MakeServiceName()) { } diff --git a/chromium/dbus/string_util.cc b/chromium/dbus/string_util.cc index 7f71015c480..bb2087bee8e 100644 --- a/chromium/dbus/string_util.cc +++ b/chromium/dbus/string_util.cc @@ -45,4 +45,20 @@ bool IsValidObjectPath(const std::string& value) { return true; } +bool IsValidServiceNameElement(const std::string& value) { + if (value.empty()) + return false; + for (size_t i = 0; i < value.size(); ++i) { + const char c = value[i]; + // Each element must only contain "[A-Z][a-z][0-9]_-", but can not start with a digit. + const bool is_valid_character = + ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || + (i > 0 && '0' <= c && c <= '9') || c == '_' || c == '-'; + if (!is_valid_character) + return false; + } + + return true; +} + } // namespace dbus diff --git a/chromium/dbus/string_util.h b/chromium/dbus/string_util.h index 60c02d17418..454b14e5fb6 100644 --- a/chromium/dbus/string_util.h +++ b/chromium/dbus/string_util.h @@ -14,6 +14,9 @@ namespace dbus { // Returns true if the specified string is a valid object path. CHROME_DBUS_EXPORT bool IsValidObjectPath(const std::string& value); +// Returns true if the specified string is a valid element of a service name. +CHROME_DBUS_EXPORT bool IsValidServiceNameElement(const std::string& value); + } // namespace dbus #endif // DBUS_STRING_UTIL_H_ |