OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/notifications/notification_platform_bridge_linux.h" | 5 #include "chrome/browser/notifications/notification_platform_bridge_linux.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <memory> | 8 #include <memory> |
9 #include <set> | 9 #include <set> |
10 #include <sstream> | 10 #include <sstream> |
(...skipping 14 matching lines...) Expand all Loading... |
25 #include "base/task_scheduler/post_task.h" | 25 #include "base/task_scheduler/post_task.h" |
26 #include "base/version.h" | 26 #include "base/version.h" |
27 #include "chrome/browser/browser_process.h" | 27 #include "chrome/browser/browser_process.h" |
28 #include "chrome/browser/chrome_notification_types.h" | 28 #include "chrome/browser/chrome_notification_types.h" |
29 #include "chrome/browser/notifications/native_notification_display_service.h" | 29 #include "chrome/browser/notifications/native_notification_display_service.h" |
30 #include "chrome/browser/notifications/notification.h" | 30 #include "chrome/browser/notifications/notification.h" |
31 #include "chrome/browser/notifications/notification_display_service_factory.h" | 31 #include "chrome/browser/notifications/notification_display_service_factory.h" |
32 #include "chrome/browser/profiles/profile_manager.h" | 32 #include "chrome/browser/profiles/profile_manager.h" |
33 #include "chrome/browser/shell_integration_linux.h" | 33 #include "chrome/browser/shell_integration_linux.h" |
34 #include "chrome/grit/generated_resources.h" | 34 #include "chrome/grit/generated_resources.h" |
| 35 #include "components/url_formatter/elide_url.h" |
35 #include "content/public/browser/browser_thread.h" | 36 #include "content/public/browser/browser_thread.h" |
36 #include "content/public/browser/notification_service.h" | 37 #include "content/public/browser/notification_service.h" |
37 #include "dbus/bus.h" | 38 #include "dbus/bus.h" |
38 #include "dbus/message.h" | 39 #include "dbus/message.h" |
39 #include "dbus/object_proxy.h" | 40 #include "dbus/object_proxy.h" |
40 #include "net/base/escape.h" | 41 #include "net/base/escape.h" |
41 #include "skia/ext/image_operations.h" | 42 #include "skia/ext/image_operations.h" |
42 #include "ui/base/l10n/l10n_util.h" | 43 #include "ui/base/l10n/l10n_util.h" |
43 #include "ui/gfx/image/image_skia.h" | 44 #include "ui/gfx/image/image_skia.h" |
44 | 45 |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 NOTREACHED(); | 130 NOTREACHED(); |
130 case message_center::DEFAULT_PRIORITY: | 131 case message_center::DEFAULT_PRIORITY: |
131 return NORMAL; | 132 return NORMAL; |
132 } | 133 } |
133 } | 134 } |
134 | 135 |
135 // Constrain |image|'s size to |kMaxImageWidth|x|kMaxImageHeight|. If | 136 // Constrain |image|'s size to |kMaxImageWidth|x|kMaxImageHeight|. If |
136 // the image does not need to be resized, or the image is empty, | 137 // the image does not need to be resized, or the image is empty, |
137 // returns |image| directly. | 138 // returns |image| directly. |
138 gfx::Image ResizeImageToFdoMaxSize(const gfx::Image& image) { | 139 gfx::Image ResizeImageToFdoMaxSize(const gfx::Image& image) { |
| 140 DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
139 if (image.IsEmpty()) | 141 if (image.IsEmpty()) |
140 return image; | 142 return image; |
141 int width = image.Width(); | 143 int width = image.Width(); |
142 int height = image.Height(); | 144 int height = image.Height(); |
143 if (width <= kMaxImageWidth && height <= kMaxImageHeight) { | 145 if (width <= kMaxImageWidth && height <= kMaxImageHeight) { |
144 return image; | 146 return image; |
145 } | 147 } |
146 const SkBitmap* image_bitmap = image.ToSkBitmap(); | 148 const SkBitmap* image_bitmap = image.ToSkBitmap(); |
147 double scale = std::min(static_cast<double>(kMaxImageWidth) / width, | 149 double scale = std::min(static_cast<double>(kMaxImageWidth) / width, |
148 static_cast<double>(kMaxImageHeight) / height); | 150 static_cast<double>(kMaxImageHeight) / height); |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
512 // app_icon passed implicitly via desktop-entry. | 514 // app_icon passed implicitly via desktop-entry. |
513 writer.AppendString(""); | 515 writer.AppendString(""); |
514 | 516 |
515 writer.AppendString( | 517 writer.AppendString( |
516 base::UTF16ToUTF8(CreateNotificationTitle(*notification))); | 518 base::UTF16ToUTF8(CreateNotificationTitle(*notification))); |
517 | 519 |
518 std::ostringstream body; | 520 std::ostringstream body; |
519 if (base::ContainsKey(capabilities_, kCapabilityBody)) { | 521 if (base::ContainsKey(capabilities_, kCapabilityBody)) { |
520 const bool body_markup = | 522 const bool body_markup = |
521 base::ContainsKey(capabilities_, kCapabilityBodyMarkup); | 523 base::ContainsKey(capabilities_, kCapabilityBodyMarkup); |
| 524 |
| 525 if (notification->UseOriginAsContextMessage()) { |
| 526 std::string url_display_text = net::EscapeForHTML( |
| 527 base::UTF16ToUTF8(url_formatter::FormatUrlForSecurityDisplay( |
| 528 notification->origin_url(), |
| 529 url_formatter::SchemeDisplay::OMIT_HTTP_AND_HTTPS))); |
| 530 if (base::ContainsKey(capabilities_, kCapabilityBodyHyperlinks)) { |
| 531 body << "<a href=\"" |
| 532 << net::EscapePath(notification->origin_url().spec()) << "\">" |
| 533 << url_display_text << "</a>"; |
| 534 } else { |
| 535 body << url_display_text; |
| 536 } |
| 537 } else if (!notification->context_message().empty()) { |
| 538 std::string context = |
| 539 base::UTF16ToUTF8(notification->context_message()); |
| 540 if (body_markup) |
| 541 context = net::EscapeForHTML(context); |
| 542 body << context; |
| 543 } |
| 544 |
522 std::string message = base::UTF16ToUTF8(notification->message()); | 545 std::string message = base::UTF16ToUTF8(notification->message()); |
523 if (body_markup) { | 546 if (body_markup) |
524 base::ReplaceSubstringsAfterOffset(&message, 0, "&", "&"); | 547 message = net::EscapeForHTML(message); |
525 base::ReplaceSubstringsAfterOffset(&message, 0, "<", "<"); | 548 if (body.tellp()) |
526 base::ReplaceSubstringsAfterOffset(&message, 0, ">", ">"); | 549 body << "\n"; |
527 } | |
528 body << message; | 550 body << message; |
529 | 551 |
530 if (notification->type() == message_center::NOTIFICATION_TYPE_MULTIPLE) { | 552 if (notification->type() == message_center::NOTIFICATION_TYPE_MULTIPLE) { |
531 for (const auto& item : notification->items()) { | 553 for (const auto& item : notification->items()) { |
532 if (body.tellp()) | 554 if (body.tellp()) |
533 body << "\n"; | 555 body << "\n"; |
534 const std::string title = base::UTF16ToUTF8(item.title); | 556 const std::string title = base::UTF16ToUTF8(item.title); |
535 const std::string message = base::UTF16ToUTF8(item.message); | 557 const std::string message = base::UTF16ToUTF8(item.message); |
536 // TODO(peter): Figure out the right way to internationalize | 558 // TODO(peter): Figure out the right way to internationalize |
537 // this for RTL languages. | 559 // this for RTL languages. |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
904 } | 926 } |
905 | 927 |
906 void NotificationPlatformBridgeLinux::SetReadyCallback( | 928 void NotificationPlatformBridgeLinux::SetReadyCallback( |
907 NotificationBridgeReadyCallback callback) { | 929 NotificationBridgeReadyCallback callback) { |
908 impl_->SetReadyCallback(std::move(callback)); | 930 impl_->SetReadyCallback(std::move(callback)); |
909 } | 931 } |
910 | 932 |
911 void NotificationPlatformBridgeLinux::CleanUp() { | 933 void NotificationPlatformBridgeLinux::CleanUp() { |
912 impl_->CleanUp(); | 934 impl_->CleanUp(); |
913 } | 935 } |
OLD | NEW |