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 4d0ec1152c7a4d815b4e8d6af4029a3744783c15..6d8cbc79b603b539ba1a1816bd7a4d27e224164c 100644 |
--- a/chrome/browser/notifications/notification_platform_bridge_linux.cc |
+++ b/chrome/browser/notifications/notification_platform_bridge_linux.cc |
@@ -5,6 +5,11 @@ |
#include "chrome/browser/notifications/notification_platform_bridge_linux.h" |
#include <algorithm> |
+#include <memory> |
+#include <set> |
+#include <unordered_map> |
+#include <utility> |
+#include <vector> |
Tom (Use chromium acct)
2017/05/03 21:42:56
out of curiosity, did you do this by hand?
Lei Zhang
2017/05/03 21:45:24
"git cl lint" checks for these.
|
#include "base/barrier_closure.h" |
#include "base/files/file_util.h" |
@@ -72,12 +77,11 @@ void ProfileLoadedCallback(NotificationCommon::Operation operation, |
if (!profile) |
return; |
- NotificationDisplayService* display_service = |
- NotificationDisplayServiceFactory::GetForProfile(profile); |
- |
- static_cast<NativeNotificationDisplayService*>(display_service) |
- ->ProcessNotificationOperation(operation, notification_type, origin, |
- notification_id, action_index, reply); |
+ auto* display_service = static_cast<NativeNotificationDisplayService*>( |
+ NotificationDisplayServiceFactory::GetForProfile(profile)); |
+ display_service->ProcessNotificationOperation(operation, notification_type, |
+ origin, notification_id, |
+ action_index, reply); |
} |
void ForwardNotificationOperationOnUiThread( |
@@ -89,30 +93,45 @@ void ForwardNotificationOperationOnUiThread( |
const std::string& profile_id, |
bool is_incognito) { |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
- ProfileManager* profile_manager = g_browser_process->profile_manager(); |
- |
- profile_manager->LoadProfile( |
+ g_browser_process->profile_manager()->LoadProfile( |
profile_id, is_incognito, |
base::Bind(&ProfileLoadedCallback, operation, notification_type, origin, |
notification_id, action_index, base::NullableString16())); |
} |
-// Writes |data| to a new temporary file and returns its path. |
-// Returns base::FilePath() on failure. |
-base::FilePath WriteDataToTmpFile( |
+class ResourceFile { |
+ public: |
+ explicit ResourceFile(const base::FilePath& file_path) |
+ : file_path_(file_path) { |
+ DCHECK(!file_path.empty()); |
+ } |
+ ~ResourceFile() { base::DeleteFile(file_path_, false); } |
+ |
+ const base::FilePath& file_path() const { return file_path_; } |
+ |
+ private: |
+ const base::FilePath file_path_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ResourceFile); |
+}; |
+ |
+// Writes |data| to a new temporary file and returns the ResourceFile |
+// that holds it. |
+std::unique_ptr<ResourceFile> WriteDataToTmpFile( |
const scoped_refptr<base::RefCountedMemory>& data) { |
int data_len = data->size(); |
if (data_len == 0) |
- return base::FilePath(); |
+ return nullptr; |
base::FilePath file_path; |
if (!base::CreateTemporaryFile(&file_path)) |
- return base::FilePath(); |
+ return nullptr; |
+ |
+ auto resource_file = base::MakeUnique<ResourceFile>(file_path); |
if (base::WriteFile(file_path, data->front_as<char>(), data_len) != |
data_len) { |
- base::DeleteFile(file_path, false); |
- return base::FilePath(); |
+ resource_file.reset(); |
} |
- return file_path; |
+ return resource_file; |
} |
} // namespace |
@@ -208,13 +227,6 @@ class NotificationPlatformBridgeLinuxImpl |
private: |
friend class base::RefCountedThreadSafe<NotificationPlatformBridgeLinuxImpl>; |
- struct ResourceFile { |
- explicit ResourceFile(const base::FilePath& file_path) |
- : file_path(file_path) {} |
- ~ResourceFile() { base::DeleteFile(file_path, false); } |
- const base::FilePath file_path; |
- }; |
- |
struct NotificationData { |
NotificationData(NotificationCommon::Type notification_type, |
const std::string& notification_id, |
@@ -412,15 +424,15 @@ class NotificationPlatformBridgeLinuxImpl |
desktop_entry_writer.AppendVariantOfString(desktop_file.value()); |
hints_writer.CloseContainer(&desktop_entry_writer); |
- base::FilePath icon_file = |
+ std::unique_ptr<ResourceFile> icon_file = |
WriteDataToTmpFile(notification->icon().As1xPNGBytes()); |
- if (!icon_file.empty()) { |
+ if (icon_file) { |
dbus::MessageWriter image_path_writer(nullptr); |
hints_writer.OpenDictEntry(&image_path_writer); |
image_path_writer.AppendString("image-path"); |
- image_path_writer.AppendVariantOfString(icon_file.value()); |
+ image_path_writer.AppendVariantOfString(icon_file->file_path().value()); |
hints_writer.CloseContainer(&image_path_writer); |
- data->resource_files.push_back(base::MakeUnique<ResourceFile>(icon_file)); |
+ data->resource_files.push_back(std::move(icon_file)); |
} |
writer.CloseContainer(&hints_writer); |
@@ -456,6 +468,7 @@ class NotificationPlatformBridgeLinuxImpl |
writer.AppendUint32(data->dbus_id); |
notification_proxy_->CallMethodAndBlock( |
&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT); |
+ to_erase.push_back(data); |
} |
} |
for (NotificationData* data : to_erase) |
@@ -468,11 +481,10 @@ class NotificationPlatformBridgeLinuxImpl |
const GetDisplayedNotificationsCallback& callback) const { |
DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
auto displayed = base::MakeUnique<std::set<std::string>>(); |
- for (const auto& notification : notifications_) { |
- if (notification.first->profile_id == profile_id && |
- notification.first->is_incognito == incognito) { |
- displayed->insert(notification.first->notification_id); |
- } |
+ for (const auto& pair : notifications_) { |
+ NotificationData* data = pair.first; |
+ if (data->profile_id == profile_id && data->is_incognito == incognito) |
+ displayed->insert(data->notification_id); |
} |
PostTaskToUiThread(base::BindOnce(callback, std::move(displayed), true)); |
} |
@@ -493,8 +505,9 @@ class NotificationPlatformBridgeLinuxImpl |
return nullptr; |
} |
- NotificationData* FindNotificationData(uint32_t dbus_id) { |
+ NotificationData* FindNotificationDataWithDBusId(uint32_t dbus_id) { |
DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
+ DCHECK(dbus_id); |
for (const auto& pair : notifications_) { |
NotificationData* data = pair.first; |
if (data->dbus_id == dbus_id) |
@@ -518,13 +531,13 @@ class NotificationPlatformBridgeLinuxImpl |
DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
dbus::MessageReader reader(signal); |
uint32_t dbus_id; |
- if (!reader.PopUint32(&dbus_id)) |
+ if (!reader.PopUint32(&dbus_id) || !dbus_id) |
return; |
std::string action; |
if (!reader.PopString(&action)) |
return; |
- NotificationData* data = FindNotificationData(dbus_id); |
+ NotificationData* data = FindNotificationDataWithDBusId(dbus_id); |
if (!data) |
return; |
@@ -549,10 +562,10 @@ class NotificationPlatformBridgeLinuxImpl |
DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
dbus::MessageReader reader(signal); |
uint32_t dbus_id; |
- if (!reader.PopUint32(&dbus_id)) |
+ if (!reader.PopUint32(&dbus_id) || !dbus_id) |
return; |
- NotificationData* data = FindNotificationData(dbus_id); |
+ NotificationData* data = FindNotificationDataWithDBusId(dbus_id); |
if (!data) |
return; |