Index: chrome/browser/notifications/notification_platform_bridge_linux.cc |
diff --git a/chrome/browser/notifications/notification_platform_bridge_linux.cc b/chrome/browser/notifications/notification_platform_bridge_linux.cc |
index dfd306ce06c18476918e433156a6a8a0a5fc4d6f..aa3a6efc57271c5443f25d7acfd1bbb44f051a31 100644 |
--- a/chrome/browser/notifications/notification_platform_bridge_linux.cc |
+++ b/chrome/browser/notifications/notification_platform_bridge_linux.cc |
@@ -17,9 +17,11 @@ |
#include "base/metrics/histogram_macros.h" |
#include "base/strings/nullable_string16.h" |
#include "base/strings/string_number_conversions.h" |
+#include "base/strings/string_split.h" |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/task_scheduler/post_task.h" |
+#include "base/version.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/chrome_notification_types.h" |
#include "chrome/browser/notifications/native_notification_display_service.h" |
@@ -51,6 +53,7 @@ enum class ConnectionInitializationStatusCode { |
NATIVE_NOTIFICATIONS_NOT_SUPPORTED = 1, |
MISSING_REQUIRED_CAPABILITIES = 2, |
COULD_NOT_CONNECT_TO_SIGNALS = 3, |
+ INCOMPATIBLE_SPEC_VERSION = 4, |
NUM_ITEMS |
}; |
@@ -347,6 +350,30 @@ class NotificationPlatformBridgeLinuxImpl |
} |
RecordMetricsForCapabilities(); |
+ dbus::MethodCall get_server_information_call(kFreedesktopNotificationsName, |
+ "GetServerInformation"); |
+ std::unique_ptr<dbus::Response> server_information_response = |
+ notification_proxy_->CallMethodAndBlock( |
+ &get_server_information_call, |
+ dbus::ObjectProxy::TIMEOUT_USE_DEFAULT); |
+ if (server_information_response) { |
+ dbus::MessageReader reader(server_information_response.get()); |
+ std::string spec_version; |
+ reader.PopString(&spec_version); // name |
+ reader.PopString(&spec_version); // vendor |
+ reader.PopString(&spec_version); // version |
+ reader.PopString(&spec_version); // spec_version |
+ spec_version_ = base::Version(spec_version); |
+ } |
+ // The minimum supported spec version is 1.1, because this was the |
+ // version that added image hints. |
+ if (!spec_version_.IsValid() || |
+ spec_version_ < base::Version(std::vector<uint32_t>{1, 1})) { |
+ OnConnectionInitializationFinishedOnTaskRunner( |
+ ConnectionInitializationStatusCode::INCOMPATIBLE_SPEC_VERSION); |
+ return; |
+ } |
+ |
connected_signals_barrier_ = base::BarrierClosure( |
2, base::Bind(&NotificationPlatformBridgeLinuxImpl:: |
OnConnectionInitializationFinishedOnTaskRunner, |
@@ -472,7 +499,10 @@ class NotificationPlatformBridgeLinuxImpl |
if (icon_file) { |
dbus::MessageWriter image_path_writer(nullptr); |
hints_writer.OpenDictEntry(&image_path_writer); |
- image_path_writer.AppendString("image-path"); |
+ image_path_writer.AppendString( |
+ spec_version_ == base::Version(std::vector<uint32_t>{1, 1}) |
+ ? "image_path" |
+ : "image-path"); |
image_path_writer.AppendVariantOfString(icon_file->file_path().value()); |
hints_writer.CloseContainer(&image_path_writer); |
data->resource_files.push_back(std::move(icon_file)); |
@@ -700,6 +730,8 @@ class NotificationPlatformBridgeLinuxImpl |
std::unordered_set<std::string> capabilities_; |
+ base::Version spec_version_; |
+ |
base::Closure connected_signals_barrier_; |
// A std::set<std::unique_ptr<T>> doesn't work well because |